串口通讯笔记理解 重点
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /*2018年8月9日凌晨1点 于福安公寓 2 功能:通过串口调试工具模拟电脑给单片机发送数据,能够接受到数据 3 切记:串口通讯时,晶振一定要匹配为11.0592MHZ ,如果为12MHZ时, 4 就会出现接收到的数据和所发送的数据不同 5 注:当开发板上为12MHZ时,初值就必须要重新计算 当出现乱码的时候,可能是波特率出现问题 6 7 该程序匹配的为:12MHZ、SMOD =1,加倍、波特率为4800,由此的求得初值 8 */ 9 #include<reg52.h> 10 unsigned char flag,a; 11 void main() 12 { 13 TMOD=0x20;//定时器1的工作方式2 M1和M0的组合来确定工作方式 14 TH1 =0xf3; //波特率为4800、定时器1的工作方式2、加倍SMOD=1 15 TL1 =0xf3; //重装初值 16 TR1 =1; //启动定时器1 17 PCON =0x80; //设置了SMOD =1,因为默认的是SMOD =0 ,所以必须通过PCON寄存器设定 18 SM0 =0; //在SCON寄存器中 19 SM1 =1; 20 REN =1; 21 EA=1; 22 ES =1; 23 24 25 while(1) 26 { 27 // if(RI==1)//if后面不能加;如果加封号,就会为空,就会出现逻辑错误,但是编译器检查不出来 28 // { 29 // RI=0; 30 // P2=SBUF; 31 // } 32 if(flag==1) 33 { 34 flag =0; 35 ES =0; //关闭串口中断,否则会进入一个死循环中,因为接收或者发送完成之后都会进入到中断中去 36 SBUF =a; //发送数据 37 while(!TI); //在此等候如果发送完成之后,进行下面的语句 38 TI=0; //发送完成后,软件令TI=0; 39 ES =1; //发送完成后,再打开串口中断 40 // { 41 // ES=0; 42 // flag=0; 43 44 // SBUF='1';//28; //并且此处的SBUF是发送缓冲器 45 // while(!TI); 46 // TI=0; 47 48 // SBUF='2';//28; 49 // while(!TI); 50 // TI=0; 51 52 // SBUF='4';//28; 53 // while(!TI); 54 // TI=0; 55 56 // ES=1; 57 // } 58 } 59 } 60 } 61 62 void ser() interrupt 4 63 { 64 RI =0; 65 P2 =SBUF; 66 a =SBUF; 67 flag =1; 68 }