单片机串口简单问题 为什么要所中断要全部关掉??

#include <reg51.h>
#include <intrins.h>
unsigned char tmp;
void send_char(unsigned char txd);
main()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;

SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增

TR1 = 1; // 启动定时器1
IE = 0x0; // 禁止任何中断

while(1)
{

if(RI) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
P0 = tmp; // 数据传送到P0口
send_char(tmp); // 回传接收到的数据
}
}
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
那为什么不用开串口中断的??谢谢

我觉得是这样子的,关闭中断是为了避免更高优先级的中断信号抢占MCU的资源,因为你所设置的串口通讯模式必须保证上位机、下位机时序一致,如果这时候中断,则会时序混乱,通讯错误,很多单总线的IC工作时也要关闭中断就是为了避免更改优先级中断导致时序混乱问题。
并不是你不关中断就一定不能正常工作,这只是避免一些隐患问题。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-02-06
就像二楼说的, 如果要保证数据的通信,就必须在发送数据的时候关闭中断。因为单片机在运行的时候假如你开了某种中断(不是串口的),有一定的几率会出现错误中断信号,从而导致放弃正在发送的信息。虽然这种几率很低,但要确保正常的运行,所有可能出现的问题都考虑到,所有的隐患都要去掉。所以关所有中断。
而你这个程序是用软件查询的方式来确定是否接收到数据或者发送完数据。所以不需要串口中断来接收和发送数据。
第2个回答  2010-02-06
还是我来告诉你吧.
开中断以后是应该编写相应的"中断函数"的,在这里你没有编写中断函数,你即使开启全局中断(EA=1)也是没有影响的.
第3个回答  2010-02-06
既然你没有采用中断的方式接受数据全局中断当然可以关掉,不过就算你打开程序应该也是没 问题的
相似回答