且看下面这个最简单的51串口发送程序。单片机是AT89S51,留意其中红色字体那一句。现象是如果屏蔽了这一句,单片机就会不闪灯,不发数据,什么反应也没有。如果不屏蔽这一句,单片机就会正常闪灯且发送数据。但不管ET1 =1还是ET1=0,单片机都能正常,是不是很奇怪啊?此外,这个ET1是控制TIMER1中断的,和串口有什么关系啊?凭什么屏蔽了,串口就不好使了?
#include<reg51.h>
#include<intrins.h>
sbit LED =P2^7;
void delay(unsigned int n)
{
while(n)
{
n--;
}
}
void uart_init()
{
TMOD = 0x20; //定时器1定时方式2,自动重装
TH1 = 0XFD; //定时器初值。11.0592M,波特率9600
TL1 = 0XFD;
TR1 = 1; //定时器开始计时
SCON = 0x50; //串口方式1,允许接收
//PCON = 0x80; //波特率加倍控制,SMOD=1,加倍速率
RI = 0; //清接收中断标志
TI = 0; //清发送中断标志
EA =1; //开总中断
ES =1; //开启串口中断
// ET1 =1; //就这句有鬼的,如果这句屏蔽,就会灯不闪,串口不发送数据,反之不屏蔽就既闪灯又发数据
}
void uart_send_byte(unsigned char dt)
{
SBUF =dt; //发送数据
while(!TI);
TI =0; //清零,TI为发送中断标志
}
void com_interrupt(void) interrupt 4 using 3
{
RI = 0; //清接收中断标志
TI = 0; //清发送中断标志
}
void main()
{
uart_init();
while(1)
{
delay(1000);
LED=1;
delay(50000);
uart_send_byte(0x55);
LED=0;
}
}
|