串行接口及串行通信技术文档格式.docx
《串行接口及串行通信技术文档格式.docx》由会员分享,可在线阅读,更多相关《串行接口及串行通信技术文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
![串行接口及串行通信技术文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/5/fcddcd74-1eb9-49ef-a5a6-2858d439cb52/fcddcd74-1eb9-49ef-a5a6-2858d439cb521.gif)
其后,新的字符传送可在任何时候开始,并不要求整倍数的位时间。
2.传送的速率
串行通信的速率用波特率来表示,所谓波特率就是指一秒钟传送数据位的个数。
每秒钟传送一个数据位就是1波特。
即:
1波特=1bps(位/秒)
在串行通信中,数据位的发送和接收分别由发送时钟脉冲和接收时钟脉冲进行定时控制。
时钟频率高,则波特率高,通信速度就快;
反之,时钟频率低,波特率就低,通信速度就慢。
9.1.2数据转换
MCS-51单片机只能处理8位的并行数据,所以在进行串行数据的发送时,要把并行数据转换为串行数据。
而在接收数据时,只有把接收的串行数据转换成并行数据,单片机才能进行处理。
能实现这种转换的设备,称为通用异步接收发送器(UniversalAsynchronousReceiver/Transmitter)。
这种设备已集成到单片机内部,称为串行接口电路。
串行接口电路为用户提供了两个串行口缓冲寄存器(SBUF),一个称为发送缓存器,它的用途是接收片内总线送来的数据,即发送缓冲器只能写不能读。
发送缓冲器中的数据通过TXD引脚向外传送。
另一个称为接收缓冲器,它的用途是向片内总线发送数据,即接收缓冲器只能读不能写。
接收缓冲器通过RXD引脚接收数据。
因为这两个缓冲器一个只能写,一个只能读,所以共用一个地址99H。
串行接口电路如图9.2所示。
图9.2MCS-51串行口寄存器结构
1.串行口控制寄存器(SCON)
SCON是MCS-51单片机的一个可位寻址的专用寄存器,用于串行数据通信的控制。
单元地址为98H,位地址为98H~9FH。
寄存器的内容及位地址表示如下:
位地址
9FH
9EH
9DH
9CH
9BH
9AH
99H
98H
位符号
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
各位的说明如下:
SM0、SM1——串行口工作方式选择位
其状态组合和对应工作方式为:
SM0SM1工作方式
0
0方式0
1方式1
1
0方式2
11方式3
SM2——允许方式2、3的多机通信控制位
在方式2和3中,若SM2=1且接收到的第九位数据(RB8)为1,才将接收到的前8位数据送入接收SBUF中,并置位RI产生中断请求;
否则丢弃前8位数据。
若SM2=0,则不论第九位数据(RB8)为1还是为0,都将前8位送入接收SBUF中,并产生中断请求。
方式0时,SM2必须置0。
REN——允许接收位
REN=0禁止接收数据
REN=1允许接收数据
TB8——发送数据位8
在方式2、3时,TB8的内容是要发送的第9位数据,其值由用户通过软件来设置。
5)
RB8——接收数据位8
在方式2、3时,RB8是接收的第9位数据。
在方式1时,RB8是接收的停止位
在方式0时,不使用RB8
6)
TI——发送中断标志位
在方式0时,发送完第8位数据后,该位由硬件置位。
在其它方式下,于发送停止位之前,由硬件置位。
因此,TI=1表示帧发送结束,其状态既可供软件查询使用,也可请求中断。
TI由软件清“0”。
7)
RI——接收中断标志位
在方式0时,接收完第8位数据后,该位由硬件置位。
在其它方式下,于接收到停止位之前,该位由硬件置位。
因此,RI=1表示帧接收结束,其状态既可供软件查询使用,也可请求中断。
RI由软件清“0”。
2.电源控制寄存器(PCON)
PCON不可位寻址,字节地址为87H。
它主要是为CHMOS型单片机80C51的电源控制而设置的专用寄存器。
其内容如下:
位序
D7
D6
D5
D4
D3
D2
D1
D0
SMOD
/
GF1
GF0
PD
IDL
与串行通信有关的只有D7位(SMOD),该位为波特率倍增位,当SMOD=1时,串行口波特率增加一倍,当SMOD=0时,串行口波特率为设定值。
当系统复位时,SMOD=0。
3.中断允许控制寄存器(IE)
此寄存器在第六章已经介绍过,在此不作赘述。
串行口的工作方式由SM0和SM1确定,编码和功能如表8-1所示。
表8-1串行口工作方式
SM0SM1
方式
功能说明
波特率
00
方式0
移位寄存器方式
fosc/12
01
方式1
8位UART
可变
10
方式2
9位UART
fosc/64或者fosc/32
11
方式3
方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由T1的溢出率决定。
9.3.1串行工作方式0
串行口工作在方式0时,串行口作同步移位寄存器使用。
以RXD(P3.0)端作为数据的输入或输出端,而TXD(P3.1)提供移位的时钟脉冲。
外接移位寄存器,实现数据并行输入或输出。
工作在方式0时,波特率为fosc/12,即一个机器周期移位一次。
1.数据输出(发送)
当数据写入SBUF后,数据从RXD端在移位脉冲(TXD)的控制下,逐位移入74LS164,74LS164能完成数据的串并转换。
当8位数据全部移出后,TI由硬件置位,发生中断请求。
若CPU响应中断,则从0023H单元开始执行串行口中断服务程序,数据由74LS164并行输出。
其接口逻辑如图9.3所示。
由逻辑图可知,通过外接74LS164,串行口能够实现数据的并行输出。
图9.3外接移位寄存器输出
2.数据输入(接收)
要实现接收数据,必须首先把SCON中的允许接收位REN设置为1。
当REN设置为1时,数据就在移位脉冲的控制下,从RXD端输入。
当接收到8位数据时,置位接收中断标志位RI,发生中断请求。
其接口逻辑如图9.4所示。
由逻辑图可知,通过外接74LS165,串行口能够实现数据的并行输入。
图9.4外接移位寄存器输入
【例8-1】使用74LS164的并行输出端接8支发光二极管,利用它的串入并出功能,把发光二极管从左到右依次点亮,并反复循环。
假定发光二极管为共阴极接法。
图9.5电路设计
解:
电路如图9.5。
软件部分如下:
ORG
0000H
LJMP
MAIN
1000H
MAIN:
MOV
SCON,#00H
;
串行口工作在方式0
CLR
ES
禁止串行中断
A,#80H
发光二极管从左边亮起
DELR:
P1.0
关闭并行输出
SBUF,A
串行输出
WAINT:
JNB
TI,WAIT
状态查询
SETB
开启并行输出
ACALL
DELAY
调用延时子程序
TI
清发送中断标志
RR
A
发光右移
AJMP
DELR
继续
EDN
9.3.2串行工作方式1
方式1为10位为一帧的异步串行通信方式。
其帧格式为1个起始位、8个数据位和1个停止位。
如图9.6所示。
图9.6方式1的帧格式
1.数据输出(发送)
数据写入SBUF后,开始发送,此时由硬件加入起始位和停止位,构成一帧数据,由TXD串行输出。
输出一帧数据后,TXD保持在高电平状态下,并将TI置位,通知CPU可以进行下一个字符的发送。
2.数据输入(接收)
当REN=1且接收到起始位后,在移位脉冲的控制下,把接收到的数据移入接收缓冲寄存器(SBUF)中,停止位到来后,把停止位送入RB8中,并置位RI,通知CPU接收到一个字符。
3.波特率的设定
工作在方式1时,其波特率是可变的,波特率的计算公式为:
其中,SMOD为PCON寄存器最高位的值,其值为1或0。
当定时器1作波特率发生器使用时,选用工作方式2(即自动加载定时初值方式)。
选择方式2可以避免通过程序反复装入定时初值所引起的定时误差,使波特率更加稳定。
假定计数初值为X,则计数溢出周期为:
溢出率为溢出周期的倒数。
则波特率的计算公式为:
实际使用中,波特率是已知的。
因此需要根据波特率的计算公式求定时初值X。
用户只需要把定时初值设置到定时器1,就能得到所要求的波特率。
4.应用举例(用方式1实现双机串行通信)
(1)通信双方的硬件连接
作为应用系统首先要研究通信双方如何连接。
一种办法是把两片8051的串行口直接相连,一片8051的TXD与另一片的RXD相连,RXD与另一片的TXD相连,地与地连通。
由于8051串行口的输出是TTL电平,两片相连所允许的距离极短。
(2)通信双方的软件约定
通信双方除了在硬件上进行连接外,在软件还必须作如下约定:
作为发送方,必须知道什么时候发送信息,发什么,对方是否收到,收到的内容有没有错误,要不要重发,怎样通知对方结束。
作为接收一方,必须知道对方是否发送了信息,发的是什么,收到的信息是否有错误,如果有错误怎样通知对方重发,怎样判断结束等等。
这些规定必须在编程之前确定下来。
为实现双机通信,我们规定如下:
假定A机为发送机,B机为接收机。
当A机发送时,先送一个“AA”信号,B机收到后回答一个“BB”信号,表示同意接收。
当A机接收到“BB”后,开始发送数据,每发送一次求一次“检查和”,假定数据块长16个字节,起始地址为30H,一个数据块发送完后再发出“检查和”。
B机接收的数据并转存到数据区,起始地址也为30H,同时每接收一次也计算一次“检查和”,当一个数据块收齐后,再接收A机发来的“检查和”,并将它与B机的“检查和”进行比较。
若两者相等,说明接收正确,B机回答一个00;
若两者不相等,说明接收不正确,B机回答一个FF,请求重发。
A机收到00的答复后,结束发送。
若收到的答复非0,则重新将数据发送一次。
双方均以1200波特的速率传送。
假设晶振频率为6MHz,计算定时器1的计数初值:
为使波特率不倍增,设定PCON寄存器的SMOD=0,则PCON=00H
(3)基本的通信程序
设计程序框图如图9.7所示。
图9.7双机通信程序结构图
根据结构图设计出下述通信程序:
A机通信程序:
ASTART:
TMOD,#20H
设定定时器1工作方式2
TL1,#0F2H
设定计数初值
TH1,#0F2H
计数重装值
PCON,#00H
波特率不倍增
TR1
启动T1
SCON,#50H
设置串行口方式1
ATT1:
SBUF,#0AAH
发送“AA”
AWAIT1:
JBC
TI,ARR1
等待一帧发送完
SJMP
AWAIT1
ARR1:
RI,ARR2
等待应答信号
ARR1
ARR2:
A,SBUF
XRL
A,#0BBH
JNZ
ATT1
判断是否是应答信号“00”
ATT2:
R0,#30H
R7,#10
R6,#00H
ATT3:
SBUF,@R0
A,R6
ADD
A,@R0
R6,A
INC
R0
AWAIT2:
TI,ATT4
AWAIT2
发送有效数据
ATT4:
DJNZ
R7,ATT3
判断是否传送完毕
SBUF,R6
AWAIT3:
TI,ARR3
AWAIT3
等待
ARR3:
RI,ARR4
ARR3
ARR4:
ATT2
AEND:
RET
B机通信程序:
BSTART:
TMOD,#20H
BRR1:
RI,BRR2
BRR1
BRR2:
把接收到的数据送入A
A,#0AAH
判断接收到数据是否是“AA”
如果不是继续等待
BTT11:
SBUF,0BBH
发送应答信号
BWAIT1:
TI,BRR3
BWAIT1
BRR3:
接收有效数据
BRR4:
RI,BRR5
BRR4
BRR5:
@R0,A
R7,BRR4
BWAIT2:
RI,BRR6
BWAIT2
BRR6:
JZ
BEND
SBUF,#0FFH
BWAIT3:
BWAIT3
BEND:
SBUF,#00H
9.3.3串行工作方式2
方式2为11位为一帧的异步串行通信方式。
其帧格式为1个起始位、9个数据位和1个停止位。
如图9.8所示。
图9.8方式2的帧格式
在方式2下,字符还是8个数据位,只不过增加了一个第9个数据位(D8),而且其功能由用户确定,是一个可编程位。
在发送数据时,应先在SCON的TB8位中把第9个数据位的内容准备好。
这可使用如下指令完成:
SETBTB8;
TB8位置“1”
CLRTB8;
TB8位置“0”
发送数据(D0~D7)由MOV指令向SBUF写入,而D8位的内容则由硬件电路从TB8中直接送到发送移位器的第九位,并以此来启动串行发送。
一个字符帧发送完毕后,将TI位置“1”,其他过程与方式1相同。
方式2的接收过程也于方式1基本类似,所不同的只在第9数据位上,串行口把接收到的前8个数据位送入SBUF,而把第九数据位送入RB9.
方式2的波特率时固定的,而且有两种。
一种是晶振频率的三十二分之一;
另一种是晶振频率的六十四分之一。
即fosc/32和fosc/64。
如用公式表示则为:
由此公式可知,当SMOD为0时,波特率为fosc/64,当SMOD为1时,波特率为fosc/32。
9.3.4串行工作方式3
方式3同方式2几乎完全一样,只不过方式3的波特率是可变的,有用户来确定。
其波特率的确定同方式1。