电子工程师提升计划-第5章 中断技术【2.3】

7.3 串行通信口的控制

        串行通信口的工作受串行控制寄存器SCON和电源控制寄存器PCON的控制。

7.3.1 串行控制寄存器SCON

        SCON用来控制串行通信的工作方式及反映串行通信口的一些工作状态。SCON是一个8位寄存器,它的地址为98H,其中每位都可以位寻址。SCON各位的名称和地址如下:


        SM0、SM1位:串行通信口工作方式设置位。通过设置这两位的值,可以让串行通信口工作在4种不同的方式下,具体见表7-1。
        表7-1 串行通信口工作方式设置位及其功能


        这几种工作方式在后面将会详细介绍。
        SM2、TB8和RB8位:用来设置主——从式多机通信。当一个单片机(主机)要与其他几个单片机(从机)通信时,就要对这些位进行设置。当SM2=1时,允许多机通信;当SM2=0时,不允许多机通信。REN位:允许/禁止接收数据控制位。当REN=1时,允许串行通信口接收数据;当REN=0时,禁止串行通信口接收数据。

        TI位:发送中断标志位。当串行通信口工作在方式0时,发送完8
位数据后,该位自动置“1”(即硬件置“1”),向CPU发出中断请
求,在CPU响应中断后,必须用软件清0;在其他几种工作方式中,该
位在停止位开始发送前自动置“1”,向CPU发出中断请求,在CPU响应
中断后,也必须用软件清0。
        RI位:接收中断标志位。在工作方式0时,接收完8位数据后,该位自动置“1”,向CPU发出接收中断请求,在CPU响应中断后,必须用软件清0;在其他几种工作方式中,该位在接收到停止位期间自动置“1”,向CPU发出中断请求,在CPU响应中断取走数据后,必须用软件对该位清0,以准备开始接收下一帧数据。在上电复位时,SCON各位均为“0”。

7.3.2 电源控制寄存器PCON

        PCON是一个8位寄存器,它的字节地址为87H,不可位寻址,并且只有最高位SMOD与串行通信口控制有关。PCON各位的名称和地址如下:


SMOD位:波特率设置位。在串行通信口工作在方式1~3时起作用。若SMOD=0,波特率不变;当SMOD=1时,波特率加倍。在上电复位时,SMOD为“0”。

7.4 4种工作方式与波特率的设置

        串行通信口有4种工作方式,具体工作在哪种方式受寄存器SCON的控制。在串行通信时,要改变数据传送速率(波特率),可对波特率进行设置。

7.4.1 方式0

        当SCON中的SM0=0、SM1=0时,串行通信口工作在方式0。方式 0 称为同步移位寄存器输入/输出(I/O)方式,常用于扩展I/O 接口。在单片机发送或接收串行数据时,通过RXD端发送数据或接收数据,而通过TXD端送出数据传输所需的移位脉冲。
        在方式0时,串行通信口又分两种工作情况:发送数据和接收数据。
1.方式 0——发送数据
        当串行通信口工作在方式0时,若要发送数据,通常在外部接8位串/并转换移位寄存器74LS164,具体连接电路如图7-7所示。其中,RXD 端用来输出串行数据,TXD 端用来输出移位脉冲,P1.0端用来对74LS164进行清0。

        在单片机发送数据前,先从P1.0引脚发出一个清0信号(低电平)到74LS164的CLR引脚,对其进行清0,让D7~D0全部为“0”,然后单片机在内部执行写SBUF指令,开始从RXD端(P3.0引脚)送出8位数据,与此同时,单片机的TXD端输出移位脉冲到74LS164的CLK引脚,在移位脉冲的控制下,74LS164接收单片机RXD端送到的8位数据(先低位后高位),数据发送完毕,在74LS164的D7~D0端输出8位数据。另外,在数据发送结束后,寄存器SCON的发送中断标志位TI自动置“1”。
下面以图7-7所示的电路为例,编写一段程序,将单片机中的数据36H通过串行通信口发送到74LS164中。
程序如下:
MOV SCON,#00H ;将数据00H(00000000)送到寄存器SCON中,
设置串行通信为方式0
CLR P1.0  ;将P1.0端口清0,即让P1.0引脚输出低电平,对74LS164进行清0
NOP    ;空操作指令,单片机不进行任何操作,用来消耗一
个机器周期
NOP    ;再消耗一个机器周期(机器周期一般是时钟周期的
12倍,若时钟频率是12MHz,
;那么机器周期为1μs(12×1/12MHz),这两条空指令的功能是
让P1.0端口的低
;电平持续2μs,以便能使清0顺利完成
SETB P1.0  ;将P1.0端口置“1”,即让P1.0端口由低电平变为
高电平,以结束对74LS164
;的清0操作
MOV SBUF,#36H ;将数据36H写入串行通信口的缓冲器SBUF中,
同时数据36H由低到高逐位
;从RXD端送出,进入74LS164的1、2脚
JNB TI,$  ;判断SCON的TI位是否为“0”,若为“0”,则反
复执行本条指令;若为“1”,
;则执行下一条指令。只有RXD端8位数据发送完毕,TI位才会置
“1”,所以
;该指令是等待数据发送完成,若未完成(TI=0)继续等待,若完
成(TI=1)则执
;行下一条指令
CLR TI   ;将TI位清0。当一帧数据发送完成时,需要将TI位清0,以便开始发送下一帧;数据

2.方式 0——接收数据

        当串行通信口工作在方式0时,若要接收数据,一般在外部接8位并/串转换移位寄存器74LS165,具体连接电路如图7-8所示。在这种方式时,RXD端用来接收输入的串行数据,TXD端用来输出移位脉冲,P1.0端用来对74LS165的数据进行锁存。

        在单片机接收数据前,先从P1.0引脚发出一个低电平信号到74LS165的S/L引脚,让74LS165锁存由D7~D0端输入的8位数据,然后单片机内部执行读SBUF指令,与此同时,单片机的TXD端送移位脉冲到74LS165的CLK1引脚,在移位脉冲的控制下,74LS165中的数据逐位从RXD端送入单片机,单片机接收数据完毕,寄存器SCON的接收中断标志位RI自动置“1”。
下面编写一段程序,让单片机接收74LS165送来的8位数据。
程序如下:
CLR P1.0  ;让P1.0引脚输出低电平,将从D7~D0端输入的数
据存入74LS165中
NOP    ;空操作指令
NOP    ;空操作指令,这两条空指令是让P1.0端口的低电平
持续2μs,以便74LS165能
;顺利完成数据的存入
SETB P1.0  ;让P1.0端口由低电平变为高电平,以结束74LS165
对数据的存入
MOV SCON,#10H ;将数据10H(00010000)送到寄存器SCON中,
让REN位为“1”,设置串行

;通信为方式0,并启动数据接收
JNB RI,$  ;等待接收数据完成,若未完成继续等待,若完成
则执行下一条指令
CLR RI   ;将RI位清0。当一帧数据接收完成时,需要将RI位
清0,以便开始接收下一帧
;数据
MOV A,SBUF  ;将接收器内的数据送入累加器A中
在方式0中,串行通信口发送和接收数据的波特率都是fosc/12。

7.4.2 方式1

        当寄存器SCON中的SM0=0、SM1=1时,串行通信口工作在方式1。在方式1时,串行通信口可以发送和接收每帧10位的串行数据。其中,TXD端用来发送数据, RXD端用来接收数据。在方式1中,一帧数据中有10位,包括1位起始位(低电平)、8位数据位(低位在前)和1位停止位(高电平)。
        在方式1时,串行通信口又分两种工作情况:发送数据和接收数据。
1.方式1——发送数据
        在发送数据时,若执行写 SBUF 指令(如 MOV SBUF,#36H),发送控制器在移位脉冲(由定时器/计数器T1产生的信号再经16或32分频而得到)的控制下,先从TXD端送出一个起始位(低电平),然后再逐位将8位数据从TXD端送出,当最后一位数据发送完成时,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)。
2.方式1——接收数据
        在方式1时,需要设置SCON中的REN=1,串行通信口才允许接收数据。由于不知道外部设备何时会发送数据,所以串行通信口会不断检测RXD端,当检测到RXD端有负跳变(由“1”变为“0”)时,说明外部设备发来了数据的起始位,于是启动RXD端接收,将输入的8位数据逐位移入内部的输入移位寄存器。
        8位数据全部进入输入移位寄存器后,如果满足RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的数据停止位为“1”也可以)的条件,输入移位寄存器中的8位数据才可以放入SBUF,停止位的“1”才能送入SCON的RB8位中,RI位就会被置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据;如果条件不满足,输入移位寄存器中的数据将无法送入SBUF而丢弃,重新等待接收新的数据。

7.4.3 方式2

        当SCON中的SM0=1、SM1=0时,串行通信口工作在方式2。在方式2时,串行通信口可以发送和接收每帧11位的串行数据,其中1位起始位、8位数据位、1位可编程位和1位停止位。TXD端用来发送数据,RXD端用来接收数据。
        在方式2时,串行通信口又分两种工作情况:发送数据和接收数据。

1.方式2——发送数据
        在方式2时,发送的一帧数据有11位,其中有9位数据,第9位数据取自SCON中的TB8位。在发送数据前,先用软件设置TB8位的值,然后执行写SBUF指令(如MOV SBUF,A),发送控制器在内部移位脉冲的控制下,从TXD端送出一个起始位(低电平),然后逐位送出8位数据,再从TB8位中取出第9位并送出,当最后一位数据发送完成,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)。
2.方式2——接收数据
        在方式2时,同样需设置SCON的REN=1,串行通信口才允许接收数据,然后不断检测RXD端是否有负跳变(由“1”变为“0”),若有,说明外部设备发来了数据的起始位,于是启动 RXD端接收数据。当8位数据全部进入输入移位寄存器后,如果RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的第9位数据为“1”也可以),输入移位寄存器中的8位数据才可以送入SBUF,第9位会放进SCON的RB8位,同时RI位置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据,否则输入移位寄存器中的数据将无法送入SBUF而丢弃。

7.4.4 方式3

        当SCON中的SM0=1、SM1=1时,串行通信口工作在方式3。方式3与方式2一样,传送的一帧数据都为11位,工作原理也相同,两者的区别仅在于波特率不同,方式2的波特率固定为fosc/64或fosc/32,而方式3的波特率则可以设置。

7.4.5 波特率的设置

        在串行通信中,为了保证数据的发送和接收成功,要求发送方发送数据的速率与接收方接收数据的速率相同,而将双方的波特率设置相同就可以达到这个要求。
        在串行通信的4种方式中,方式0的波特率是固定的,而方式1~方式3的波特率则是可变的。波特率是数据传送的速率,它用每秒传送的二进制数的位数来表示,单位符号是baud/s。
1.方式0的波特率
方式0的波特率固定为时钟振荡频率的1/12,即:

2.方式2的波特率
方式2的波特率由寄存器PCON中的SMOD位决定。当SMOD=0时,方式2的波特率为时钟振荡频率的1/64;当SMOD=1时,方式2的波特率加倍,为时钟振荡频率的1/32,即:


3.方式1和方式3的波特率
方式1和方式3的波特率除了与SMOD位有关,还与定时器/计数器T1的溢出率有关。方式1和方式3的波特率可用下式计算:


T1的溢出率是指定时器/计数器T1在单位时间内计数产生的溢出次数,也即溢出脉冲的频率。
        在将定时器/计数器T0设作工作方式3时(设置方法见“定时器/计数器”一章内容),T1可以工作在方式0、方式1或方式2这3种方式下。当T1工作于方式0时,它对脉冲信号(由时钟信号fosc经12分频得到)进行计数,计到213时会产生一个溢出脉冲到串行通信口作为移位脉冲;当T1工作于方式1和方式2时,则分别要计到216和28-X(X为T1的初值,可以设定)才产生溢出脉冲。
        如果欲提高串行通信口的波特率,可让T1工作在方式2,因为该方式计数时间短,溢出脉冲频率高,并且能通过设置 T1 的初值来调节计数时间,从而改变 T1 产生的溢出脉冲的频率(又称 T1的溢出率)。
当T1工作在方式2时,T1两次溢出的时间间隔,也即T1的溢出周期为:

故当T1工作在方式2时,串行通信口工作方式1、3的波特率为:


由上式可推导出T1在方式2时,其初值X为:


例如:单片机的时钟频率fosc=11.0592 MHz,现要让串行通信的波特率为2400 baud/s,可将串行通信口的工作方式设为1、T1的方式设为2,并求出T1应设的初值。
求T1初值的过程如下。
先进行寄存器设置:为了让波特率不倍增,将寄存器PCON中的数据设为00H,这样SMOD位就为“0”;设置寄存器TMOD中的数据为20H,这样T1就工作在方式2。
再计算并设置T1的初值:


十进制数244转换成十六进制数为F4H,将T1的初值设为F4H。由于设置波特率和初值需要计算,比较麻烦,一般情况下可查表来进行设置。常见的波特率设置见表7-2。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryStarXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值