https://blog.csdn.net/qq_27977257/article/details/70677661
51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。
接收数据时,使用“中断方式”,清除 RI 后,用一个变量通知主函数,收到新数据。发送数据时,也用“中断方式”,清除 TI 后,用另一个变量通知主函数,数据发送完毕。这样一来,收、发两者基本一致,编写程序也很规范、易懂。更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。
1.
#include <reg52.h>//#define uchar unsigned char//uchar receive;
void main(void){ EA = 1; //允许总中断(如不使用中断,可用//屏蔽) ES = 1; //允许UART串口的中断 TMOD = 0x20; //定时器T/C1工作方式2 SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) TH1 = 0xF3; //定时器初值高8位设置 //12MHZ晶振,波特率为4800 0xf3 TL1 = 0xF3; //定时器初值低8位设置 //11.0592MHZ晶振,波特率为4800 0xf4 9600 0xfa 19200 0xfd PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) TR1 = 1; //定时器启动 while(1);
}
void tranData() interrupt 4{ SBUF='1'; while(TI==0); TI=0; RI=0; // 将此句注释掉,查看效果.}
2. 键盘输入
#include <reg52.h>#define uchar unsigned char uchar uc;
void main(void){ EA = 1; //允许总中断(如不使用中断,可用//屏蔽) ES = 1; //允许UART串口的中断 TMOD = 0x20; //定时器T/C1工作方式2 SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) TH1 = 0xF3; //定时器初值高8位设置 //12MHZ晶振,波特率为4800 0xf3 TL1 = 0xF3; //定时器初值低8位设置 //11.0592MHZ晶振,波特率为4800 0xf4 9600 0xfa 19200 0xfd PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) TR1 = 1; //定时器启动 while(1);
}
void tranData() interrupt 4{ uc=SBUF;
SBUF=uc; while(TI==0); TI=0; RI=0;}
3.
1 #include <reg52.h> 2 #define uchar unsigned char 3 4 uchar receive; 5 6 7 void main(void) 8 { 9 EA = 1; //允许总中断(如不使用中断,可用//屏蔽) 10 ES = 1; //允许UART串口的中断 11 TMOD = 0x20; //定时器T/C1工作方式2 12 SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) 13 TH1 = 0xF3; //定时器初值高8位设置 //12MHZ晶振,波特率为4800 0xf3 14 TL1 = 0xF3; //定时器初值低8位设置 //11.0592MHZ晶振,波特率为4800 0xf4 9600 0xfa 19200 0xfd 15 PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) 16 TR1 = 1; //定时器启动 17 while(1); 18 19 } 20 21 void tranData() interrupt 4 22 { 23 uchar i; 24 if(RI) 25 { 26 RI=0; 27 receive=SBUF; 28 if(receive==0x31) 29 { 30 for(i=0;i<4;i++) 31 { 32 SBUF='a'; 33 while(!TI); 34 TI=0; 35 } 36 } 37 else if(receive==0x32) 38 { 39 for(i=0;i<4;i++) 40 { 41 SBUF='b'; 42 while(!TI); 43 TI=0; 44 } 45 } 46 } 47 } 48 49 View Code
转载于:https://www.cnblogs.com/https/p/9250407.html
相关资源:数据结构—成绩单生成器