mege16 usart 的测试代码

来源:互联网 发布:淘宝客服月薪大概多少 编辑:程序博客网 时间:2024/05/17 20:43

最近要做一个基于GSM的报警器,初步选型是选择现在手上有的mege16,显示运用无字库的lcd12864  KS0108B  GSM 是MC35

现在第一步是先弄好mege16的串口,下面是最简单的串口代码。


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define USART_C
#include "includes.h"
void UsartInit(void)
{
    // 晶振频率 : 8.0MHz
    // 通信参数: 8 Data, 1 Stop, No Parity
    // 波特率:
    // UBRRL= 0x33    9600;
    UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);  //允许发送和接收,接收中断使能
    UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据位+1位停止位
    UBRRH = 0x00;
    UBRRL = 0x33;  
    //sei();
}

int PutChar(char c)
{
    if(c == '\n')
    {
        PutChar('\r');
    }
    UDR = c;
    while(!(UCSRA &(1<<UDRE)));
    UCSRA |= (1<<UDRE);
    return 0;
}


void SendNbyte(unsigned char *p,unsigned char L)
{
    unsigned char w;
    for(w=0;w<L;w++)
    {
       // UDR = *(p+w);
       // while(!(UCSRA &(1<<UDRE)));
        //UCSRA |= (1<<UDRE);
        PutChar(*(p+w));
    }
    
}

void PutStr(unsigned char *Str)
{
    while(*Str != '\0')
    {
        PutChar(*Str);
        Str++;
    }

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define MAIN_C
#include "includes.h"
/***************************/
/*串口通信*/
/*晶振为8MHz*/
/*波特率为9600bps*/
/*发送采用查询方式,中断采用接收方式*/
/***************************/
#define BufSize 10
unsigned char RsBuf[BufSize];  //定义接收缓冲器
int RsBytes = 0;
unsigned char flag = 0;
void main(void)
{
    unsigned char *msg = "Usart Test!\n";    
    SREG |= (1<<7);  //使能全局中断
    UsartInit();
    SendNbyte(msg,12);
    PutStr("Test Ok\n");   
    delay_nms(1000);
    while(1)
    {
    PutStr("Test Ok\n");   
    delay_nms(2000);
        if(flag)
        {
           PutStr(RsBuf);        
           PutChar('\n');
           flag = 0;
        }
        
    }
}

//接收中断子程序  
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
 //uart has received a character in UDR
    RsBuf[RsBytes] = UDR;
    RsBytes ++;
    if(RsBytes > BufSize)
    {   
        flag = 1;
        RsBytes = 0;
    }
}  

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define DELAY_C
#include "includes.h"
#define XTAL 8    //晶振频率,单位MHz
void delay_1us(void)                 //1us延时函数
  {
   asm("nop");
  }

void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
  }
 
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<(unsigned int)(XTAL*143-2);i++);
  }
 
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   {
      delay_1ms();
   }   
  }
    

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef USART_H
#define USART_H
#ifdef USART_C
void UsartInit(void);
int PutChar(char c);
void SendNbyte(unsigned char *p,unsigned char L);
void PutStr(unsigned char *Str);
#else
extern void UsartInit(void);
extern int PutChar(char c);
extern void SendNbyte(unsigned char *p,unsigned char L);
extern void PutStr(unsigned char *Str);
#endif
#endif

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef MAIN_H
#define MAIN_H

#define ENABLE_BIT_DEFINITIONS   
#define OutPort  PORTA   
#define ConPort  PORTC


#ifdef MAIN_C
unsigned char data[4] = {0,0,0,0};
unsigned char CNT = 0;  //记数初值
unsigned char KeyUp;
unsigned char KeyDown;

#else
//extern unsigned char table[10];
#endif

#endif


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
#ifndef DELAY_H
#define DELAY_H
#ifdef DELAY_C
void delay_1us(void);                 //1us延时函数
void delay_nus(unsigned int n);       //N us延时函数
void delay_1ms(void) ;                //1ms延时函数
void delay_nms(unsigned int n) ;      //N ms延时函数
#else
extern void delay_1us(void);                 //1us延时函数
extern void delay_nus(unsigned int n);       //N us延时函数
extern void delay_1ms(void) ;                //1ms延时函数
extern void delay_nms(unsigned int n) ;      //N ms延时函数
#endif
#endif


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "main.h"
#include "delay.h"
#include "usart.h"
#include <iom16v.h>

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

原创粉丝点击