修改了 1 中不能连续调用 字符串发送的BUG!!
/*----------------------------------------------- 名称:串口通信 修复程序1中无法连续调用字符串发送的BUG 编写:LZM [email protected] </a> 日期:2015.05.24 修改:无 内容:连接好串口波特率设置为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); } }