|
这算是个BUG吗?关于STC89C52串口调用和EA
[复制链接]
用STC89C52调试程序的时候,发现程序刚复位不久,通过串口打印了几个字符就看门狗叫唤复位了。各种查看逻辑时序都没有发现问题,最后偶然改动了一下串口程序就Ok了。现做了测试程序如下:
#include "stc89c52.h"
#include
void UART_init(void) //串口初始化
{
SCON=0x50;
TMOD=0x20;
TH1=0xFD; // 9600 11.0592MHz
TL1=0XFD;
TR1=1;
TI=0; //清串行通信相关的中断标志
RI=0;
ES=1; //使能串行通信中断
}
void UART_byte(unsigned char byte)
{
SBUF=byte;
while(!TI);
TI=0;
// delay(5);
}
void main()
{
UART_init();
EA=1;
UART_byte(0x01);
UART_byte(0x02);
while(1);
}
烧写这样的程序,复位单片机,我这打印出来的字符是0x01,0x01,而我在之前的程序中是直接卡在第一次调用UART_byte()的while(!TI)的。
而如果我在EA=1;后面加一句空跳_nop_();如下:
#include "stc89c52.h"
#include
void UART_init(void) //串口初始化
{
SCON=0x50;
TMOD=0x20;
TH1=0xFD; // 9600 11.0592MHz
TL1=0XFD;
TR1=1;
TI=0; //清串行通信相关的中断标志
RI=0;
ES=1; //使能串行通信中断
}
void UART_byte(unsigned char byte)
{
SBUF=byte;
while(!TI);
TI=0;
// delay(5);
}
void main()
{
UART_init();
EA=1;
_nop_(); //仅添加此句
UART_byte(0x01);
UART_byte(0x02);
while(1);
}
打印出来的字符就是0x01,0x02正常了。不过我那个程序时常异常复位,而我将UART_byte()函数内容改为如下:
oid UART_byte(unsigned char byte)
{
SBUF=byte;
delay(5);
TI=0;
}
就不会再有此类问题了。不知道有没有人碰到过串口的TI标志位,和与EA紧接操作时,发生类似的问题的。
对于这款单片机,看来是不能直接使用while()进行判断的,必须添加超时退出机制。
|
|