五、串行串口通信(UART)
下面讲复习提纲第五部分:五、串行串口通信(UART)。这一部分常考串口作用、TXD/RXD、波特率、串口工作方式、SCON寄存器、串口中断、单机/多机通信,也容易和定时器1方式2结合出初始化程序。
1. 串口通信是干什么的
Section titled “1. 串口通信是干什么的”复习提纲中写:
通信作用:实现单片机与电脑、单片机与单片机等设备的数据传输。可以理解成:
单片机不是孤立工作的它经常需要把数据发出去也经常需要接收外部设备发来的命令或数据例如:
单片机把温度值发给电脑显示电脑通过串口给单片机发送控制命令单片机和蓝牙模块通信单片机和串口屏通信两个单片机互相传递状态串口就是这些设备之间传输数据的一种常用接口。
考试答法:
串行通信接口用于单片机与计算机、其他单片机或通信模块之间进行数据传输,可实现数据发送、接收和远程控制。2. 并行通信和串行通信的区别
Section titled “2. 并行通信和串行通信的区别”PPT 第8章先讲了并行通信和串行通信。
并行通信是多个数据位同时传输。
比如传输 8 位数据:
D0 D1 D2 D3 D4 D5 D6 D78根数据线同时传优点:
速度快缺点:
线多成本高不适合远距离串行通信是一位一位按顺序传输。
比如传输一个字节:
第0位 -> 第1位 -> 第2位 -> ... -> 第7位优点:
线少成本低适合较远距离接口简单缺点:
同等条件下速度可能比并行慢对比表:
| 对比项 | 并行通信 | 串行通信 |
|---|---|---|
| 数据传输 | 多位同时传 | 一位一位传 |
| 数据线 | 多 | 少 |
| 距离 | 短距离较适合 | 较适合长距离 |
| 成本 | 较高 | 较低 |
| 单片机常见用途 | 外部总线扩展 | UART、模块通信、上位机通信 |
3. 同步通信和异步通信
Section titled “3. 同步通信和异步通信”串行通信又分同步和异步。
3.1 同步通信
Section titled “3.1 同步通信”同步通信需要收发双方共享时钟。
可以理解成:
一根数据线传数据另一根时钟线告诉对方什么时候采样优点:
效率高位同步准确缺点:
需要额外时钟线连接和时序更复杂3.2 异步通信
Section titled “3.2 异步通信”异步通信不专门传输同步时钟,收发双方各自用自己的时钟。为了让接收方知道一帧数据从哪里开始、哪里结束,就要加起始位和停止位。
UART 常用异步通信。
典型帧格式:
空闲高电平 -> 起始位0 -> 8位数据 -> 停止位1如果带校验位,则可能是:
起始位 + 数据位 + 校验位 + 停止位异步通信关键要求:
收发双方波特率必须一致否则接收方采样位置会错,数据就乱了。
4. 单工、半双工、全双工
Section titled “4. 单工、半双工、全双工”PPT 第8章还讲了数据传输方向。
| 类型 | 含义 | 例子 |
|---|---|---|
| 单工 | 只能单方向传输 | 只发不收的广播 |
| 半双工 | 双方都能传,但不能同时传 | 对讲机、常见RS-485 |
| 全双工 | 双方可以同时发送和接收 | 电话、51串口 |
51 单片机的串口是:
全双工异步串行口也就是说,它有独立的发送和接收缓冲结构,可以同时收发。
考试表达:
AT89C51/AT89S52片内串行口为全双工异步串行通信接口,可同时进行数据发送和接收。5. 串口引脚:TXD 和 RXD
Section titled “5. 串口引脚:TXD 和 RXD”复习提纲要求掌握:
TXD(P3.1):发送数据RXD(P3.0):接收数据一定不要记反。
P3.0 = RXD = 接收P3.1 = TXD = 发送两个设备连接时,要交叉连接:
单片机TXD -> 对方RXD单片机RXD <- 对方TXDGND -> 对方GND如果是单片机接 USB-TTL 模块:
P3.1/TXD -> USB-TTL的RXDP3.0/RXD -> USB-TTL的TXDGND -> GND如果接真正的 RS-232 串口,不能直接连接,因为电平标准不同,需要 MAX232 等电平转换芯片。
6. 波特率
Section titled “6. 波特率”复习提纲中写:
波特率:决定通信速度,常用9600、115200;双方波特率必须一致才能通信。6.1 波特率是什么意思
Section titled “6.1 波特率是什么意思”波特率可以粗略理解为每秒传输多少位。
例如:
9600bps:每秒约传9600位115200bps:每秒约传115200位UART 一帧除了 8 位数据,还可能包括起始位、停止位,所以实际每秒传输的有效字节数会小一些。
比如 9600bps,常见 1起始位 + 8数据位 + 1停止位:
1帧 = 10位每秒约 9600 / 10 = 960字节6.2 为什么双方波特率要一致
Section titled “6.2 为什么双方波特率要一致”异步串口没有单独时钟线,接收方按照自己的波特率去采样。
如果发送方和接收方波特率不一致:
接收方采样位置偏移可能把0读成1一帧数据错位接收到乱码所以串口通信前必须约定:
波特率数据位停止位校验方式考试重点一般是波特率一致。
7. 串口内部结构:SBUF、SCON、PCON
Section titled “7. 串口内部结构:SBUF、SCON、PCON”51 串口相关核心寄存器:
SBUF:串口数据缓冲寄存器SCON:串口控制寄存器PCON:电源控制寄存器,其中SMOD影响波特率7.1 SBUF:发送和接收都叫 SBUF
Section titled “7.1 SBUF:发送和接收都叫 SBUF”SBUF 很容易让人困惑,因为读和写都叫 SBUF,但硬件上对应不同缓冲器。
写SBUF:把数据放入发送缓冲器,启动发送读SBUF:从接收缓冲器取出收到的数据例如发送:
SBUF = 'A';接收:
dat = SBUF;考试可以写:
SBUF是串行口数据缓冲寄存器,写SBUF表示发送数据,读SBUF表示读取接收到的数据。8. SCON 串口控制寄存器
Section titled “8. SCON 串口控制寄存器”SCON 是串口控制寄存器,字节地址 98H,可位寻址。
常用位:
| 位 | 名称 | 作用 |
|---|---|---|
| SM0、SM1 | 工作方式选择 | 决定4种串口工作方式 |
| SM2 | 多机通信控制 | 方式2/3中常用 |
| REN | 接收允许 | 1允许接收 |
| TB8 | 发送第9位 | 方式2/3使用 |
| RB8 | 接收第9位 | 方式2/3使用 |
| TI | 发送中断标志 | 发送完成置1 |
| RI | 接收中断标志 | 接收完成置1 |
8.1 SM0、SM1:选择工作方式
Section titled “8.1 SM0、SM1:选择工作方式”| SM0 | SM1 | 工作方式 |
|---|---|---|
| 0 | 0 | 方式0 |
| 0 | 1 | 方式1 |
| 1 | 0 | 方式2 |
| 1 | 1 | 方式3 |
最常用的是方式1:
SM0=0, SM1=18.2 REN:允许接收
Section titled “8.2 REN:允许接收”如果要让串口接收数据,必须:
REN = 1;常见初始化:
SCON = 0x50;0x50 = 0101 0000B,含义是:
SM0=0,SM1=1:串口方式1REN=1:允许接收8.3 TI 和 RI
Section titled “8.3 TI 和 RI”TI=1:一帧数据发送完成RI=1:一帧数据接收完成重点:
TI和RI必须软件清零。9. 串口 4 种工作方式
Section titled “9. 串口 4 种工作方式”9.1 方式0:同步移位寄存器方式
Section titled “9.1 方式0:同步移位寄存器方式”方式0不是平时最常说的 UART 异步通信,而是同步移位方式。
特点:
8位数据无起始位、停止位波特率固定为 fosc/12常用于外接移位寄存器扩展I/OPPT 中举例用 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位标志的数据传输10. 串口中断
Section titled “10. 串口中断”复习提纲中写:
接收或发送完成后触发中断,实现高效数据收发。串口中断入口:
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. 方式1串口初始化示例
Section titled “11. 方式1串口初始化示例”以 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工作在方式2TH1/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;}12. 单机通信和多机通信
Section titled “12. 单机通信和多机通信”复习提纲中说:
熟悉各种模式,掌握单机以及多机通信模式的实现过程。12.1 单机/双机通信
Section titled “12.1 单机/双机通信”最常见的是一个单片机和一个设备通信。
例如:
单片机 <-> 电脑单片机 <-> 蓝牙模块单片机 <-> 另一个单片机一般使用方式1。
通信前约定:
波特率相同数据格式相同TXD/RXD交叉连接共地12.2 多机通信
Section titled “12.2 多机通信”多机通信常见结构:
一个主机 + 多个从机方式2/方式3提供第9位数据,可以用来区分:
地址帧数据帧典型过程:
主机先发送地址帧,第9位为1所有从机接收地址并判断是不是自己被选中的从机继续接收数据帧未被选中的从机忽略后续数据主机再发送数据帧,第9位为0SCON 中的 SM2 与多机通信有关:
SM2=1时,可让从机只对特定第9位的数据产生接收中断考试一般不会让你完整写多机通信程序,但要知道:
方式2、方式3支持9位数据,常用于多机通信;第9位可用于区分地址帧和数据帧。13. 常见考法
Section titled “13. 常见考法”考法1:问串口引脚
Section titled “考法1:问串口引脚”答案:
RXD为P3.0,用于接收数据;TXD为P3.1,用于发送数据。考法2:问波特率
Section titled “考法2:问波特率”答案:
波特率表示串行通信的数据传输速率,通信双方必须设置相同波特率,否则会接收错误或出现乱码。考法3:问方式1特点
Section titled “考法3:问方式1特点”答案:
方式1为8位异步串行通信方式,包含1位起始位、8位数据位和1位停止位,波特率可变,是51单片机串口最常用的工作方式。考法4:问 TI 和 RI
Section titled “考法4:问 TI 和 RI”答案:
TI为发送中断标志,一帧数据发送完成后置1;RI为接收中断标志,一帧数据接收完成后置1。两者都必须由软件清零。考法5:写串口初始化
Section titled “考法5:写串口初始化”常见答案:
TMOD |= 0x20;TH1 = 0xFD;TL1 = 0xFD;SCON = 0x50;TR1 = 1;ES = 1;EA = 1;考法6:问多机通信
Section titled “考法6:问多机通信”答案:
51串口方式2和方式3为9位异步通信方式,可用于多机通信。第9位可用来区分地址帧和数据帧,主机先发送地址帧选中从机,再发送数据帧进行通信。14. 易混点
Section titled “14. 易混点”1. TXD 和 RXD 不要记反
Section titled “1. TXD 和 RXD 不要记反”P3.0 = RXD = 接收P3.1 = TXD = 发送2. SBUF 读写含义不同
Section titled “2. SBUF 读写含义不同”写SBUF:发送读SBUF:接收3. 串口中断入口只有一个
Section titled “3. 串口中断入口只有一个”虽然有发送和接收两个标志,但都进入:
interrupt 44. RI/TI 不会自动清零
Section titled “4. RI/TI 不会自动清零”必须写:
RI = 0;TI = 0;5. 方式1最常用
Section titled “5. 方式1最常用”不要把方式0误认为普通串口通信。方式0更偏向同步移位寄存器扩展 I/O;普通 UART 通信最常用方式1。
6. 串口和定时器1经常绑定
Section titled “6. 串口和定时器1经常绑定”方式1波特率常由 T1 方式2产生,所以串口初始化经常看到:
TMOD = 0x20;TH1 = 0xFD;TR1 = 1;第五部分背诵版
Section titled “第五部分背诵版”串行通信用于单片机与计算机、其他单片机或通信模块之间进行数据传输。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共用同一中断入口,必须在中断服务程序中判断并由软件清零。