串口通信

连接好串口波特率设置为9600,无奇偶校验

晶振11.0592MHz

接上串口,可以接收到自己发送的字符

请提前计算一下所选晶振能达到的最高速度,波特率不能超过最高速度

(1) 波特率加倍(SMOD=1): Max_Baud = FOSC/12/16

(2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32

例如:22.1184MHz晶振,波特率加倍时,最大波特率=22118400/12/16=115200

程序源码

/*----------------------------------------------- 
  名称:串口通信 
  修改:无 
  内容:连接好串口波特率设置为9600,无奇偶校验 
        晶振11.0592MHz 
        接上串口,可以接收到自己发送的字符 
------------------------------------------------*/  
  
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                          
  
/******************************************************************* 
请提前计算一下所选晶振能达到的最高速度,波特率不能超过最高速度 
(1) 波特率加倍(SMOD=1):  Max_Baud = FOSC/12/16 
(2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32 
例如:22.1184MHz晶振,波特率加倍时,最大波特率=22118400/12/16=115200 
*******************************************************************/  
#define FOSC    11059200        //振荡频率  
#define BAUD    9600            //波特率  
#define SMOD    1           //是否波特率加倍  
#if SMOD  
    #define TC_VAL  (256-FOSC/16/12/BAUD)  
#else  
    #define TC_VAL  (256-FOSC/32/12/BAUD)  
#endif  
  
typedef unsigned char uint8;  
typedef unsigned int uint16;  
  
code const char str1[] = "The string is 来自单片机!\r\n";       
code const char str2[] = "Author: Louis \r\n";  
code const char str3[] = "多多指教~~\r\n";  
  
//const  限定一个变量不允许被改变。在一定程度上提高程序安全性和可靠性  
//code 存储区间为 程序存储区  
  
/***************函数声明*******************/  
void InitUART(void);  
void SendOneByte(uint8);  
void SendrStr(const uint8 *ptr);  
  
/****************主函数********************/  
void main(void)  
{  
    uint8 i=0;  
    InitUART();  
  
    while(str2[i]!='\0')  
    {  
    SendOneByte(str2[i++]);   
    }  
  
    SendrStr(&str1[0]);  
    SendrStr(&str1[0]);  
    while(1);  
}  
  
/****************中断服务函数***************/  
void UART_ISR(void) interrupt 4  
{  
    uint8 RX_Data;  
    //只响应"接收"中断,"发送"中断来了就直接抹掉  
    if(RI)  
   {  
     RI = 0;    //串口中断标志不能自己清除,需要手动清除  
     RX_Data=SBUF;  
     SendOneByte(RX_Data);  
   }  
   else  
     TI = 0;        //串口发中断是发送完缓冲区数据之后产生  
}  
  
/****************串口初始化函数*************/  
void InitUART(void)  
{  
    TMOD = 0x20;    //定时器1,模式2工作模式       
    SCON = 0x50;    //串口工作模式1,允许REN   /* SCON: 模式 1,  8-bit UART, 使能接收         */  
    TH1 = TC_VAL;  
    TL1 = TH1;  
    PCON = 0x80;    //发送速率加倍  
    ES = 1;  
    EA = 1;  
    TR1 = 1;  
}  
/**************串口发送字符函数*************/  
void SendOneByte(uint8 c)  
{  
    ES = 0;         //禁止中断,让串口安心工作啊  
    SBUF = c;  
    while(!TI);     //等待发送完毕  
    TI = 0;         //清TI中断  
    ES = 1;         //打开中断  
}  
/**************串口发送字符串函数*************/  
void SendrStr(const uint8 *ptr)  
{  
      
    for(;*ptr!='\0';ptr++)  
    {  
       SendOneByte(*ptr);  
    }  
}