关于串口中断的一个问题。求教
时间:10-02
整理:3721RD
点击:
这是郭天翔《新概念51单片机C语言教程》里的一个例子6.5.1,
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag,a,i;
uchar code table[]="i get ";
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0Xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0; //关闭串口中断
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser()interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
教程里的这个例子下载运行是,为什么在电复位时,在串口调试软件的接受发送缓冲区会自动输出table的“i get ”?
如果把if语句里的ES=0去掉,就不会这样。但是教程里说,如果在if语句里不把串口中断关掉,在接下来的发送数据完成后,会触发中断。flag又会值1,再次发送数据,这样会进入死循环。
可是我去掉ES=0这句后,结果是我给一次SBUF发送一次数据,接受区就输出一次,并没有出现死循环....
哪位高手能告诉我?谢谢
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag,a,i;
uchar code table[]="i get ";
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0Xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0; //关闭串口中断
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser()interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
教程里的这个例子下载运行是,为什么在电复位时,在串口调试软件的接受发送缓冲区会自动输出table的“i get ”?
如果把if语句里的ES=0去掉,就不会这样。但是教程里说,如果在if语句里不把串口中断关掉,在接下来的发送数据完成后,会触发中断。flag又会值1,再次发送数据,这样会进入死循环。
可是我去掉ES=0这句后,结果是我给一次SBUF发送一次数据,接受区就输出一次,并没有出现死循环....
哪位高手能告诉我?谢谢
上电时 flag没有清0, flag里的数据不确定。去掉ES=0,不会进入死循环,但a里的数据就不是电脑发下来的数据了,因为每次TI=1时都会触发中断。如果flag=0;这句摆在前面就会进入死循环。
你还是先看看单片机关于这块的工作原理吧。
顶
我也学习学习
你往下看到例6.6.1中有解释这问题;
1,将REN=1;
SM0=0;
SM1=1;
改成:SM0=0;
SM1=1;
REN=1;
或者
2,不要对SCON寄存器进位操作,而是直接对整个寄存器进行设置,如SCON=0x50;
恩,看到后面才知道,他在前面没说到所以我郁闷,虽然很久了,但还是谢谢你呀