目录
概述
类别:
UART----通用异步收发器
用途:
UART多用于板间通信
通信方式:
串行通信:一位一位的传送数据
解析:
UART通信虽然用到了TXD和RXD两根线,但是实际一次通信中,1条线就可以完成,两条线是把发送和接收分开而已。
两个单片机间通信简介
文字解析:
以二进制形式进行传输,最低位先发、高位后发。TXD先拉低电平,持续一段时间,发送一位;然后接着重复,直到全部发送完毕。
一段时间=1/波特率,波特率又称作比特率(baud)
在UART通信时,一个字节是8位。
图解:
单片机1的TXD引脚接到单片机2的RXD引脚,1发送2接收
单片机1的RXD引脚接到单片机2的TXD引脚,2发送1接收
没有通信信号发生时,通信线路保持高电平。当通信来临,拉低电平,发送数据前,先发送一位0,表示起始位,然后发送8位数据,发送顺序是由低位到高位,数据发送完毕后,再发送一位1,表示停止位。实际一共发送了10位
UART的寄存器
SCON-----串行控制寄存器的位分配(地址0x98,可位寻址)
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
符号 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | T1 | R1 |
复位值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
SCON-----串行控制寄存器的位描述
位 | 符号 | 描述 |
7 | SM0 | 这两位共同决定了串口通信的模式0~模式3共4中模式。最常用的就是模式1,也就是SM0=0,SM1=1 |
6 | SM1 | |
5 | SM2 | 多机通信控制位(很少用),模式1直接清0 |
4 | REN | 使能串行接收。由软件置位使能接收,软件清0则禁止接收 |
3 | TB8 | 模式2和3中要发送的第9位数据(很少用) |
2 | RB8 | 模式2和3中接收到的第9位数据(很少用),模式1用来接收停止位 |
1 | T1 | 发送中断标志位,当发送电路发送到停止位的中间位置时,T1由硬件置1,必须通过软件清0 |
0 | R1 | 接收中断标志位,当接收电路接收到停止位的中间位置时,R1由硬件置1,必须通过软件清0 |
寄存器的配置
模式1:
波特率发生器
在硬件串口模块中,有一个专门的波特率发生器用来控制发送和接收数据的速度,对于STC89C52单片机来说,这个波特率发生器只能由定时器T1或定时器T2产生,而不能由定时器T0产生
由于用定时器T2,需要配置额外的寄存器,所以默认是使用定时器T1的。
模式1下的波特率发生器必须使用定时器T1的模式2(自动重装载模式),定时器的重装载值计算公式为:
TH1=TL1=256-晶振值/12/2/16/波特率
若是使用电源管理寄存器PCON,它的最高位可以把波特率提高一倍,也就是加上
PCON|=0x80,计算公式变为:
TH1=TL1=256-晶振值/12/16/波特率
UART串口通信步骤
第一步:配置串口为模式1(0x50)
第二步:配置定时器T1为模式2,即自动重装模式
第三步:根据波特率计算出TH1和TL1的初值,如果有需要可以使用PCON进行波特率设置
第四步:打开定时器控制寄存器TR1
注:在使用T1做波特率发生器时,不可再使用T1的中断
部分相关程序
/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
SCON = 0x50; //配置串口为模式1
TMOD &= 0x0F; //清零T1的控制位
TMOD |= 0x20; //配置T1为模式2
TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值
TL1 = TH1; //初值等于重载值
ET1 = 0; //禁止T1中断
ES = 1; //使能串口中断
TR1 = 1; //启动T1
}
/* UART中断服务函数 */
void InterruptUART() interrupt 4
{
if (RI) //接收到字节
{
RI = 0; //手动清零接收中断标志位
RxdByte = SBUF; //接收到的数据保存到接收字节变量中
if(RxdByte == '2')
{
P0 = 0x00; //用来控制LED灯
}
// else
// {
// P0 = 0xff;
// }
//P2 = SBUF;
SBUF = RxdByte; //接收到的数据又直接发回,叫作-"echo",
//用以提示用户输入的信息是否已正确接收
}
if (TI) //字节发送完毕
{
TI = 0; //手动清零发送中断标志位
}
}