串行接口电路也称为通用异步收发器(UART)。从原理上说,一个UART应包括发送器电路、接收器电路和控制电路。MCS-51系列单片机其中已集成了UART,构成一个全双工串行接口,这个接口既可以用于网络通信,也可以实现串行异步通信,还可以作为同步移位寄存器使用。
MCS-51系列单片机的串行口通过引脚RXD(P3.0,串行口数据接收端)和引脚TXD(P3.1,串行口数据发送端)与外部设备进行串行通信,图6-30为MCS-51系列单片机内部串行口结构示意图。
图6-30 单片机内部串行口结构示意图
图中,共有两个物理上独立、逻辑上同名的接收、发送缓冲器SBUF(属于特殊功能寄存器SFR),可同时发送、接收数据,实现全双工方式串行通信。发送缓冲器只能写入不能读出;接收缓冲器只能读出不能写入。串行发送时,累加器A通过片内总线向发送SBUF写入数据;串行接收时,从接收SBUF通过片内总线把读入的数据存入A。由于单片机的CPU对发送与接收寄存器不能同时进行操作,所以给这两个缓冲寄存器赋以同一个特殊功能寄存器字节地址99H。
在接收方式下,串行数据通过引脚RXD(P3.0)进入,由于在接收寄存器之前还有移位寄存器,从而构成了串行接收的双缓冲结构,以避免在数据接收过程中出现帧重叠错误,即在下一帧数据来时,前一帧数据还没有读走。
在发送方式下,串行数据通过引脚TXD(P3.1)发出。与接收数据情况不同,发送数据时,由于CPU是主动的,不会发生帧重叠错误,因此发送电路就不需双重缓冲结构,这样可以提高数据发送速度。
串行接口的通信由3个特殊功能寄存器对数据的接收和发送进行控制。它们分别是串行口控制寄存器SCON、电源控制寄存器PCON和中断允许控制寄存器IE。
6.3.2.1 串行接口的控制寄存器
单片机串行接口的工作主要由SCON、PCON、IE共3个特殊功能寄存器控制。
1.串行口控制寄存器SCON
串行口控制寄存器SCON地址为98H,位地址9FH~98H,具体格式见图6-31。
图6-31 SCON具体格式
SCON各位的控制功能如下:
(1)SM0、SM1:串行口工作方式选择位。SM0、SM1对应的4种通信方式如表6-4所列(表中f osc为晶振频率)。
表6-4 串行口工作方式
(2)SM2:多机通信控制位。该位为多机通信控制位,主要用于工作方式2和工作方式3。
当SM2为0时,则接收到的第9位数据(RB8)无论是0还是1,都将接收到的数据装入SBUF中,在接收完当前帧后,产生中断申请,RI置位。
当SM2为1时,则只有当接收到的第9位数据RB8为1,才将接收到的数据装入SBUF中,在接收完当前帧后,产生中断申请,RI置位。若接收到的第9位数据RB8为0,则接收到的前8位数据丢弃,且不产生中断申请。
在工作方式0时,SM2必须为0。
(3)REN:允许接收位。由软件置位或清0,只有当REN=1时,才允许接收,它相当于串行接收的开关;若REN=0时,则禁止接收。
(4)TB8:发送数据位8。在工作方式2和工作方式3时,TB8的内容是要发送的第9位数据,其值由用户通过软件设置。在双机通信时,TB8一般作为奇偶校验位使用;在多机通信中,常以TB8位的状态表示主机发送的是地址帧还是数据帧。
在工作方式1和工作方式0中,该位未用。
(5)RB8:接收数据位8。RB8是接收数据的第9位,在工作方式2和工作方式3中,接收数据的第9位数据放在RB8中,它可能是约定的奇偶校验位,也可能是地址/数据标志等。
在工作方式1中,RB8存放的是接收的停止位;在工作方式0中,该位未用。
(6)TI:发送中断标志。当工作方式0时,发送完第8位数据后,该位由硬件置1,在其他方式下,于发送停止位之前,由硬件置1,因此TI=1,表示帧发送结束,其状态既可供软件查询使用,也可请求中断。TI位必须由软件清0。
(7)RI:接收中断标志。当方式0时,接收完第8位数据后,该位由硬件置1,在其他方式下,当接收到停止位时,该位由硬件置1,因此RI=1,表示帧接收结束。其状态既可供软件查询使用,也可以请求中断。RI位也必须由软件清0。
无论接收/发送数据是否采用中断方式工作,每接收/发送一个数据都必须用指令对RI/TI清0,以备下一次收/发。
2.电源控制寄存器PCON
PCON主要是为MCS-51系列CHMOS型单片机的电源控制而设置的专用寄存器,单元地址为87 H,不能位寻址。其格式见图6-32。
图6-32 PCON格式
电源控制寄存器PCON中,与串行口工作有关的仅有它的最高位SMOD,SMOD称为串行口的波特率倍增位。在串行口工作方式1、2、3中,当SMOD=1时,波特率加倍;否则,波特率不加倍。系统复位时,SMOD=0。
3.中断允许控制寄存器IE
在中断允许控制寄存器IE中,与串行通信有关的位有ES位。ES为串行中断允许位,ES=0,禁止串行中断;ES=1,允许串行中断。
6.3.2.2 串行接口的工作方式
MCS-51单片机串行接口有4种工作方式,分别为方式0、方式1、方式2和方式3,由串行接口控制寄存器SCON中最高两位SM0、SM1的状态,通过软件设置来决定选择何种工作方式。其中有8位、10位和11位为一帧的数据传送格式。
1.工作方式0
工作方式0以8位数据为一帧进行传输,不设起始位和停止位,先发送或接收最低位。波特率固定,为f osc/12。其一帧数据格式如图6-33所示。
图6-33 方式0的帧格式
方式0为同步移位寄存器输入/输出方式。该方式并不能用于两个单片机之间的异步串行通信,而是用于串行口外接移位寄存器,扩展并行I/O口。
(1)方式0发送过程。当CPU执行一条将数据写入发送缓冲器SBUF的指令时,产生一个正脉冲,串行口开始把SBUF中的8位数据以f osc/12的固定波特率从RXD引脚串行输出,低位在先,TXD引脚输出同步移位脉冲,发送完8位数据,中断标志位TI置“1”。发送时序如图6-34所示。
图6-34 方式0发送时序
(2)方式0接收过程。方式0接收,REN为串行口允许接收控制位,REN=0,禁止接收;REN=1,允许接收。当向SCON寄存器写入控制字(设置为方式0,并使REN位置1,同时RI=0)时,产生一个正脉冲,串行口开始接收数据。引脚RXD为数据输入端,TXD为移位脉冲信号输出端,接收器以f osc/12的固定波特率采样RXD引脚的数据信息,当接收完8位数据时,中断标志RI置1,表示一帧数据接收完毕,可进行下一帧数据的接收,时序如图6-35所示。
图6-35 方式0接收时序
(3)方式0发送与接收应用举例。使用工作方式0实现数据的移位输入/输出时,实际上是把串行接口作为移位寄存器使用。
串行接口变为并行输出口使用时,要有“串入并出”的移位寄存器配合,例如CD4094、74LS164等。图6-36为8串行输入/并行输出移位寄存器CD4094、74LS164芯片的引脚图。数据预先写入串行接口数据缓冲寄存器SBUF,然后从串行接口RXD端在移位时钟脉冲TXD的控制下逐位移入CD4094/74LS164,当8位数据全部移出后,SCON寄存器的发送中断标志TI被自动置1。其后主程序就可用中断或查询的方法,通过设置STB状态的控制,把CD4094的内容并行输出。
图6-36 8串行输入/并行输出移位寄存器芯片的引脚图
串行接口变为并行输入口使用时,要有“并入串出”的移位寄存器配合,例如CD4014、74LS165等。图6-37为8串行输入/并行输出移位寄存器CD4014、74LS165芯片的引脚图。CD4014/74LS165移出的串行数据同样经RXD端串行输入,还是由TXD端提供移位时钟脉冲,8位数据串行接收需要有允许接收的控制,具体由SCON寄存器的REN位实现。REN=0,禁止接收;REN=1,允许接收。当软件置位REN时,即开始从RXD端输入数据(低位在前),当接收到8位数据时,置位接收中断标志RI。
图6-37 8并行输入/串行输出移位寄存器芯片的引脚图
图6-38、图6-39分别为采用CD4094/CD4014、74LS164/74LS165进行移位输入/输出的连接示意图。
图6-38 方式0采用CD4094和CD4014进行移位输入/输出的连接图
图6-39 方式0采用74LS164和74LS165进行移位输入/输出的连接图
在移位时钟脉冲(TXD)的控制下,数据从串行口RXD端逐位移入CD4094的DATA端或74LS164的SA、SB端。当8位数据全部移出后,SCON寄存器的TI位被自动置1。其后CD4094或74LS164的内容即可并行输出。当CD4094的STB端=0或74LS164的端=0时,数据串行输入,此时打开串行输入控制门,在时钟信号CLK的控制下,数据从串行输入端DATA或Q8一个时钟周期一位依次输入,而CD4094的STB端=1或74LS164的端=1时,数据并行输出,此时打开并行输出控制门,CD4094或74LS164中的8位数据并行输出。
CD4014的端或74LS165的端为置入/移位端或移位/_置入端,当_或S/=0时,8位数据从Q0~Q7并行置入到内部的寄存器;而当时,在时钟信号CLK的控制下,内部寄存器的内容按低位在前从Q8或QH端串行依次输出。在80C51串行控制寄存器SCON中的REN=1时,TXD端发出移位时钟脉冲,从RXD端串行输入8位数据。当接收到第8位数据D7后,置位中断标志RI,表示一帧数据接收完成。
从上可见,在工作方式0下,串行接口为8位同步移位寄存器输入/输出方式,这种方式不适合用于两个单片机芯片之间的直接数据通信,但可以通过外接移位寄存器来实现单片机的接口扩展。
(4)波特率的设定。工作方式0时,移位操作(串入或串出)的波特率是固定的。波特率为单片机晶振频率的1/12,如晶振频率以f osc表示,则波特率为f osc/12。按此波特率也就是一个机器周期进行一次移位,如f osc=12MHz,则波特率为1Mbit/s,即1μs移位一次。
(5)其他。在方式0,SCON中的TB8、RB8位没有用到,发送或接收完8位数据由硬件使TI或RI中断标志位置“1”,CPU响应TI或RI中断,在中断服务程序中向发送SBUF中送入下一个要发送的数据或从接收SBUF中把接收到的1个字节数据存入内部RAM中。
注意,TI或RI标志位必须由软件清“0”,采用如下指令:
CLR TI ;TI位清“0”
CLR RI ;RI位清“0”
方式0时,SM2位(多机通信控制位)必须为0。
2.工作方式1
方式1是以10位数据为一帧的串行异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图6-40所示。在一帧数据中,1位起始位(0)、8位数据位(数据位是先低位后高位)和1位停止位(1)。方式1可用于无奇偶校验的双机串行异步通信方式。方式1为波特率可变的10位异步通信接口。其波特率由下式确定
方式1波特率=2SMOD×定时器T1的溢出率
式中:SMOD为PCON寄存器的最高位的值(0或1)。
图6-40 方式1的帧格式
(1)方式1发送过程。发送时序见图6-41。图中TX时钟的频率就是发送的波特率。发送时,数据从TXD(P3.1)端输出,当TI=0,CPU执行数据写入发送缓冲器SBUF指令时,就启动了串行接口数据的发送操作。启动发送后,内部发送控制信号变为有效,串行接口自动把1位起始位清0,而后是8位数据和1位停止位1,一帧数据为10位。每经过一个TX时钟周期,便产生一个移位脉冲,并由TXD引脚输出一个数据位,数据依次从TXD端发出,一帧数据发送完毕,使TXD输出线维持在1状态下,并将SCON寄存器的TI置1,以便查询数据是否发送完毕或作为发送中断申请信号。TI必须由软件清0。
图6-41 方式1发送时序
(2)方式1接收过程。接收时序见图6-42。接收时,数据从RXD(P3.0)端输入,SCON的REN位应处于允许接收状态(REN=1)。在此前提下,串行接口采样RXD(P3.0)端,当采样到从1向0的状态负跳变时,就认定是接收到起始位。
图6-42 方式1接收时序
接收时,定时控制信号有两种:一种是接收移位时钟(RX时钟),它的频率和传送的波特率相同;另一种是位检测器采样脉冲,频率是RX时钟的16倍。以波特率的16倍速率采样RXD脚状态。当采样到RXD端从1到0的负跳变时就启动检测器,接收的值是3次连续采样(第7、8、9个脉冲时采样)取两次相同的值,以确认起始位(负跳变)的开始,较好地消除干扰引起的影响。
当确认起始位有效时,开始接收一帧信息。每一位数据,也都进行3次连续采样(第7、8、9个脉冲采样),接收的值是3次采样中至少两次相同的值。当一帧数据接收完毕后,同时满足以下两个条件,接收才有效。
1)RI=0,即上一帧数据接收完成时,RI=1发出的中断请求已被响应,SBUF中的数据已被取走,说明“接收SBUF”已空。
2)SM2=0或收到的停止位=1(方式1时,停止位已进入RB8),则将接收到的数据装入SBUF和RB8(装入的是停止位),且中断标志RI置“1”。
若不同时满足两个条件,接收的数据不能装入接收寄存器SBUF,该帧数据将丢弃。
在同时满足上面两个条件下,通过移位脉冲的控制,把接收到的数据位移入接收寄存器SBUF中。直到停止位到来之后把停止位送入RB8中,并置位中断标志位RI,通知CPU从SBUF取走接收到的一个字符。
(3)波特率的设定。工作方式1的波特率则是可变的。它以定时器T1作波特率发生器使用,其值由定时器1的计数溢出率来决定,其公式为:
波特率=(2SMOD/32)×定时器T1溢出率
式中:T1溢出率为一次定时时间的倒数,即为
定时器T1溢出率=1/[(2m-X)×12/f osc]=f osc/[(2m-X)×12]
式中:X为计数初值,m由定时器T1的工作方式所决定,即m=8、13或16,当定时器1作波特率发生器使用时,一般选用工作方式2。之所以选择工作方式2,是因为它具有自动加载功能,可避免通过程序反复装入初值所引起的定时误差,使波特率更加稳定。因此,对于定时器T1的工作方式2,定时器T1的溢出率又可简化为
定时器T1溢出率=f osc/[(256-X)×12]
此时,波特率为
因此,计数初值X为
X=256-(2SMOD×f osc)/(384×波特率)
例如,设两机通信的波特率为2400波特,若f osc=12MHz,串行接口工作在方式1,用定时器T1作波特率发生器,选定时器工作在方式2(要禁止T1中断,以免产生不必要的中断带来频率误差)。
若SMOD=1,则计数初值X为
若SMOD=0,则计数初值X为
3.工作方式2和3
方式2和方式3都为以11位数据为一帧的串行异步通信接口,TXD为数据发送引脚,RXD为数据接收引脚。在每帧11位数据中,1位起始位(0),8位数据位(先低位),1位可程控为1或0的附加第9位数据(发送时为SCON中的TB8,接收时为RB8)和1位停止位(1)。方式2、方式3帧格式如图6-43所示。方式2与方式3的差别仅是波特率不同,其中,方式2的波特率固定为晶振频率的1/64或1/32两种,而方式3的波特率与方式1相同,是由定时器T1的溢出率决定。方式2和3可用于多机串行异步通信或带奇偶校验的双机串行异步通信。
图6-43 方式2、方式3的帧格式
(1)方式2和3发送过程。在工作方式2和3下,字符还是8个数据位,只不过增加了一个第9个数据位(D8),而且其功能由用户确定,是一个可编程位。
串行口方式2和3发送时序如图6-44所示。发送前,先根据通信协议预先由软件设置SCON的TB8(如奇偶校验位或多机通信的地址/数据标志位),把第9个数据位的内容准备好。然后将要发送的数据(D0~D7)写入SBUF,而D8位的内容由硬件电路从TB8中直接送到发送移位寄存器的第9位,并以此来启动串行发送,逐一发送。一个字符帧发送完毕,使TI位置“1”,其他过程与工作方式1相同。
图6-44 方式2和方式3发送时序
(2)方式2和3接收过程。串行口方式2和3接收时序如图6-45所示。其接收过程也与工作方式1基本类似,所不同的只在第9数据位上,串行口把接收到的前8个数据位送入SBUF,而把第9数据位送入RB8。
当REN=1时,数据由RXD端输入,接收11位信息。当位检测逻辑采样到RXD的负跳变,判断起始位有效,便开始接收一帧信息。在接收完第9位数据后,需满足以下两个条件,才能将接收到的数据送入SBUF(接收缓冲器)。
1)RI=0,意味着接收缓冲器为空。
2)SM2=0或接收到的第9位数据位RB8=1。
当满足上述两个条件时,收到的数据送SBUF(接收缓冲器),第9位数据送入RB8,且RI置“1”。若不满足这两个条件,接收的信息将被丢弃。
图6-45 方式2和方式3接收时序
(3)波特率的设定。方式2与方式3的差别仅是波特率不同,其中工作方式2的波特率是固定的两种,而工作方式3波特率与方式1相同,是可变的。它们的波特率公式为
方式2波特率=2SMOD/64×f osc(www.xing528.com)
方式3波特率=2SMOD/32×定时器T1的溢出率
式中,工作方式2的波特率与PCON寄存器中SMOD位的值有关。当SMOD=0时,波特率为f osc的1/64;当SMOD=1时,波特率等于f osc的1/32。
4.方式2、3的多机通信原理
多个单片机可利用串行口工作方式2、方式3进行多机通信,经常采用如图4-46所示的主从式结构。系统中有1个主机(单片机或其他有串行接口的微机)和1、2、…、N多个单片机组成的从机系统。主机的RXD与所有从机的TXD端相连,TXD与所有从机的RXD端相连。从机地址分别为01H,02H,…,(N-1)H。
图6-46 多机通信系统示意图
主从式是指多机系统中,只有一个主机,其余全是从机。主机发送的信息可以被所有从机接收,任何一个从机发送的信息,只能由主机接收。从机和从机之间不能进行直接通信,只能经主机才能实现。
(1)多机通信的工作原理。要保证主机与所选择的从机通信,须保证串口有识别功能。SCON中的SM2位就是为满足这一条件设置的多机通信控制位。其工作原理是在串行口以方式2或方式3接收时,若SM2=1,则表示进行多机通信,可能出现以下两种情况:
1)从机接收到的主机发来的第9位数据RB8=1时,前8位数据才装入SBUF,并置中断标志RI=1,向CPU发出中断请求。在中断服务程序中,从机把接收到的SBUF中的数据存入数据缓冲区中。
2)如果从机接收到的第9位数据RB8=0时,则不产生中断标志RI=1,不引起中断,从机不接收主机发来的数据。
若SM2=0,则接收的第9位数据不论是0还是1,从机都将产生RI=1中断标志,接收到的数据装入SBUF中。
利用这一特性,便可实现主机与多个从机之间的串行通信。
(2)单片机多机通信的工作过程。
1)各从机初始化程序允许从机的串行口中断,将串行口编程为方式2或方式3接收,即9位异步通信方式,且SM2和REN位置“1”,使从机处于多机通信且只接收地址帧的状态。
2)在主机和某个从机通信之前,先将从机地址(即准备接收数据的从机)发送给各个从机,接着才传送数据(或命令),主机发出的地址帧信息的第9位为1,数据(或命令)帧的第9位为0。当主机向各从机发送地址帧时,各从机的串行口接收到的第9位信息RB8为1,且由于各从机的SM2=1,则RI置“1”,各从机响应中断,在中断服务子程序中,判断主机送来的地址是否和本机地址相符合,若为本机地址,则该从机SM2位清“0”,准备接收主机的数据或命令;若地址不相符,则保持SM2=1。
3)接着主机发送数据(或命令)帧,数据帧的第9位为0。此时各从机接收到的RB8=0。只有与前面地址相符合的从机(即SM2位已清“0”的从机)才能激活中断标志位RI,从而进入中断服务程序,接收主机发来的数据(或命令);与主机发来的地址不相符的从机,由于SM2保持为1,又RB8=0,因此不能激活中断标志RI,就不能接受主机发来的数据帧。从而保证主机与从机间通信的正确性。此时主机与建立联系的从机已经设置为单机通信模式,即在整个通信中,通信的双方都要保持发送数据的第9位(即TB8位)为0,防止其他的从机误接收数据。
4)结束数据通信并为下一次的多机通信做好准备。在多机系统,每个从机都被赋予唯一的地址。例如,多个从机的地址可设为:01H、02 H、…、(N-1)H。还要预留1~2个“广播地址”,它是所有从机共有的地址,例如,将“广播地址”设为00 H。当主机与从机的数据通信结束后,一定要将从机再设置为多机通信模式,以便进行下一次的多机通信。这时要求与主机正在进行数据传输的从机必须随时注意,一旦接收的数据第9位(RB8)为“1”,说明主机传送的不再是数据,而是地址,这个地址就有可能是“广播地址”。当收到“广播地址”后,便将从机的通信模式再设置成多机模式,为下一次的多机通信做好准备。
(3)多机通信的通信协议。通信协议的约定为:要保证通信的可靠和有条不紊,主、从机相互通信时,必须要有严格的通信协议。一般通信协议都有通用标准,协议较完善,但很复杂。这里为了说明MCS-51单片机多机通信程序设计的基本原理,仅讲述几条最基本的条款。
1)设置主、从机工作于方式2或方式3,收、发双方发送或接收的波特率必须相同,并且接收方允许接收。
2)规定主机用第9数据位TB8进行地址/数据帧辨别。若TB8=0,表示发送的是数据帧;若TB8=1,表示发送的是地址帧。
3)规定系统中从机容量数及地址编号。
4)规定对所有从机都起作用的控制命令,即复位命令,命令所有从机恢复到SM2=1的状态。
5)设定主、从机数据通信的长度和校验方式。
6)设定主机发送的有效控制命令代码,其余即为非法代码。从机接收到命令代码后必须先进行命令代码的合法性检查,检查合法后才执行主机发出的命令。
7)设置从机工作状态字,说明从机目前状态。如从机是否准备好、从机接收数据是否正常等。
5.波特率的制定方法
4种工作方式的波特率总结如下:
(1)方式0时,波特率固定,不受SMOD位值的影响。
方式0的波特率=f osc/12
若f osc=12MHz,波特率为1Mbit/s。
(2)方式2时,波特率仅与SMOD位的值有关。
方式2波特率=2SMOD/64×f osc
若f osc=12MHz:SMOD=0,波特率=187.5kbit/s;SMOD=1,波特率为375kbit/s。
(3)方式1或方式3定时,常用T1作为波特率发生器,其关系式为:
波特率=2SMOD/32×定时器T1的溢出率
因此,波特率由T1溢出率和SMOD的值共同决定。
在实际设定波特率时,T1常设置为方式2定时(自动装初值),即TL1作为8位计数器,TH1存放备用初值。这种方式操作方便,也避免因软件重装初值带来的定时误差。
设定时器T1方式2的初值为X,则有:
定时器T1溢出率=f osc/{12×[256-X]}
由此可得,
波特率=2SMOD/32×f osc/{12×[256-X]}
因此,波特率随f osc、SMOD和初值X而变化。
实际使用时,经常根据已知波特率和时钟频率f osc来计算T1的初值X。为避免繁杂的初值计算,常用的波特率和初值X间的关系常列成表6-5的形式,以供查用。
表6-5 常用定时器T1产生的常用波特率
对表6-5有两点需要注意:
1)在使用的时钟振荡频率f osc为12MHz或6MHz时,将初值X和f osc带入公式计算出的波特率有一定误差。消除误差可采用时钟频率11.0592MHz。
2)如果选用很低的波特率,如波特率选为55,可将定时器T1设置为方式1定时。但在这种情况下,T1溢出时,需在中断服务程序中重新装入初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的方法加以调整。
【例6-6】 若时钟频率为11.0592MHz,选用T1的方式2定时作为波特率发生器,波特率为2400bit/s,求初值。
设T1为方式2定时,选SMOD=0。
将已知条件代入下式中
波特率=2SMOD/32×f osc/{12×[256-X]}=2400
解得X=244=F4H。
只要把F4H装入TH1和TL1,则T1产生的波特率为2400bit/s。该结果也可直接从表6-5中查到。这里时钟振荡频率选为11.0592MHz,就可使初值为整数,从而产生精确的波特率。
6.3.2.3 MCS-51单片机内部串行口的应用
1.串行口的初始化
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。一般步骤如下:
(1)设定串行口的工作方式,设定SCON寄存器。
(2)设置波特率。对于方式0,不需要设置波特率;对于方式2,设置波特率仅需对PCON中的SMOD位编程:对于方式1和方式3,设置波特率不仅需对PCON中的SMOD位编程,还需开启定时器1信号发生器,对T1编程。
(3)串行工作方式1、3需对T1编程。确定T1的工作方式(编程TMOD寄存器);计算T1的初值,装载TH1、TL1;启动T1(编程TCON中的TR1位)。
(4)选择查询方式或中断方式,在中断工作方式时,需要进行中断设置(编程IE、IP寄存器)。
2.串行通信设计需要考虑的问题
单片机的串行通信接口设计时,需考虑如下问题:
(1)首先确定通信双方的数据传输速率。
(2)由数据传输速率确定采用的串行通信接口标准。
(3)在通信接口标准允许的范围内确定通信的波特率。为减小波特率的误差,通常选用11.0592MHz的晶振频率。
(4)根据任务需要,确定收发双方使用的通信协议。
(5)通信线的选择,这是要考虑的一个很重要的因素。通信线一般选用双绞线较好,并根据传输的距离选择纤芯的直径。如果空间的干扰较多,还要选择带有屏蔽层的双绞线。
(6)通信协议确定后,进行通信软件编程。利用串行口可实现单片机间的点对点串行通信、多机通信以及单片机与PC机间的单机或多机通信。
3.串行口的应用
利用串行口可实现单片机并行接口扩展、单片机间的点对点串行通信、多机通信以及单片机与PC机间的单机或多机通信。
图6-47 例6-7的电路图
【例6-7】 如图6-47所示,用MCS-51单片机的串行口外接串入并出的芯片CD4094扩展并行输出口控制一组发光二极管,使发光二极管从左到右依次点亮,并反复循环。
由硬件连接可知,要使某一个发光二极管点亮,必须使驱动该发光二极管的CD4094并行输出端输出高电平。因此,要点亮Q1对应的发光二极管,串行口应送出80 H,要实现将发光二极管由左到右依次循环点亮,只需使串行口依次循环送出80 H→40 H→20H→10 H→08 H→04H→02 H→01 H即可。串行口数据传送时,为避免CD4094并行输出端Q1~Q8的不断变化而使发光二极管闪烁,在传送时,使P1.0=0(即STB=0),每次串行口数据传送完毕,即SCON的TI位为1时,使P1.0=1(即STB=1),Q1~Q8输出控制相应发光二极管点亮。
使用时,8051串行口工作于方式0,8051的TXD接CD4094的CLK,RXD接DATA,STB用P1.0控制,8位并行输出端接8个发光二极管。
设串行口采用查询方式,显示的延时依靠调用延时子程序来实现。
汇编参考程序为:
C语言参考程序为:
在上述程序中,有几点要特别注意:①SCON的SM2位一定要为0;②使用中断方法编写上面功能的程序,也不能忘记软件清TI位;③DELAY是一个延时子程序,若没有延时,程序执行后,由于人眼的视觉惰性,8只发光二极管看起来像同时被点亮一样。
【例6-8】 如图6-48所示,用8051单片机的串行口外接并入串出的芯片CD4014扩展并行输入口,输入一组开关的信息。
使用时,8051串行口工作于方式0,8051的TXD接CD4094的CLK,RXD接QB,用P1.0控制,另外,用P1.1控制8并行数据的置入。
串行口方式0数据的接收,用SCON寄存器中的REN位来控制,采用查询RI的方式来判断数据是否输入。
汇编参考程序为:
C语言参考程序为:
图6-48 例6-8的电路图
【例6-9】 串行通信实现将甲机的片内RAM中30 H~3FH单元的内容传送到乙机的片内RAM中40H~4FH单元中。
如果两个单片机相距在1.5m之内,它们的串行口可直接采用TTL电平相连;若在1.5~15m之间时它们的串行口可通过RS-232C标准接口相连接口,如图6-49所示。甲机RXD与乙机TXD端相连,乙机RXD与甲机TXD端相连,地线与地线相连。
图6-49 双机TTL电平和RS-232C电平的通信接口
甲乙两机都选择方式1,即8位异步通信方式,最高位用作奇偶校验,波特率为1200bps,甲机发送,乙机接收,因此甲机、乙机的串口控制字分别为40H、50H。
由于选择串口方式1,波特率由T1的流出率和SMOD位决定,需对T1进行初始化。设SMOD=0,甲机、乙机的f osc=12MHz,T1选择为方式2,则T1的初值为:
初值x=256-f osc×2SMOD/(12×波特率×32)≈230=E6 H
根据要求,T1的方式控制字为20 H。下面采用查询方式编写程序。
甲机的汇编语言发送程序:
乙机的汇编语言接收程序:
甲机的C语言发送程序:
乙机的C语言接收程序:
【例6-10】 现用简单实例说明单片机多机串行通信中从机的基本工作过程。而实际应用中还需要考虑通信的规范协议。有些协议很复杂,在此不加以考虑。假设系统晶振频率为11.0592MHz。设多机单工通信如图6-50所示。试编程实现如下功能:
(1)主机先向从机发送一帧地址信息,然后再向从机发送10个数据信息。
图6-50 多机单工通信的连接图
(2)从机接收主机发来的地址帧信息,并与本机的地址号相比较,若不符合,仍保持SM2=1不变;若相等,则使SM2清零,准备接收后续的数据信息,直至接收完10个数据信息。图6-51为多机单工通信的流程图。具体的汇编及C语言程序请读者自己完成。
图6-51 多机单工通信的流程图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。