51单片机的UART串口的结构由串行口控制寄存器SCON、发送和接收电路三部分构成。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
符号 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
复位值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
其中,SM0和SM1共同决定串口通信的模式,共4种通信模式;SM2是多机通信控制位;REN使能串行接收;TB8和RB8是模式2中要发送和接收的第9位数据;TI是发送中断标志位,当发送电路发送到停止位的中间位置时,TI由硬件置一,必须通过软件清零;RI是接收中断标志位,当接收电路发送到停止位的中间位置时,RI由硬件置一,必须通过软件清零。
对于硬件串口模块中,有一个专门的波特率发生器用来控制发送和接收的速率,对于STC89C52而言,只能由定时器T1或T2来设定。由于使用定时器T2需要额外的配置寄存器,故使用定时器T1.
通信方式使用方式1,即SM0 = 0, SM = 1。方式1下的波特率必须使用定时器T1的自动重载模式,重载值计算公式为:
TH1 = TL1 = 晶振值/12/2/16/波特率
和波特率有关的还有一个电源管理寄存器PCON,它的最高位可以把波特率提高一倍,也就是如果写PCON |= 0x80,计算公式为:
TH1 = TL1 = 晶振值/12/16/波特率
其中,256是8位定时器的溢出值,即TL1的溢出值;12是指一个机器周期等于12个时钟周期;16,串口把一位信号采集16次,其中把7、8、9次取出,如果两次高就是1,两次低就是0;
串口通信的发送和接收在物理上是名字名字相同的SBUF寄存器,地址也是一样,但是一个用来发送缓冲,一个用来接收缓冲。
编写串口通信的一般步骤:
- 配置串口为模式1;
- 配置定时器T1为模式2;
- 设置波特率;
- 打开定时器控制寄存器TR1;
例:
#include <reg52.h>
void ConfigBaud(unsigned int baud);
void main()
{
EA = 1; //使能总中断
ConfigBaud(9600); //设置波特率为9600
while(1);
}
//波特率配置函数
void ConfigBaud(unsigned int baud)
{
SCON = 0x50; //配置串口为模式1
TMOD &= 0x0F; //清零T1控制位
TMOD |= 0x20; //配置T1为模式2
TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值
TH1 = TL1;
ET1 = 0; //禁止T1中断
ES = 1; //使能串口中断
TR1 = 1; //使能T1
}
//串口中断服务函数
void InterruptUART() interrupt 4
{
if(RI) //接收到数据
{
RI = 0; //软件清零
......
}
if(TI) //数据发送完毕
{
TI = 0; //软件清零
}
}