串口通信-51单片机
编辑1.串口通信
串口时一种应用十分广泛的通讯接口,串口成本低、容易使用、通串口是一种应用十分广泛的通讯信线路简单,可实现两个设备的互相通信。片机、单片机与电脑、单片机与各单片机的串口可以使单片机与单式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
51单片机内部自带UART(Universal Asynchronous Receiver可实现单片机的串口通信。Transmitter,通用异步收发器)
- 简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
- TXD与RXD要交叉连接
- 当只需单向的数据传输时,可以直接一根通信线
- 当电平标准不一致时,需要加电平转换芯片

1. 常见通讯接口
名称 | 引脚定义 | 通信方式 | 特点 |
---|---|---|---|
UART | TXD、RXD | 全双工、异步 | 点对点通信 |
I²C | SCL、SDA | 半双工、同步 | 可挂载多个设备 |
SPI | SCLK、MOSI、MISO、CS | 全双工、同步 | 可挂载多个设备 |
1-Wire | DQ | 半双工、异步 | 可挂载多个设备 |
此外还有:CAN、USB等
-
全双工:通信双方可以在同一时刻互相传输数据
- 两根线,一根发,一根收
-
半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
- 一根线,收发
-
单工:通信只能有一方发送到另一方,不能反向传输
-
只能由一方发向另一方,单向
-
-
异步:通信双方各自约定通信速率
-
同步:通信双方靠一根时钟线来约定通信速率
-
总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)
2. 51单片机的UART
STC89C52内部有1个UART,四种工作模式:
- 模式0:同步移位寄存器
- 模式1:8位UART,波特率可变(常用)
- 模式2:9位UART,波特率固定
- 模式3:9位UART,波特率可变

3. 串口参数及时序图
- 波特率:串口通信的速率(发送和接收各数据位的间隔时间)
- 检验位:用于数据验证
- 停止位:用于数据帧间隔

4. 串口模式图
SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器
串口进入后会进入中断系统
5. 串口相关寄存器
C51单片机串口通信整体流程
1. 模式1流程
模式1的发送过程(白话版):
- 配置好串口(配置模式和波特率)
- 配置好定时器1(八位自动重装模式,以及初始时间),并打开定时器。发送不需要中断
- 发送数据(就是把一个字节的数据直接赋值给SBUF,然后循环检测TI发送标志位,检测到TI为1时发送完成,这个时候手动重置TI为0)
void Uart1_Init(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x40; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式 8位自动重装
TL1 = 0xF4; //设置定时初始值
TH1 = 0xF4; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
void uart1_sendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI==0);
TI=0;
}
2.发送配置说明
发送数据的时候,只需要配置串口控制寄存器SCON和串口波特率寄存器PCON
STC89C51RC/RD+系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。
串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。
其格式如下:SCON:串行控制寄存器(可位寻址)
SM0/FE: 当PCON寄存器中的SMODO/PCON.6位为1时,该位用于错误检测。当检测到一个无效停止位时,通过UART接收器设置该位。它必须由软件清零。
当PCON寄存器中的SMODO/PCON.6位为0时,该位和SM1一起指定串行通信的工作方式,如下表所示。
其中SM0、SM1按下列组合确定串行口的工作方式:
-
配置SM0和SM1,就可以将串口配置为需要的工作模式,具体见上表
-
REN:接受控制位,1为允许接受
-
TB8/RB8:发送和接受时的第9位校验位,也就是模式2和3需要用的,模式1不需要都置0即可
-
TI和RI:为发送和接受中断标志位,必须要由软件重置为0
总结:常用模式1时,SCON配置为 0100 0000 也就是0x40
波特率选择特殊功能寄存器PCON配置
波特率计算方式见上上个表
举个例子:
我的系统晶振周期时11.0596, 设定定时器1初值以及重装值为F4也就是242, SMOD为2
先计算定时器的溢出率=11.0592/12/(256-242) = 0.0768
计算波特率=0.0768/16=0.0048MHZ=4800HZ
3. 接收配置说明
接受同样需要配置配置模式和波特率,定时器,除此之外还要配置中断函数,串口中断函数!
这里模式配置注意要把接受使能打开, 参考下面的代码,可发送可接受
#include <REGX52.H>
/**
* @brief UART串口初始化
* @param 无
* @retval 无
*/
void Uart1_Init(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式 8位自动重装
TL1 = 0xF4; //设置定时初始值
TH1 = 0xF4; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
EA = 1; // 使能总中断控制
ES = 1; //使能串口1中断
}
/**
* @brief 发送一个字节数据
* @param unsigned char Byte 要发送的数据
* @retval 无
*/
void Uart1_sendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI==0);
TI=0;
}
/*串口中断函数模板
void Uart1_Isr(void) interrupt 4
{
if (TI) //检测串口1发送中断
{
TI = 0; //清除串口1发送中断请求位
}
if (RI) //检测串口1接收中断
{
P2 = SBUF;
RI = 0; //清除串口1接收中断请求位
}
}
*/
- 0
- 0
-
分享