当前位置:文档之家› 51单片机串口中断使用总结

51单片机串口中断使用总结

二:不在中断里检测是否是接收中断
中断函数这样写
voidsrei()interrupt 4
{
P0=SBUF;
RI=0;//P0口接led来检测接收到的数据
a=SBUF;
flag=1;
}
那么就会出现这样的状况:接收中断将接收缓冲器的值取回发送中断中断里又将接收缓冲器的值取回再发送再中断......所以不断发送数据,串口调试助手里就不断的显示数据
下面的程序为通过串口调试助手实现上位机通过串口发送数据给单片机,单片机接收后并回发给上位机(发一个接一个)。
#include<reg52.h>
unsignedintflag,a;
void main()
{
TMOD=0x20;//通过定时器1来设置串行口的波特率
TH1=0xfd;
TL1=0xfd;//设置串行口的波特率为9600,相应的晶振频率为11.0592MHZ,
{
}
在这个if语句里不用关中断,为啥呢?
上位机发送数据单片机接收进入接收中断通过a=SBUF取回接收到的数据放入a中主函数用if(flag==1)检测a已取回数据用SBUF=a将取回到的数据再放入发送缓冲器并发送发送完后虽进入中断由于中断里用if(RI==1)检测,所以发送中断里并不执行其他命令,因此实现了数据的一收一发
SM0=0;
SM1=1;//选择串行口为工行口接收数据
EA=1;//开总中断
ES=1;//开串行口中断
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(!TI);
TI=0;
ES=1;
}
}
}
voidsrei()interrupt 4
一:在中断里检测是否是接收中断
voidsrei()interrupt 4
{
if(RI==1)
{
P0=SBUF;
RI=0;//P0口接led来检测接收到的数据
a=SBUF;
flag=1;
}
}
即判断是接收中断,只有在接收中断后,才将SBUF取回,并在主函数里在发送给上位机,
此时主函数
if(flag==1)
{
//if(RI==1)
//{
RI=0;
P0=SBUF;//P0口接led来检测接收到的数据
a=SBUF;
flag=1;
// }
}
单片机的串口中断分发送中断和接收中断,即在串口发送完(给发送SBUF赋值并发送)一帧数据后TI(发送中断标志位)置位,而串口接收完(接收SBUF获得数据)一帧数据后RI(接收中断标志位)置位。根据要求在进入中断后可有两种写法:
那怎么样解决呢?
我们在接收到数据后,在回发前,关闭中断,等待数据发送后再开中断,程序如下:
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(!TI);
TI=0;
ES=1;
}
这样发送完数据并不进人中断,所以只能在接收完数据进入中断,所以数据收到一个再回发一个,而不是不断的回发
2014年1月12日
王亚整理
相关主题