说明:
参考内容:《单片机原理及应用(第三版)》 张毅刚 ; hfut单片机原理课程ppt 博文仅做笔记备份,不定时更新 文中部分图片来自ppt截图,侵删致歉 每一章节的笔记分为文字版和思维导图版,思维导图是由文字版笔记导出的,部分章节有整理习题内容,可浏览目录了解哪些章节有习题部分、
2022/7/5考完复盘 :
题目比较基础,对基本的知识点考察较多 选择、填空、判断和改错题基本上都是对基本知识点的考察,对存储器的考察基本都在这部分 没有考察串行口的编程题,编程题也很基础,一道是把数据从片内移到片外;一道是输出波形,是对中断和定时器的考察 然后我很想说:相信自己的第一直觉,第一直觉选了正确答案,检查试卷时搁那儿分析半天重选了错误答案,我真的会谢😭
MCS-51硬件结构
笔记思维导图
笔记文字部分
MCS-51硬件结构
CPU
运算器
ALU
ACC
B
常用于乘除操作
乘法:
A
×
B
→
B
A
A\times B \rightarrow BA
A × B → B A 除法:
A
÷
B
→
A
⋅
⋅
⋅
⋅
⋅
⋅
B
A\div B\rightarrow A······ B
A ÷ B → A ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ B 作为通用寄存器或RAM的一个单元使用 暂存器 PSW——8位专用寄存器,可进行位寻址
C
y
(
P
S
W
.
7
)
C_y(PSW.7)
C y ( P S W . 7 ) :最高位进位/借位
A
c
(
P
S
W
.
6
)
A_c(PSW.6)
A c ( P S W . 6 ) :半进位,低四位向高四位的进位
F
0
(
P
S
W
.
5
)
F_0(PSW.5)
F 0 ( P S W . 5 ) :用户标志位
R
S
1
R
S
0
(
P
S
W
.
4
P
S
W
.
3
)
RS1\ RS0(PSW.4\ PSW.3)
R S 1 R S 0 ( P S W . 4 P S W . 3 ) :工作寄存器组指针,用以选择CPU当前工作的寄存器组
O
V
(
P
S
W
.
2
)
OV(PSW.2)
O V ( P S W . 2 )
F
1
(
P
S
W
.
1
)
F1(PSW.1)
F 1 ( P S W . 1 ) :用户标志位
P
(
P
S
W
.
0
)
P(PSW.0)
P ( P S W . 0 ) :奇偶标志位 控制器
PC
可对64KB 的程序存储器直接寻址(PC16位) 对用户透明 程序地址寄存器 IR 指令译码器ID 时序控制电路 存储器
数据存储器RAM
内部数据存储器
8031有128byte,地址空间
00
H
∼
7
F
H
00H\sim 7FH
0 0 H ∼ 7 F H 8032有256byte,地址空间
00
H
∼
7
F
H
00H\sim 7FH
0 0 H ∼ 7 F H 和
80
H
∼
0
F
F
H
80H\sim 0FFH
8 0 H ∼ 0 F F H (与SFR地址重叠) 寻址:对片内高区128B(
80
H
∼
0
F
F
H
80H\sim 0FFH
8 0 H ∼ 0 F F H )只能用寄存器间接寻址 ,对特殊功能寄存器区必须用直接寻址 外部数据存储器
程序存储器 ROM/EPROM
可寻址范围64KB,片内外程序存储器统一编址 片内
E
A
‾
=
1
\overline{EA}=1
E A = 1 时,PC在0~
0
F
F
F
H
0FFFH
0 F F F H 范围内执行片内中的程序,超出片内程序存储器容量后自动转向片外 片外
E
A
‾
=
0
\overline{EA}=0
E A = 0 时,PC在0~
0
F
F
F
F
H
0FFFFH
0 F F F F H 范围内执行片外的程序 7个特殊的地址单元
0000H:复位后PC=0000H,即程序从0000H处开始执行指令 0003H:外部中断0入口地址 000BH:定时器0溢出中断入口地址 0013H:外部中断1入口地址 001BH:定时器1溢出中断入口地址 0023H:串行口中断入口地址 002BH:定时器2溢出中断入口地址(针对8032) 特殊功能寄存器 SFR
说明
在
80
H
∼
0
F
F
H
80H\sim 0FFH
8 0 H ∼ 0 F F H 共128个字节单元中,SFR只离散的占用了部分字节 部分SFR可进行位寻址,可位寻址的SFR的字节地址末位只能是X0H或X8H SP
在调用子程序或进入中断服务程序时,断点地址的入栈和出栈是由硬件自动实现的 DPTR (DPH和DPL)
主要存放16位地址 某些情况下,DPH和DPL可单独使用 对64KB外部数据存储器空间寻址时,作为间址寄存器使用;在访问程序存储器时,作为基址寄存器使用 I/O端口
P
0
∼
P
3
P_0\sim P_3
P 0 ∼ P 3
特殊功能寄存器
P
0
∼
P
3
P_0\sim P_3
P 0 ∼ P 3 分别是I/O端口
P
0
∼
P
3
P_0\sim P_3
P 0 ∼ P 3 的锁存器 寄存器B
主要是为乘除运算 不执行乘除运算时可作为普通寄存器使用 串行数据缓冲器SUBF
由发送缓冲器和接收缓冲器组成(共用一个地址99H) 串行控制寄存器SCON
主要用来选择串行通信的工作方式、接收或发送控制、设置状态标志 位地址空间
四个8位并行I/O端口
P
0
P_0
P 0
由一个输出锁存器、2个三态输入缓冲器、1个输出驱动电路、1个输出控制电路(1个与门、1个反相器、1个MUX)组成 多路开关MUX的位置
当
P
0
P_0
P 0 口做地址/数据总线时,CPU发出1信号,MUX将非门输出端和T2的栅极接通 当
P
0
P_0
P 0 做I/O端口时,CPU发出0信号,MUX将输出锁存器
Q
‾
\overline{Q}
Q 与T2的栅极接通
P
1
P_1
P 1
P
2
P_2
P 2
P
3
P_3
P 3 一个串行口 两个16位定时器(8032有3个) 中断系统
MCS-51指令系统 指令表 此图来自课本
指令系统习题
已知执行下列指令前,(A)=01H, (SP)=6AH, (69H)=50H, (6AH)=80H,执行后它们各自是多少?
POP DPH ; ( ( SP ) ) - > DPH , ( SP ) - 1 - > SP
; ( 6AH) = 80H- > DPH , ( SP ) - 1 = 6AH- 1 = 69H- > SP
POP DPL ; ( ( SP ) ) - > DPL , ( SP ) - 1 - > SP
; ( 69H) = 50H- > DPL , ( SP ) - 1 = 69H- 1 = 68H- > SP
MOV DPTR , #3000H; 30H- > DPH , 00H- > DPL
RL A ; ( A ) = 02H
MOV B , A ; ( B ) = 02H
MOVC A , @A + DPTR ; ( A ) = 33H
PUSH ACC ; ( SP ) + 1 - > SP , ( A ) - > ( SP )
; 68H+ 1 = 69H- > SP , 33H- > ( 69H)
MOV A , B ; 02H- > ( A )
RL A ; ( A ) = 04H
MOVC A , @A + DPTR ; ( A ) = 55H
PUSH ACC ; ( SP ) + 1 - > SP , ( A ) - > ( SP )
; 69H+ 1 = 6AH- > SP , 55H- > ( 6AH)
RET ; ( ( SP ) ) - > PCH , ( SP ) - 1 - > SP
; ( ( SP ) ) - > PCL , ( SP ) - 1 - > SP
; ( 6AH) = 55H- > PCH , 6AH- 1 = 69H- > SP
; ( 69H) = 33H- > PCL , 69H- 1 = 68H- > SP
ORG 3000H
DB 11H, 22H, 33H, 44H, 55H, 66H
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
因此执行后,(A)=55H, (SP)=68H, (69H)=33H, (6AH)=55H, (PC)=5533H
假设(A)=57H, (R0)=63H, (63H)=0A1H,则执行后(A)=?
ANL A , #63H ; ( A ) = 43H
ORL 63H, A ; ( 63H) = E3H
XRL A , @R0 ; ( A ) = A0H
CPL A ; ( A ) = 5FH
执行后(A)=5FH
编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据,若有,则将51H单元置01H,否则,将51H单元置00H
ORG 0000H
MOV R0 , #30H ; 内部单元起始地址
MOV R2 , #21H ; 查找次数
LOOP : MOV A , @R0
CJNE A , #0AAH, NOT
MOV 51H, #01H
SJMP DEND
NOT : INC R0
DJNZ R2 , LOOP
MOV 51H, #00H
DEND : SJMP DEND
MCS-51的中断系统
笔记思维导图
笔记文字部分
MCS-51的中断系统
中断源
I
N
T
0
‾
\overline{INT0}
I N T 0 ,外部中断0请求,由P3.2输入。
I
N
T
1
‾
\overline{INT1}
I N T 1 ,外部中断1请求,由P3.3输入片内定时器T0溢出中断请求 片内定时器T1溢出中断请求 片内串行口发送/接收中断请求 片内定时器T2溢出中断请求(8032) 特殊功能寄存器TCON(专用寄存器)
作用:锁存外部的中断请求标志,以及T0、T1的溢出中断请求标志
IT0:选择
I
N
T
0
‾
\overline{INT0}
I N T 0 触发方式控制位。IT0=0,
I
N
T
0
‾
\overline{INT0}
I N T 0 低电平触发中断;IT0=1,
I
N
T
0
‾
\overline{INT0}
I N T 0 负跳沿触发中断
IE0:
I
N
T
0
‾
\overline{INT0}
I N T 0 请求标志位。IE0=1,外部中断0向CPU申请中断
IT1、IE1功能同上
TF0:片内定时器T0溢出中断请求标志。T0启动后从初始值开始进行加1计数,当最高位产生溢出时,置TF0=1,向CPU申请中断
TF1功能同TF0
特殊功能寄存器T2CON(专用寄存器)
TF2:当T2的计数器(TH2、TL2)计数溢出回0时,由内部硬件置位TF2,向CPU发出中断请求。但当RCLK或TCLK为1时将不予置位。本标志位必须由软件清0
EXF2:当由引脚T2EX上的负跳变引起“捕捉”或“重新装载”且EXEN2=1时,则置位EXF2标志位(T2CON.6),向CPU发出中断请求
上述2种中断请求,CPU响应时会转向同一个中断矢量地址进行处理,因此需在T2的中断服务程序中对TF2和EXF2进行查询判别
特殊功能寄存器SCON(串行口控制寄存器)
中断控制
中断允许寄存器IE
第一级:总开关中断控制位EA;另一个是各个中断源对应的中断请求允许位
EX0:对应
I
N
T
0
‾
\overline{INT0}
I N T 0
ET0:对应
T
0
T0
T 0
EX1:对应
I
N
T
1
‾
\overline{INT1}
I N T 1
ET1:对应
T
1
T1
T 1
ES:对应串行口中断
ET2:对应T2
中断优先级寄存器IP
中断优先基本规则
低优先级可被高优先级中断 任何一种中断一旦得到响应,不会再被同级中断源中断 同时收到几个同级的中断请求时,同一优先级中断的查询次序(从高到低)
外部中断0 T0溢出中断 外部中断1 T1溢出中断 串行口中断 T2中断 中断响应条件
CPU开中断,即EA=1 中断源未被屏蔽 中断源发出中断请求 没有同级或更高级的中断正在被服务,并且没有同级顺序更高的中断源正在请求中断 中断被推迟响应的条件
CPU正在处理同级或更高优先级的中断 现行机器周期不是正在执行的指令的最后一个机器周期 正在执行的是中断返回指令RETI或访问专用寄存器IE或IP的指令 中断请求的撤销
T0、T1中断请求的撤销:中断响应后,硬件自动清除 TF0或TF1 外部中断请求的撤销
跳沿方式:中断响应后,硬件自动清除 中断请求标志位IE0或IE1,负跳沿信号是瞬息过程,不会维持 电平方式:硬件自动清除 IE0或IE1,但中断请求低电平信号可能继续维持 串行口中断请求的撤销:在中断服务程序中,用软件清除 相应的中断标志位 定时器T2中断请求的撤销:用软件清除 TF2或EXF2的中断标志位
MCS-51定时器/计数器
笔记思维导图
笔记文字部分
MCS-51定时器/计数器
T0与T1的结构
工作方式
计数器方式
计数脉冲来自外部输入引脚T0和T1,当引脚发生1到0的负跳变时,计数器加1 CPU在每个机器周期的S5P2节拍对外部计数脉冲进行采样 由于计数脉冲是在两个机器周期进行的,因此最高计数频率是振荡频率的1/24 定时器方式
定时器的输入来自内部时钟发生器电路 ,每个机器周期计数器加1,而1个机器周期有12个振荡周期,所以定时器的计数频率是晶振频率的1/12 例子:若单片机的时钟频率是12MHz,则计数频率是1MHz,即每个微秒计数器加一 工作方式控制寄存器TMOD
定时器/计数器控制寄存器TCON(仅介绍TR0、TR1)
TR0、TR1:定时器/计数器运行控制位
1:启动定时器/计数器工作 0:停止定时器/计数器工作 T0与T1的工作方式
方式0
13位计数器 由TLx的低5位和THx的高8位组成 TLx的低5位溢出时,向THx进位;THx计数溢出时,则置位溢出标志TFx 方式1
16位计数器 由TLx的低8位和THx的高8位组成 TLx低8位溢出,则向THx进位;THx计数溢出,则置位溢出标志TFx 方式2
是能自动重装计数初值的8位计数器 TLx作8位计数器用,THx用以保存计数初值 TLx计数溢出时,将溢出位TFx置1,同时将保存在THx中的计数初值重新装入TLx,继续计数循环不止 方式2可以自动循环计数,通常用在定时精度高的场合,例如作为串行口的波特率发生器使用 方式3
仅适用于T0 方式3下,TH0和TL0变为两个独立的计数器 TL0占用全部的T0控制位,仍可具有定时/计数功能 TH0只能用于定时方式,运行控制位和溢出标志位则借用定时器T1的TR1和TF1 T0工作于方式3时,一般将定时器T1作为串行口波特率发生器或用于不需要中断的场合 对输入信号的要求
定时器模式下,输入信号内部时钟 ,每个机器周期产生一个计数脉冲 计数器模式下,输入信号是外部信号,负跳变有效 ,每个机器周期检查一次外部信号的状态(外部输入信号的高、低电平至少保持一个机器周期) T0与T1的初始化
初始化步骤
确定工作方式、操作模式、启动控制方式,并写入TMOD、TCON 设置定时或计数器的初值,直接将初值写入TH0、TL0或TH1、TL1、TH2、TL2中 根据需要开放CPU和定时/计数器的中断,即对IE和IP寄存器编程 启动
若要求软件启动,编程时对TCON中的TR0或TR1置位即可 若要求外部中断引脚电平启动,则对TCON中的TR0或TR1置位后,还需给外引脚加启动电平 初值的计算
若设最大计数值为
2
n
2^n
2 n ,n为计数器位数,则
方式0:
n
=
13
,
2
n
=
8192
n=13, \ 2^n=8192
n = 1 3 , 2 n = 8 1 9 2 方式1:
n
=
16
,
2
n
=
65536
n=16, \ 2^n=65536
n = 1 6 , 2 n = 6 5 5 3 6 方式2:
n
=
8
,
2
n
=
256
n=8, \ 2^n=256
n = 8 , 2 n = 2 5 6 方式3:
n
=
8
,
2
n
=
256
n=8, \ 2^n=256
n = 8 , 2 n = 2 5 6 (TH0、TL0为两个独立的计数器,各自最大的计数值均为256) T0和T1定时器都是加一计数器,当加到最大值时产生溢出中断,因此计数器初值X的计算公式为:
X
=
2
n
−
计
数
值
X=2^n-计数值
X = 2 n − 计 数 值 计数模式
对外部脉冲进行计数,计数初值:
X
=
2
n
−
计
数
值
X=2^n-计数值
X = 2 n − 计 数 值 定时模式
对机器周期进行计数,故计数脉冲频率为
f
c
o
n
t
=
f
o
s
c
12
f_{cont}=\cfrac{f_{osc}}{12}
f c o n t = 1 2 f o s c 、计数周期
T
=
1
f
c
o
n
t
T=\cfrac{1}{f_{cont}}
T = f c o n t 1 , 定时模式的初值
X
=
2
n
−
计
数
值
=
2
n
−
t
T
=
2
n
−
t
×
f
o
s
c
12
X=2^n-计数值=2^n-\frac{t}{T}=2^n-\frac{t\times f_{osc}}{12}
X = 2 n − 计 数 值 = 2 n − T t = 2 n − 1 2 t × f o s c (
f
o
s
c
f_{osc}
f o s c 单位是MHz,定时时间t的单位是
μ
s
\mu s
μ s )
定时器/计数器习题
说明:这题是往年考试的一道试题,自己写的正确性没验证。 8031 单片机系统,晶振为 6MHz。请编写程序,采用定时器 T0 的方式二,在 P1.0 输出一个周期250μs、占空比为 2:5 的方波(如下图): (1)计算初值 采用定时器方式,计数值 =
t
×
f
o
s
c
12
=
50
μ
s
×
6
M
H
z
12
=
25
t\times \frac{f_{osc}}{12}=50\mu s \times \frac{6MHz}{12}=25
t × 1 2 f o s c = 5 0 μ s × 1 2 6 M H z = 2 5 ,每
50
μ
s
50 \mu s
5 0 μ s 产生一次中断 初始值 X =
2
8
−
25
=
231
=
E
7
H
2^8 - 25 = 231 = E7H
2 8 − 2 5 = 2 3 1 = E 7 H (2)编写程序
ORG 0000H
LJMP MAIN
ORG 000BH ; T0 的中断入口地址
LJMP INT
ORG 0100H
MAIN : MOV SP , #60H
MOV TMOD , #02H ; 0010
MOV TH0 , #0E7H
MOV TL0 , #0E7H ; T0 赋初值
SETB EA ; 开总中断
SETB ET0 ; 允许T0 中断
SETB TR0 ; 启动T0
SETB P1 .0
CLR F0 ; F0 = 0 时,输出100 微秒的高电平;F0 = 1 ,输出低电平
MOV R0 , #02H ; 输出两个50 微秒的高电平
WAIT : AJMP WAIT ; 等待中断
INT : JB INT1
SETB P1 .0 ; P1 .0 输出高电平
DJNZ R0 , INT ; 若高电平维持时间没有达到100 微秒则继续维持高电平
SETB F0 ; 置F0 = 1 ,输出低电平
MOV R0 , #03H ; 维持的时间段(一个时间段为50 微秒)个数
RETI
INT1 : CLR P1 .0 ; P1 .0 输出低电平
DJNZ R0 , INT1 ; 若低电平维持时间没有达到150 微秒则继续维持低电平
CLR F0 ; 置F0 = 0 ,输出高电平
MOV R0 , #02H ; 维持的时间段(一个时间段为50 微秒)个数
RETI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
MCS-51的串行口
笔记思维导图
笔记文字部分
MCS-51的串行口
串行口的结构
全双工的串行异步通信口 两个独立的发送、接收缓冲器(使用同一字节地址,但在物理上是两个独立的缓冲器)
发送缓冲器:只能写入,不能读出 接收缓冲器:只能读出,不能写入 串行口控制寄存器SCON(可位寻址)
SM1、SM0:串行口工作方式选择
00:方式0,同步移位寄存器方式(用于扩展I/O口) 01:方式1,8位异步收发,波特率可变(由定时器控制) 10:方式2,9位异步收发,波特率为
f
o
s
c
64
\cfrac{f_{osc}}{64}
6 4 f o s c 或
f
o
s
c
32
\cfrac{f_{osc}}{32}
3 2 f o s c 11:方式3,9位异步收发,波特率可变(由定时器控制) SM2:多机通信控制位
在工作方式2和3中
若SM2=1,当接收到第9位数据为1,才将接收到的前8位数据装入SBUF,并置位RI;否则丢弃接收到的数据 若SM2=0,不论第9位数据是否为1,都将接收到的前8位数据装入SBUF,并置位RI 在工作方式1中
若SM2=1,则只有接收到有效停止位时,才置位RI 在工作方式0中
REN:允许串行接收位
TB8:发送的第9位数据
在工作方式2或3中,TB8为发送的第9位数据,可由软件置位或清零 在双机通信中,TB8可作为奇偶校验位 在多机通信中,TB8用来表示发送的是地址帧(TB8=1)还是数据帧(TB8=0) RB8:接收到的第9位数据
在工作方式2或3中,RB8存放接收到的第9位数据 在工作方式1中,RB8是已接收的停止位 在工作方式0中,RB8未使用 TI:发送中断标志
TI在一帧数据发送结束时由硬件置1,表示一帧数据发送结束,此时可向SBUF写入下一帧要发送的数据 TI可供软件查询,也可申请中断,但必须由软件清零 RI:接收中断标志
RI在接收完一帧有效数据时由硬件置1,表示一帧数据接收结束,并申请中断,要求CPU从接收SBUF取走数据 RI可供软件查询,RI必须由软件清零 电源控制寄存器PCON(只能字节寻址,不能位寻址 )
SMOD(PCON.7):串行口波特率选择位
SMOD=1时,串行口波特率加倍。复位时SMOD=0
方式1、3:
波
特
率
=
2
S
M
O
D
32
×
定
时
器
T
1
溢
出
率
波特率 = \cfrac{2^{SMOD}}{32}\times 定时器T1溢出率
波 特 率 = 3 2 2 S M O D × 定 时 器 T 1 溢 出 率 方式2:
波
特
率
=
f
o
s
c
×
2
S
M
O
D
64
波特率=f_{osc}\times \frac{2^{SMOD}}{64}
波 特 率 = f o s c × 6 4 2 S M O D GF1、GF0:通用标志位 PD:掉电方式位 IDL:休眠方式位 串行口的工作方式
方式0
同步移位寄存器输入输出方式,常用于外界移位寄存器,以扩展I/O口 8位数据为一帧,没有起始位和停止位,发送或接收时,低位在先 RXD:数据输入/输出端 TXD:同步脉冲输出端,每个脉冲对应一个数据位 固定波特率 =
f
o
s
c
/
12
f_{osc}/12
f o s c / 1 2 发送过程
CPU执行将数据写入SBUF的指令,启动发送 串行口开始将SBUF中的数据以
f
o
s
c
/
12
f_{osc}/12
f o s c / 1 2 的波特率从RXD引脚输出,TXD引脚输出同步移位脉冲 一帧发送结束,TI置1 接收过程
写入控制字SCON置方式0、REN=1、RI=0,启动接收 串行口开始将RXD引脚的数据以
f
o
s
c
/
12
f_{osc}/12
f o s c / 1 2 的波特率输入SBUF,TXD输出同步移位脉冲 一帧接收完毕,RI置1 方式1
为异步串行通信方式 10位数据为一帧,1个起始位,8个数据位,1个停止位,发送或接收时,低位在先 RXD:数据接收端 TXD:数据发送端 波特率 =
2
S
M
O
D
32
×
定
时
器
T
1
溢
出
率
\frac{2^{SMOD}}{32}\times 定时器T1溢出率
3 2 2 S M O D × 定 时 器 T 1 溢 出 率 发送过程
CPU执行将数据写入SBUF的指令,启动发送 串行口开始将SBUF中的数据以方式1的波特率从TXD引脚输出 8位数据位发送完成,TI置1 接收过程
REN=1时允许接收,数据从RXD引入,当检测到起始位时开始接收 接收完一帧,若同时满足(1)RI=0;(2)SM2=0或停止位为1,则接收有效 接收有效时,将接收的数据装入SBUF,停止位装入RB8,并置RI为1;否则丢弃接收到的数据,不置位RI 方式2和3
都是异步串行通信方式 11位数据为一帧,1个起始位,8个数据位,1个第9位,1额停止位,发送或接收数据时,低位在先 RXD:数据接收端 TXD:数据发送端 方式2的波特率 =
f
o
s
c
×
2
S
M
O
D
64
f_{osc}\times \frac{2^{SMOD}}{64}
f o s c × 6 4 2 S M O D 方式3的波特率 =
2
S
M
O
D
32
×
定
时
器
T
1
溢
出
率
\frac{2^{SMOD}}{32}\times 定时器T1溢出率
3 2 2 S M O D × 定 时 器 T 1 溢 出 率 发送过程
先根据通信协议设置TB8(第9位) ,然后CPU执行将8位数据写入SBUF的指令,启动发送串行口开始将SBUF中的8位数据和TB8以波特率从TXD引脚输出 TB8发送结束时,TI置1 接收过程
REN=1时允许接收,数据从RXD引入,当检测到起始位时开始接收 接收完一帧,若满足(1)RI=0;(2)SM2=0或第9位为1,接收有效 接收有效时,将接收到的8位数据装入SBUF,第9位装入RB8,并置RI为1;否则丢弃接收到的数据,不置位RI 波特率的制定方法
串行口每秒发送或接收的位数称为波特率 设发送一位所需时间为T,则波特率为1/T
方式0:波特率 =
f
O
S
C
/
12
f_{OSC}/12
f O S C / 1 2 方式1:波特率 =
2
S
M
O
D
32
×
定
时
器
T
1
溢
出
率
\cfrac{2^{SMOD}}{32}\times 定时器T1溢出率
3 2 2 S M O D × 定 时 器 T 1 溢 出 率 方式2:波特率 =
f
O
S
C
×
2
S
M
O
D
64
f_{OSC}\times \frac{2^{SMOD}}{64}
f O S C × 6 4 2 S M O D 方式3:波特率 =
2
S
M
O
D
32
×
定
时
器
T
1
溢
出
率
\frac{2^{SMOD}}{32}\times 定时器T1溢出率
3 2 2 S M O D × 定 时 器 T 1 溢 出 率 定时器T1产生波特率的计算
通常定时器T1在作为波特率发生器时,采用工作方式2(自动装初值),即TL1为8位计数器,TH1存放重装初值,溢出率计算公式:定时器T1的溢出率 =
f
o
s
c
/
12
256
−
T
H
1
\cfrac{f_{osc}/12}{256-TH1}
2 5 6 − T H 1 f o s c / 1 2 因此串行方式1、3的波特率 =
2
S
M
O
D
32
×
f
o
s
c
12
×
(
256
−
T
H
1
)
\cfrac{2^{SMOD}}{32}\times \cfrac{f_{osc}}{12\times (256-TH1)}
3 2 2 S M O D × 1 2 × ( 2 5 6 − T H 1 ) f o s c