从头开始学51单片机之7:串行通信

发布于:2022-11-29 ⋅ 阅读:(827) ⋅ 点赞:(0)

7.1 串行口结构

  • 包含:发送/接收缓冲寄存器SBUF、发送控制器、接收控制器、移位寄存器、中断等

  •  发送缓冲寄存器和接收缓冲寄存器虽然地址相同(99H),且都用SBUF命名,但二者在物理上独立且单向,一个只负责发送数据,一个只负责接收数据

7.1.1 串行口控制寄存器(SCON)

  • 作用:串行数据通信的控制
  • 单元地址:98H
  • 可位寻址(位地址9FH~98H)
位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
位符号 SM0 SM1 SM2 REN TB8 RB8 TI RI
RI和TI为状态标志位

1)若RI为1,表示已经收到1字节数据(由硬件置位),此时用户可以从SBUF中读取收到的数据

2)注意:要及时读走SBUF中的数据,否则会被新收到的数据所覆盖,造成数据丢失

3)RI要用软件才能被清零

4)若TI为1,表示已经发送完毕1字节数据(由硬件置位),此时用户可以继续往SBUF写数据,进行新的数据的发送

5)TI要用软件才能被清零

RB8和TB8在方式2、3时有效,配合SBUF寄存器,作为第9位数据使用

1)RB8表示接收时,除接收SBUF中的8位数据外,RB8为收到的第9位数据

2)TB8表示发送时,除发送SBUF中的8位数据外,TB8为将发送的第9位数据

3)应用中,一般作为地址/数据标志位或奇/偶校验标志位使用

REN为接收允许(或使能)控制位

1:表示允许接收串行数据

0:表示禁止接收

SM0和SM1为串行口工作方式选择位,其中方式0为同步移位方式(或同步通信方式),方式1、2、3为异步通信方式(简称UART)
SM0 SM1 工作方式 波特率
0 0 方式0 同步移位方式 fosc/12
0 1 方式1 8位UART 可变
1 0 方式2 9位UART fosc/32或fosc/64
1 1 方式3 9位UART 可变

SM2为多机通信控制位

1)方式2、3中,若SM2=1且接收到的第9位数据(RB8)为1,才将接收到的前8位数据送入接收SBUF中,并置位RI产生中断请求;否则丢弃前8位数据

2)若SM2=0,则不论第9位数据(RB8)为0或1,都将前8位数据送入接收SBUF中,并置位RI

3)方式0、1中,要求SM2置0

7.1.2 电源控制寄存器(PCON)

  • 作用:为电源控制而设置的专用寄存器
  • 单元地址:87H
位序 D7 D6 D5 D4 D3 D2 D1 D0
位符号 SMOD - - 0 GF1 GF0 PD IDL
  • 仅SMOD与串行口有关
    • SMOD=1时,串行口波特率加倍(或倍频)
    • 系统复位时,SMOD=0

7.2 串行口的4种工作模式

  • 串行口既可以作为UART,也可作为一个同步移位寄存器
  • 作为UART时,可以传输8位或9位数据,其中方式1和3中波特率可由用户设置
  • 作为同步移位寄存器时,可以配合外围器件,用于扩展I/O

7.2.1 方式0

  • 串行口作为同步移位寄存器使用
  • RXD(P3.1)引脚作为数据移位的输出(或输入)口,与外设交换串行数据
  • TXD(P3.2)引脚提供移位脉冲,向外同步输出时钟信号
  • 移位数据发送(或接收)以8位为一帧,低位在前,高位在后,帧格式:
首位 - - - - - - 尾位
D0 D1 D2 D3 D4 D5 D6 D7
  • 方式0中,移位操作的波特率值恒定,为晶振的1/12,即波特率=fosc/12

1. 数据发送

  • 数据一旦写入发送寄存器SBUF,则启动发送,TXD以fosc/12速率主动向外输出8个时钟信号;
  • 与此同时,SBUF的数据从D0开始通过RXD引脚逐位向外输出,当SBUF中D7数据发送完毕,停止发送;
  • 然后,系统将SCON寄存器中TI自动置位,发送结束
  • 实际使用时,在“串入并出”的移位寄存器(74HC164、74HC595或CD4049)配合下,利用方式0,可以把串行口作为并行输出口使用

2. 数据接收

  • 当SCON的REN被置位,则启动接收,TXD以固定速率输出脉冲信号,同时RXD引脚数据被移入单片机内部的移位寄存器,当接收满一字节数据,移位寄存器数据被存入SBUF,同时将SCON寄存器RI的硬件置位,产生中断请求
  • TXD暂停输出脉冲信号,知道RI被清零,TXD再次启动输出脉冲,启动新的数据的接收
  • 实际使用时,在“并入串出”的移位寄存器(74HC165、CD4014等)配合下,利用方式0,可以把串行口作为并行输入口使用,实现扩展并行输入口

7.2.2 方式1

  • 10位为一帧的异步串行通信方式,包括1个起始位(低电平)、8个数据位和1个停止位(高电平),帧格式:
首位 - - - - - - - - 尾位
起始位 D0 D1 D2 D3 D4 D5 D6 D7 停止位
  • 数据发送与接收
    • 与方式0相同,方式1的数据发送是由一条写发送SBUF指令所触发启动,当一个字符帧(共10位)发送完后,TXD输出线便维持在1(空闲)状态下,同时将TI置1,即通知CPU可以发送下一个字符了
    • 接收数据时,要保证REN=1,始终处于允许接收状态。CPU在移位脉冲的控制下,按照设定的波特率,不断对RXD引脚的信号进行采集、处理,当识别到有效的“起始位”后,CPU开始以一定的速率采集数据线,并将接收到的有效数据位移入移位寄存器中,直到收到停止位为止。当收到停止位,移位寄存器内容被送到SBUF中(停止位被送到RB8中),同时,置位中断标志位RI,通知CPU可以从SBUF取走接收到的字符
  • 波特率
    • 方式1的波特率受定时器T1控制,设置T1的溢出时间可以控制串行口的波特率;为了保持波特率恒定,一般将T1设置为模式2工作方式
    • 对于52系列单片机,定时器T2也可控制串行口波特率

7.2.3 方式2

  • 11位为一帧的异步串行通信方式,包括1个起始位(低电平)、8个数据位、TB8(或RB8)和1个停止位(高电平),帧格式:
首位 - - - - - - - - - 尾位
起始位 D0 D1 D2 D3 D4 D5 D6 D7 TB8/RB8 停止位
  •  方式2与方式1通信过程类似,均属于异步串行通信(UART),仅是数据位后多发送一位T8(或R8),次位可用于校验位标志或多机通信时使用
  • 波特率只有两种,当SMOD=0时,波特率=fosc/64;当SMOD=1时,波特率=fosc/32

7.2.4 方式3

  • 方式3帧格式与方式2相同,位11位UART;波特率方式与方式1相同,受T1(或T2)控制

7.3 波特率的设定方法

7.3.1 波特率的定义

  • 用来描述每秒钟内发生二进制信号的事件数,用来表示一个二进制数据位的持续时间,体现数据传输的快慢程度
  • 是表明传输速度的标准,RS232-C标准中定义的标准波特率有:300bit/s、600bit/s、1200bit/s、2400bit/s、4800bit/s、9600bit/s、19200bit/s
  • 按照规定的波特率以及相应的协议,就可以实现不同设备之间的串行通信

7.3.2 定时器T1产生波特率的计算

  • 51单片机串口方式1和3中波特率受定时器T1控制,调整T1溢出时间,即可实现波特率设置
  • 作为波特率发生器使用时,通常选用T1的工作方式2(简称模式2),计算公式

BaudRate=\frac{2^{SMOD}\times f_{osc}}{384\times (2^{8}-TH1)}

  • 式中,fosc为晶振频率,SMOD为PCON寄存器最高位的值,TH1为T1计数器计数单元值 
  • 波特率设置的理论有一定偏差
  • 在实际应用中,若要采用UART通信,为了减少理论偏差,晶振频率一般不选用12MHz,而选用11.0592MHz、22.1184MHz等值,这时无论采用哪种方案,其误差为0,这样可以大大提高数据通信的可靠性
本文含有隐藏内容,请 开通VIP 后查看