51单片机串口通信中断的问题

程序在下面。利用上位机发送数据给51,然后51把数据返回给上位机。但现在有一个问题,就是当上位机没有发数据给51的时候,为什么一直进入中断服务程序呢?上位机一打开,就会持续的接收数据,只有把if(flag==1)中加入ES=0,ES=1,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)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(TI==0);
TI=0;
ES=1;
}
}

}
void ser_interrupt()interrupt 4
{

RI=0;
P1=SBUF; //P1口接的发光二极管,以此查看接收到的数据
a=SBUF;
flag=1;
}

肯定不会运行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;

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-02-28
串口接收与发送都是用的相同中断源。所以在中断函数中要判断是接收还是发送中断,同时,要软件清中断。所以中断函数修改
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;
}本回答被网友采纳
第2个回答  2019-02-28
对于51而言,每帧产生一次中断。接收4个字节是分4次中断接收完成的。51的UART模块从串行移位寄存器接收完成后是直接放入接收缓冲的,而且接收缓冲只有一个单元。
第3个回答  2014-02-28
打开PC串口软件就有数据接收,是和第一次发的数据一样吗,具体是什么样的数据。
你把 while ( RI == 0) ;放到中断第一句,再把MAIN中的ES=0放进中断最后看看。

C51单片机串口通信中断的问题
对于51而言,每帧产生一次中断。接收4个字节是分4次中断接收完成的。51的UART模块从串行移位寄存器接收完成后是直接放入接收缓冲的,而且接收缓冲只有一个单元。

51单片机串口通信问题
一个一个问题回答:1、是在一个字节接收成功或一个字节发送成功以后进入中断程序(不过,一般在发送时是将中断关闭的,也就不进入中断了)。此时,定时器的作用就是为了设定串口速率,因为单片机的速度和串口的速度不是一个数量级的,所以一定要有个变速箱。2、数据的接收是由硬件控制的,其实,数据的...

51单片机串口通信时, 外部中断无法执行
串口通信是不是也是采用中断方式?如果与外部中断为同一优先经中断的话,则当51单片机串口通信时(串口中断时),外部中断是无法执行的。如果想实现外部中断优先,需要改变它们的优先级别,串口低优先级PS=0,外部中断高优先级PX0=1,PX1=1

51单片机在什么情况下会产生串口中断
所说的串口中断“其他中断是在I/O口低的时候产生的”是指外部中断,它是在单片机的外部I/O口电平改变的时候产生的。而串口中断是一种内部中断,所谓内部中断,是单片机执行内部程序,由内部定时器或其他中断源触发的,通常要生成串行中断或其他中断,首先必须有中断和总中断。例如:串行中断EA=1;/...

51单片机串口通讯(模式1)问题:发送内容前半部分出错,后半部分正确。错...
ET1=1;此语句是罪魁祸首,定时器1已经作为串口波特率发生器了,就不能做其他用途了,此时定时必须禁止中断,而你程序中恰恰相反,来了句ET1=1;开启了定时器1中断,导致串口波特率发生混乱。那当然串口通信会有问题了,删掉ET1=1;该语句即可。

51单片机串行口通信数据丢失问题
中断服务程序占用时间太长,将网EEPROM写的程序放在外边,另外,需要开辟一个接收缓冲区,否则有可能丢失数据,用串口助手是没有握手的,所以PC没有多长时间的等待,你来不及接收就丢失了。

51单片机把串口唤醒 不会进入中断是什么问题?
1.串口通信设置是否正确(SCON,EA,波特率,定时器初值,重装值,启动定时器)2.中断函数(如果汇编的话,串口中断入口地址应指定为23h),如果C的话,加上中断函数的关键字和串口中断对应编号 3.进入串口接收中断后,别忘记将RI=0

看了51单片机的串口通信,有一些疑问??
所以在串口中断服务中,不能有太多的程序去处理,因为处理这数据时,串口被中断占用就不能接收数据。通常将需要处理的数据放到主程序中,因为前面说了,主程序和串口接收是可以同时运行的。如果在串口中断服务中,程序较多,占去太多时间,正如你说的,那就会丢帧而出错,这是不允许的。

51单片机的串口通信中接收中断和发送中断的问题。
在程序中检测RI和TI,RI表示接收中断,TI表示发送中断,如果只要在接收中断时运行,可以如下设置:...JNB RI,EXIT ...CLR RI ...EXIT:RETI

两个51单片机485串口通信接收数据出错原因?大概发送三、五次会有一次...
1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。这种处理方法,就会遗漏收到的数据。2.有人在发送数据之前,并没有关闭串口中断,当 TI = 1 时,是可以进入中断...

相似回答