跳转到内容

五、串行串口通信(UART)

下面讲复习提纲第五部分:五、串行串口通信(UART)。这一部分常考串口作用、TXD/RXD、波特率、串口工作方式、SCON寄存器、串口中断、单机/多机通信,也容易和定时器1方式2结合出初始化程序。


复习提纲中写:

通信作用:实现单片机与电脑、单片机与单片机等设备的数据传输。

可以理解成:

单片机不是孤立工作的
它经常需要把数据发出去
也经常需要接收外部设备发来的命令或数据

例如:

单片机把温度值发给电脑显示
电脑通过串口给单片机发送控制命令
单片机和蓝牙模块通信
单片机和串口屏通信
两个单片机互相传递状态

串口就是这些设备之间传输数据的一种常用接口。

考试答法:

串行通信接口用于单片机与计算机、其他单片机或通信模块之间进行数据传输,可实现数据发送、接收和远程控制。

PPT 第8章先讲了并行通信和串行通信。

并行通信是多个数据位同时传输。

比如传输 8 位数据:

D0 D1 D2 D3 D4 D5 D6 D7
8根数据线同时传

优点:

速度快

缺点:

线多
成本高
不适合远距离

串行通信是一位一位按顺序传输。

比如传输一个字节:

第0位 -> 第1位 -> 第2位 -> ... -> 第7位

优点:

线少
成本低
适合较远距离
接口简单

缺点:

同等条件下速度可能比并行慢

对比表:

对比项并行通信串行通信
数据传输多位同时传一位一位传
数据线
距离短距离较适合较适合长距离
成本较高较低
单片机常见用途外部总线扩展UART、模块通信、上位机通信

串行通信又分同步和异步。

同步通信需要收发双方共享时钟。

可以理解成:

一根数据线传数据
另一根时钟线告诉对方什么时候采样

优点:

效率高
位同步准确

缺点:

需要额外时钟线
连接和时序更复杂

异步通信不专门传输同步时钟,收发双方各自用自己的时钟。为了让接收方知道一帧数据从哪里开始、哪里结束,就要加起始位和停止位。

UART 常用异步通信。

典型帧格式:

空闲高电平 -> 起始位0 -> 8位数据 -> 停止位1

如果带校验位,则可能是:

起始位 + 数据位 + 校验位 + 停止位

异步通信关键要求:

收发双方波特率必须一致

否则接收方采样位置会错,数据就乱了。


PPT 第8章还讲了数据传输方向。

类型含义例子
单工只能单方向传输只发不收的广播
半双工双方都能传,但不能同时传对讲机、常见RS-485
全双工双方可以同时发送和接收电话、51串口

51 单片机的串口是:

全双工异步串行口

也就是说,它有独立的发送和接收缓冲结构,可以同时收发。

考试表达:

AT89C51/AT89S52片内串行口为全双工异步串行通信接口,可同时进行数据发送和接收。

复习提纲要求掌握:

TXD(P3.1):发送数据
RXD(P3.0):接收数据

一定不要记反。

P3.0 = RXD = 接收
P3.1 = TXD = 发送

两个设备连接时,要交叉连接:

单片机TXD -> 对方RXD
单片机RXD <- 对方TXD
GND -> 对方GND

如果是单片机接 USB-TTL 模块:

P3.1/TXD -> USB-TTL的RXD
P3.0/RXD -> USB-TTL的TXD
GND -> GND

如果接真正的 RS-232 串口,不能直接连接,因为电平标准不同,需要 MAX232 等电平转换芯片。


复习提纲中写:

波特率:决定通信速度,常用9600、115200;双方波特率必须一致才能通信。

波特率可以粗略理解为每秒传输多少位。

例如:

9600bps:每秒约传9600位
115200bps:每秒约传115200位

UART 一帧除了 8 位数据,还可能包括起始位、停止位,所以实际每秒传输的有效字节数会小一些。

比如 9600bps,常见 1起始位 + 8数据位 + 1停止位:

1帧 = 10位
每秒约 9600 / 10 = 960字节

异步串口没有单独时钟线,接收方按照自己的波特率去采样。

如果发送方和接收方波特率不一致:

接收方采样位置偏移
可能把0读成1
一帧数据错位
接收到乱码

所以串口通信前必须约定:

波特率
数据位
停止位
校验方式

考试重点一般是波特率一致。


7. 串口内部结构:SBUF、SCON、PCON

Section titled “7. 串口内部结构:SBUF、SCON、PCON”

51 串口相关核心寄存器:

SBUF:串口数据缓冲寄存器
SCON:串口控制寄存器
PCON:电源控制寄存器,其中SMOD影响波特率

SBUF 很容易让人困惑,因为读和写都叫 SBUF,但硬件上对应不同缓冲器。

写SBUF:把数据放入发送缓冲器,启动发送
读SBUF:从接收缓冲器取出收到的数据

例如发送:

SBUF = 'A';

接收:

dat = SBUF;

考试可以写:

SBUF是串行口数据缓冲寄存器,写SBUF表示发送数据,读SBUF表示读取接收到的数据。

SCON 是串口控制寄存器,字节地址 98H,可位寻址。

常用位:

名称作用
SM0、SM1工作方式选择决定4种串口工作方式
SM2多机通信控制方式2/3中常用
REN接收允许1允许接收
TB8发送第9位方式2/3使用
RB8接收第9位方式2/3使用
TI发送中断标志发送完成置1
RI接收中断标志接收完成置1
SM0SM1工作方式
00方式0
01方式1
10方式2
11方式3

最常用的是方式1:

SM0=0, SM1=1

如果要让串口接收数据,必须:

REN = 1;

常见初始化:

SCON = 0x50;

0x50 = 0101 0000B,含义是:

SM0=0,SM1=1:串口方式1
REN=1:允许接收
TI=1:一帧数据发送完成
RI=1:一帧数据接收完成

重点:

TI和RI必须软件清零。

方式0不是平时最常说的 UART 异步通信,而是同步移位方式。

特点:

8位数据
无起始位、停止位
波特率固定为 fosc/12
常用于外接移位寄存器扩展I/O

PPT 中举例用 74LS164 扩展 LED 输出。

9.2 方式1:8位异步通信,最常用

Section titled “9.2 方式1:8位异步通信,最常用”

复习提纲说:

常用方式1:8位异步串行通信,可变波特率,最常用。

方式1帧格式:

1位起始位 + 8位数据位 + 1位停止位

特点:

异步通信
8位数据
可变波特率
常用于单片机与电脑、蓝牙模块、串口屏等通信

初始化常见写法:

SCON = 0x50; // 方式1,允许接收

9.3 方式2:9位异步通信,固定波特率

Section titled “9.3 方式2:9位异步通信,固定波特率”

方式2特点:

9位数据
固定波特率
第9位可作校验位或多机通信地址/数据标志

9.4 方式3:9位异步通信,可变波特率

Section titled “9.4 方式3:9位异步通信,可变波特率”

方式3和方式2类似,也是 9 位数据,但波特率可变。

常用于:

多机通信
带第9位标志的数据传输

复习提纲中写:

接收或发送完成后触发中断,实现高效数据收发。

串口中断入口:

void uart_isr(void) interrupt 4

串口中断有两个来源:

RI:接收完成
TI:发送完成

它们共用一个中断入口,所以必须在中断函数里判断。

示例:

void uart_isr(void) interrupt 4
{
unsigned char dat;
if (RI)
{
RI = 0; // 必须清0
dat = SBUF; // 读取接收数据
SBUF = dat; // 回显
}
if (TI)
{
TI = 0; // 必须清0
}
}

这段程序的作用是:

收到什么字符,就发回什么字符

以 11.0592MHz 晶振、9600 波特率为例,常见代码:

#include <reg51.h>
void uart_init(void)
{
TMOD |= 0x20; // T1方式2,自动重装
TH1 = 0xFD; // 9600波特率常用初值
TL1 = 0xFD;
SCON = 0x50; // 串口方式1,允许接收
TR1 = 1; // 启动定时器1
ES = 1; // 开串口中断
EA = 1; // 开总中断
}

逐句理解:

TMOD |= 0x20:让T1工作在方式2
TH1/TL1 = 0xFD:设置波特率
SCON = 0x50:串口方式1,允许接收
TR1 = 1:启动T1产生波特率
ES = 1:允许串口中断
EA = 1:允许总中断

如果不用中断,也可以查询发送标志:

void uart_send(unsigned char dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}

复习提纲中说:

熟悉各种模式,掌握单机以及多机通信模式的实现过程。

最常见的是一个单片机和一个设备通信。

例如:

单片机 <-> 电脑
单片机 <-> 蓝牙模块
单片机 <-> 另一个单片机

一般使用方式1。

通信前约定:

波特率相同
数据格式相同
TXD/RXD交叉连接
共地

多机通信常见结构:

一个主机 + 多个从机

方式2/方式3提供第9位数据,可以用来区分:

地址帧
数据帧

典型过程:

主机先发送地址帧,第9位为1
所有从机接收地址并判断是不是自己
被选中的从机继续接收数据帧
未被选中的从机忽略后续数据
主机再发送数据帧,第9位为0

SCON 中的 SM2 与多机通信有关:

SM2=1时,可让从机只对特定第9位的数据产生接收中断

考试一般不会让你完整写多机通信程序,但要知道:

方式2、方式3支持9位数据,常用于多机通信;第9位可用于区分地址帧和数据帧。

答案:

RXD为P3.0,用于接收数据;TXD为P3.1,用于发送数据。

答案:

波特率表示串行通信的数据传输速率,通信双方必须设置相同波特率,否则会接收错误或出现乱码。

答案:

方式1为8位异步串行通信方式,包含1位起始位、8位数据位和1位停止位,波特率可变,是51单片机串口最常用的工作方式。

答案:

TI为发送中断标志,一帧数据发送完成后置1;RI为接收中断标志,一帧数据接收完成后置1。两者都必须由软件清零。

常见答案:

TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
SCON = 0x50;
TR1 = 1;
ES = 1;
EA = 1;

答案:

51串口方式2和方式3为9位异步通信方式,可用于多机通信。第9位可用来区分地址帧和数据帧,主机先发送地址帧选中从机,再发送数据帧进行通信。

P3.0 = RXD = 接收
P3.1 = TXD = 发送
写SBUF:发送
读SBUF:接收

虽然有发送和接收两个标志,但都进入:

interrupt 4

必须写:

RI = 0;
TI = 0;

不要把方式0误认为普通串口通信。方式0更偏向同步移位寄存器扩展 I/O;普通 UART 通信最常用方式1。

方式1波特率常由 T1 方式2产生,所以串口初始化经常看到:

TMOD = 0x20;
TH1 = 0xFD;
TR1 = 1;

串行通信用于单片机与计算机、其他单片机或通信模块之间进行数据传输。51单片机串口引脚为P3.0/RXD和P3.1/TXD,其中RXD用于接收,TXD用于发送。连接两个串口设备时,TXD应接对方RXD,RXD应接对方TXD,并且要共地。
波特率表示串行通信的数据传输速率,通信双方波特率必须一致。51单片机串口有4种工作方式,方式0为同步移位寄存器方式,方式1为8位异步通信方式且波特率可变,是最常用方式,方式2和方式3为9位异步通信方式,可用于多机通信。
SCON是串口控制寄存器,SM0、SM1用于选择工作方式,REN用于允许接收,TI为发送完成标志,RI为接收完成标志。写SBUF表示发送数据,读SBUF表示读取接收数据。串口中断入口为interrupt 4,RI和TI共用同一中断入口,必须在中断服务程序中判断并由软件清零。