51学习第七天(二)--80c51串行口内部结构介绍--串行口控制寄存器SCON--特殊功能寄存器PCON///80c51的串行口工作方式--波特率计算-串口使用之前的初始化

学习串行口时,感觉挺复杂得 ,但是进入代码之后感觉还行,所以说还是得多练习实践。

2.80c51的串行口结构

2.1、内部结构介绍

AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,两个缓冲器共用一个特殊功能寄存器字节地址(99H)。

TXD(P3.0)发送数据 Transmit(tx) Data 简写形式 

RXD(P3.1)接受数据 Receive(rx) Data 简写形式 

  1. 串行口的控制寄存器共有两个:特殊功能寄存器SCON和PCON。下面介绍这两个特殊功能寄存器各位的功能。

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寄存器

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值