51单片机串口通信中断的问题
发布网友
发布时间:2022-04-29 02:29
我来回答
共4个回答
热心网友
时间:2022-06-28 18:37
肯定不会运行while(TI==0);下面的程序的,因为你的中断开着,程序跳到中断服务程序里面了,然后中断处理结束了之后,TI自动清零了,所以一直在while(TI==0);无限循环。
程序里面,既然开通了中断功能,那你就一直使用中断功能,为什么你还要使用查询功能呢?甚至有时把中断给禁止了,这里面容易出现问题哈。
你不要使用查询功能,就一直使用中断,具体程序查看下面:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(int z);
char a,flag;
void main()
{
EA=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
ET1=0;
TR1=1;
ES=1;
REN=1;
SM0=0;
SM1=1;
while(1);
}
void ser_interrupt()interrupt 4
{
if(RI==1)
{
RI=0;
a=SBUF; //P1口接的发光二极管,以此查看接收到的数据
P1=a;
SBUF=a;
}
else if(TI==1)TI=0;
}
热心网友
时间:2022-06-28 18:37
串口接收与发送都是用的相同中断源。所以在中断函数中要判断是接收还是发送中断,同时,要软件清中断。所以中断函数修改
void ser_interrupt()interrupt 4
{
if(RI)
{
RI=0;
P1=SBUF; //P1口接的发光二极管,以此查看接收到的数据
if(flag == 0) // 防止接收了一个数据没处理,又接收了新的数据,也可不要
{
a=SBUF;
flag=1;
}
}
if(TI)
{
TI = 0;
}
}
主函数中可改为
if(flag==1)
{
flag=0;
SBUF=a;
}
热心网友
时间:2022-06-28 18:38
对于51而言,每帧产生一次中断。接收4个字节是分4次中断接收完成的。51的UART模块从串行移位寄存器接收完成后是直接放入接收缓冲的,而且接收缓冲只有一个单元。
热心网友
时间:2022-06-28 18:38
打开PC串口软件就有数据接收,是和第一次发的数据一样吗,具体是什么样的数据。
你把 while ( RI == 0) ;放到中断第一句,再把MAIN中的ES=0放进中断最后看看。