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;
} 展开
疑问:为什么串口中断服务程序会一直响应?
#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;
}
程序里面,既然开通了中断功能,那你就一直使用中断功能,为什么你还要使用查询功能呢?甚至有时把中断给禁止了,这里面容易出现问题哈。
你不要使用查询功能,就一直使用中断,具体程序查看下面:
#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;
}
展开全部
串口接收与发送都是用的相同中断源。所以在中断函数中要判断是接收还是发送中断,同时,要软件清中断。所以中断函数修改
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;
}
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;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对于51而言,每帧产生一次中断。接收4个字节是分4次中断接收完成的。51的UART模块从串行移位寄存器接收完成后是直接放入接收缓冲的,而且接收缓冲只有一个单元。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
打开PC串口软件就有数据接收,是和第一次发的数据一样吗,具体是什么样的数据。
你把 while ( RI == 0) ;放到中断第一句,再把MAIN中的ES=0放进中断最后看看。
你把 while ( RI == 0) ;放到中断第一句,再把MAIN中的ES=0放进中断最后看看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询