本 章 重 点 串行通信基本知识 单片机的串口及控制器 单片机串行通信方式 课时安排:3个课时
第8章 单片机串行数据通信 8.1 串行通信概述 8.2 80C51串行口简介 8.3 波特率 8.4 串行通信工作方式 思考题
8.1 串行通信概述 1. 基本通信方式 计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换,所有这些信息的交换均称为“通信”。 通信的基本方式分为并行通信和串行通信两种。
(1)并行通信 ——通常是将数据字节的各位用多 条数据线同时进行传送。 并行通信的特点:优点是传输速度快;缺点是当 距离较远、位数又多时,会导致通信线路复杂且成本 高。
(2)串行通信 ——是将数据字节分成一位一位的 形式在一条传输线上逐个地传送。 串行通信的特点:优点是通信线路简单,只要一 对传输线就可以实现通信(如电话线),从而大大地降 低了成本。特别适用于远距离通信。缺点是传送速度 慢。
2. 串行通信的基本概念 串行通信分为异步通信和同步通信两种基本方式。 (1) 异步通信 2. 串行通信的基本概念 串行通信分为异步通信和同步通信两种基本方式。 (1) 异步通信 异步通信——是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。
异步通信ASYNC(Asynchronous Data Communication) 的数据或字符是一帧(frame)一帧地传送的。帧定义 为一个字符的完整的通信格式,通常也称为帧格式。 最常见的帧格式一般是先用一个起始位“0”表示字 符的开始;然后是5~8位数据(低位在前,高位在 后),其后是奇偶校验位(用于判别字符传送的正确 性);最后是停止位“0” (可以是1位、1.5位或2位), 用以表示字符的结束。从起始位到停止位结束就构成 完整的一帧。
异步通信的数据格式 : 异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。
(2)同步通信SYNC(Synchronous Data Communication): : 特点是数据在线路上连续传送,各数据间不能有间隙或停顿。 在传送时,以数据块为单位进行传送。数据块由同步字符、若 干个连续的数据字符、校验字符等组成,用一个时钟信号来控 制数据的发送和接收。同步传送格式如下图所示。 图8-3 同步传送
3. 串行通信的制式 在串行通信中,数据是在两机之间传送的。按照 数据传送方向,串行通信可分为单工(simplex doplex) 3. 串行通信的制式 在串行通信中,数据是在两机之间传送的。按照 数据传送方向,串行通信可分为单工(simplex doplex) 制式、半双工(half doplex)制式和全双工(full doplex)制式。 (1)单工制式:是指 数据传输仅能沿一个方向, 不能实现反向传输。 接收 发送 单工
(2)半双工制式:即甲机和 乙机之间只有一个通信回路,接收 和发送不能同时进行,只能分时发 送和接收,即甲机发送乙机接收, 或者乙机发送甲机接收,因而两机 之间只需一条数据线。 时间1 时间2 发送 接收 半双工 (3)全双工制式:即甲机和 乙机之间数据的发送和接收可以 同时进行。全双工形式的串行通 信必须使用两根数据线。 发送 接收 全双工
4. 串行通信的传输速率 传送速率是指数据传送的速度。波特率(baud rate)是异 4. 串行通信的传输速率 传送速率是指数据传送的速度。波特率(baud rate)是异 步通信中数据传送速率的单位(即bps),其意义是每秒传送 多少位二进制数。 假如数据传送的速率是120个字符/秒,每个字符由1个起 始位、8个数据位、1个停止位组成,则波特率为: 10b × 120/s = 1200b/s 异步通信的传送速度一般为 50~9600bps 之间,常用于双 机或多机之间的通信。
5. 信号的调制与解调 计算机通信是一种数字信号的通信,它要求传送线的频带很宽,而在长距离通信时,通常是利用电话线传送的,电话线不可能有这样宽的频带,如果数字信号直接在电话线上通信,信号就会产生畸变。 所以,要用调制器(Modulator) 把数字信号转换为模拟 信号;用解调器(Demodulator)检测此信号,再把它转换成 数字信号。
调制器(Modulator)是一个波形变换器,它将基带数字 (1)什么叫调制? 所调调制就是进行波形变换。或者说进行频谱变换,就是 将基带数字信号的频谱变换成适合于在模拟信道中传输的频谱。 (2)作用: 调制器(Modulator)是一个波形变换器,它将基带数字 的波形变换成适合于模拟信道传输的波形。 解调器(Demodulator)是一个波形识别器,将模拟信号 恢复成原来的数字信号。 调制器 解调器 010010
0 1 0 0 1 1 (3)调制方法: ①调幅(AM) 即载波的振幅随基带数字信号而变化. “1” 对应有载波 “0” 对应无载波 AM 0 1 0 0 1 1 (3)调制方法: ①调幅(AM) 即载波的振幅随基带数字信号而变化. “1” 对应有载波 “0” 对应无载波 AM ②调频(FM) 即载波频率随数字信号而变化 “0” 对应”f1” “1” 对应“f2” f1 f2 FM ③调相(PM) 即载波初始相位随基带数字信号而变化. “0” 对应相位0度 “1” 对应相位180度 0度 180度 PM
8.2 80C51串行口简介 MCS-51单片机内部有1个功能很强的全双工串行口,可 同时发送和接收数据。它有4种工作方式,可供不同场合使用。 波特率由软件设置,通过片内的定时/计数器产生。 MCS-51的串行口除了用于数据通信外,还可以非常方 便地构成1个或多个并行输入/输出口,或作串并转换(如外 接74LS164串入并出芯片),用来驱动键盘与显示器。 MCS-51的串行口可以通过软件编程作为通用异步接收和 发送器UART(Universal Asynchronous Receiver/Transmitter) 用,也可以作为同步移位寄存器用。
图8-5 MCS-51串行口的原理结构图
从图8-5可知,MCS-51单片机内部串行口由两个数据缓 冲寄存器SBUF、一个输入移位寄存器、一个串行控制寄存 器SCON等组成。 在进行串行通信时,外界数据是通过RXD引脚(P3.0口, 串行数据接收端)输入的。输入数据先进入输入移位寄存 器,再送入接收SBUF。在接收器中采用了双缓冲结构,以免 前一个数据还未读走,就接收到第二个数据,而造成两个数 据的重叠错误。 对于发送器,因为发送时CPU是主动的,不会产生写重 叠问题,因而一般不需要双缓冲结构,以保持最大传送速率。
1. 串行口数据缓冲区SBUF SBUF是两个在物理上独立的接收、发送缓冲器,可同 时发送、接收数据。两个缓冲器只用一个字节地址99H,可 对发送缓冲器的操作。 CPU写SBUF,就是修改发送缓冲器;读SBUF;就是读 接收缓冲器。串行口对外也有两条独立的收发信号线RXD (P3.0)和TXD(P3.1);因此可以同时发送、接收数据; 实现全双工传送。
2. 串行口控制寄存器SCON SCON寄存器用来控制串行口的工作方式和状态,它可 以是位寻址。在复位时所有位被清0,字地址为98H。 RI TI RB8 TB8 REN SM2 SM1 SM0 D7 D6 D5 D4 D3 D2 D1 D0 SM0、SM1:串行口工作方式选择位(串行口有4种工 作方式)。SM0, SM1=00, 01, 10, 11 时,即将串行口分别设 置为方式0、1、2、3。
SM2:多机通信控制位。主要用于工作方式2和方式3。 若SM2=1,且接收到RB8=0时,则RI不置“1”,不接收 主机发来的数据; 若SM2=1,且接收到RB8=1时,置RI为“1”,产生中断 请求,将接收到的8位数据送到SBUF。 若SM2=0,则不论RB8为“0”还是为“1”,都将接收到的 数据送到SBUF中,并产生中断。 REN:允许串行接收控制位。若REN=0,则禁止接收;若REN=1,则允许接收。该位由软件置位或复位。
TB8/RB8:发送/接收数据位的第9位。 在方式2和方式3时,TB8为所要发送的第9位数据。在多 机通信中,以TB8位的状态表示主机发送的是地址还是数据: TB8=0为数据,TB8=1为地址;也可用作数据的奇偶校验位。 该位由软件置位或复位。 TI/RI:发送/接收中断标志位。 在方式0时,发送/接收完第8位数据后,由硬件置位;在 其它方式中,在发送/接收停止位的中间,由硬件置位。TI=1 或 RI=1 可申请中断,也可供软件查询用。 在任何方式中,TI/RI 都必须由软件来清“0”。
3. 特殊功能寄存器PCON PCON主要是为CHMOS型单片机的电源控制而设置的 专用寄存器,单元地址为87H,不能位寻址。其内容如下: IDL PD GF0 GF1 SMOD D7 D6 D5 D4 D3 D2 D1 D0 PCON 87H 在CMOS单片机中,该寄存器除最高位外,其它位都是 虚设的。最高位SMOD为串行口波特率倍增位,当SMOD=1 时,方式1、2、3的波特率加倍;当SMOD=0时,系统复位。
8.3 波特率 波特率是表征数据传输速度的重要指标,定义为每秒钟 传送二进制数码的位数,单位是bps(bit per second),即 8.3 波特率 波特率是表征数据传输速度的重要指标,定义为每秒钟 传送二进制数码的位数,单位是bps(bit per second),即 位/秒。波特率的倒数也就是每一位的传输时间。 在串行通信中,收发双方对发送或接收的数据速率(即 波特率)要有一定的约定。通过软件对80C51串行口编程可 约定4种工作方式,其中方式0和方式2的波特率是固定的,而 方式1和方式3的波特率是可变的,由定时器T1 的溢出率控制。 下面分别加以介绍:
1. 方式0和方式2的波特率 方式0中,每个机器周期发送或接收一位数据,因此波特 1. 方式0和方式2的波特率 方式0中,每个机器周期发送或接收一位数据,因此波特 率的数值固定为晶振频率数值的1/12,且不受SMOD的影响。 方式2中, 波特率取决于PCON中的SMOD之值。当SMOD = 0 时,波特率为 fosc 的 1/64;若 SMOD=1 时,波特率为 fosc 的 1/32,即 方式2的波特率 = × fosc 2 64 SMOD
2. 方式1和方式3的波特率 对于方式1和方式3,波特率都由定时器T1的溢出率决定 的,对应于以下公式: 2. 方式1和方式3的波特率 对于方式1和方式3,波特率都由定时器T1的溢出率决定 的,对应于以下公式: 波特率 = (2SMOD / 32) × (定时器T1的溢出率) 其中,T1溢出率取决于计数速率和定时器的预置值。计 数速率与TMOD寄存器中C/T的状态有关。当C/T=0时,计数 速率=fosc/12;当C/T=1时,计数速率取决于外部输入时钟频 率。
当T1作波特率发生器时,通常是选用自动重装载方式2。 在方式2中,定时初值为X,那么每过“256-X”个机器周期, 定时器T1就会产生一次溢出。溢出周期为: T = (256 - X) × 12 / fosc 溢出率为溢出周期的倒数,所以: 2SMOD 波特率 = 32 × fosc 12 ×(256-X) 则定时器T1在方式2的定时初值为: 2SMOD ×fosc X = 256 - 384 ×波特率
表8-1 常用波特率和定时器T1初值
8.4 串行通信工作方式 串行口有4种工作方式,它是由SCON中的SM0、SM1 来定义的,如表8-2所示。 表8-2 串行口的工作方式
1. 方式0——同步移位寄存器方式 在方式0下,串行口作同步移位寄存器用,以8位数据 为一帧,先发送或接收最低位,每个机器周期发送或接收 1. 方式0——同步移位寄存器方式 在方式0下,串行口作同步移位寄存器用,以8位数据 为一帧,先发送或接收最低位,每个机器周期发送或接收 一位,故其波特率固定为“fosc/12”。串行数据由RXD (P3.0)端输入或输出,同步移位脉冲由TXD(P3.1)端 送出。这种方式常用于扩展I/O口,如图8-6所示。
例如将串行口作为并行输出口使用时,可采用如图8-6所 示的方法。 图8-6 一种串转并的方法 74LS164
方式0发送:当1个数据写入发送缓冲器SBUF时,串行 口即把8位数据以fosc/12的波特率从TXD端口送出,发送完 后将中断标志TI置“1”,再次发送数据之前,必须用软件将 TI清0。 方式0接收:REN是串行口接收允许控制位。REN=0 时禁止接收;REN=1时允许接收。当软件将REN置“1” 时,即开始从RXD端口以fosc/12波特率输入数据,当接收 到8位数据时,将中断标志RI置“1”。再次接收数据之 前,必须用软件将RI清0。
2. 方式1——10位通用异步接口 方式1下,串行口为10位通用异步接口。发送或接收 2. 方式1——10位通用异步接口 方式1下,串行口为10位通用异步接口。发送或接收 一帧数据信息为10位,包括1位起始位“0”、8位数据位、1 位停止位“1”。 波特率可调,为: 波特率 = (2SMOD/32) × (定时器T1的溢出率) 定时器T1的溢出率=fosc/12×(2n-X)
方式1发送:数据从TXD端口输出,当数据写入发送缓 冲器SBUF时,就启动发送器发送。发送完一帧数据后,置 中断标志TI=1,申请中断,通知CPU可以发送下一个数据 了。 方式1接收:首先使REN=1(允许接收数据),串行口 从RXD接收数据,当采样到1至0跳变时,确认是起始位 “0”,就开始接收一帧数据,当接收完一帧数据时,置中断 标志RI=1,申请中断,通知CPU从SBUF取走接收到的数据。
3. 方式2——11位异步通信接口 方式2下串行口为11位异步通信接口。发送或接收一帧 3. 方式2——11位异步通信接口 方式2下串行口为11位异步通信接口。发送或接收一帧 信息包括1位起始位“0”、8位数据位、1位可编程位、1位停 止位“1”。 波特率固定,为: 方式2的波特率 = × fosc 2 64 SMOD
方式2发送:发送前,先根据通信协议由软件设置TB8为 “奇偶校验位”或“数据标识位”,然后将要发送的数据写入 SBUF,即能启动发送器。发送过程是由执行任何一条以 SBUF为目的寄存器的指令而启动的,把8位数据装入SBUF, 同时还把TB8装到发送移位寄存器的第9位上,然后从TXD (P3.1)端口输出一帧数据。 方式2接收:先置REN=1,使串行口为允许接收状态, 同时还要将RI清“0”。然后再根据SM2的状态和所接收到的 RB8(第9位)的状态决定此串行口在信息到来后是否置RI=1?并申请中断,通知CPU接收数据。
当SM2=0时,不管RB8为“0”还是为“1”,都置RI=1,此 串行口将接收发送来的信息。 当SM2=1时,且RB8=1,表示在多机通信情况下,接收 的信息为“地址帧”, 此时置RI=1, 串行口将接收发来的地址。 当SM2=1时,且RB8=0,表示在多机通信情况下,接收 的信息为“数据帧”, 不是发给本从机的,此时RI不置为 “1”,因而SBUF中接收的数据帧将丢失。
方式2发送举例: PIPL:PUSH PSW ;保护现场 PUSH A CLR TI ;清0发送中断标志 MOV A,@R0 ;取数据 MOV C,P ;奇偶位送C MOV TB8,C ;奇偶位送TB8 MOV SBUF,A ;数据写入发送缓冲器,启动发送 INC R0 ;数据指针加1 POP A ;恢复现场 POP PSW RETI ;中断返回
方式2接收举例: PIPL: PUSH PSW ;保护现场 PUSH A CLR RI ;清0接收中断标志 MOV A, SUBF ;接收数据 MOV C, P ;取奇偶校验位 JNC L1 ;偶校验时转L1 JNB RB8, ERR ;奇校验时RB8为0转出错处理 SJMP L2 L1: JB RB8, ERR ;偶校验时RB8为1转出错处理 L2: MOV @R0, A ;奇偶校验对时存入数据 INC R0 ;修改指针 POP A ;恢复现场 POP PSW ERR: … ;出错处理 RETI ;中断返回
4. 方式3 ——11位异步通信接口 方式3为波特率可变的11位异步通信方式,除了波特 率有所区别之外,其余方式都与方式2相同。 4. 方式3 ——11位异步通信接口 方式3为波特率可变的11位异步通信方式,除了波特 率有所区别之外,其余方式都与方式2相同。 波特率可调,为: 波特率 = (2SMOD/32) × (定时器T1的溢出率)
5. 方式2、3的应用——多机通信 多机通信是指采用一台主机和多台从机,它们的通信 方式如下图所示。这一功能可以方便地应用于集散式分布 5. 方式2、3的应用——多机通信 多机通信是指采用一台主机和多台从机,它们的通信 方式如下图所示。这一功能可以方便地应用于集散式分布 系统中。多机通信地实现,主要靠主、从机之间正确地设 置与判断多机通信位SM2和发送/接收的第9位数据。 TXD RXD 80C51 主机 0#从机 1#从机 2#从机 图8-7 多机通信连接图
多机通信的工作过程: (1)先给各从机定义地址编号,如分别为00H、01H、 02H、……。 (2)当主机想发送一个数据块给某个从机时,它首先送 出一个地址字节,以辨认从机。地址字节和数据字节可用第9 位数据位来区别,为“1”时表示地址信息,为“0”时表示数据 信息。所以主机发送地址帧时,应使TB8=1。 (3)此时,所有的从机初始化时均置SM2=1,使它只处 于接收地址帧的状态。当从机接收到主机发来的信息后,第9 位RB8若为“1”,则置RI=1,在中断程序中判断该地址帧是否 与自己的地址相符?若相符,就使SM2=0,准备接收即将从 主机发送来的数据帧;若不相符,仍然保持SM2=1。
(4)接着主机发送数据帧,使TB8=0。此时虽然所有从 机都能收到此信息,但只有SM2=0的那个从机才能接收此数 据帧,其它SM2=1的所有从机将丢弃该数据帧。 (5)本次通信结束后,主、从机重新置SM2=1,主机可 再对其它从机寻址。 综上所述,任何时候,通信都只能在主机和一台从机之 间进行,从机之间的通信只有经过主机作中介才能实现, 在实际应用中,因为单片机功能有限,在较大的测控系 统中,常把单片机作为前端机(即下位机或从机)直接用于 控制对象的数据采集与控制,而把PC机作为中央处理器(即 上位机或主机)用于数据处理和对下位机的监控。它们之间 的信息交换主要是采用串行通信。
思 考 题 1. 什么叫中断?80C51单片机有几个中断源? CPU响应中断时,中断入口地址各是多少 ? 么?这些中断标志是如何产生的?又是如何复零 的 ?
3. 什么是串行异步通信?有哪几种帧格式 ? 4. 何谓波特率?若某异步通信接口按方式3传送, 已知每分钟传送 3600 个字符,计算其传送波特率 ?
1. 答:80C51单片机有5个中断源,分别是2个外部中断 源 ,2个片内定时器 T0 和 T1 的溢出中断源,1个片内串行 发送/接收中断源。 CPU响应中断时,中断入口地址如下: 中断源 入口地址 外部中断 0 0003H 定时器 T0 中断 000BH 外部中断 1 0013H 定时器 T1 中断 001BH 串行口中断 0023H
2、答:其中2个片外中断源的中断标识是 IE0和IE1,2 个片内定时器/计数器的中断标识是 TF0 和 TF1,1个片内串 行口中断标识是 TI(或RI)。 中断标志的产生和复位: (1)外部中断的中断标志IE0(或IE1) 当CPU采样到/INT0端出现有效中断请求时,IE0位置1; 响应中断后,转向中断服务程序时,硬件复位。 (2)定时器中断的中断标志TF0(或TF1) T0计数溢出时,硬件置位,响应中断时,硬件复位,不 使用中断时软件清0。 (3)串行中断的中断标志TI(或RI) 发送或接收完一帧数据,硬件置位,响应中断后,必须 软件清0。
2. 答:串行通信是指所传送数据的各位按顺序一位一位 地发送或接收。串行通信分同步通信和异步通信两种方式。 在异步通信中,数据或字符是一帧一帧地传送的,帧定 义为一个字符的完整的通信格式,通常也称为帧格式。 帧格式的一般形式是先用一个起始位“0”表示字符的开 始,然后是数据位,其后是奇偶校验位,最后是停止位,用 以表示字符的结束。适用于80C51的帧格式有3种:(1)8位 数据位;(2)1位起始位、8位数据位、1位停止位;(2)1 位起始位、8位数据位、1位奇偶校验位、1位停止位。
3. 答:波特率(Baud rate)是指每秒钟传输的数据位数, 波特率发生器用于控制串行口的数据传输速率。单位是bps。 若某异步通信接口按方式3传送,说明每个字符由1个起 始位、8个数据位、1个可编程位、1个停止位组成。且已知 每分钟传送3600个字符,故其传送波特率为: 11b × 3600 / 60s = 660 bps
51汇编程序设计总结 一、寄存器使用的问题: 绝对不应该将寄存器A、B和通用寄存器R0~R7等同于我们高级语言里的变量,事实上,这些寄存器只不过在逻辑上与存储空间统一编址,其自身具有独立的硬件结构,这也是为什么使用这些寄存器进行数据传送和运算比用直接地址要快一些的原因。 变通的解决办法:使用伪指令EQU和DATA定义一个存储区的绝对地址,而定义的符号名基本可以替代我们所熟悉的变量。
51汇编程序设计总结 二、现场保护的问题: 51C中的函数、中断函数局部变量还能放到特定区域保存,汇编里连这种保存都没有,毫无疑问,现场一定会被汇编子程序破坏,中断子程序调用中这个问题会更加突出(为什么?)。 解决办法:好的设计风格的养成。
51汇编程序设计总结 好的设计风格: 1、子程序中ACC、PSW必入栈。这也就意味着ACC、B绝不要用作子程序的入口或出口参数。(入口参数定义到哪儿?) 2、对于子程序中通用寄存器的保存:不一定8个寄存器均要全部入栈,代价太大(子程序中也未必用全了全部8个寄存器),一般但普适的方法是子程序中用到的寄存器入栈,同样这会降低效率。更通用但并非万能的方法是修改RS0和RS1来使用不同的寄存器组(为何非万能?)。
51汇编程序设计总结 三、P口读写的理解问题: 是否每次读入P口的数据前都必须向P口写1??
51汇编程序设计总结 四、对于中断的理解: 1、查询法本质是主程序对中断申请标志位的查询,而中断法本质是CPU对中断申请的响应。二者均是对某一中断源所触发的中断事件的处理,它们对外部中断和定时计数器中断均有效(外部中断的查询有细微的差别),串口通讯不提倡使用查询。 2、如采用中断法,则主程序可以在响应中断前继续做其它工作,但中断处理子程序不应过长(有什么问题?),所以,除频繁使用的核心算法外,中断子程序是对代码效率要求最高的子程序。