第八章 数据通信
任课教师:刘忠国 山东大学课程中心网站: http://course.sdu.edu.cn/G2S/stcmcu.cc 宏晶官方网站:http://www.stcmcu.com STC单片机编译(汇编)/编程(烧录)/仿真工具说 明书; stc15系列单片机器件手册等 keil μvision软件下载及指导手册(Help→μvision Help) http://www.keil.com/ Keil Software –Cx51 编译器用户手册: Cx51编译 器--对传统和扩展的8051微处理器的优化的C 编译器和库参考
第八章 数据通信 本章学习目标 了解通信的有关概念 掌握串行通信和并行通信的原理 第八章 数据通信 本章学习目标 了解通信的有关概念 掌握串行通信和并行通信的原理 掌握常见串行接口(RS232/RS485/SPI/I2C)的原 理及应用方法 掌握单片机并行接口的扩展方法
第八章 数据通信 8.1 通信的有关概念 8.1.1 串行通信的相关概念 8.1.2 并行通信的相关概念 8.2 串行接口 8.2.1 单片机的串行接口 8.2.2 RS232串行通信接口 8.2.3 RS485通信接口 8.2.4 SPI通信接口 8.2.5 I2C通信接口 8.3 并行接口的扩展方法 8.3.1 8255A接口及其应用 8.3.2 74HC595接口及其应用 1. 串行口的寄存器 2. 串行口的工作方式 3. 多处理机通信 4. 波特率的设定 5. 串行口通信应用举例
(1)串口1控制寄存器SCON 位号 D7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 位名称 SM0/FE SM1 SM2 REN TB8 RB8 TI RI 1)SM0/FE: PCON寄存器中的SMOD0=1时,该位用于帧错误 检测,当检测到一个无效停止位时,FE置1。它必 须由软件清零。 PCON寄存器中的SMOD0=0时, SM0/FE位和 SM1一起指定串行通信的工作方式。(如下表) 表中SYSclk为振荡器频率
(1)串口1控制寄存器SCON 表8-1 串行通信的工作方式
8.2.1 单片机的串行接口 2、串行接口的工作方式 (1) 串行接口1的工作方式 STC15F2K60S2单片机的串行口1有4种工作方式, 通过设置SCON寄存器的SM0和SM1进行选择 。现 分别加以介绍。 (2) 串行口2的工作方式 方式0 8位UART, 波特率可变 方式1 9位UART, 波特率可变 SM0, SM1 串口1工作方式 0 0 方式0:同步移位寄存器输出方式 0 1 方式1:8位UART可变波特率方式 1 0 方式2:9位UART固定波特率方式 1 1 方式3:9位UART可变波特率方式
2、串行接口的工作方式 (1) 串行接口1的工作方式 ① 方式0: 移位寄存器方式 方式0为半双工方式,又称为同步移位寄存器输出 方式。 在这种方式下, TXD引脚输出同步移位时钟, RXD 用于发送和接收串行数据。 串行口输出端可直接与移位寄存器相连,也可用 作扩展I/O口或外接同步输入输出设备。 该方式下的数据帧为8位,低位在先,高位在后, 没有起始位和停止位。
① 方式0: 移位寄存器方式 图8-9 (a)串行口1方式0功能结构图
②串口1的UART方式 —— (a) 方式1: (a) 方式1:8位可变波特率方式 方式1提供异步全双工通信,适合于点到点的通信。 每个数据帧长度为10位:1个起始位(低电平)、8个 数据位和1个停止位(高电平)。 传输的数据位首先是起始位,然后是8位数据(低位 在前),最后一位是停止位。起始位和停止位是在 发送时自动插入的。 接收时,停止位进入SCON的RB8位。 TXD/P3.1为发送端口, RXD/P3.0为接收端口。
改教材(源于STC15F2K60S2系列单片机器件手册(2013/6/13)) (a) 方式1:8位可变波特率方式 ÷16 本图源于STC15系列单片机器件手册(2015/6/29) 图8-10(a)串行口1方式1功能结构图
方式1: 8位可变波特率方式: ——发送过程 发送数据时, 数据由串行发送端TxD输出。当单片机执 行写SBUF的指令时, 就启动串行通信发送, 写SBUF信 号还把1装入发送移位寄存器的第9位, 并通知TX控制 器开始发送。 发送各位的定时时间由16 4分频计数器同步(?)。 移位寄存器将数据不断右移送TxD端口发送, 数据左边 不断移入0作补充。当数据最高位移到移位寄存器输出 位置, 紧跟其后的是第9位“1” , 在它左边各位全为“0”, 此状态, 使TX控制器作最后一次移位输出后, 使允许发 送信号“SEND” 失效, 完成一帧信息发送, 并置位中断 请求位TI(TI=1), 向CPU请求中断处理。
方式1的发送、接收工作波形图如图所示 图8-10(b)串行口1方式1时序图 SEND 发送 DATA 接收 TI在停止位开始发送时由硬件置位 RI在接收到停止位的中间时刻时由硬件置位 图8-10(b)串行口1方式1时序图
方式1: 8位可变波特率方式: ——接收过程 当软件置位接收允许标志位REN, 即REN=1时, 接收器 便以选定波特率的16 4分频(?)速率采样接收端口RxD, 当检测到RxD端口从1→0的负跳变时就启动接收器准 备接收数据, 并立即复位16 4分频计数器, 将1FFH值装 入移位寄存器。复位16 4分频计数器的目的是使它与 输入位时间同步: 16 4分频计数器的16 4个状态是将每位的接收时间均 为16 4等份, 在每位时间的7, 8, 9状态由检测器对RxD 端口进行采样(?), 经“三中取二” 后的值作为本次所接 收的值, 即3次采样至少2次相同的值, 以此消除干扰 影响, 提高可靠性 。
方式1: 8位可变波特率方式: ——接收过程 检测到RxD从1→0的负跳变, 经“三中取二” 后的值作为本次所接收的值 在起始位, 如果接收到的值不为0 (低电平), 则起始位 无效, 复位接收电路, 并重新检测1→0的跳变。 若接收到的起始位有效, 则将它输入移位寄存器, 并 接收本帧的其余信息。 接收数据从接收移位寄存器右边移入, 已装入的1FFH 向左边移出, 当起始位0移到移位寄存器最左边时, 使 RX控制器作最后一次移位, 完成一帧的接收。 若同时满足两个条件: 1) RI=0;2) SM2=0或接收到的停止位为1。 则接收到的数据有效, 数据载入SBUF, 停止位进入RB8, 置位RI, 向CPU请求中断。 (SM2=0, 则RB8是接收到的停止位)
方式1: 8位可变波特率方式: ——接收过程 接收数据有效的两条件: 1) RI=0;2) SM2=0或接收到的停止位为1。 若上述两条件不能同时满足,则接收到的数据作废 并丢失; 无论条件满足与否,接收器重新检测RxD端口上的 1→0的跳变,继续下一帧的接收。 接收有效,在响应中断后,必须由软件将RI清0。 通常情况下,串行口工作于方式1时,SM2设置为0。 (SM2=0, 则RB8是接收到的停止位)
与下面定时器1工作于模式2(8位自动重装模式)比较。 方式1: 8位可变波特率方式: 波特率 串行通信方式1的波特率是可变的,波特率由定时器 1或定时器2(优先选择定时器2)的溢出率决定。 定时/计数器的溢出率定义为: 单位时间 (秒) 内定时器/计数器溢出的次数。 串行口1用定时器1作为波特率发生器且定时器1工作 于模式0(16位自动重装模式)时, 波特率=(定时器1的溢出率)/4。 注意:此时波特率与SMOD无关。 与下面定时器1工作于模式2(8位自动重装模式)比较。
方式1: 8位可变波特率方式: 波特率 当定时器1工作于模式0 (16位自动重装模式), 若 T1x12 = 0时, 定时器1的溢出率 = SYSclk/12/( 65536 -[RL_TH1, RL_TL1]); 而定时器1工作于模式0(16位自动重装模式)时, 串行 口1的波特率=(定时器1的溢出率)/4。 所以,串口1的波特率 = SYSclk/12/( 65536 - [RL_TH1, RL_TL1]) /4 其中,RL_TH1是TH1的自动重装载寄存器, RL_TL1是TL1的自动重装载寄存器。 计数次数 计满数后溢出 计数初值
方式1: 8位可变波特率方式: 波特率 定时器1工作于模式0(16位自动重装模式)且 T1x12 = 1时, 定时器1的溢出率 方式1: 8位可变波特率方式: 波特率 定时器1工作于模式0(16位自动重装模式)且 T1x12 = 1时, 定时器1的溢出率 = SYSclk / (65536 - [RL_TH1, RL_TL1])。 此时,串口1的波特率 = SYSclk/ ( 65536 - [RL_TH1, RL_TL1])/4。 其中,RL_TH1是TH1的自动重装载寄存器, RL_TL1是TL1的自动重装载寄存器。
方式1: 8位可变波特率方式: 波特率 当串行口1用定时器1作为波特率发生器且定时器1工作 于模式2 (8位自动重装模式)时 波特率= ×(定时器1的溢出率) 当定时器1工作于模式2(8位自重装模式)且T1x12 = 0时, 定时器1的溢出率= SYSclk/12/( 256 - TH1); 此时,串口1的波特率= × SYSclk/12/( 256 - TH1) PCON中SMOD为波特率加倍位: 当SMOD=1时,波特率 为SYSclk/16;当SMOD=0时,波特率为SYSclk/32。
方式1: 8位可变波特率方式: 波特率 当串行口1用定时器1作为波特率发生器且定时器1工作 于模式2(8位自动重装模式), 且T1x12 = 1时, 定时器1的溢出率= SYSclk / ( 256 - TH1) 此时,串口1的波特率= ×(定时器1的溢出率) = × SYSclk/ ( 256 - TH1)
方式1: 8位可变波特率方式: 波特率 当串行口1用定时器2(固定的16位自动重装模式) 时, 当T2x12=0时, 定时器2的溢出率 方式1: 8位可变波特率方式: 波特率 当串行口1用定时器2(固定的16位自动重装模式) 时, 当T2x12=0时, 定时器2的溢出率 =SYSclk/12/(65536- [RL_TH2, RL_TL2] ) 此时,串口1的波特率 = SYSclk/12/( 65536 - [RL_TH2,RL_TL2])/4 当T2x12 = 1时,定时器2的溢出率 =SYSclk/(65536- [RL_TH2,RL_TL2] )。 = SYSclk/ ( 65536 - [RL_TH2,RL_TL2])/4。 其中,RL_TH2是TH2的自动重装寄存器, RL_TL2是TL2的自动重装寄存器。
(b) 串口方式2:9位固定波特率方式 方式2提供异步全双工通信,适合于固定波特率的 多机通信。 每个数据字节长度为11位:1个起始位、8个数据位 (低位在前)、1个可编程的第9位(TB8/RB8)和1个停 止位。与方式1相比,每帧增加了一个第9位。 发送时, 第9位数据由TB8确定,可置位也可清0。 接收时,第9位进入RB8位。 TXD/P3.1为发送端口, RXD/P3.0为接收端口。
(b) 串口方式2:9位固定波特率方式 方式2的波特率= PCON寄存器中的SMOD为波特率加倍位 当SMOD=1时,波特率为SYSclk/32; 当SMOD=0时,波特率为SYSclk/64。 方式2的收发过程: 方式2和方式1相比, 除波特率发生源略有不同, 和发送 时由TB8提供给移位寄存器第9数据位不同外, 其余功 能结构均基本相同, 其接收/发送操作过程及时序也基 本相同。 (SYSclk:系统时钟频率)
8-12 串行通信方式2的功能结构示意图 图8-11 (a)串行通信方式2的功能结构示意图
——接收过程 (b) 串口方式2: 9位固定波特率方式 当接收器接收完一帧信息后必须同时满足下列条件: RI=0; SM2=0或SM2=1, 且接收到的第9数据位RB8=1。 当上述两条件同时满足时,才将接收到的移位寄存器 的数据装入SBUF和RB8中,并置位RI,向CPU请求 中断处理。 如果上述条件有一个不满足,则刚接收到移位寄存器 中的数据无效而丢失,也不置位RI。 无论上述条件满足与否,接收器又重新开始检测RxD 输入端口的跳变信息,接收下一帧的输入信息。
②串口1的UART方式 ——(c) 串口方式3 (c) 串口方式3:9位可变波特率方式 该方式也适于多机通信。方式3的每个数据字节长度 为11位:1个起始位、8个数据位(低位在前)、1个可编 程的第9位(TB8/RB8)和1个停止位。 发送时, 第9位数据由SCON的TB8确定, 可置1也可清0。 TB8既可作为多机通信中的地址数据标志位,又可作为 数据奇偶校验位 (将PSW中奇/偶校验位P值装入TB8) 接收时,第9位数据进入SCON的RB8位。 TXD/P3.1为发送端口, RXD/P3.0为接收端口,以全双工 模式进行接收/发发送。
改教材(源于STC15F2K60S2系列单片机器件手册(2013/6/13)) 图8-12 (a)串行口1方式3功能结构图
②串口1的UART方式——(c) 串口方式3 (c) 串口方式3: 9位可变波特率方式 图8-12是串行口工作方式3的功能结构示意图及其接收 /发送时序图。 由图可见,方式3和方式1相比, 除发送时由TB8提供给 移位寄存器第9数据位不同外, 其余功能结构和数据接 收/发送操作过程及时序也基本相同。 方式3和方式1一样, 其波特率可通过软件对定时器/计 数器1或定时器2的设置进行波特率选择,是可变的。波 特率的计算方法与方式1相同。
改教材(源于STC15F2K60S2系列单片机器件手册(2013/6/13)) (a) 方式1:8位可变波特率方式 ÷16 本图源于STC15系列单片机器件手册(2015/6/29) 图8-10(a)串行口1方式1功能结构图
②串口1的UART方式 总结 在实际应用中,应根据实际需要选择串行口的工作 方式。 由于方式1和方式3的波特率可以通过定时器1, 2控制, 通信波特率的设定比较灵活, 因此, 方式1和方式3使 用较多; 其中,方式1常用于点对点通信的情况;而方式3常 用语多机通信的情况。 串行口工作方式一览表(见表8-3)。
②串口1的UART方式 表8-3 串行口工作方式一览表。
2.串行口的工作方式 2) 串行口2的工作方式: 2种UART方式 ①方式0 10位数据通过RXD2/P1.0 (RXD2_2/P4.6)接收, 通过 TxD2/P1.1 (TxD2_2/P4.7)发送。 一帧数据含一个起始位(0), 8个数据位和一个停止位(1)。 接收时, 停止位进入特殊功能寄存器S2CON的S2RB8位。 波特率由定时器T2的溢出率决定: 波特率=T2溢出率/4 P_SW2 S2_S 串口2可以在2个地方切换, 由S2_S0控制位选择: 0: 串口2在[P1.0/RxD2, P1.1/TxD2] 1: 串口2在[P4.6/RxD2_2, P4.7/TxD2_2]
(2)串口2控制寄存器S2CON 当T2x12=1时, 定时器2的溢出率: 位号 D7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 位名称 S2SM0 0 - S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 其中,S2SM0用于指定串口2的工作方式,如表所示: S2SM0 工作方式 功能说明 波特率 方式0 8位UART, 波特率可变 (定时器2的溢出率)/4 1 方式1 9位UART, 波特率可变 当T2x12=1时, 定时器2的溢出率: = SYSclk/(65536 - [RL_TH2, RL_TL2]) 当T2x12=0时, 定时器2的溢出率: = SYSclk /12 /(65536 - [RL_TH2, RL_TL2]) RL_TH2, RL_TL2分别是T2H, T2L的重装载寄存器。
2)串行口2的工作方式: ②方式1 11位数据通过RXD2/P1.0 (RXD2_2/P4.6)接收,通 过TxD2/P1.1 (TxD2_2/P4.7)发送。 一帧数据包含一个起始位(0),8个数据位,一个 可编程的第9位和一个停止位(1)。 发送时,第9位数据由特殊功能寄存器S2CON的 S2TB8位确定;接收时,第9位数据进入特殊功能 寄存器S2CON的S2RB8位。 波特率的计算方法与方式0相同,在此略。
8.2.1 单片机的串行接口 3、多处理机通信 以使用串口1为例,说明多机通信的过程。 串行口控制寄存器SCON中的SM2位为方式2和方式3 工作时进行多机通信的控制位。 这种多机通信方式一般为“一台主机,多台从机” 系统, 主机发送的信息可被各从机接收,而从机只能对主机 发送信息,从机间互相不能直接通信。 典型的多机通信结构图
4、波特率的设定 ← 8.2.1 单片机的串行接口 (1)串行口1的波特率设定 方式0的波特率 当UART_M0x6=0时,波特率为SYSclk/12; 当UART_M0x6=1时,波特率为SYSclk/2。 方式2的波特率(固定) 当SMOD=0时,波特率为SYSclk/64; 当SMOD=1时,为SYSclk/32。 方式1和3的波特率 (可变) 串行口1用方式1和3时, 波特率可变,可编程改变定时 器1的溢出率或者定时器2的溢出率来确定波特率。
4、波特率的设定 编程时应注意 当定时器作为波特率发生器使用时,应禁止定时 器产生中断( ET1=0或者ET2=0 )。 典型用法是定时器1工作在自动再装入时间常数的 定时方式2。设置完成后,启动定时器1(TR1=1或 T2R=1 )。 STC15F2K60S2单片机是“一个时钟周期” 的8051 单片机,选用定时器1,2作为波特率发生器时,应 注意时钟分频的设置与波特率之间的关系,1T模 式下的波特率是相同条件下12T模式的12倍。
4、波特率的设定 常用串行口波特率、系统时钟以及定时器1(工 作于方式2时)重装时间常数之间关系如表8-4 所示。 可以直接从表中查得所需设置的时间常数。 定时器1工作于方式0时以及使用定时器T2作 为波特率发生器时的重装时间常数,可根据 计算公式自行计算。
4、波特率的设定 表8-4 串口1常用波特率与系统时钟及定时器1(方式2)重装时间常数之间 关系 波特率(bps) 时间常数(SMOD=1) 时钟频率(MHz) 分频模式 波特率(bps) 时间常数(SMOD=1) 时间常数(SMOD=0) 1.8432 1T 115200 FFH 57600 FEH 38400 FDH 28800 FCH 19200 FAH 9600 F4H 4800 E8H 2400 D0H 1200 A0H 18.432 576000 288000 144000 F6H ECH E2H D8H C4H 88H 12T FBH B0H 11.0592 14400
4、波特率的设定 表8-4 串口1常用波特率与系统时钟及定时器1(方式2)重装时间常数之间 关系 波特率(bps) 时间常数(SMOD=1) 时钟频率(MHz) 分频模式 波特率(bps) 时间常数(SMOD=1) 时间常数(SMOD=0) 18.432 1T 576000 FEH FFH 288000 FDH 144000 FCH 115200 F6H 57600 ECH 38400 E2H 28800 D8H 19200 C4H 9600 88H 4800 12T FBH 2400 1200 B0H 11.0592 14400 FAH F4H E8H D0H
8.2.1 单片机的串行接口 (1)串口1的编程要点 5、串行接口通信应用举例 下面分别说明STC15F2K60S2单片机使用串口1和串口2 的串行通信程序编程要点。 编程应用中, 虽然可用查询(RI, TI)方式进行通信, 但为 了有效进行实时任务处理, 一般用中断方式进行串行通 信。 (1)串口1的编程要点 1)设置串口的工作模式 设置SCON寄存器的内容。若要串口接收, 需将其中的 REN位置1。 串口1控制寄存器SCON 位号 D7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 位名称 SM0/FE SM1 SM2 REN TB8 RB8 TI RI
5、串行接口通信应用举例 (1)串口1的编程要点 2)设置正确的波特率 ①使用定时器1作为波特率发生器时, 需设置定时器1的工 作方式和时间常数(设置TMOD和TH1,TL1寄存器内容), PCON. SMOD位;启动定时器1(置位TCON. TR1)。 ②使用定时器2作为波特率发生器时, 需设置定时器2寄 存器和相应的位, 包括: 定时器2自动重装寄存器T2H和 T2L, AUXR. T2_C/ 位, T2x12位。启动T2(置位T2R), T2开始计数。 位号 D7 D6 D5 D4 D3 D2 D1 D0 定时器名 定时器1 定时器0 位名称 GATE C/ M1 M0 TMOD
5、串行接口通信应用举例 (1)串口1的编程要点 3)设置串口的中断优先级 (设置IP寄存器PS位, 也 可以不设置, 取默认值), 设置相应的中断控制位 (IE. ES和IE. EA)。 4)如要串口1发送,将数据送入SBUF。 5)编制串行中断服务程序,在中断服务程序中要有 清除中断标志指令(将SCON. TI和RI清0)。 中断优先级寄存器IP 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 中断允许寄存器IE 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 EA ELVD EADC ES ET1 EX1 ET0 EX0
5、串行接口通信应用举例 (2)串口2的编程要点 1)设置串口2的工作模式 设置S2CON寄存器中的S2SM0位。如要串口2接 收,将S2REN置1。 2)设置串口2的波特率相应的寄存器和位: 包括:T2H和T2L, AUXR. T2_C/ 位,T2x12 位。启动T2(置位T2R),T2开始计数。
5、串行接口通信应用举例 (2)串口2的编程要点 3)设置串口2的中断优先级(设置PS2, 也可以不设置, 取默认值), 设置打开相应的中断控制位(ES2和EA)。 4)如要串口2发送,将数据送入S2BUF。 5)编制串行中断服务程序,在中断服务程序中要设置 清除中断标志指令(分别是接收完成标志S2RI和发送 完成标志S2TI (位于S2CON ) )。 第二中断优先级低字节寄存器IP2 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 PSPI PS2 中断允许寄存器IE2 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 ET2 ESPI ES2
5、串行接口通信应用举例 下面举例说明12T模式下,STC15F2K60S2单片机 串行通信程序的编制方法。 【例8-1】 设有甲、乙两台单片机,编写程序,使 两台单片机间实现如下串行通信功能。(假设系 统时钟为11.0592MHz。) 甲机(发送机):将首址为ADDRT的128字节外 部RAM数据块顺序向乙机发送; 乙机(接收机):将接收的数据,顺序存放在以 首址为ADDRR的外部RAM中。