单片机串行口详解

之前学习了UART通信协议,那为了实现串行通信,单片机中需要有对应的硬件电路。 这些硬件电路用来解决串行通信中的一系列协调问题,而这些硬件就是串行接口,简称为串行口。

下面对80C51单片机中的串行口进行介绍。

硬件结构

通常把实现异步通信的串行口称为通用异步接收器/发送器UART,把实现同步通信的串行口称为通用同步接收器/发送器USRT,把实现同步和异步通信的串行口称为通用同步异步接收/发送器USART。
80C51的串行口,虽然是既能实现同步通信,又能实现异步通信的全双工串口,但在单片机的串行数据通信中,最常用的是异步方式,因此常把它写为UART。它的硬件结构如下图:
单片机串行口详解_第1张图片
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相同. 不同波特率的设置可以应对多样的通信环境.

上述的介绍中,一直在使用一个词汇,波特率. 那么什么是波特率呢?又应该如何设置波特率呢?
这个问题将在下面进行解答.而介绍波特率,要从串行通信传输速率开始介绍.

传输速率用于说明信息传输的快慢,是串行通信的一项重要技术指标. 以单位时间内,传输信息的单位数表示.

传输速率通常以秒为单位时间,但信心单位却可能多样,因此就出现了多种表示传输速率的方法.

单片机应用中涉及到的有关传输速率的术语有一下几点:

  1. 波特Baud. 每秒一次的信号变化,称为1波特. 波特原本是表示电信设备传输速率的单位,后来又用于表示调制解调器的数据传输速率
  2. 波特率Baud rate. 波特率是每秒钟事件发生的数目或信号变化的次数. 在单片机的串行数据传输中,事件和信号变化都反映在二进制上,因此就以波特率表示串行数据的传输速率.
  3. 比特率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 × 波特率)

以定时器T1作为波特率发生器是由系统决定的,内部的硬件电路已经接好,无需用户操心, 用户只需先把波特率确定下来,再通过计算得到定时器的计数初值,然后通过初始化程序装入T1即可. 当定时器T1作为波特率发生器使用时,应选择定时方式2,因为在定时方式2下定时器才具有自动重新加载功能

你可能感兴趣的:(单片机,嵌入式硬件)