51单片机串口中断
上图为常见的一些通信协议,串口中断使用的是第一个点对点通信,通过TXD发送数据,RXD接受数据。下图为RXD和TXD的引脚。
波特率计算:
例如:4800波特率,就是每秒要传送4800个位,则每传送一个字节需要的时间为1/4800=208.3us, AT89C52单片机的晶振为11.0592MHz, 经过12分频,再除以32后,其频率为11.0592/12/32 = 0.0288,则周期为1/0.0288= 34.72,208/34.72 = 5.999,则初值为5.999,16进制为0xFA。
在串口通信时,发送和接受需要有相同的波特率,就是相当于使用同一个时间序列(CLK),来保证通信的准确性。而且波特率相当于通信的速率。STC89C52RC单片机必须用11.0259MHz才可准确通信。
上图为串口通信的过程,发送和接受的数据都存储在SBUF中,通过定时器1来设置波特率,并可以通过串口中断来判断接受(RI)和发送(TI)数据。下图为中断的内部配置。
下图为与串口有关的寄存器,在串口初始化中,只需要对串口的模式,定时器1,中断的配置即可。
如果要发送文本文件,则可以通过ASCll码编码发送或者接受。
不用中断,代码如下:
void UartInit(void) //4800bps@11.0592MHz
{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率TMOD &= 0x0F; //设置定时器模式TMOD |= 0x20; //设置定时器模式TL1 = 0xFA; //设置定时初始值TH1 = 0xFA; //设置定时重载值ET1 = 0; //禁止定时器中断TR1 = 1; //定时器1开始计时
}void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0);TI = 0;
}unsigned char UART_ReceiveByte()
{unsigned char Byte;if(RI == 1){Byte = SBUF;RI = 0;return Byte;}return 0;
}
使用中断,在初始化中将ES = 1,EA = 1即可。(接受数据和发送数据都会引起串口中断,可以通过TI,RI来进行判断。)