7.1 串行数据通信概述
计算机数据传送的2种方式
串行通信的数据通路的方式❗
- 单工方式(1-wire)
- 定义:信号(不包括联络信号)在信道中只能沿一个方向传送。
- 示例:发送方A (TXD) →接收方B (RXD)。

- 半双工方式()
- 定义:双方均具有发送和接收信息的能力,信道也具有双向传输性能,但在指定的时刻, 只能沿某一个方向传送信息,不能同时发送和接收。
- 示例:发送方A (TXD, RXD) ←→接收方B (TXD, RXD),但某一时刻只能单向传输。

- 全双工方式()
- 定义:信号沿两个方向同时传送,任何一方在同一时刻既能发送又能接收信息。
- 示例:发送方A (TXD->RXD_B, RXD<-TXD_B) <-> 接收方B (RXD<-TXD_A, TXD->RXD_A)。

同步传输和异步传输❗
波特率 (Baud Rate)❗
- 定义:串行通信时每秒钟信号变化次数,单位“BAUD”。
- 比特率:数据传输速率 bps (bit per second)。
在二进制通信中,比特率等于波特率。
这是因为对于二进制而言,信号变化一次(0/1)就代表着传输了一位数据。
- 标准速率:RS-232C标准规定了常用的标准速率,如50~19200bps,根据不同的数据量及线路状况设定。
异步串行通信的同步技术❗❗
既然没有时钟,那么一定要有某种约定来确保数据被正确传输
- 通信双方约定一个通信速率 (波特率)。
- 采用相同的数据传输格式 (起始位(低)、数据位、停止位(高))。
- 低位在前,高位在后

7.2 80C51串行口及控制
80C51串行口结构
特性:80C51中的串行口是一个全双工的异步串行通信接口,可作UART (通用异步接收和发送器)用,也可作同步移位寄存器用。
主要技术问题:
- 数据传送:传送中的标准、格式及工作方式问题。
- 数据转换:串行数据与并行数据之间的相互转换 (UART)。
波特率发生器:
- 由T1、T2及内部的一些控制开关和分频器所组成,提供TXCLOCK (发送时钟) 和RXCLOCK (接收时钟)。
- 相关SFR:TMOD, TCON, T2CON, TL1, TH1, TL2, TH2, PCON (电源控制寄存器,用于波特率控制)。
数据缓冲寄存器 SBUF:
- 存放发送和接收数据的两个独立的缓冲寄存器,在SFR的地址都是99H。
- 写SBUF (
MOV SBUF, A
) 引发串口发送。
- 读SBUF (
MOV A, SBUF
) 读取接收到的数据。
- 由于发送SBUF与接收SBUF独立,51串行口是全双工接口。
- CPU将数据送到发送SBUF后,SBUF自动一位一位发送,完成后 TI=1。
- 外部串行数据经RXD送入SBUF时,电路自动启动接收,完成后 RI=1。
串行口控制逻辑:
- 接受来自波特率发生器的时钟信号——TXCLOCK(发送时钟),RXCLOCK(接收时钟)
- 控制输入移位寄存器将外部串行数据转换为并行数据输入
- 控制输出移位寄存器将内部的并行数据转换为串行数据输出
- 控制串行中断(RI和TI)
引脚:
- RXD (P3.0) 用于接收数据(Receive),TXD (P3.1) 用于发送数据(Transmit)

80C51串行口控制寄存器
SCON (串行口控制寄存器) ❗❗
- 地址:98H (位地址9FH~98H)。

- 位定义:
- SM0, SM1 (位7, 位6):串行口工作方式选择位。
- SM2 (位5):多机通信控制位 (用于方式2和方式3)。
- : 当接收到第9位RB8为1(说明送过来的是地址)时,有效,RI=1,产生中断。 RB8为0(说明送过来的是数据),无效,不产生中断。
- : 无论RB8为1或0,数据均有效,RI=1,产生中断。
- 方式0时,SM2必须为0。
- 方式1时,若SM2=1,停止位必须为1。
- REN (位4):
- TB8 (位3):
- RB8 (位2):
- TI (位1):发送中断标志。 表示一帧数据发送结束,由软件清0。
- RI (位0):接收中断标志。 表示一帧数据接收结束,由软件清0。
SM0 | SM1 | 工作方式 | 特点 | 波特率 (典型) |
0 | 0 | 方式0 | 8位移位寄存器 | |
0 | 1 | 方式1 | 10位异步接收发送 | (T1产生) |
1 | 0 | 方式2 | 11位异步接收发送 | 或 |
1 | 1 | 方式3 | 11位异步接收发送 | (T1产生) |
在这个条件下,仅对收到的地址响应,不对收到的数据响应
在这个条件下,对收到的地址、数据均响应;
允许接收位。 允许接收, 禁止接收。
发送数据位8。 在方式2和方式3时,TB8是要发送的第9位数据。
TB8=1表示地址,TB8=0表示数据。
接收数据位8。 在方式2和方式3接收到的第9位数据。方式1中接收到的是停止位。 方式0中不使用。
- 系统复位后,SCON中所有位都被清除。
PCON (电源控制寄存器)
- 地址:87H (不能位寻址)。
- 位定义:
- SMOD (位7):波特率倍增位。 串行口波特率加倍。
- 具体可以看波特率的计算公式
- 其他位与掉电方式有关。
IE (中断允许寄存器)
- 地址:A8H。
- 位定义:
- ES (位4):串行中断允许位。 0为禁止,1为允许。
- EA (位7):总中断允许位。
7.3 串行口的工作方式
通过SCON寄存器的SM0和SM1位设置,共四种工作方式。
方式0:同步串行通信方式 ()
- 特点:同步串行通信方式,类似一个同步移位寄存器
- 数据传输:8位数据,低位在前。
- 波特率:固定为 。
- 引脚功能:
- RXD (P3.0):输入或输出数据。
- TXD (P3.1):输出同步移位时钟,因为同步传输还需要单片机输出时钟信号给对方。
- 帧格式:

- 发送:执行写SBUF指令 (
MOV SBUF,A
) 时启动。
- 接收:当REN=1且RI=0时启动。
- 时序:发送过程约10个机器周期,接收过程类似。
方式1:8位UART,可变波特率 ()
特点:
标准的8位UART,异步通信。
数据传输:
10位数据帧:1个起始位 (低),8位数据 (低位在前),1个停止位 (高)。
注意数据帧的概念。UART一次通信就传一个数据帧;而I2C、SPI理论上一次通讯可以传很多字节。

波特率:
由定时器T1或T2 (80C51无T2则仅T1) 的溢出率决定,可设定。
T1通常工作在方式2 (自动重装载) 以获得稳定波特率。
引脚功能:
RXD (P3.0) 接收数据,TXD (P3.1) 发送数据。
发送:
- 对SBUF写数据后,硬件自动加入起始位和停止位,从TXD串行输出。
- 发送结束TI置1。
- 实际发送开始于T1下一次溢出时刻。
接收:
- 条件:
- REN=1且RI清零后,RXD引脚检测到1到0的跳变启动接收。
- 启动16倍波特率速度采样
- 起始位确认:
连续8次采集到低电平确认起始位到来。
- 接收采样:
对RXD线以16倍波特率速度采样,在每个数据位的第7,8,9个脉冲采样并“三取二”确定数据。
- 接收结束,置位RI的条件:
- RI=0。
- 接收到的停止位=1(这里停止位的采样和普通数据位的采样一样,“三取二”

波特率计算 (使用定时器1):
- 公式:
分母32,来源于8051串行通信口(UART)内部的两个固定的硬件分频系数的乘积
- T1工作于方式0 (13位计数器):每次溢出需重装初值TC。
式中,TC表示计数初值;X表示中断程序所需的机器周期数目
- T1工作于方式1 (16位计数器):每次溢出需重装初值TC。
- T1工作于方式2 (8位自动重装载):无需中断服务程序重装,波特率更稳定,应禁止T1中断。
方式2和方式3:9位UART ( )
特点:
标准的9位UART,异步通信。
数据传输:
- 11位数据帧:1个起始位,9位数据(低位在前),1个停止位。
- 第9数据位(TB8发送,RB8接收)可作奇偶校验位或控制位。

引脚功能:
RXD (P3.0) 接收数据,TXD (P3.1) 发送数据。
波特率:
- 方式2 ():波特率几乎几乎固定。
波特率 = (即当SMOD=1时, ;当SMOD=0时, )
- 方式3 ()
波特率可变,由定时器T1的溢出率决定,和方式一一致
数据控制:
通过
SETB TB8
或 CLR TB8
设置发送的第9位。发送:
执行写SBUF指令启动。
接收:
- 条件:REN=1且RI清零后,RXD引脚检测到1到0的跳变启动接收。
- 如果第一个时钟周期接收到的不是0(说明不是起始位),则复位接收电路,继续检测RXD上1到0的跳变(起始位的检测和确认机制是基本一致的)
置位RI的条件 (受SM2影响):
- 若 :无论RB8为0或1,均置位RI,触发中断。
- 若 :只有当RB8=1时才置位RI,触发中断。若RB8=0,则接收数据被忽略
这一特性被用在下面的多机通信中👇
7.4 多机通信
intro
- 概念:整个系统有多个单片微机,需要相互通信。

- 实现机制:利用串行口工作方式2或方式3,以及SCON寄存器中的SM2位 (SCON.5)。

主-从通信系统❗❗
- 主机发起:每次通信都由主机发起。
- 从机地址:每个从机都有各自的地址 (通常一个字节)。
- 通信格式:主机先发送地址帧,然后发送数据帧。

地址帧:发送的第9位数据 (TB8) 置1。
数据帧:发送的第9位数据 (TB8) 清0。
- 从机初始状态:所有从机的SM2位均设置为1,并允许串行口中断接收。
- 地址识别:
- 主机发送地址帧 (TB8=1),所有从机因SM2=1且接收到RB8=1而响应中断。
- 从机在中断中比较接收到的地址与本机地址。
- 地址匹配:若地址相符,该从机将SM2清0,准备接收后续的数据帧。
- 地址不匹配:
- 若地址不符,该从机保持SM2=1,忽略后续的数据帧
- (因为数据帧的RB8将为0,SM2=1时不会产生中断),等待下一次地址帧。
- 数据传输:地址匹配的从机 (SM2=0) 接收主机发来的数据帧 (TB8=0)。
- 从机回复 (如果需要):被选中的从机可以向主机发送数据。 此时从机发送时TB8通常为0,主机接收时应将SM2设为0。
7.5 串行口的应用
波特率允许误差❗❗

异步串口通信没有时钟信号,时序的维持全靠双方约定的波特率。为保证正确接收,发送与接收波特率累积误差在最后一位采样时不应超过半个位周期。
例如:第10位累积误差 ,
- 其中 是误差百分比, 是位周期,9.5是最后一个bit采样的时刻
- 通常要求波特率误差 小于5%,因为
晶振选择与TH1初值
- 为获得精确的常用波特率,晶振频率的选择很重要。
- 常用晶振:11.0592MHz 或 7.3728MHz 可以产生无误差的常用波特率。 12MHz晶振在某些波特率下会有误差。
- 计算TH1 (定时器1方式2):
- 例:, BaudRate=2400, SMOD=0 ⇒
- 例:, BaudRate=1200, SMOD=0 ⇒}$。
方式0的编程和应用
- 用于扩展并行I/O口等。
- 示例:使用74LS164串入并出扩展并行输出口控制LED。
- 初始化:
MOV SCON, #00H
(方式0),CLR ES
。 - 发送:
MOV SBUF, A
,JNB TI, $
,CLR TI
。
方式1的编程和应用
- 示例:双机通信
- 甲机发送,乙机接收。串行口方式1,T1方式2作波特率发生器,波特率2400bps,晶振6MHz。
- 波特率计算:
- 初始化 (甲机):
MOV TMOD, #20H
,MOV TL1, #0FAH
,MOV TH1, #0FAH
,SETB TR1
,MOV SCON, #40H
(方式1, 禁止接收)。 - 发送首末地址 (查询方式):
MOV SBUF, data
,JNB TI, $
,CLR TI
。 - 发送数据块 (中断方式):
SETB ES
,SETB EA
,MOV SBUF, A
(发送第一字节),后续在中断服务程序中发送。 - 发送中断服务程序 (SINT):保护现场,发送下一字节,判断是否结束,恢复现场,RETI。
- 初始化 (乙机):类似甲机,但
MOV SCON, #50H
(方式1, 允许接收)。 - 接收中断服务程序 (RSINT):保护现场,读SBUF,根据标志判断是地址还是数据,存入RAM,更新指针和计数,判断结束,恢复现场,RETI。
- 示例:通过串行口发送带奇偶校验位的数据块
- ASCII码7位,最高位用作奇偶校验。 方式1,T1方式2,1200bps,。 查询发送。
- (SMOD=0)。
- 初始化:
MOV TMOD, #20H
,MOV PCON, #00H
,MOV TL1, #0E8H
,MOV TH1, #0E8H
,SETB TR1
,MOV SCON, #40H
(禁止接收)。 - 发送子程序 (SP-OUT):取数据,计算奇偶校验位 (P标志) 并置于ACC.7,
MOV SBUF, A
,JNB TI, $
,CLR TI
。
- 示例:通过串行口接收带奇偶校验位的数据块
- 接收32字节,存20H~3FH,1200bps,奇校验出错C置“1”。
- 初始化:类似发送,但
MOV SCON, #50H
(允许接收)。 - 接收子程序 (SP-IN):
JNB RI, $
,CLR RI
,MOV A, SBUF
。 检查奇偶性 (P标志),若出错,C=1。 去掉校验位后数据存A。
方式2、3的编程和应用
- 方式3 波特率设置与方式1相同,可由用户设置。
- 主要用于多机通信。
- 第9数据位TB8/RB8 也可用于校验位。
- 示例:利用第9位作为奇偶校验位编写发送中断程序
- 中断服务程序 (SPINT):关中断EA,保护现场PSW, ACC,开中断EA。 切换寄存器工作组 (SETB RS0),取数据,计算奇偶校验 (P标志),将校验位送TB8 (
MOV TB8, C
),数据送SBUF,指针增加。 关中断EA,恢复现场,清RS0,RETI。
第七章作业
里面有很多例程还是很好的,可以很大增进理解。