串口通讯笔记理解 重点

 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 }
View Code
原文地址:https://www.cnblogs.com/wises/p/9539530.html