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

程序在下面。利用上位机发送数据给51,然后51把数据返回给上位机。但现在有一个问题,就是当上位机没有发数据给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;
}
展开
 我来答
bingshiliuxing
2014-02-28 · TA获得超过795个赞
知道小有建树答主
回答量:229
采纳率:100%
帮助的人:121万
展开全部
肯定不会运行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;

}
hbwin020
2014-02-28 · TA获得超过223个赞
知道小有建树答主
回答量:191
采纳率:0%
帮助的人:121万
展开全部
串口接收与发送都是用的相同中断源。所以在中断函数中要判断是接收还是发送中断,同时,要软件清中断。所以中断函数修改
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;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
伦哲齐骞
2019-02-28 · TA获得超过3560个赞
知道大有可为答主
回答量:3033
采纳率:26%
帮助的人:167万
展开全部
对于51而言,每帧产生一次中断。接收4个字节是分4次中断接收完成的。51的UART模块从串行移位寄存器接收完成后是直接放入接收缓冲的,而且接收缓冲只有一个单元。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wjfhsym
2014-02-28 · TA获得超过946个赞
知道小有建树答主
回答量:475
采纳率:85%
帮助的人:306万
展开全部
打开PC串口软件就有数据接收,是和第一次发的数据一样吗,具体是什么样的数据。
你把 while ( RI == 0) ;放到中断第一句,再把MAIN中的ES=0放进中断最后看看。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式