串/并行通信
并行通信:
使用多条数据线将数据字节的各个位同时传送,每一位数据都需要一条传输线,还需要一条或几条控制信号线,
并行通信相对传输速度快,但传输线较多,长距离传送时成本高,也因此这种方式适合于短距离的数据传输。
串行通信:
将数据字节分成一位一位的形式在一条传输线上逐个传送,一次只能传送一位,对于一个字节的数据,至少要分8位才能传送完毕。串行通信传输线少,长距离传送成本低,单片机应用系统中串行通信的使用非常普便。
发送时,把并行数据变成串行数据发送到线路上去,接受时,把串行数据在变成并行数据
同步/异步通信
同步通信:
发送和接收设备采用一个同步时钟,通过一条同步时钟线加到收发双方,效率较高
异步通信
收发双发使用各自的时钟控制数据的发送和接收,(为使收发双方协调,要求收发双方的时钟可尽可能一致)
异步串行通信,以数据帧为单位进行数据传输,各数据帧之间的间隔是任意的,每个数据帧中的各位是以固定的时间传送的,(每个数据帧要加起始位,停止位,有时需要校验位)
单片机串行口
结构
有两个物理上独立的发送、接收缓冲器,SBUF(特殊功能寄存器),可通过两个引脚TXD,RXD,同时发送、接收数据,两个缓冲器共用一个特殊功能寄存器,其字节地址为99H
SCON–串行口控制寄存器
字节地址98H,可位寻址,
SCON各位功能如下:
- SM0、SM1–串行口4中工作方式选择
常用方式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。
- REN——允许串行接收位由软件置1或清0
- REN =1,允许串行口接收数据。
- REN =0,禁止串行口接收数据。
- TB8——发送的第9位数据
- 在方式2或方式3时,TB8是要发送的第9位数据,其值由软件置1或清0。
- 在双机串行通信时,TB8一般作为奇偶校验位使用;在多机串行通信中用来表示主机发送的是地址帧还是数据帧,TB8=1为地址帧,TB8=0为数据帧。
- RB8——接收的第9位数据
- 工作在方式2或方式3时,RB8存放串行口接收到的第9位数据。
- 在方式1,如果SM2 =0,RB8是接收到的停止位。
- 在方式0,不使用RB8。
- TI——发送中断标志位
Tl=1,表示一帧数据发送结束。
- 串行口工作在方式0时,串行发送的第8位数据结束时TI由硬件置1。
- 在其他工作方式中,串行口发送停止位时,置TI为1。TI =1,则可申请中断,CPU响应中断后,在中断服务程序中向“发送 SBUF”写入要发送的下一帧数据。
TI位的状态可供软件查询,且必须由软件清0。
- RI——接收中断标志位
RI =1,表示一帧数据接收完毕。
- 串行口工作在方式0时,接收完第8位数据时,RI由硬件置1。
- 在其他工作方式中,串行接收到停止位时,该位置1。Rl =1,则可申请中断,要求CPU从“接收SBUF”取走数据。
RI位的状态也可供软件查询,且必须由软件清0。
PCON–特殊功能寄存器
字节地址:87H,不能位寻址
SMOD–波特率选择位;
工作方式:
方式0:
同步移位寄存器输入/输出方式**,用于串行口外接移位寄存器,以扩展并行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:
双击串行通信方式
收发一帧的数据为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的溢出率
当一帧数据接收完毕后,必须同时满足以下两个条件,这次接收才真正有效。
- RI =0,即上一帧数据接收完成时,Rl =1发出的中断请求已被响应,SBUF中的数据已被取走,说明“接收SBUF”已空。
- SM2 =0或收到的停止位=1(方式1时,停止位已进入RB8),则将接收到的数据装入SBUF 和 RB8(装入的是停止位),且中断标志RI置1。
若不同时满足这两个条件,收到的数据不能装入SBUF,这意味着该帧数据将丢失。
方式2:
串行口工作于方式2和方式3时,被定义为9位异步通信接口。
每帧数据均为11位位起始位0,8位数据位(先低位),1位可程控为1或0的第9位数据和1位停止位
方式
2
的波特率
=
2
S
M
O
D
64
∗
f
方式2的波特率 = \frac{2^{SMOD}}{64}*f
方式2的波特率=642SMOD∗f
引脚从1到0的负跳变,并判断起始位有效后,便开始接收一帧信息。在接收完第9位数据后,需满足以下两个条件,才能将接收到的数据送入接收缓冲器SBUF。
- RI =0,意味着接收缓冲器为空。
- 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。
波特率和串行口的工作方式有关。
- 串行口工作在方式0时
方式 0 的波特率 = f 12 方式0的波特率= \frac{f}{12} 方式0的波特率=12f
若fosc = 12 MHz,波特率为fosc/12,即1 Mbit/ s。
- 串行口工作在方式2时,波特率仅与SMOD位的值有关。
方式 2 的波特率 = 2 S M O D 64 ∗ f 方式2的波特率 = \frac{2^{SMOD}}{64}*f 方式2的波特率=642SMOD∗f
若fosc = 12 MHz: SMOD =0,波特率=187.5 kbit/s; SMOD =1,波特率=375kbit/ s。
- 串行口工作在方式1或方式3时,常用定时器T1作为波特率发生器,其关系式为
方式 2 的波特率 = 2 S M O D 64 ∗ f 方式2的波特率 = \frac{2^{SMOD}}{64}*f 方式2的波特率=642SMOD∗f
在实际设定波特率时,T1常设置为方式2定时(自动装初值),即TL1作为8位计数器,TH1存放备用初值。
这种方式不仅使操作方便,也可避免因软件重装初值带来的定时误差。
设定时器T1方式2的初值为X,则有
定时器
T
1
的溢出率
=
计数速率
/
(
256
−
X
)
=
(
f
/
12
)
/
(
256
−
X
)
定时器T1的溢出率=计数速率/(256-X) =(f/12)/(256-X)
定时器T1的溢出率=计数速率/(256−X)=(f/12)/(256−X)
化简:
波特率
=
(
2
S
M
O
D
/
32
)
×
(
f
o
s
c
/
12
)
/
(
256
−
X
)
波特率=(2^{SMOD}/32)×(fosc/12)/(256-X)
波特率=(2SMOD/32)×(fosc/12)/(256−X)
在实际使用时,经常根据已知波特率和时钟频率fc来计算定时器T1的初值X。
当使用串行口进行串行通信时,为减小波特率误差,应使用11.0592 MHz的时钟频率
51单片机学习笔记(二)—定时
51单片机学习笔记(一)—中断