http://jpkc.wxit.edu.cn/2008_Dpj/07-3-1.htm
80C51单片机的串口是一个能进行全双工异步通信或同步移位寄存器,具有4种工作方式的可编程接口。其帧格式可为8位、10位或11位,并可以设置多种不同的波特率。通过引脚RXD(P3.0串行数据接收引脚)和引脚TXD(P3.1 串行数据发送引脚)与外界进行通信。
80C51单片机串行口是由发送缓冲寄存器SBUF、发送控制器、发送控制门、接收缓冲寄存器SBUF、接收控制寄存器、移位寄存器和中断等部分组成。
1.SBUF
在逻辑上,SBUF只有一个,既表示发送寄存器,又表示接收寄存器。具有同一个单元地址99H。在物理上,SBUF有两个,一个是发送寄存器,另一个是接收寄存器。在逻辑上,SBUF只有一个,既表示发送寄存器,又表示接收寄存器。具有同一个单元地址99H。在物理上,SBUF有两个,一个是发送寄存器,另一个是接收寄存器。
2.控制寄存器
与串行通信有关的控制寄存器共有三个。
(1)串行控制寄存器SCON
SCON是80C51的一个可位寻址的专用寄存器,用于串行数据通信的控制。单元地址98H,位地址9FH-98H。寄存器及位地址表示如下:
位址址 | 9F | 9E | 9D | 9C | 9B | 9A | 99 | 98 |
位符号 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
各位功能说明如下:
①SM0 SM1--- 串行口工作方式选择位
串口4种工作方式不同之处在于其通信协议不同,即帧格式与波特率的不同。4种工作方式与其对应的帧格式与波特率如下:
其中,SMOD为电源控制寄存器PCON 的最高位,f为系统主频,T1溢出率的概念在后文中介绍。
②SM2--- 多机通信控制位
在进行多机通信时,需要用SM2控制从机是准备接收地址还是接收数据。当串行口以方式2或方式3接收时,若SM2=1,则只有当接收到的第九位数据(RB8)为1,才将接收到的前8位地址送入SBUF,并置位RI产生中断请求;否则,将接收到的8位地址丢弃。而当SM2=0时,则不论第九位数据为0还是为1,都将前8位数据装入SBUF中,并产生中断请求。在方式0,1时,SM2必须为0。
③REN--- 允许接收位
REN位用于对串行数据的接收进行控制:
REN=0 禁止接收
REN=1 允许接收
该位由软件置位或复位。
④TB8 --- 发送数据的第9位
在方式2和方式3时,TB8是发送的第9位数据。在多机通信中,以TB8位的状态表示主机发送的是地址还是数据;TB8=0为数据,TB8=1为地址。该位由软件置位或复位。
⑤RB8--- 接收数据位的第9位数据
在方式2或方式3时,RB8存放接收到的第9位数据,代表着接收的某种特征,故应根据其状态对接收数据进行操作。
⑥TI --- 发送中断标志
当方式0时,发送完第8位数据后,该位由硬件置位。在其它方式下,于发送停止位之前,由硬件置位。因此TI=1,表示帧发送结束,其状态既可供软件查询使用,也可请求中断。TI位由软件清0。
⑦RI --- 接收中断标志
当方式0时,接收完第8位数据后,该位由硬件置位。在其它方式下,当接收到停止位时,该位由硬件置位。因此RI=1,表示帧接收结束。其状态既可供软件查询使用,也可以请求中断。RI位由软件清0。
(2)电源控制寄存器PCON
PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器。单元地址为87H。其内容如下:
在HMOS的单片机中,该寄存器中除最高位之外,其它位都是虚设的。最高位(SMOD)是串行口波特率的倍增位,当SMOD=1时串行口波特率加倍。系统复位时,SMOD=0。PCON寄存器不能进行位寻址,因此表中写了“位序”而不是“位地址”。
7.2.2 80C51单片机串行通信工作方式
1. 串行工作方式0
在方式0下,串行口是作为同步移位寄存器使用。这时以RXD(P3.0)端作为数据移位的入口和出口,而由TXD(P3.1)端提供移位脉冲。移位数据的发送和接收以8位为一帧,不设起始位和停止位,低位在前高位在后。其帧格式为:
.... | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | ...... |
(1)数据发送与接收
使用方式0实现数据的移位输入输出时,实际上是把串行口变成并行口使用。
串行口作为并行输出口使用时,要和CD4049或74LS164配合使用,其电路连接如图10。
图7-12(b)为74LS164的引脚图,芯片各引脚功能如下:
Q0~Q7为并行输出引脚。
DSA、DSB为 串行输入引脚。
清零引脚,低电平时,使74LS164输出清零。
CP为时钟脉冲输入引脚,在CP脉冲的上升沿作用下实现移位。在CP=0, =1时,74LS164保持原来数据状态不变。
利用串行口与74LS164实现八位串入并行输出的连接如图7-12(a)所示,当8位数据全部移出后,SCON寄存器的TI位被自动置1。用P1.0输出低电平可将164输出清零。
如果把能实现“并入串出”功能的CD4014或74LS165与串行口配合使用,就可以把串行口变为并行输入口使用。如图11所示。
图713(b)为74LS165引脚图,当 =1时,允许串行移位, =0时允许并行输入。当CPINH=1时,从CP引脚输入的每一个正脉冲使QH输出移位一次。REN=0,
|
禁止接收;REN=1,允许接收。当软件置位REN时,即开始从RXD端以fosc/12波特率输入数据(低位在前),当接收到8位数据时,置位中断标志RI,在中断处理程序中将REN清零停止接收数据,并用P1.0引脚将 清零,停止串行输出,转而并行输入。当SBUF中的数据取走后,再将REN置1准备接收数据,并用用P1.0将 置1,停止并行输入,转串行输出。
(2)波特率
方式0时,移位操作的波特率是固定的,波特率=fosc/12。
(3) 应用举例
例7-1 使用74LS164的并行输出端接8支发光二极管,利用它的串入并出功能,把发光二极管从右向左依次点亮,并反复循环之。
假定发光二极管为共阴极型,则电路连接如图7-14所示。
当串行口把8位状态码串行移位输出后,TI置1。如把TI作为状态查询标志,则使用查询方法完成的参考程序如下:
注意:串行口先移出最低位D0,而74LS164通过同步脉冲移到Q0,随着8个字节的逐步移出,D0位通过8个同步脉冲移到Q7。
此外,串行口并行I/O扩展功能还常用于LED显示器接口电路。
2.串行工作方式1
方式1是10位为一帧的异步串行通信方式。共包括1个起始位,8个数据位和1个停止位。其帧格式为:
起始位 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 停止 |
(1)数据发送与接收
方式1的数据发送是由一条写发送寄存器(SBUF)指令开始的。随后在串行口由硬件自动加入起始位和停止位,构成一个完整的帧格式,然后在移位脉冲的作用下,由TXD端串行输出。一个字符帧发送完后,使TXD输出线维持在“1”(space)状态下,并将SCON寄存器的TI置1,通知CPU可以发送下一个字符。用动画
接收数据时,SCON的REN位应处于允许接收状态(REN=1)。在此前提下,串行口采样RXD端,当采样到从1向0的状态跳变时,就认定是接收到起始位。随后在移位脉冲的控制下,把接收到的数据位移入接收寄存器中。直到停止位到来之后把停止位送入RB8中,并置位中断标志位RI,通知CPU从SBUF取走接收到的一个字符。
(2)波特率设定
方式0 的波特率是固定的,一个机器周期进行一次移位。但方式1的波特率是可变的,其波特率由定时器1的计数溢出来决定,其公式为: 其中
smod为PCON寄存器最高位的值,smod=1表示波特率加倍,定时器的工作于方式2。
3.串行工作方式2
方式2是11位一帧的串行通信方式,即1个起始位,9个数据位和1个停止位。
在方式2下,字符还是8个数据位。而第9数据位即可作奇偶校验位使用,也可作控制使用,其功能由用户确定,发送之前应先在SCON中的TB8准备好,再向SBUF写入字符的8个数据位,并以此来启动串行发送。一个字符帧发送完毕后,将TI位置1,其过程与方式1相同。方式2的接收过程也与方式1基本类似,所不同的在于第9数据位上,串行口把接收到的8位数据送入SBUF,而把第9数据位送入RB8。
方式2的波特率是固定的,波特率=2smod╳fosc/64
与PCON寄存器中SMOD位的值有关。
4.串行工作方式3
方式3同样是11位为一帧的串行通信方式(1个起始位,9个数据位和1个停止位)其通信过程与方式2完全相同,所不同的仅在于波特率。而方式3的波特率则可由用户根据需要设定。其设定方式与方式1一样,即通过设置定时器1的初值来设定波特率。
5.串行口四种工作方式的比较
四种工作方式的区别主要表现在帧格式及波特率两个方面。见表7-2。
表7-2 四种工作方式--帧格式及波特率
工作方式 | 帧 格 式 | 波 特 率 |
方式0 | 8位全是数据位,没有启始位、停止位。 | fosc/12 |
方式1 | 10位,其中一位起始位,8位数据位,1位停止位。 | |
方式2 | 11位,其中一位起始位,9位数据位,1位停止位。 | 固定,即(2smod/64)*f |
方式3 | 同方式2。 | 同方式1 |
在串行通信中,收发双方对发送或接收的速率要有约定。通过软件可对单片机串行接口编程。
在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行接口波特率以及各参数的关系如表7-3所示。
表7-3 常用波特率与定时器1的关系位置
串口工作方式 及波特率(bps) | fosc | Smod | 定时器1 | |||
C/ | 工作方式 | 初值 | ||||
方式1、3 | 62.5k | 12 | 1 | 0 | 2 | FFH |
19.2 | 11.0592 | 1 | 0 | 2 | FDH | |
9600 | 11.0592 | 0 | 0 | 2 | FDH | |
4800 | 11.0592 | 0 | 0 | 2 | FAH | |
2400 | 11.0592 | 0 | 0 | 2 | F4H | |
1200 | 11.0592 | 0 | 0 | 2 | E8H |
在使用串行口前,应对其进行初始化,主要是设置产生波特率的定时器1、串行接口控制和中断控制。具体步骤如下:
①确定T1的工作方式(编程TMOD寄存器);
②计算T1的初值,装载TH1、TL1;
③启动T1(编程TCON中的TR1位);
④确定串行接口控制(编程SCON寄存器);
⑤串行接口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。
表7-3 常用波特率与定时器1的关系位置
串口工作方式 及波特率(bps) | fosc | Smod | 定时器1 | |||
C/ | 工作方式 | 初值 | ||||
方式1、3 | 62.5k | 12 | 1 | 0 | 2 | FFH |
19.2 | 11.0592 | 1 | 0 | 2 | FDH | |
9600 | 11.0592 | 0 | 0 | 2 | FDH | |
4800 | 11.0592 | 0 | 0 | 2 | FAH | |
2400 | 11.0592 | 0 | 0 | 2 | F4H | |
1200 | 11.0592 | 0 | 0 | 2 | E8H |
在使用串行口前,应对其进行初始化,主要是设置产生波特率的定时器1、串行接口控制和中断控制。具体步骤如下:
①确定T1的工作方式(编程TMOD寄存器);
②计算T1的初值,装载TH1、TL1;
③启动T1(编程TCON中的TR1位);
④确定串行接口控制(编程SCON寄存器);
⑤串行接口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。
文章评论(0条评论)
登录后参与讨论