2.1、内部结构介绍
AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据。发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,两个缓冲器共用一个特殊功能寄存器字节地址(99H)。
TXD(P3.0)发送数据 Transmit(tx) Data 简写形式
RXD(P3.1)接受数据 Receive(rx) Data 简写形式
2.1.1、串行口控制寄存器SCON
串行口控制寄存器SCON,字节地址98H,可位寻址,位地址为98H~9FH。SCON时一个特殊功能寄存器,用以设定串行口的工作方式,接收发送控制以设置状态标志,格式如下图所示。(不用的话 设置0,一般默认是0)
下面介绍SCON中各位的功能。
(1) SM0、SMl:串行口4种工作方式选择位。
SM0、SM1两位的编码所对应的4种工作方式见下表。
表 串行口的4种工作方式
注:方式1最常用,以此为例!
(2)SM2:多机通信控制位。
因为多机通信是在方式2和方式3下进行的,因此SM2位主要用于方式2或方式3中。当串行口以方式2或方式3接收时,
如果SM2=1,则只有当接收到的第9位数据(RB8)为1时,才使RI置l,产生中断请求,并将接收到的前8位数据送人SBUF;当接收到的第9位数据(RB8)为0时,则将接收到的前8位数据丢弃。
而当SM2=0时,则不论第9位数据是l还是0,都将前8位数据送入SBUF中,并使RI置1,产生中断请求。(RB8不具有激活RI的功能)
在方式1时,如果SM2=1,则只有收到有效的停止位时才会激活RI(接受控制器)。
在方式0时,SM2必须为0。
(3)REN:允许串行接收位。
由软件置1或清0。
REN=1,允许串行口接收数据。
REN=O,禁止串行口接收数据。
(4)TB8:发送的第9位数据。
在方式2和方式3时,TB8是要发送的第9位数据,其值由软件置l或清O。在双机串行通信时,TB8一般作为奇偶校验位使用;在多机串行通信中用来表示主机发送的是地址帧还是数据帧,TB8=1为地址帧,TB8=0为数据帧。
在方式0和1中,该位未用(0)
(5) RB8:接收的第9位数据。
工作在方式2和方式3时,RB8存放接收到的第9位数据。在方式1,如果SM2=0,RB8是接收到的停止位。在方式0,不使用RB8。
(6)TI:发送中断标志位
串行口工作在方式0时,串行发送的第8位数据结束时TI由硬件置1,在其他工作方式中,串行口发送停止位的开始时置TI为1。TI=1,表示一帧数据发送结束。TI位的状态可供软件查询,也可申请中断。CPU响应中断后,在中断服务程序中向SBUF写入要发送的下一帧数据。TI必须由软件清0。
(7) RI:接收中断标志位
串行口工作在方式0时,接收完第8位数据时,RI由硬件置1。在其他工作方式中,串行接收到停止位时,该位置l。RI=1,表示一帧数据接收完毕,并申请中断,要求CPU从接收SBUF取走数据。该位的状态也可供软件查询。RI必须由软件清0。
SCON的所有位都可进行位操作清0或置1。
2.1.2、特殊功能寄存器PCON
特殊功能寄存器PCON字节地址为87H,不能位寻址。PCON的格式如下图所示。
其中,仅仅是最高位SMOD与串行口有关。
SMOD位:波特率选择位。
当SMOD=1时,要比SMOD=O时的波特率加倍,所以也称SMOD位为波特率倍增位。
2.2、80c51的串行口工作方式
由SM0、SM1两位的编码决定有4种方式!
2.2.1、方式1、
只介绍方式1。
传送一帧数据的格式如图所示,其中:
TXD为发送端引脚,RXD为接收端引脚。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由T1或T2的溢出率确定。
在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志(置0),否则,下一帧数据无法发送或接收。
(1)发送:
CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND和DATA无效,发送停止位,一帧结束,置TI=1。
(2)接收:
REN=1后,允许接收。接收器以所选波特率的16倍速率采样RXD
端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。将接收到的9位数据前8位装入SBUF,第九位进入RB8并置RI=1,向CPU请求中断
2.2.2、波特率计算
在串行通信中,收发双方对发送或接受数据的速率要有约定。通过软件可对单片机串行口编程为四种方式。
方式0和2波特率固定,
方式1和3波特率可变,由定时器的溢出率来决定。
各种方式的波特率计算公式;
1)方式0的波特率=fosc/12
2)方式2的波特率=2^smod*fosc/64
3)方式1、3的波特率=2^smod*fosc/32
由T1或T2的溢出率和SMOD位确定
定时器的溢出率由定时器中的TH1计数值决定。
T1定时器溢出率= fosc /[12*(256-TH1)]
在单片机中,最常用的晶振频率为12MHZ和11.0592MHZ,所以选择用的波特率也相对稳定,常用的波特率以及各参数的关系表
1)用T1:
波特率=2^smod*T1定时器的溢出率/32,T1为方式2(这个指的是计时器工作方式,自动重装8位)//T1定时器的溢出率由TH1
T1定时器溢出率= fosc /[12*(256-TH1)]
例:已知fosc=6MHz,SMOD=0,设置波特率为2400,求T1的计数初值TH1。
波特率=1/((12/fosc)*(256-X))/32=fosc/12*32(256-X)
(256-X)=fosc/2400/384=6M/2400/384;256-X~=6.5104
TH1~=250=FAH 只能近似计算。
若fosc=11.0592MHz, 则256-X=11.0592M/2400/384=4068/384=12 TH1=F4H;可精确算出,对其它常用的标准波特率也是能正确算出。所以这个晶振频率是最常用的。
如果SMOD=1,则同样的X初值得出的波特率加倍。
2)用T2:
在52型单片机中,串口方式1、3的波特率发生器选择由TCLK、RCLK位
确定是T1还是T2。若TCLK=1,则发送器波特率来自T2,否则来自T1。若RCLK=1,则接收器波特率来自T2,否则来自T1。
由T2产生的波特率与SMOD无关。T2定时的最小单元=2/fosc。T2的溢出脉冲16分频后作为串口的发送或接收脉冲。
波特率=(1/((2/fosc)(65536-X)))/16=fosc/(32(65536-X))
例:已知fosc=11.0592MHz,求波特率=2400时的X
2400=11059200/(32(65536-X)) 65536-X=144 X=65392=FF70H
2.2.3、串口使用之前的初始化
主要设置产生波特率的定时器1,串行口控制和中断控制。具体步骤如下:
1、确定T1的工作方式(编程TMOD的寄存器)
2、计算T1 的初值,装TH1.TL1
3、启动T1(编程中TCON中的TR1位)
4、确定串行口控制(编程SCON寄存器,这个寄存器可以位寻址即:0x??,也可以直接操作如:SM1=?,SM0=?)
5、串行口在中断方式工作时,要进行中断设置(编程IE.IP寄存器)