熟悉串行通信的基本概念
掌握串行口的结构及工作原理
掌握串行口的工作方式
掌握串行口的应用
学习重点和难点
80C51单片机串行通信的基本原理
单片机串行通信的应用
教学目的
第8章 80C51单片机串行通信
第8章 80C51单片机串行通信
串行通信基础知识
80C51串行口
80C51串行口工作方式
串行通信数据传输速率
串行通信应用
串行通信基础知识
通信:指计算机与外部设备或计算机与计算机之间的信息交换。
在计算机系统中,CPU与外部通信的基本方式有两种:
并行通信——数据的各位同时传送。
串行通信——数据一位一位顺序传送。
基本通信方式示意图
串行通信基础知识
并行通信的特点:各数据位同时传送,传送速度快、效
率高。但有多少数据位就需要有多少根数据线,因此传送成
本高。在集成电路芯片的内部、同一插件板上各部件之间、
同一机箱内各插件板之间等的数据传送都是并行的。并行数
据传送的距离通常小于30米。
串行通信的特点:数据传送按位顺序进行,最少只需一
根传输线即可完成,成本低,但速度慢。计算机与远程终端
或终端与终端之间的数据传送通常都是串行的。串行数据传
送的距离可以从几米到几千公里。
串行通信有同步通信和异步通信两种基本方式。
1. 异步串行通信
异步串行通信是以字符为单位的间歇传输形式。传送
时按字符进行包装,为此,在数据位之外要增添起始位、
奇偶校验位和停止位,构成一个通信帧。下图为异步通信
的帧格式。
异步通信和同步通信
几点说明:
① 在串行通信中,信息的两种状态分别以mark和space标志。
其中mark译为标号,对应逻辑状态1,在发送器空闲时,数
据线应保持在mark状态;space译为空格,对应逻辑状态0。
② 起始位。发送器通过发送起始位而开始一个字符的传输。起
始位使数据线处于space状态。
③ 数据位。起始位之后传送数据位。在数据位中,低位在前
(左)高位在后(右)。由于字符编码方式的不同,数据位可
以是5、6、7或8位等多种形式。
④ 奇偶校验位。用于对字符传送作正确性检查,因此,奇偶校
验位是可选择的,共有3种可能,即奇校验、偶校验和无校
验,由用户根据需要选定。
所谓偶校验,即数据位和奇偶校验位中逻辑1的个数加
起来必须是偶数(全0也视为偶数个1)。
所谓奇校验,即数据位和奇偶校验位中逻辑1的个数加
起来必须是奇数。
⑤ 停止位。停止位在最后,用于标志一个字符传输的结束,
对应于mark状态。停止位可能是1、或2位,在实际应用
中根据需要确定。
⑥ 位时间。一个格式位的时间宽度。
⑦ 帧(Frame)。从起始位开始到停止位结束的全部内容称为
一帧。
异步串行通信是一帧接一帧进行的,传输可以是连续
的,也可以是断续(间歇)的。
2. 同步串行通信
为提高传送速度,把数据传输按相等的时间间隔分块
进行,在数据块的开始加一些特殊字符,作为发送和
接收双方的同步标志。由于数据块的位数较多,为防
止错位,在发送数据时一般同时给出时钟信号,以保
持接收与发送的同步,这就是同步串行通信。同步串
行通信的数据传送格式如下图所示:
同步串行通信的数据格式有如下特点和要求:
① 只在数据块传输的开始使用同步字符串,作为发送和接收
双方同步的标志,而在结束时不需要同步标志。
② 数据字符之间不允许有间隔,当线路空闲或没有数据可发
时,可发送同步字符串。
③ 数据块内各字符的格式必须相同。
同步串行通信比异步串行通信的传送速度快,但同步串
行通信要求收发双方在整个数据传输过程中始终保持同步,
这将对硬件提出更高的要求,实现起来难度大一些;而异步
串行通信只要求在每帧的短时间内保持同步即可,实现起来
容易得多。所以同步串行通信适用于数据量大、对速度要求
比较高的串行通信场合。
1. 单工形式
单工(Simplex)形式的数据传输是单向的。通信双方中一方
固定为发送端,另一方则固定为接收端。单工形式的串行
通信只需要一条数据线,如下图所示。
例如,计算机与打印机之间的串行通信。
串行通信线路形式
2. 全双工形式
全双工(Full duplex)形式的数据传输是双向的,可以
同时发送和接收数据,因此,全双工形式的串行通信
需要两条数据线。
3. 半双工形式
半双工(Half duplex)形式的数据传输也是双向的。但任
何时刻只能由其中的一方发送数据,另一方接收数据。
因此半双工形式既可以使用一条数据线,也可以使用两
条数据线。
近程串行通信
单片机的数据信号在传输线上传送时,由于受到线间分布
电容和噪声干扰等影响,将引起传输信号的幅度衰减和波
形畸变,极易导致传输错误。加之导线越长电容越大,所
以传输距离就受到一定的限制。
由于近距离串行通信不改变数据位波形和频率,所以也称
为基带传输方式。虽然基带方式实现起来既方便又经济,
但只能用于近程通信。
对于近距离的串行通信(例如一个房间内的计算机之间,
距离不超过10 m),传输中虽有波形畸变产生,但不会严
重到影响使用,仍可使用TTL电平直接传输。近距离的串
行通信并不复杂,只需将两端串行口直接连接就可进行
串行数据通信,省去了接口的麻烦,见下图。
远程通信
对于远程通信(例如城市之间),不能使用基带传输方式,只能使用模拟信
号形式进行,一般使用电话线。
为了在电话线上进行串行数据传输,需要在发送端把数字信号转变为模拟信
号再进行发送,这种把数字信号转变为模拟信号的过程称为调制。在接收端
应把模拟信号再转变为数字信号,这一过程称为解调。远程通信多采用双工
方式,即通信双方都应具有发送和接收功能。为此在通信线路的两端都设置
调制器和解调器,并且把二者结合在一起称为调制解调器(Modem)。使用电
话线作传输线的远程通信连接如下图所示。
80C51串行口
为了实现串行通信,需要有硬件电路以解决串行数据传输
中的一系列协调问题,这些硬件就是串行接口电路或简称
串行口。
80C51串行口硬件结构
通常把实现异步通信的串行口称为通用异步接收器/发送器
UART(Universal Asynchronous Receiver/Transmitter)。
80C51的串行口,虽然是既能实现同步通信,又能实现异
步通信的全双工串行口,但在单片机的串行数据通信中,
最常用的是异步方式,因此,常把它写为UART。串行接
口结构如下图所示。
80C51串行口寄存器结构
80C51单片机有两个独立的接收、发送缓冲器SBUF(属于特
殊功能寄存器),一个用作发送,一个用作接收。发送缓冲
器只能写入不能读出;接收缓冲器只能读出不能写入,两
者共用一个字节地址(99H)。
在发送时,CPU由一条写发送缓冲器的指令把数据(字符)写
入串行口的发送缓冲器SBUF(发)中,然后从TXD端一位位地
向外发送。与此同时,接收端RXD也可一位位地接收数据,
直到收到一个完整的字符数据后通知CPU,再用一条指令把
接收缓冲器SBUF(收)的内容读入累加器。可见,在整个串
行收发过程中,CPU的操作时间很短,使得CPU还可以从事
其他的各种操作(指工作在中断方式下),从而大大提高了
CPU的效率。
80C51串行口通过控制寄存器、中断功能和波特率设
置实现串行通信控制。
1. 串行口控制寄存器(SCON)-98H
SM0、SM1——串行口工作方式选择位。其状态组
合所对应的工作方式为:
SM0 SM1=00,工作方式0;
SM0 SM1=01,工作方式1;
SM0 SM1=10,工作方式2;
SM0 SM1=11,工作方式3。
串行口控制机制
SM2——多机通信控制位。TB8——发送数据位8。
RB8——接收数据位8。(这3位用于多机通信)
因为多机通信是在方式2和方式3下进行的,因此SM2
主要用于方式2和方式3。当串行口以方式2和方式3接
收数据时,
SM2=1,则只有在接收到的第9位数据(RB8)为1时才
将接收到的前8位数据送入SBUF,并置位RI产生中断
请求;否则将接收到的前8位数据丢弃。
SM2=0,则不论第9位数据是0还是1,都将前8位数据
装入SBUF中,并产生中断请求。在方式0时,SM2必
须为0。
REN——允许接收位。REN=0;禁止接收;REN=1,
允许接收。
TI——串行发送中断请求标志。在数据发送过程中,
当最后一个数据位被发送完成后,TI由硬件置位。
RI——串行接收中断请求标志。在数据接收过程中,
当采样到最后一个数据位有效时,RI由硬件置位。
2. 串行中断
80C51有两个串行中断,即串行发送中断和串行接收中
断。但这两个串行中断共享一个中断向量0023H。每当串行
口发送或接收一个数据字节时,都产生中断请求。串行中断
请求在芯片内部发生,因此不需要引脚。两个中断共享一个
中断向量,就需要在中断服务程序中对中断源进行判断,以
便进行不同的中断处理。
对于串行中断控制共涉及3个寄存器,其中一个就是串
行口控制寄存器SCON,用于存放串行中断请求标志。另外
两个中断允许控制寄存器IE和中断优先级控制寄存器IP。
80C51串行口工作方式
80C51单片机的串行口共有4种工作方式,见下表。
SM0 SM1 工作方式 功能 波特率
0 0 方式0
8位同步移位寄
存器
f
osc
/12
0 1 方式1 10位UART 可变
1 0 方式2 11位UART
f
osc
/64或
f
osc
/32
1 1 方式3 11位UART 可变
串行工作方式0
串行工作方式0是把串行口作为同步移位寄存器使用,实
现串行数据的输入/输出。移位数据的传输以8位为一组,低位
在前、高位在后。
利用串行工作方式0,加上“并入串出”或“串入并出”芯
片
的配合,80C51的串行口可实现数据的并行输入/输出。
方式0实现数据并行输入/输出,“并入串出”芯片74LS165
、
CD4014)用于把并行输入数据通过移位形成位串,传送给串行
口;而“串入并出”芯片(74LS164、CD4094)则接收串行口
的
串行数据,通过移位形成8位并行数据输出。
74LS164 CLR为清0端,
输出时CLR必须为1,否则
74HC164 Q0~Q7输出为0。
74HC165 S/L端为移位/置入端,当
S/L=0时,从Q0~Q7并行数据置入寄
存器,当S/L=1时,允许从Q端移出数
据。
串行接口工作方式0其波特率是固定的,为fosc(振荡频率)的
1/12。
1.方式0发送
数据从RxD引脚串行输出,TxD引脚输出同步脉冲。当一个
数据写入串行口发送缓冲器时,串行口将8位数据以fosc/12
的固定波特率从RxD引脚输出,从低位到高位。发送后置
中断标志TI为1,请求中断,在再次发送数据之前,必须用
软件将TI清零。
2.方式0接收
在满足REN=1和RI=0的条件下,串行口处于方式0输入。
此时,RxD为数据输入端,TXD为同步信号输出端,接收
器也以fosc/12的波特率对RxD引脚输入的数据信息采样。
当接收器接收完8位数据后,置中断标志RI=1为请求中断,
在再次接收之前,必须用软件将RI清零。
在方式0工作时,必须使SCON寄存器中的SM2位为“0”
,这并不影响TB8位和RB8位。方式0发送或接收完数据后
由硬件置位TI或RI, CPU在响应中断后要用软件清除TI或
RI标志。
串行工作方式1
串行工作方式1是10位为一帧的异步串行通信方式,帧格式
包括1个起始位,8个数据位和1个停止位。这种工作方式是
为双机通信而准备的。
1.方式l发送
由一条写发送寄存器(SBUF)的指令开始,随后在串行口
由硬件自动加入起始位和停止位,构成一个完整的帧格
式,然后在移位脉冲的作用下,由TXD端串行输出。一个字符
帧发送完后,使TXD输出线维持在1状态下,并将SCON寄存器
的TI位置1,通知CPU可以接着发送下一个字符。
2.方式1接收
SCON的REN位应处于允许接收状态,即REN=1。在此
前提下,串行口采样RXD端,当采样到从1到0的状态跳变时,
就认为已接收到起始位。随后在移位脉冲的控制下,把接收
到的数据位移入接收寄存器中。直到停止位到来之后置位中
断标志位RI,通知CPU从SBUF取走接收到的一个字符。
串行工作方式2 和3
串行工作方式2和3都是11位为一帧的串行通信方式,即1个
起始位、9个数据位和1个停止位。这两种工作方式主要是
为多机通信而准备的。
在这两种工作方式下,字符还是8个数据位,只不过增加了
一个第9数据位(D8),它是一个可编程位,其功能由用户设
定。
在发送数据时,应予先在串行口控制寄存器SCON的TB8位
中把第9个数据位的内容准备好。
这两种工作方式的数据接收过程也与方式1基本类似,不同
点仍在第9数据位上,串行口把接收到的前8个数据位移入
SBUF,而把第9数据位送SCON的RB8。
串行工作方式2和3是为多机通信而准备的。两者的工作过程
相同,差别仅在于波特率的设置,方式2的波特率是固定的
,而方式3的波特率可由用户根据需要设定,设定方法与方
式1相同。
串行通信数据传输速率
传输速率的表示方法
1.与传输速率有关的术语
波特率:每秒钟事件发生的数目或信号变化的次数。
单位:波特(B,Baud)
比特率:每秒钟传送二进制的位数。
单位:位/秒(bps)
说明:
(1)在一般的单片机串行通信中,事件和信号变化都反映
在二进制位上,波特率与比特率的概念是一样的。
(2)但在高速串行通信中,由于一个事件的编码往往不止
1位,因此波特率与比特率就不一样了。
例如事件按4位编码,如果数据传输的波特率是2400,
则比特率就是 9600
2.单片机中使用的波特率
在单片机中使用波特率来表示串行通信的传送速率。
波特率:每秒钟传送二进制的位数波特率:每秒钟传送二进制的位数
1波特=1位/秒(bps)
注意:波特率和字符的传输速率不同
例如:如果每秒钟传送240个字符,而每个字符格式包含
10位(1个起始位、8个数据位、 1个停止位),这时的波
特率为:
10位×240个/秒 = 2400 bps
波特率是串行通信的重要技术指标
在串行通信中,波特率除表明数据传送速率外,还可以
表示串行口中移位脉冲频率的高低。波特率高表明移位脉
冲频率高,串行数据传输速度就快;反之,波特率低表明
移位脉冲频率也低,串行数据传输速度就慢。
在实际的串行通信中,应根据速度要求、线路质量以及
设备情况等因素选定波特率。
1.串行工作方式0的波特率
串行工作方式0的波特率是固定的,其计算公式为:
2.串行工作方式2的波特率
串行工作方式2的波特率也是固定的,但有两个数值。
其计算公式为:
SMOD=0时,波特率= ,SMOD=1时,波特率=
80C51单片机的波特率设置
位序 B7 B6 B5 B4 B3 B2 B1 B0
位符号 SMOD / / / GF1 GF0 PD IDL
电源控制寄存器PCON
字节地址87H
其中SMOD:串行口的波特率倍增位
SMOD=0,波特率不加倍
SMOD=1,串行口波特率加倍。
系统复位时, SMOD=0。
PCON不能位寻址。
3.串行工作方式1和方式3的波特率
串行工作方式1和方式3的波特率不是固定的,可以根据需
要设置。
当串行口工作在方式1和方式3时, 由80C51单片机的定时
器T1作为波特率发生器(以定时器T1作波特率发生器是由
系统决定的),为串行口提供移位脉冲。
串行工作方式1和方式3的波特率计算公式为:
当定时器T1作波特率发生器使用时,通常选用工作方式2
(即8位自动重装载方式)。选择方式2可以避免通过程序
反复装入定时初值所引起的定时误差,使波特率更加稳定
定时器的溢出周期:定时器溢出一次所需要的时间。
定时器的溢出率:单位时间定时器溢出的次数。
溢出率等于溢出周期的倒数
当定时器T1工作在方式2 (即8位自动重装载方式),假
定定时器T1的计数初值为X,则定时器T1的溢出周期为:
溢出率为溢出周期的倒数,则定时器T1的溢出率为:
实际使用中,波特率是已知的。因此需要根据波特率的
计算公式求定时初值X。
则波特率计算公式为:
根据上述波特率计算公式,得出计数初值的计算公式为:
用户只需要把定时初值设置到定时器1,就能得到所要求
的波特率。
思考题:定时器T1工作在方式2,串行口方式1波特率=1200bps,
fosc=12MHZ,SMOD=0,则X=?
如果T1预装的初值X=E6H,则实际得到的波特率为:
误差怎么解决?
其它条件不变,取fosc=,则X=?
说明:
(1)当串行口工作在方式1或方式3,且要求波特率按规范取
1200、2400、4800、9600…时,若采用晶振12MHz和6MHz,按波
特率计算公式算出的T1定时初值将不是一个整数,因此会产生
波特率误差而影响串行通信的同步性能。解决的方法可以调整
单片机的晶振频率fosc,通常采用为的晶振,这样
可使计算出的T1初值为整数。
(2)实际使用时,可根据波特率的计算公式来计算T1的初值。
为避免烦杂的初值计算,可以通过查常用波特率与定时器1
的 参数关系表。
(3)串行口工作在方式1和方式3时,定时器1初始化程序的
步骤:
首先确定波特率
再计算定时器1的计数初值
然后进行定时器的初始化
例题:单片机的晶振频率为,串行口工
作在方式1,波特率为2400bps,计算定时器T1的计
数初值,并写出初始化程序。(假设SMOD=0)
解:定时器T1工作在方式2 (8位自动重装载方式)
初始化程序:
MOV TMOD , #20H
MOV TL1, #0F4H
MOV TH1, #0F4H
SETB EA
CLR ES
MOV PCON, #00H
MOV SCON, #50H
SETB TR1
80C51单片机的串行口共有4种工作方式,见下表。
SM0 SM1 工作方式 功能 波特率
0 0 方式0
8位同步移位寄
存器
f
osc
/12
0 1 方式1 10位UART 可变
1 0 方式2 11位UART
f
osc
/64或
f
osc
/32
1 1 方式3 11位UART 可变
【例题】用80C51单片机的串行口外接串入并出的芯片CD4094
扩展并行输出口控制一组发光二极管,使发光二极管从左至右延
时轮流点亮。(fosc=12MHZ)
ORG 0000H
LJMP MAIN
ORG 2000H
MAIN: MOV SCON,#00H
MOV A,#80H
CLR
START:MOV SBUF,A
LOOP:JNB TI,LOOP
SETB
ACALL DELAY
CLR TI
RR A
CLR
SJMP START
DELAY:MOV R7,#05H
LOOP2:MOV R6,#0FFH
LOOP1:DJNZ R6,LOOP1
DJNZ R7,LOOP2
RET
END
【思考题】 用80C51单片机的串行口外接并入串出的芯片CD4014
扩展并行输入口,输入一组开关的信息,开关 K 闭合时有效。
ORG 0000H
LJMP MAIN
ORG 2000H
MAIN:SETB
START:JB ,START
SETB
MOV SCON,#10H
CLR
LOOP:JNB RI,LOOP
CLR RI
MOV A,SBUF
80C51
RXD
TXD
QB
CLK P/S
K0 K7 K
CD4014
72H2006MHz110
串口方式1
或3
×××112MHz375K串口方式2
××××12MHz1M串口方式0
相应初
值
所选方式C/T
定时器T1
SMODFosc波特率
常用波特率与定时器1的参数关系表
串行通信应用
近程串行通信
调制解调器的使用
双机通信
1、问题的提出
把甲机存放在内部RAM40H—4FH中的16个字节的
数据块传送到乙机内部RAM40H—4FH中,如何实现?
2、问题分析与解决
从上面的问题可以看出,这实际上是双机通信问题,
由甲机发送,乙机接收。
在进行双机通信之前,发送和接收双方要进行
一些约定,明确一些技术问题。
(1)数据通路采用何种形式,硬件电路如何连接?采用
何种串行工作方式?
约定:串行工作方式1
双机异步通信接口电路
若fosc=,取SMOD=0,根据波特率的计算公式
也可以通过查表,确定X=F4H。
可求得计数初值X为:
(2)数据传送的波特率是多少?
约定:2400bps
(4)双方如何取得联络?
约定:
甲机向乙机发送一个E1作为联络信号,表示请求通信
乙机收到E1信号后,回答一个E2作为应答信号,表示通信
(3)如何检验数据传输的正确性?
约定:采用累加和检验(代码和检验)
累加和检验:发送方对所发送的数据块求和,并将“检
验和”附加到数据块末尾,也发送给接收方。接收方接收
数据时,也是先对数据块求和,将所得结果与发送方的“
检验和”进行比较,若两者相同,表示传送正确,若不相
同表示传送出了差错。
(5)双方通信如何结束?
约定:
乙机如果接收的数据正确,向甲机发送00H信号,表
示结束双方的通信。
乙机如果接收的数据不正确,向甲机发送非00H信号,
表示数据出错,要求甲机重新发送。
3、编写程序
在编写程序之前,要分别给出甲机和乙机的
流程图,根据流程图编写甲机和乙机的通信程序。
甲机通信流程图
乙机通信流程图
ASTART:CLR EA
MOV TMOD,#20H
MOV TH1,#0F4H
MOV TL1,#0F4H
MOV PCON,#00H
SETB TR1
MOV SCON,#50H
ALOOP1:MOV SBUF,#0E1H
JNB TI,$
CLR TI
JNB RI,$
CLR RI
MOV A,SBUF
XRL A,#0E2H
JNZ ALOOP1
ALOOP3: MOV SBUF,@R0
MOV A,R6
ADD A,@R0
MOV R6,A
INC R0
JNB TI,$
CLR TI
DJNZ R7,ALOOP3
MOV SBUF,R6
JNB TI,$
CLR TI
JNB RI,$
CLR RI
MOV A,SBUF
JNZ ALOOP2
RET
甲机发送程序清单(采用查询方式)
ALOOP2: MOV R0,#40H
MOV R7,#10H
MOV R6,#00H
BSTART:CLR EA
MOV TMOD,#20H
MOV TH1,#0F4H
MOV TL1,#0F4H
MOV PCON,#00H
SETB TR1
MOV SCON,#50H
BLOOP1:JNB RI,$
CLR RI
MOV A,SBUF
XRL A,#0E1H
JNZ BLOOP1
MOV SBUF,#0E2H
JNB TI,$
CLR TI
BLOOP2:MOV R0,#40H
MOV R7,#10H
MOV R6,#00H
BLOOP3:JNB RI,$
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
ADD A,R6
MOV R6,A
DJNZ R7,BLOOP3
JNB RI,$
CLR RI
MOV A,SBUF
XRL A,R6
JZ END1
MOV SBUF,#0FFH
JNB TI,$
CLR TI
AJMP BLOOP2
END1: MOV SBUF,#00H
RET
乙机接收程序清单(采用查询方式)
多机通信
多机通信是指一台主机和多台从机之间的通信。通常单片机
的多机通信采用主从式多机通信方式。在这种方式中,只有
一台主机,有多台从机。主机发送的信息可以传到各个从机
或指定的从机,各从机发送的信息只能被主机接收。
主要问题:
怎样识别地址?
怎样维持主机与指定从机之间的通信?
1.多机通信连接电路
在串行方式2或方式3条件下,可实现一台主机和
多台从机之间的通信,其连接电路如图所示。
2.多机通信原理
多机通信时,主机向从机发送的信息分为地址帧和数
据帧两类,以可编程第9位TB8作区分标志:
TB8=0,表示数据;TB8=1,表示地址。
多机通信充分利用了80C51串行控制寄存器SCON中的
多机通信控制位SM2的特性。
当SM2=1时,CPU接收的前8位数据是否送入SBUF取决
于接收的第9位RB8的状态:若RB8=1,将接收到的前8位数
据送入SBUF,并置位RI产生中断请求;若RB8=0,则接收到
的前8位数据丢弃。即当从机SM2=1时,从机只能接收主机
发送的地址帧(RB8=1),对数据帧(RB8=0)不予理睬。
当从机SM2=0时,从机可接收主机发送的所有信息。
通信开始时,主机首先发送地址帧。由于各从机的
SM2=1和RB8=1,所以各从机均能接收到地址帧,分别发出
串行接收中断请求,通过串行中断服务程序来判断主机发
送的地址与本从机地址是否相符。如果相符,则把自身的
SM2清0,以准备接收随后传送来的数据帧。其余从机由于
地址不符,则仍保持SM2=1状态,因而不能接收主机传送
来的数据帧。这就是多机通信中主、从机一对一的通信情
况。这种通信只能在主、从机之间进行,如果想在两个从
机之间进行通信,则要通过主机作中介才能实现。
3.多机通信过程
(1)主、从机工作于方式2或方式3,主机置SM2=0,REN=1;
从机置SM2=1,REN=1。
(2)主机置位TB8=1,向从机发送寻址地址帧,各从机因满
足接收条件(SM2=1,RB8=1),从而接收到主机发来的地址,
并与本机地址进行比较。
(3)地址一致的从机(被寻址机)将SM2清0,并向主机返回
地址,供主机核对。地址不一致的从机(未被寻址机)
保持SM2=1。
(4)主机核对返回的地址,若与此前发出的地址一致则准备
发送数据;若不一致则返回(2)重新发送地址帧。
(5)主机向从机发送数据,此时主机的TB8=0,只有
被选中的那台从机能接收到该数据。其他从机则舍弃
该数据。
(6)本次通信结束后,从机重新置SM2=1,等待下次
通信。
4. 多机通信实现方法
(1)有关通信协议的几条规定
① 从机地址为00H~FEH,即允许接255台从机。
② “地址”FFH是对所有从机都起作用的一条控制命令,命令使被寻址
从机恢复SM2 =1的状态。
③假定主机发送的控制命令代码为:00H——主机发送从机接收命令;
01H——从机发送主机接收命令;其它为非法命令。
④ 从机状态字格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
ERR 0 0 0 0 0 TRDY RRDY
ERR=1,表示收到非法指令;
TRDY=1,表示发送准备就绪;
RRDY=1,表示接收准备就绪。
(2)软件设计
主机和从机程序都以子程序形式出现,所不同的是在这里
设从机采用中断的方式。
在调用主机子程序之前,应先准备好R0、 R1、 R2、 R3和
R4中的参数。
主机中寄存器的分配:
R0:主机接收数据块首址;
R1:主机发送数据块首址;
R2:被寻址的从机地址;
R3:主机发出的指令;
R4:数据块长度。
主机串行口设为方式3,允许接收,并置TB8为1,故控制字
为11011000B=D8H。
从机采用中断的方式,即接收到地址帧后就进行串行口中
断申请。CPU响应后,进入中断服务程序。
从机串行口的初始化、定时器初始化和中断初始化等都在
从机主程序中完成。
从机串行口中断服务参考程序中SLAVE为本机地址,并用F0
和作为本从机发送和接收准备就绪的状态位。即:F0
中为1表示从机发送准备就绪, = 1为本机已准备好
接收。
从机中寄存器的分配:
R0:存放发送数据块始址
R1:存放接收数据块始址
R2:存放发送数据块长度
R3:存放接收数据块长度
MOV SCON, #OD8H ;串行口初始化
MSIO1: MOV A, R2
MOV SBUF, A ;启动发送,发送从机地址
JNB RI,$ ;等待从机回答
CLR RI ;从机回答后清RI
MOV A, SBUF ;取从机地址
XRL A, R2 ;核对地址
JZ MSIO3 ;相符转MSI03
MSIO2: MOV SBUF, #OFFH ;准备重发地址
SETB TB8 ;设地址帧标志
SJMP MSIO1 ;重发地址
MSIO3: CLR TB8 ;准备发送指令
MOV SBUF, R3 ;发出指令
JNB RI,$ ;等待从机回答
CLR RI ;从机回答后清RI
MOV A, SBUF ;取应答信息
JNB , MSIO4 ;核对指令接收是否出错
SJMP MSIO2 ;指令出错,重发
主机程序
MSIO4: CJNE R3,#00H, MSIO5 ;若为发送指令,则转发送程序段
JNB , MSIO2 ;从机未准备好接收,重新联络
STX: MOV SBUF, @R1 ;从机准备好,开始发送
JNB TI,$ ;等待发送结束
CLR TI ;清TI,准备发送下一帧数据
INC R1 ;修改指针
DJNZ R4, STX ;未完,继续
RET ;发送完,返回
MSIO5: JNB ,MSIO2 ;从机未准备好发送,重新联络
SRX: JNB RI,$ ;等待接收完毕
CLR RI ;清RI,为下次接收准备
MOV A, SBUF ;取出收到的数据
MOV @R0, A ;存入数据
INC R0 ;修改指针
DJNZ R4, SRX ;未完,继续
RET ;接收完毕,返回
主机程序
ORG 1000H
START:MOV TMOD,#20H ;定时器T1为方式2
MOV TH1, #0F4H ;波特率为1200bps
MOV TL1, #0F4H
SETB TR1 ;启动T1工作
MOV SCON,#0F8H ;串行口为方式3,
;允许接收SM2=1,TB8=1
MOV PCON,#00H
MOV R0, #20H ;R0指向发送数据块始址
MOV R1, #40H ;R1指向接收数据块始址
MOV R2, #20 ;发送数块长度送R2
MOV R3, #20 ;接收数块长度送R3
SETB EA ;开CPU中断
SETB ES ;允许串行口中断
CLR RI ;清RI
┆
SJMP $ ;等待
从机主程序
SSIO: CLR RI ;清RI标志
PUSH A ;保护现场
PUSH PSW
SETB RS1 ;取1区工作寄存器
CLR RS0
MOV A, SBUF
XRL A, #SLAVE ;核对是否收到本机地址
JZ SSIO1 ;地址相符转SSIO1
RETURN: POP PSW ;不是呼叫本机,恢复现场,返回
POP A
RETI
SSIO1: CLR SM2 ;准备接收数据/指令
MOV SBUF,#SLAVE ;向主机发回本机地址
JNB RB8,SSIO2 ;RB8=0,是数据/指令,转SSIO2
SETB SM2 ;是复位指令,返回
SJMP RETURN
SSIO2: MOV A,SBUF ;取指令
CJNE A,#02H,NEXT ;检查指令是否合法
NEXT: JC SSIO3 ;是合法指令,转SSIO3
CLR TI
MOV SBUF,#80H ;是非法指令,发出出错信息,返回
SJMP RETURN
从机串行口
中断服务
参考程序
MCS-51多机通信技术
SSIO3: JZ CMOD ;是接收指令,转接收模块
CMD1: JB F0,SSIO4 ;发送准备好,转SSIO4
MOV SBUF,#00H ;未准备好,发TRDY=0,返回
SJMP RETURN
SSIO4: MOV SBUF,#02H ;发TRDY=1,准备发送
CLR TI
LOOP1: MOV SBUF,@R0 ;开始循环发送,直至发送完毕
JNB TI,$
CLR TI
INC R0
DJNZ R2,LOOP1
SETB SM2
SJMP RETURN
CMOD: JB ,SSIO5 ;接收准备好,转SSIO5
MOV SBUF,#00H ;未准备好,发RRDY=0,返回
SJMP RETURN
SSIO5: MOV SBUF,#01H ;发RRDY=1,准备接收
LOOP2: JNB R1,$
CLR RI
MOV @R1,SBUF ;开始循环接收,直至接收完毕
INC R1
DJNZ R3,LOOP2
SJMP RETURN
从机串行口
中断服务
参考程序
从机串行口
中断服务
参考程序
作业题:
设以串行方式1进行数据传送,fosc=6MHz,波特
率为2400bps(设SMOD=1)。发送的8个数据依次存
在外RAM首址4000H单元中,先发送数据长度,后发
送8个数据,请编写发送子程序。