51单片机的串口,是个全双工的串口,发送数据的一起,还能够接纳数据。
当串行发送结束后,将在标志位 TI 置 1,相同,当收到了数据后,也会在 RI 置 1。
不管 RI 或 TI 呈现了 1,只需串口中止处于敞开状况,单片机都会进入串口中止处理程序。
在中止程序中,要区别出来究竟是发送引起的中止,仍是接纳引起的中止,然后别离进行处理。
看到过一些书本和文章,在串口收、发数据的处理办法上,许多人都有不当之处。
接纳数据时,根本上都是运用“中止办法”,这是正确合理的。
即:每逢收到一个新数据,就在中止函数中,把 RI 清零,并用一个变量,告诉主函数,收到了新数据。
发送数据时,许多的程序都是运用的“查询办法”,便是履行 while(TI ==0); 这样的句子来等候发送结束。
这时,处理欠好的话,就或许带来问题。
看了一些网友编写的程序,发现有如下几条简单犯错:
1.有人在发送数据之前,先封闭了串口中止!等候发送结束后,再翻开串口中止。
这样,在发送数据的等候期间内,假如收到了数据,将不能进入中止函数,也就不会保存的这个新收到的数据。
这种处理办法,就会遗失收到的数据。
2.有人在发送数据之前,并没有封闭串口中止,当 TI = 1 时,是能够进入中止程序的。
可是,却在中止函数中,将 TI 清零!
这样,在主函数中的while(TI ==0);,将永久等不到发送结束的标志。
3.还有人在中止程序中,并没有区别中止的来历,反而让发送引起的中止,履行了接纳中止的程序。
对此,做而论道宣布自己常用的办法:
接纳数据时,运用“中止办法”,铲除 RI 后,用一个变量告诉主函数,收到新数据。
发送数据时,也用“中止办法”,铲除 TI 后,用另一个变量告诉主函数,数据发送结束。
这样一来,收、发两者根本共同,编写程序也很标准、易懂。
更重要的是,主函数中,不必在那儿死等发送结束,能够有更多的时刻检查其它的标志。
实例:
求一个PC与单片机串口通讯的程序,要求如下:
1、假如在电脑上发送以$开端的字符串,则将整个字符串原样回来(字符串长度不是固定的)。
2、假如接纳到1,则将P10置高电平,接纳到0,P10置低电平。(用来操控一个LED)
单片机是STC89C52RC/晶振11.0592/波特率要求是9600或4800。谢谢!
问题弥补:或许会将【$ABCD,123456,987654ccc,aasdasd,aaaa,sssd,4D】这样的字符串(字符串长度约为50-150个字符)传送给单片机,只能能原样回来。
最佳答案:
下列程序,现已调试成功。
#include
sbit LED = P1^0;
unsigned char UART_buff;
bit New_rec = 0, Send_ed = 1, Money = 0;
//———————————————-
void main (void)
{
}
//———————————————-
void ser_int (void) interrupt 4
{
}
//———————————————-