文章目录
- 知识准备
- 发送/接收缓冲器 SBUF
- 串口通信控制寄存器SCON
- 电源控制寄存器 PCON
- 各个工作方式波特率的设定
- 常考题型
- 例题1
- 题目描述
- 题目解析
- 题解
- 例题2
- 题目描述
- 题解
知识准备
发送/接收缓冲器 SBUF
- 单片机在发送或接收数据的前先将数据存储在
SBUF
中; - 接收:
MOV A, SUBF
; - 发送:
MOV SUBF, A
;
串口通信控制寄存器SCON
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SM0、SM1
决定串行口的工作方式共四种组合,如下表所示:
M1 | M0 | 方式 | 帧格式 | 波特率 |
---|---|---|---|---|
0 | 0 | 方式0 | 8位移位寄存器 | ∫晶振 / 12 |
0 | 1 | 方式1 | 10位UART | 可变,由定时器控制 |
1 | 0 | 方式2 | 10位UART | ∫晶振 / 64或∫晶振 / 32 |
1 | 1 | 方式3 | 10位UART | 可变,由定时器控制 |
SM2
:多机控制位;REN
:允许串行口接收控制位:- 0:禁止;
- 1:允许;
TB8
:发送第9位数据;RB8
:接收第9位数据;TI
:发送中断标志;RI
:接收中断标志;
电源控制寄存器 PCON
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
SMOD | – | – | – | GF1 | GF0 | PD | IDL |
SMOD
:串行口波特率系数控制位;
各个工作方式波特率的设定
- 在串行通信中,收发双方的波特率必须一致。
方式0
的波特率:∫OSC / 12(∫OSC 是晶振频率);方式2
的波特率:(2SMOD / 64) • ∫OSC;方式1
和方式3
的波特率:(2SMOD / 32) • T1的溢出率 = (2SMOD / 32) • ( ∫OSC / 12(256 - X);(注意一般使用T1的方式2
作为波特率发生器);
常考题型
例题1
题目描述
- MCS51单片机的时钟频率为
u=11.0592MHZ
,选用定时器T1
工作在方式2
作为波特率发生器,要求产生4800bit/s
的波特率,求T1的计数初值
。若串行口工作在方式1
,允许接收,允许串行口中断,试写出该单片机串行口的初始化程序。
题目解析
本题可分为两个小问题看待。首先是求T1的初值:可根据方式1的波特率公式(2SMOD / 32) • ( ∫OSC / 12(256 - X)解出初值X的值。
- 假设
SMOD = 0
(因为题目并未给出),则方式1
的波特率 = (2SMOD / 32) • ( ∫OSC / 12(256 - X),代入数值得: - 4800 = (20 /32) • (11.0953 * 106 ) / 12(256 - X),解得 X = FAH;
- 所以
TH1 = TL1 = 0FAH
;
其次是写出初始化程序:
- 根据题目要求串行口工作在方式1,允许接收,可以得出
SCON
=0101 0000
=50H
; - 由允许串行口中断可以得出
IE寄存器
中的EA、ES
必须置为1; - 由选用定时器1工作在方式2可得出
TCON
=0010 0000
=20H
;
题解
MOV TMOD, #20H
MOV TH1, #0FAH
MOV TL1, #0FAH
SETB TR1 ;启用定时器1
MOV PCON, #00H
MOV SCON, #50H
SETB EA
SETB ES
例题2
题目描述
- MCS51单片机进行通信。要求甲机将内部RAM地址
30H
开始存储的20个数据
送入乙机器中内部RAM地址40H
开始的存储空间中。要求双方的串口均采用方式1、中断方式进行数据传输。波特率为4800bit/s
,晶振频率为11.0592MHZ
。试分别写出甲乙机器的发送与接收程序。
题解
- 方式1的波特率 = (2SMOD / 32) • ( ∫OSC / 12(256 - X),代入数值得:
- 4800 = (20 /32) • (11.0953 * 106 ) / 12(256 - X),解得 X = FAH;
- 所以
TH1 = TL1 = 0FAH
;
甲机(发送数据)
ORG 0000H
AJMP MAIN
ORG 0023H ;串行口中断入口
AJMP SOUT ;跳转到中断服务程序
ORG 0030H
MAIN:
MOV SCON, #40H;采用方式1,且禁止接收
MOV TMOD, #20H;定时器采用方式2
MOV TH1, #0FAH;定时器初值
MOV TL1, #0FAH
SETB TR1 ;启用定时器1
SETB EA ;打开中断允许总开关
SETB ES ;允许串行口中断
MOV R0, #30H;存储数据的地址
MOV R7, #20H;控制循环次数
MOV A, @R0
MOV SBUF, A ;先将数据存储至SBUF
DEC R7 ;R7-1
SJMP $ ;死循环,等待中断
SOUT:
CLR TI ;发送中断标志位清零
INC R0 ;R0+1
MOV A, @R0
MOV SBUF, A
DJNZ R7, ENDSI;判断循环是否结束
CLR ES ;关闭串行口中断
ENDSI:
RETI
END
乙机(接收数据)
ORG 0000H
AJMP MAIN
ORG 0023H ;串行口中断入口
AJMP SOUT ;跳转到中断服务程序
ORG 0030H
MAIN:
MOV SCON, #50H;采用方式1,且允许接收
MOV TMOD, #20H;定时器采用方式2
MOV TH1, #0FAH;定时器初值
MOV TL1, #0FAH
SETB TR1 ;启用定时器1
SETB EA ;打开中断允许总开关
SETB ES ;允许串行口中断
MOV R0, #40H;存储数据的地址
MOV A, @R0
SJMP $ ;死循环,等待中断
SIN:
CLR RI ;接收中断标志位清零
MOV A, SBUF
MOV @R0, A
INC R0
ENDSI:
RETI
END