之前学习了UART通信协议,那为了实现串行通信,单片机中需要有对应的硬件电路。 这些硬件电路用来解决串行通信中的一系列协调问题,而这些硬件就是串行接口,简称为串行口。
下面对80C51单片机中的串行口进行介绍。
硬件结构
通常把实现异步通信的串行口称为通用异步接收器/发送器UART,把实现同步通信的串行口称为通用同步接收器/发送器USRT,把实现同步和异步通信的串行口称为通用同步异步接收/发送器USART。
80C51的串行口,虽然是既能实现同步通信,又能实现异步通信的全双工串口,但在单片机的串行数据通信中,最常用的是异步方式,因此常把它写为UART。它的硬件结构如下图:
SBUF为8位只写寄存器,地址为99H。在发送状态下,写入该寄存器的数据将从TXD引脚发送出去。在接收状态下,存放从RXD引脚接收到的数据,只供CPU读取。
鉴于任何时刻CPU只能执行发送或接收指令中的一种,因此,这两个状态的寄存器共用一个地址。
在通信过程中,一旦SBUF变成空或变满,便向CPU发送中断请求。
串行口有两个相互独立的数据引脚,即发送引脚TXD和接收引脚RXD,分别供数据发送和接收使用。 但这两个引脚都是和IO口线复用的,TXD与P3.1共用,RXD与P3.0共用。
串行口的主要功能是实现数据的串行化/反串行化,串行化是把并行数据转变为串行数据,而反串行化则是把串行数据转变为并行数据。
串行口的数据发送是一个串行化的过程,在这一过程中,把写入发送寄存器的并行数据,按帧格式要求插入格式信息(起始位,奇偶校验位和停止位),构成一个串行位串,经TXD引脚串行送出。
串行口的数据接收是一个反串行化过程。 在反串行化过程中,串行数据通过引脚RXD进入,经移位寄存器移位,把帧格式中的信息格式滤除而保留数据位,从而在接收缓冲器中得到并行数据,并送上内部数据总线。
在串行接收通路中,移位寄存器和接收缓冲器构成了双缓冲结构,以避免在数据接收过程中出现帧重叠错误
所谓帧重叠错误,就是在接收下一帧数据时候,前一帧的数据还没有被读走.
控制机制
80C51串行口通过控制寄存器、中断功能和波特率设置实现串行通信控制,此处先介绍前两项内容。
串行口控制寄存器SCON
SCON是80C51的一个可位寻址的专用寄存器,用于串行数据通信控制。 单元地址为98H,位地址为9FH~98H。寄存器内容及位地址表示如下:
位地址 | 9FH | 9EH | 9DH | 9CH | 9BH | 9AH | 99H | 98H |
---|---|---|---|---|---|---|---|---|
位符号 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SM0/SM1—串行口工作方式选择位. 00为工作方式0,依次类推
SM2—多机通信控制位.
TB8—发送数据位8
RB8—接收数据位8
REN—允许接收位
TI—串行发送中断请求标志.
在数据发送过程中,当最后一个数据位被发送完成后,RI由硬件置位. 软件查询时TI可作为状态位使用.
RI—串行接收中断请求标志.
在数据接收过程中,当采样到最后一个数据位有效时,RI由硬件置位.软件查询时RI可作为状态位使用.
串行中断
80C51有两个串行中断,即串行发送中断和串行接收中断. 但这两个串行中断共享一个中断向量0023H. 每当串行口发送或接收一个数据字节时,都产生中断请求. 串行中断请求在芯片内部发生,因此不需要引脚. 两个中断共享一个中断向量,就需要在中断服务程序中对中断源进行判断,以便进行不同的中断处理.
对于串行中断控制共涉及3个寄存器. 其中一个就是上面介绍的SCON,用于存放串行中断请求标志. 另外两个是中断允许控制寄存器IE和中断优先级控制寄存器IP. (具体内容可参考我写的另一个篇关于中断系统的博客:中断系统详解)
工作方式
上面介绍到SM1/SM0可以控制串行口的工作方式,其概况如表所示:
SM0 | SM1 | 工作方式 | 功能简述 | 波特率 |
---|---|---|---|---|
0 | 0 | 方式0 | 8位同步移位寄存器 | fosc/12 |
0 | 1 | 方式1 | 10位UART | 可变 |
1 | 0 | 方式2 | 11位UART | fosc/32或fosc/64 |
1 | 1 | 方式3 | 11位UART | 可变 |
下面对其中的内容进行具体介绍
方式0
方式0是把串行口作为同步移位寄存器使用,实现串行数据的输入/输出. 移位数据的传输以8位为一组,地位在前,高位在后.
利用工作方式0,加上"并入串出"或"串入并出"芯片的配合.80C51的串行口可实现数据的并行输入/输出.
并入串出芯片用于把并行数据通过移位形成位串,传送给串行口;而串入并出芯片则接收串行口的串行数据,通过移位形成8位并行数据输出.
在方式0下,串行数据的发送和接收都使用RXD引脚,而TXD引脚用来为并入串出或串入并出芯片中的移位寄存器提供移位脉冲,控制数据移位速率. 该移位脉冲由串行口提供,直接送到两种移位寄存器的时钟输入端.
为控制并行数据的输入和移位,并入串出芯片要有输入选通和启动移位的信号,即移位/加载信号. 先把此信号置0以加载并行数据,随后再变为1以启动移位,把数据位直接移向串行口的RXD引脚. 实际应用中,该信号通常由软件方法产生,通过一条口线送出.
方式0的帧格式都是纯数据位,不用附加起始位,停止位和校验位, 数据移位按低位在前,高位在后的顺序进行. 输入的并行数据在串行口缓冲器SBUF中. 串行数据接收需要有允许接收的控制,具体由SCON中的REN位实现. 当REN=0时,禁止接收,REN=1时,允许接收.
当软件置位REN时,即开始从RXD端输入数据,当接收到8位数据后,中断标志RI置位. 再通过查询或中断方法把移入串行口的数据读走,然后就可以对并入串出芯片加载新数据了.
要用80C51的串行口进行并行数据的输出,先把数据字节通过RXD引脚串行传送给串入并出芯片,并在TXD引脚移位脉冲的控制下,把接收的串行数据通过移位得到并行数据,移位停止后,8位并行数据留在其中,等待被其他设备取走.
如果串入并出芯片没有并行输出的选通控制功能,可在数据输出端加三态门,通过选通控制,实现并行数据齐步输出. 当串行口把8位数据全部移走后,SCON寄存器的中断标志TI被自动置1. 通知CPU以中断或查询的方法把并行数据取走
工作方式0时,移位操作(串入或串出)的波特率时固定的,位单片机晶振频率的1/12,若晶振频率用fosc表示,则波特率为fosc/12.
按此波特率的一个机器周期进行一次移位,若fosc = 6MHz,则波特率为500kb/s,即2μs移位一次. 若fosc =12MHz,则波特率为1Mb/s,即1μs移位一次.
方式1
串行方式1是10位为一帧的异步串行通信方式,这种工作方式是为双机通信而准备的. 帧格式包括一个起始位,8个数据位和1个停止位.
方式1的数据发送是由一条写发送寄存器SBUF的指令开始, 随后在串行口由硬件自动加入起始位和停止位,构成一个完整的帧格式, 然后在移位脉冲的作用下,由TXD端串行输出. 一个字符帧发送完后,使TXD输出线维持在1状态下,并将SCON的TI位置1,通知CPU可以接着发送下一个字符.
接收数据时,SCON的REN位应处于允许接收状态,即REN=1. 在此前提下,串行口采样RXD端,当采样到从1到0的状态跳变时,就认为已接收到起始位. 随后在移位脉冲的控制下,把接收到的数据位移入移位寄存器中. 直到停止位到来之后置位中断标志RI,通知CPU从SBUF取走接收到的一个字符.
方式2和3
串行工作方式2和3都是11位为一帧的串行通信方式,即1个起始位,9个数据位和1个停止位.
其帧格式为:
起始 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | 停止位 |
---|
在这两种工作方式下,字符还是8个数据位,只不过增加了一个第九数据位D8,它是一个可编程位,其功能由用户设定.
在发送数据时,应先在串行口控制寄存器SCON的TB8 位中把第九个数据位的内容准备好
发送数据D0~D7由MOV指令向SBUF写入,而D8位的内容则来自SCON的TB8位,在发送移位过程中插入到8位数据后成为第九数据位. 这两种工作方式的数据接收过程也与方式1基本类似,不同点仍在第九数据位上,串行口把接收到的8位数据位移入SBUF,而把第九位数据位送到SCON的RB8中.
串行工作方式2和3是为多机通信准备的. 两者的工作过程相同,差别仅在于波特率的设置,方式2的波特率是固定的,而方式3的波特率可由用户根据需要设定,设定方法与方式1相同. 不同波特率的设置可以应对多样的通信环境.
上述的介绍中,一直在使用一个词汇,波特率. 那么什么是波特率呢?又应该如何设置波特率呢?
这个问题将在下面进行解答.而介绍波特率,要从串行通信传输速率开始介绍.
传输速率用于说明信息传输的快慢,是串行通信的一项重要技术指标. 以单位时间内,传输信息的单位数表示.
传输速率通常以秒为单位时间,但信心单位却可能多样,因此就出现了多种表示传输速率的方法.
单片机应用中涉及到的有关传输速率的术语有一下几点:
- 波特Baud. 每秒一次的信号变化,称为1波特. 波特原本是表示电信设备传输速率的单位,后来又用于表示调制解调器的数据传输速率
- 波特率Baud rate. 波特率是每秒钟事件发生的数目或信号变化的次数. 在单片机的串行数据传输中,事件和信号变化都反映在二进制上,因此就以波特率表示串行数据的传输速率.
- 比特率Bit rate. 比特率也称为位速率,即每秒钟传输二进制的位数
在一般的单片机串行通信中,波特率和比特率的概念是一样的,但在高速串行通信中,由于一个事件的编码往往不止1位,因此波特率和比特率就不一样了.
例如事件按4位编码,如果数据传输的波特率为2400,则比特率为9600.
单片机中使用波特率作为串行通信传送速率的单位. 每秒传送1个格式位就是1波特. 即
1波特 = 1b/s
在串行数据传输中,波特率除表明数据传送速率外,还可以表示串行口中移位脉冲频率的高低,因为串行数据发送和接收的速率是由移位脉冲来决定的. 波特率高,表示移位脉冲频率高,串行传送数据速度就快,反之就慢.
80C51的波特率设置
工作方式0的波特率
串行工作方式0的波特率是固定的,其值为
波特率=fosc/12
其中fosc表示外部振荡器频率,除以12表示12分频,而外部振荡器的12分频产生一个机器周期,因此在串行工作方式0下,一个机器周期产生一个移位脉冲,进行一次串行移位.
因为波特率固定,因此不存在设置波特率的问题
工作方式2的波特率
方式2的波特率也是固定的,但有两个数值,其计算公式为:
波特率 = fosc/2smod/64
其中smod是串行口波特率倍增位SMOD的值,由公式可知,当smod=1时,波特率位fosc/32,当smod=0时,波特率位fosc/64.
这两种固定的波特率可根据需要选择,而选择的方法是设置PCON寄存器中SMOD的状态. PCON为电源控制寄存器. 地址为87H. 其中最高位SMOD是串行口的波特率倍增位. 当SMOD=1时,串行口波特率加倍,系统复位时,该位的值为0.
PCON寄存器不能进行位寻址,因此只有位序而没有位地址.
工作方式1和3的波特率
串行工作方式1和方式3的波特率不是固定的,可以根据需要设置. 具体地说,80C51是以定时器T1作为波特率发生器,以其溢出脉冲产生串行口的移位脉冲. 因此这两种工作方式中,通过计算T1的计数初值就可以实现波特率的设置. 假设定时器的计数初值为X,则计数溢出周期为:
(12 / fosc) × \times × (256 -X )
则波特率的计算公式为:
波特率 = (2smod /32 ) × \times × {fosc /[12 × \times × (256 - X)]}
再根据上述波特率计算公式,得出计数初值的计算公式为:
X= 256 - [fosc × \times × 2 smod] / (384 × \times × 波特率)文章来源:https://www.toymoban.com/news/detail-826706.html
以定时器T1作为波特率发生器是由系统决定的,内部的硬件电路已经接好,无需用户操心, 用户只需先把波特率确定下来,再通过计算得到定时器的计数初值,然后通过初始化程序装入T1即可. 当定时器T1作为波特率发生器使用时,应选择定时方式2,因为在定时方式2下定时器才具有自动重新加载功能文章来源地址https://www.toymoban.com/news/detail-826706.html
到了这里,关于单片机串行口详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!