第 6章 串行通信本章要点
异步通信和同步通信
串行通信波特率
串行通信的制式
串行通信的校验
串行口特殊功能寄存器
串行工作方式串行通信 优点,便于长距离传送缺点,传送速度较慢计算机与外界信息交换称为 通信 。
通信的 基本方式 可分为并行通信和串行通信:
并行通信 是数据的各位同时发送或同时接收;
串行通信 是数据的各位依次逐位发送或接收。
并行通信 优点,传送速度快缺点,不便长距离传送串行通信的基本特征是 数据 逐位顺序 进行传送串行通信的格式及约定(如:同步方式、通讯速率、数据块格式、信号电平 …… 等)不同,形成了多种串行通信的协议与接口标准。
常见的有:
通用异步收发器 (UART)—— 本课程介绍的串口
通用串行总线( USB)
I2C总线
CAN总线
SPI总线
RS-485,RS-232C,RS422A标准 …… 等等异步通信对硬件要求较低,实现起来比较简单,灵活,适用于数据的随机发送 /接收,但因每个字节都要建立一次同步,即每个字符都要额外附加两位,所以工作速度较低,在单片机中主要采用异步通信方式 。
§ 6-1 串行通信概述一,异步通信和同步通信串行通信按同步方式可分为异步通信和同步通信。
1,异步通信异步通信依靠起始位、停止位保持通信同步。
异步通信数据传送按帧传输,一帧数据包含起始位、数据位、校验位和停止位 。
同步通信传输速度较快,但要求有准确的时钟来实现收发双方的严格同步,对硬件要求较高,适用于成批数据传送 。
2,同步通信同步通信依靠同步字符保持通信同步。
同步通信是 由 1~ 2个同步字符和多字节数据位组成,同步字符作为起始位以触发同步时钟开始发送或接收数据;多字节数据之间不允许有空隙,每位占用的时间相等;空闲位需发送同步字符。
波特率的倒数即为每位传输所需的时间 。
相互通信的甲乙双方必须具有相同的波特率,否则无法成功地完成串行数据通信 。
二,串行通信波特率波特率 bps(bit per second)定义,
每秒传输数据的位数,即:
1波特 = 1位 /秒( 1bps)
三,串行通信的制式串行通信按照数据传送方向可分为三种制式:
单工制式 是指甲乙双方通信时 只能单向传送数据,发送方和接收方固定。
1,单工制式( Simplex)
半双工制式 是指通信双方都具有发送器和接收器,既可发送也可接收,但不能同时接收和发送,发送时不能接收,接收时不能发送 。
2,半双工制式( Half Duplex)
全双工制式 是指通信双方均设有发送器和接收器,并且信道划分为发送信道和接收信道,
因此全双工制式可实现甲乙双方 同时发送和接收数据,发送时能接收,接收时也能发送 。
3,全双工制式( Full Duplex)
四,串行通信的校验
3,循环冗余码校验
( Cyclic Redundancy Check,简称 CRC)
1,奇偶校验
2,累加和校验累加和校验 是指发送方将所发送的数据块求和,并将“校验和”附加到数据块末尾。接收方接收数据时也是先对数据块求和,将所得结果与发送方的
“校验和”进行比较,相符则无差错,否则即出现了差错。“校验和”的加运算可用逻辑加,也可用算术加。累加和校验 的缺点是无法检验出字节位序
(或 1,0位序不同 )的错误。
循环冗余码校验的基本原理 是将一个数据块看成一个位数很长的二进制数,然后用一个特定的数去除它,将余数作校验码附在数据块后一起发送。接收端收到该数据块和校验码后,进行同样的运算来校验传送是否出错。目前 CRC已广泛用于数据存储和数据通信中,并在国际上形成规范,已有不少现成的 CRC软件算法。
80C51系列单片机有一个 全双工的串行口,这个口既可以用于网络通信,也可以实现串行异步通信,还可以作为同步移位寄存器使用 。
§ 6-2 80C51串行口
51单片机的串行接口
SBUF
(发)
SBUF
(收)
发送控制器 TI
接收控制器 RI
移位寄存器波特率发生器
T1
1
A
累加器
(门 )移位寄存器
RxD
TxD
去申请中断引脚引脚
CP
U
内部发送时,只需将发送数据输入 SBUF,CPU将自动启动和完成串行数据的发送;
接收时,CPU将自动把接收到的数据存入 SBUF,用户只需从 SBUF中读出接收数据 。
一,串行口特殊功能寄存器
1,串行数据缓冲器 SBUF
在 逻辑上 只有一个,既表示发送寄存器,又表示接收寄存器,具有同一个单元地址 99H,用 同一寄存器名 SBUF。
在 物理上有两个,一个是发送缓冲寄存器,另一个是接收缓冲寄存器。
指令 MOV SBUF,A 启动一次数据发送,可向 SBUF
再发送下一个数指令 MOV A,SBUF 完成一次数据接收,SBUF可再接收下一个数
2,串行控制寄存器 SCON
SCON D7 D6 D5 D4 D3 D2 D1 D0
位名称 SM0 SM1 SM2 REN TB8 RB8 TI RI
位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
功能 工作方式 选择 多机通信 控制 接收允许 发送第 9位 接收第 9位 发送中断 接收中断
① SM0 SM1 —— 串行口 工作方式 选择位 。
② SM2 —— 多机通信控制位 。
③ REN —— 允许 接收控制位。 REN=1,允许接收。
④ TB8 —— 方式 2和方式 3中要发送的第 9位数据 。
⑤ RB8 —— 方式 2和方式 3中要接收的第 9位数据。
⑥ TI —— 发送 中断标志 。
⑦ RI —— 接收 中断标志 。
① SM0 SM1—— 串行口工作方式选择位。其状态组合所对应的工作方式如表 6-2所示。
SM0 SM1 工作方式 功能说明
00 0 同步移位寄存器输入 /输出,波特率 固定 为 fosc/12
01 1 8位 UART;波特率 可变 (TI溢出率 /n,n=32或 16)
10 2 9位 UART,波特率 固定 为 fosc/n,(n=64或 32)
11 3 9位 UART,波特率 可变 (T1溢出率 /n,n=32或 16)
② SM2------多机通信控制位。在方式 2和方式 3中,若 SM2=1,
且 RB8(接收到的第 9位数据 )=1时,将接收到的前 8位数据送入
SBUF,并置位 RI产生中断请求;否则,将接收到的 8位数据丢弃。而当 SM2=0时,则不论第 9位数据为 0还是为 1,都将前
8位数据装入 SBUF中,并产生中断请求。
在方式 0时,SM2必须为 0。
③ REN------允许接收控制位。 REN位用于对串行数据的接收进行控制,REN=0,禁止接收; REN=1,允许接收。该位由软件置位或复位。
④ TB8------方式 2和方式 3中要发送的第 9位数据。在方式 2和方式 3时,TB8是发送的第 9位数据。在多机通信中,以 TB8位的状态表示主机发送的是地址还是数据:
TB8=0表示数据,TB8=1表示地址。该位由软件置位或复位。
TB8还可用于奇偶校验位。
⑤ RB8------方式 2和方式 3中要接收的第 9位数据。在方式 2或方式 3时,RB8存放接收到的第 9位数据。
⑥ TI------发送中断标志。当方式 0时,发送完第 8位数据后,该位由硬件置位。在其他方式下,遇发送停止位时,该位由硬件置位。因此 TI=1,表示帧发送结束,可软件查询 TI位标志,也可以请求中断。
TI位必须由软件清 0。
⑦ RI------接收中断标志。当方式 0时,接收完第 8
位数据后,该位由硬件置位。在其他方式下,当接收到停止位时,该位由硬件置位。因此 RI=1,表示帧接收结束,可软件查询 RI位标志,也可以请求中断。 RI位也必须由软件清 0。
接收 /发送数据,无论是否采用中断方式工作,每接收 /发送一个数据都必须用指令对 RI/TI 清 0,以备下一次收 /发。
3,电源控制寄存器 PCON
PCON D7 D6 D5 D4 D3 D2 D1 D0
位名称 SMOD — — — GF1 GF0 PD IDL
SMOD=1,串行口波特率加倍。 PCON寄存器不能进行位寻址。
SMOD:在串行口工作方式 1,2,3 中,是 波特率加倍位
=1 时,波特率加倍
=0 时,波特率不加倍。
(在 PCON中只有这一个位与串口有关 )
二,串行工作方式
80C51串行通信共有 4种 工作方式,由串行控制寄存器 SCON
中 SM0 SM1决定。
1、串行工作方式 0(同步移位寄存器工作方式)
以 RXD( P3.0)端作为数据移位的输入 /输出端,
以 TXD( P3.1)端输出移位脉冲。
移位数据的发送和接收以 8位为一帧,不设 起始位和停止位,无论输入 /输出,均低位在前高位在后。
其帧格式为:
D0 D1 D2 D3 D4 D5 D6 D7
方式 0可将 串行 输入输出数据 转换成 并行 输入输出数据 。
⑴ 数据发送在 移位时钟脉冲( TXD) 的控制下,数据从串行口 RXD
端逐位移入 74HC164 SA,SB端。 当 8位数据全部移出后,
SCON寄存器的 TI位被自动置 1。 其后 74HC164的内容即可并行输出。 74HC164 CLR为清 0端,输出时 CLR必须为 1,
否则 74HC164 Q0~ Q7输出为 0。
串行口作为并行输出口使用时,要有,串入并出,
的移位寄存器配合 。 (例如 CD4094或 74HCl64)
(2) 数据接收串行口作为并行输入口使用时,要有,并入串出,
的移位寄存器配合 。 (例如 CD4014或 74HCl65)
74HC165 S/L端为移位 /置入端,当 S/L=0时,从 Q0~
Q7并行置入数据,当 S/L=1时,允许从 QH端移出数据 。 在
80C51串行控制寄存器 SCON中的 REN=1时,TXD端发出移位时钟脉冲,从 RXD端串行输入 8位数据 。 当接收到第 8位数据 D7后,置位中断标志 RI,表示一帧数据接收完成 。
⑶ 波特率,方式 0 波特率固定,为单片机晶振频率的十二分之一。即 一个机器周期进行一次移位。
⑷ 应用举例
【 例 6-1】 电路如图所示,试编制程序按下列顺序要求每隔
0.5秒循环操作。
④ 从右向左依次点亮,
每次亮一个;
⑤ 从左向右依次点亮,
每次增加一个,直至全部点亮;
⑥ 返回从②不断循环。
① 8个发光二极管全部点亮;
② 从左向右依次暗灭,每次减少一个,直至全灭;
③ 从左向右依次点亮,
每次亮一个;
解:编程如下:
LIGHT:MOV SCON,#00H ;串行口方式 0
CLR ES ;禁止串行中断 P121
MOV DPTR,#TAB ;置发光二极管亮暗控制字表首址
LP1,MOV R7,#0 ;置顺序编号 0
LP2,MOV A,R7 ;读顺序编号
MOVC A,@A+DPTR ;读控制字
CLR P1.0 ;关闭并行输出,STR=O时,关闭并行输 出;
MOV SBUF,A ;启动串行发送
JNB TI,$ ;等待发送完毕
CLR TI ;清发送中断标志
SETB P1.0 ;开启并行输出,STR=1时,开启并行输 出;
LCALL DLY500ms ;调用延时 0.5秒子程序 (参阅例 4-13)
INC R7 ;指向下一控制字
CJNE R7,#30,LP2 ;判循环操作完否?未完继续
SJMP LP1 ;顺序编号 0~ 29依次操作完毕,从 0开始重新循环
TAB,DB 0FFH,7FH,3FH,1FH,0FH,07H,03H,01H,00H;从左向右依次暗灭,
每次减少一个,直至全灭 ;
DB 80H,40H,20H,10H,08H,04H,02H,01H;从左向右依次点亮,每次亮一个
DB 02H,04H,08H,10H,20H,40H,80H;从右向左依次点亮,每次亮一个
DB 0C0H,0E0H,0F0H,0F8H,0FCH,0FEH;从左向右依次点亮,
每次增加一个,直至全部点亮 ;
【 例 】 电路如图所示,试编制程序输入 K1~ K8状态数据,并存入内
RAM 40H。
解:编程如下:
KIN,MOV SCON,#00H;串行口方式 0
CLR ES ;禁止串行中断
CLR P1.0 ;锁存并行输入数据
SETB P1.0 ;允许串行移位操作
SETB REN ;允许并启动接收 ( TXD发送移位脉冲 )
JNB RI,$ ;等待接收完毕
MOV 40H,SBUF ;存入 K1~ K8状态数据
RET ;
2,串行工作方式 1
方式 1是 一帧 10位 的异步串行通信方式,包括 1个起始位,8个数据位和一个停止位 。
其帧格式为:
起始 D0 D1 D2 D3 D4 D5 D6 D7 停止
⑴ 数据发送发送时只要将数据写入 SBUF,在串行口由硬件自动加入起始位和停止位,构成一个完整的帧格式 。 然后在移位脉冲的作用下,由 TXD端串行输出 。 一帧数据发送完毕,将 SCON
中的 TI置 1。
⑵ 数据接收接收时,在 REN=1前提下,当采样到 RXD从 1向 0跳变状态时,就认定为已接收到起始位 。 随后在移位脉冲的控制下,
将 串行 接收 数据 移入 SBUF中 。 一帧数据 接收 完毕,将 SCON中的 RI置 1,表示可以从 SBUF取走接收到的一个字符 。
在实际应用时,通常是先确定波特率,后根据波特率求 T1定 时初值,因此上式又可写为:
⑶ 波特率方式 1波特率可变,由定时 /计数器 T1的计数溢出率来决定。
波特率 = 2SMOD× ( T1溢出率) / 32
其中 SMOD为 PCON寄存器中最高位的值,
SMOD=1表示波特率倍增。
当定时/计数器 T1用作波特率发生器时,通常选用定时初值自动重装的工作方式 2(注意:不要把定时/计数器的工作方式与串行口的工作方式搞混淆了 )。其计数结构为 8位,假定计数初值为
COUNT,单片机的机器周期为 T,则定时时间为
( 256-COUNT) *T。从而在 1s内发生溢出的次数
(即溢出率)为:
TC O U N T *)256(
1
波特率 =(2SMOD/32)?T1的溢出率波特率 =(2SMOD/32)?T1的溢出率
溢出率,T1溢出的频繁程度即,T1溢出一次所需时间的倒数。
初值 X = 2n - 2
SMOD? fosc
32? 波特率? 12
波特率 =
2SMOD? fosc
32? 12(2n - X)
其中,X 是定时器初值
⑷ 应用举例
【 例 6-3】 设甲乙机以串行方式 1进行数据传送,
fosc=11.0592MHz,波特率为 1200b/s。 甲机发送的
16个数据存在内 RAM 40H~ 4FH单元中,乙机接收后存在内 RAM 50H为首地址的区域中 。
T1初值 = 256 - × = 232 = E8H32 12× 1200
解,串行方式 1波特率取决于 T1溢出率 (设 SMOD=0),
计算 T1定时初值:
1105920020
甲机发送子程序:
MOV TMOD,#20H ;置 T1定时器工作方式 2
MOV TL1,#0E8H ;置 T1计数初值
MOV TH1,#0E8H ;置 T1计数重装值
CLR ET1 ;禁止 T1中断
SETB TR1 ;T1启动
MOV SCON,#40H ;置串行方式 1,禁止接收
MOV PCON,#00H ;置 SMOD=0(SMOD不能位操作 )
CLR ES ;禁止串行中断
MOV R0,#40H ;置发送数据区首地址
MOV R2,#16 ;置发送数据长度
MOV A,@R0 ;读一个数据
MOV SBUF,A ;发送
JNB TI,$ ;等待一帧数据发送完毕
CLR TI ;清发送中断标志
INC R0 ;指向下一字节单元
DJNZ R2,TRSA ;判 16个数据发完否?未完继续
RET ;
TXDA:
TRSA:
MOV TMOD,#20H ;置 T1定时器工作方式 2
MOV TL1,#0E8H ;置 T1计数初值
MOV TH1,#0E8H ;置 T1计数重装值
CLR ET1 ;禁止 T1中断
SETB TR1 ;T1启动
MOV SCON,#40H ;置串行方式 1,禁止接收
MOV PCON,#00H ;置 SMOD=0(SMOD不能位操作 )
CLR ES ;禁止串行中断
MOV R0,#50H ;置接收数据区首地址
MOV R2,#16 ;置接收数据长度
SETB REN ;启动接收
JNB RI,$ ;等待一帧数据接收完毕
CLR RI ;清接收中断标志
MOV A,SBUF ;读接收数据
MOV @R0,A ;存接收数据
INC R0 ;指向下一数据存储单元
DJNZ R2,RDSB ;判 16个数据接收完否?未完继续
RET ;
乙机接收子程序:
RXDB:
RDSB:
方式 2是一帧 11位 的串行通信方式,即 1个起始位,
8个数据位,1个可编程位 TB8/RB8和 1个停止位,其帧格式为:
3,串行工作方式 2
起始 D0 D1 D2 D3 D4 D5 D6 D7 TB8/RB8 停止当 SMOD=0时,波特率 =20 ╳ fosc/64= fosc/64
当 SMOD=1时,波特率 =21 ╳ fosc/64= fosc/32
可编程位 TB8/RB8既可作奇偶校验位用,也可作控制位(多机通信)用,其功能由用户确定。
数据发送和接收与方式 1基本相同,区别 在于方式 2
把发送 /接收到的第 9位内容送入 TB8/RB8。
波特率,方式 2波特率固定,即 fosc/32和 fosc/64。
如用公式表示则为,波特率 =2SMOD ╳ fosc/64
【 例 6-4】 设计一个串行方式 2发送子程序
( SMOD=1),将片内 RAM 50H~ 5FH中的数据串行发送,第 9数据位作为奇偶校验位。接到接收方核对正确的回复信号(用 FFH表示)后,再发送下一字节数据,否则再重发一遍。
解:程序如下:
MOV A,@R0 ;读数据
MOV C,PSW.0 ;奇偶标志送 TB8
MOV TB8,C ;
MOV SBUF,A ;启动发送
JNB TI,$ ;等待一帧数据发送完毕
CLR TI ;清发送中断标志
SETB REN ;允许接收
CLR RI ;清接收中断标志
JNB RI,$ ;等待接收回复信号
MOV A,SBUF ;读回复信号
CPL A ;回复信号取反
JNZ TRLP ;非全 0(回复信号 ≠ FFH,错误 ),转重发
INC R0 ;全 0(回复信号 =FFH,正确 ),
指向下一数据存储单元
CJNE R0,#60H,TRLP ;判 16个数据发送完否?未完继续
RET ;
TRLP:
MOV SCON,#80H ;置串行方式 2,禁止接收
MOV PCON,#80H ;置 SMOD=1
MOV R0,#50H ;置发送数据区首址
TRS2:
【 例 6-5】 编制一个串行方式 2接收子程序,接收上例发送的 16个数据,存首址为 40H的内 RAM
中,并核对奇偶校验位,接收核对正确,发出回复信号 FFH;发现错误,发出回复信号 00H,
并等待重新接收 。
RXD2,MOV SCON,#80H ;置串行方式 2,禁止接收
MOV PCON,#80H ;置 SMOD=1
MOV R0,#40H ;置接收数据区首址
SETB REN ;启动接收
RWAP,JNB RI,$ ;等待一帧数据接收完毕
CLR RI ;清接收中断标志
MOV A,SBUF ;读接收数据,并在 PSW中产生接收数据的奇偶值
JB PSW.0,ONE ;P=1,转另判
JB RB8,ERR ;P=0,RB8=1,接收有错 ;;P=0,RB8=0,接收正确,继续接收
RLOP,MOV @R0,A ;存接收数据
INC R0 ;指向下一数据存储单元
RIT,MOV A,#0FFH ;置回复信号正确
FDBK,MOV SBUF,A ;发送回复信号
CJNE R0,#50H,RWAP ;判 16个数据接收完否?未完继续
CLR REN ;16个数据正确接收完毕,禁止接收
RET ;
ONE,JNB RB8,ERR ;P=1,RB8=0,接收有错
SJMP RIT ;P=1,RB8=1,接收正确,继续接收
ERR,CLR A ;接收有错,置回复信号错误标志
SJMP FDBK ;转发送回复信号解:程序如下:
方式 3同样是 一帧 11位 的串行通信方式,其通信过程与方式 2完全相同,所不同的仅在于波特率 。 方式 2的波特率只有固定的两种,而方式 3的波特率则与方式 1相同,即通过设置 T1的初值来设定波特率 。
4,串行工作方式 3
5,串行口四种工作方式的比较四种工作方式的区别主要表现在帧格式及波特率两个方面 。
表 6-2 四种工作方式比较工作方式 帧 格 式 波 特 率方式 0 8位全是数据位,没有起始位,停止位固定,即每个机器周期传送一位数据方式 1 10位,其中 1位起始位,8位数据位,1
位停止位不固定,取决于 T1溢出率和
SMOD
方式 2 11位,其中 1位起始位,9位数据位,1
位停止位固定,即 2SMOD× fosc /64
方式 3 同方式 2 同方式 1
解决的方法只有调整单片机的时钟频率
fosc,通常采用 11.0592MHz晶振 。
6,常用波特率及其产生条件常用波特率通常按规范取 1200,2400,4800、
9600,?,若采用晶振 12MHz和 6MHz,则计算得出的 T1定时初值将不是一个整数,产生波特率误差而影响串行通信的同步性能。
串口工作方式 波特率
bit/s
fosc(M
Hz)
SMOD Tl方式 2定时初值方式 1或方式 3 1200 11.0592 0 E8H
方式 1或方式 3 2400 11.0592 0 F4H
方式 1或方式 3 4800 11.0592 0 FAH
方式 l或方式 3 9600 11.0592 0 FDH
方式 1或方式 3 19200 11.0592 1 FDH
表 6-8给出了串行方式 1或方式 3时常用波特率 及其产生条件。
OVER !