51单片机学习笔记(三)---串口

串/并行通信

并行通信:

使用多条数据线将数据字节的各个位同时传送,每一位数据都需要一条传输线,还需要一条或几条控制信号线,
并行通信相对传输速度快,但传输线较多,长距离传送时成本高,也因此这种方式适合于短距离的数据传输。

串行通信:

将数据字节分成一位一位的形式在一条传输线上逐个传送,一次只能传送一位,对于一个字节的数据,至少要分8位才能传送完毕。串行通信传输线少,长距离传送成本低,单片机应用系统中串行通信的使用非常普便。

发送时,把并行数据变成串行数据发送到线路上去,接受时,把串行数据在变成并行数据

同步/异步通信

同步通信:

发送和接收设备采用一个同步时钟,通过一条同步时钟线加到收发双方,效率较高

异步通信

收发双发使用各自的时钟控制数据的发送和接收,(为使收发双方协调,要求收发双方的时钟可尽可能一致)
异步串行通信,以数据帧为单位进行数据传输,各数据帧之间的间隔是任意的,每个数据帧中的各位是以固定的时间传送的,(每个数据帧要加起始位,停止位,有时需要校验位)

单片机串行口

结构

有两个物理上独立的发送、接收缓冲器,SBUF(特殊功能寄存器),可通过两个引脚TXD,RXD,同时发送、接收数据,两个缓冲器共用一个特殊功能寄存器,其字节地址为99H

SCON–串行口控制寄存器

字节地址98H,可位寻址,
image.png
SCON各位功能如下:

  1. SM0、SM1–串行口4中工作方式选择

常用方式1
image.png

  1. SM2——多机通信控制位

多机通信必须是工作在方式2或方式3,

  • 当串行口工作于方式2或方式3时:
  • 如果SM2=1,则只有当接收到的第9位数据(RB8)为1时,才使RI置1,产生中断请求,并将接收到的前8位数据送入SBUF;当接收到的第9位数据(RB8)为0时,则将接收到的前8位数据丢弃。
  • 如果SM2=0,则不论接收到的第9位数据是1还是0,都将前8位数据送入SBUF中,并使RI置1,产生中断请求。
  • **在方式1时:**如果SM2=1,则只有收到有效的停止位时才会激活RI。
  • **在方式0时:**SM2必须为0。
  1. REN——允许串行接收位由软件置1或清0
  • REN =1,允许串行口接收数据。
  • REN =0,禁止串行口接收数据。
  1. TB8——发送的第9位数据
  • 在方式2或方式3时,TB8是要发送的第9位数据,其值由软件置1或清0。
  • 在双机串行通信时,TB8一般作为奇偶校验位使用;在多机串行通信中用来表示主机发送的是地址帧还是数据帧,TB8=1为地址帧,TB8=0为数据帧。
  1. RB8——接收的第9位数据
  • 工作在方式2或方式3时,RB8存放串行口接收到的第9位数据。
  • 在方式1,如果SM2 =0,RB8是接收到的停止位。
  • 在方式0,不使用RB8。
  1. TI——发送中断标志位

Tl=1,表示一帧数据发送结束。

  • 串行口工作在方式0时,串行发送的第8位数据结束时TI由硬件置1。
  • 在其他工作方式中,串行口发送停止位时,置TI为1。TI =1,则可申请中断,CPU响应中断后,在中断服务程序中向“发送 SBUF”写入要发送的下一帧数据。

TI位的状态可供软件查询,且必须由软件清0。

  1. RI——接收中断标志位

RI =1,表示一帧数据接收完毕。

  • 串行口工作在方式0时,接收完第8位数据时,RI由硬件置1。
  • 在其他工作方式中,串行接收到停止位时,该位置1。Rl =1,则可申请中断,要求CPU从“接收SBUF”取走数据。

RI位的状态也可供软件查询,且必须由软件清0。

PCON–特殊功能寄存器

字节地址:87H,不能位寻址
image.png
SMOD–波特率选择位;

工作方式:

方式0:

image.png
同步移位寄存器输入/输出方式**,用于串行口外接移位寄存器,以扩展并行I/O口**
以8位数据为一帧,没有起始位和停止位,先发送或接收最低位,
波特率固定为
方式 0 的波特率 = f 12 方式0的波特率 = \frac{f}{12} 方式0的波特率=12f
在方式0下,SCON 中的 TB8、RB8位没有用到,**发送或接收完8位数据由硬件自动使TI或RI中断标志位置1,**CPU响应TI或RI中断,在中断服务程序中向发送SBUF中送入下一个要发送的数据或从接收SBUF中把接收到的1B存入内部RAM 中。注意,TI或RI标志位,必须要软件清0,

方式1:

双击串行通信方式
image.png
收发一帧的数据为10位,1个起始位(0),8个数据位,1个停止位(1)先发送或接收最低位
波特率为可变的8位异步通信接口:
方式 1 的波特率 = 2 S M O D 32 ∗ 定时器 T 1 的溢出率 方式1的波特率 = \frac{2^{SMOD}}{32}*定时器T1的溢出率 方式1的波特率=322SMOD定时器T1的溢出率
当一帧数据接收完毕后,必须同时满足以下两个条件,这次接收才真正有效。

  1. RI =0,即上一帧数据接收完成时,Rl =1发出的中断请求已被响应,SBUF中的数据已被取走,说明“接收SBUF”已空。
  2. SM2 =0或收到的停止位=1(方式1时,停止位已进入RB8),则将接收到的数据装入SBUF 和 RB8(装入的是停止位),且中断标志RI置1。

若不同时满足这两个条件,收到的数据不能装入SBUF,这意味着该帧数据将丢失。

方式2:

串行口工作于方式2和方式3时,被定义为9位异步通信接口。
每帧数据均为11位位起始位0,8位数据位(先低位),1位可程控为1或0的第9位数据和1位停止位
image.png

方式 2 的波特率 = 2 S M O D 64 ∗ f 方式2的波特率 = \frac{2^{SMOD}}{64}*f 方式2的波特率=642SMODf

引脚从1到0的负跳变,并判断起始位有效后,便开始接收一帧信息。在接收完第9位数据后,需满足以下两个条件,才能将接收到的数据送入接收缓冲器SBUF。

  1. RI =0,意味着接收缓冲器为空。
  2. SM2=0或接收到的第9位数据位RB8 = 1。

当满足上述两个条件时,接收到的数据送入接收缓冲器SBUF,第9位数据送入RB8 ,且R置1。
若不满足这两个条件,接收的信息将被丢弃。

方式3:

除波特率外,方式3和2相同

方式 3 的波特率 = 2 S M O D 32 ∗ 定时器 T 1 溢出率 方式3的波特率 = \frac{2^{SMOD}}{32}*定时器T1溢出率 方式3的波特率=322SMOD定时器T1溢出率

波特率:

波特率的定义:
串行口每秒钟发送(或接收)的位数称为波特率。设发送一位所需要的时间为T,则波特率为1/T。
波特率和串行口的工作方式有关。

  1. 串行口工作在方式0时

方式 0 的波特率 = f 12 ​ 方式0的波特率= \frac{f}{12} ​ 方式0的波特率=12f

若fosc = 12 MHz,波特率为fosc/12,即1 Mbit/ s。

  1. 串行口工作在方式2时,波特率仅与SMOD位的值有关。

方式 2 的波特率 = 2 S M O D 64 ∗ f 方式2的波特率 = \frac{2^{SMOD}}{64}*f 方式2的波特率=642SMODf

若fosc = 12 MHz: SMOD =0,波特率=187.5 kbit/s; SMOD =1,波特率=375kbit/ s。

  1. 串行口工作在方式1或方式3时,常用定时器T1作为波特率发生器,其关系式为

方式 2 的波特率 = 2 S M O D 64 ∗ f 方式2的波特率 = \frac{2^{SMOD}}{64}*f 方式2的波特率=642SMODf

在实际设定波特率时,T1常设置为方式2定时(自动装初值),即TL1作为8位计数器,TH1存放备用初值。
这种方式不仅使操作方便,也可避免因软件重装初值带来的定时误差。

设定时器T1方式2的初值为X,则有
定时器 T 1 的溢出率 = 计数速率 / ( 256 − X ) = ( f / 12 ) / ( 256 − X ) 定时器T1的溢出率=计数速率/(256-X) =(f/12)/(256-X) 定时器T1的溢出率=计数速率/(256X)=(f/12)/(256X)
化简:
波特率 = ( 2 S M O D / 32 ) × ( f o s c / 12 ) / ( 256 − X ) 波特率=(2^{SMOD}/32)×(fosc/12)/(256-X) 波特率=(2SMOD/32)×(fosc/12)/(256X)
在实际使用时,经常根据已知波特率和时钟频率fc来计算定时器T1的初值X。
image.png
当使用串行口进行串行通信时,为减小波特率误差,应使用11.0592 MHz的时钟频率
51单片机学习笔记(二)—定时
51单片机学习笔记(一)—中断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值