UART串口通信
一、背景
很久没用过UART串口通信了,趁着学习HC-05模块顺便复习一下。通过串口可以实现单片机与计算机之间的信息传输,常用的串口通信协议有UART、I2C,学51时就用了这两个协议。
二、原理
串口通信的原理是这样:微处理器用三根线与电脑相连,微处理器的发送总线与电脑的接收总线相连,电脑的发送总线与微处理器的接收总线相连,这就是为什么微处理器的RXD要与计算机的TXD相连,反之亦然;还有一根线是地线,地线相连。
在无校验位的八位数据通信情况下,微处理器发送的高低电平组成了数据帧,我们每一位之间要有一个时间间隔,以让计算机区分好每一位,通俗来说这个时间间隔就是波特率。波特率为9600就是说微处理器一秒要发送9600位数据。
因为是每隔一段时间发出一位数据,所以很容易就想到可以用定时器和中断来发送数据。所以UART串口通信离不开定时器。
三、51单片机上UART的通信方法
1、配置好串口控制器SCON和PCON(可以用STC-ISP生成)
SCON可以自己决定,但是PCON需要用STC生成。SCON初始时将发送标志位TI和接收标志位RI置0,这个标志位以单片机为视角,也就是说单片机接收到数据后就将RI置1。这两个位都必须软件复位。
2、配置好定时器和中断
定时器配置好TCON和TMOD,TH和TL的值要通过计算波特率得出(也可以用STC-ISP生成,但最好自己会算。)
开总中断和对应定时器的中断。
波特率的计算:
3、SBUF的介绍
SBUF是单片机与计算机之间所传输数据的缓冲
计算机向单片机发送数据:SBUF = 0x66
单片机向计算机发送数据:int i = SBUF
PS:可以将SBUF看作是单片机的,单片机向计算机发数据时,先将数据放在自己的SBUF中,再递给计算机。计算机将数据放在SBUF中,再将SBUF递给单片机。
4、程序
#include <REGX52.H>
void UART_Init()
{
SCON = 0x50;
PCON &= 0x7F;
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFA; //设置定时初始值
TH1 = 0xFA; //与波特率有关
TR1 = 1; //定时器0开始计时
ET1 = 0;
EA=1; // 启动中断允许寄存器
ES = 1; // 启动中断允许寄存器
}
void SendByte(unsigned char Byte)
{
SBUF = Byte;
}
void main()
{
UART_Init();
while(1);
}
// UART的中断处理函数,使用STC向单片机发送数据后单片机发出中断并将RI置1
void UART_Rountine() interrupt 4
{
if(RI == 1)
{
// 将接收到的数据再发给计算机
SendByte(SBUF);
// 接收到的数据会被放在SBUF中
P2 = ~SBUF;
RI = 0;
}
}