第四章 MCS-51的片内接口内容提要,
§ 4-1 MCS-51中断系统
§ 4-2 定时 / 计数器
§ 4-3 MCS-51片内串行接口
§ 4-1 MCS-51中断系统一、概述与上对比,单片机中也有同样的问题。 CPU正在执行原程序,突然,被意外事情打断,转去执行新程序。 CPU执行新程序结束后,又回到原程序中继续执行。这样的过程就叫 。中断什么叫中断?
举例:某同学正在教室写作业,忽然被人叫出去,回来后,继续写作业 。 这就是生活中中断的例子 。
对突发事故,做出紧急处理。
根据现场随时变化的各种参数、信息,做出实时监控。
CPU与外部设备并行工作,以中断方式相联系,提高工作效率。
解决快速 CPU与慢速外设之间的矛盾。
在多项外部设备同时提出中断请求情况下,CPU能根据轻重缓急响应外设的中断请求。
中断的作用:
对于 MCS-51单片机中断系统的组成可以用一句话来讲,
叫做:,五源中断,两级管理,
五个中断源,入口地址外部中断 0( /INT0) 0003H
T0溢出中断 000BH
外部中断 1( /INT1) 0013H
T1溢出中断 001BH
串口中断 0023H
二、中断请求源(“五源中断”)
中断源的中断请求,如 何 通 知
CPU?
利用中断请求标志位来通知!!!
以上 6个中断请求标志位分别分布在 TCON,SCON两个寄存器中。
TCON IT0IE0IT1IE1TR0TF0TR1TF1
TF1—— T1的溢出中断标志硬件置 1,硬件清 0(也可软件清 0)
TF0 —— T0的溢出中断标志 。 ( 同 TF1,只是针对 T0的 )
IE1 —— 外部中断 1( /INT1) 请求标志 。
外部有中断请求时,硬件使 IE1置 1,硬件清 0。
IE0 —— 外部中断 0( /INT0) 请求标志。
IT1 —— 外部中断 1( /INT1) 触发类型控制位 。
IT1 = 0,低电平触发。 IT1 = 1,下降沿触发。
IT0 —— 外中断 0( /INT0) 触发类型控制位,用法同 IT1。
SCON RITIRB8TB8RENSM2SM1SM0
TI —— 串口发送中断标志位 。
发送完数据,硬件使 TI置 1,软件清 0( CLR TI)
RI —— 串行口接收中断标志位 。
硬件置 1,软件清 0。
在中断源与 CPU之间有二级中断允许控制逻辑电路,类似开关,其中第一级为一个总开关,第二级为五个分开关,由 IE控制。
三、中断控制(两级管理)
1、中断屏蔽(第一级管理)
IE EX0ET0EX1ET1ES—



EA
EA —— 总控制位
,—” —— 未定义位
ES —— 串口控制位
ET1—— T1中断控制位
EX1—— /INT1控制位
ET0—— T0中断控制位
EX0—— /INT0控制位若为,1”,开关接通,允许例如 SETB EA
若为,0”,开关断开,不允许例如 CLR IE.7
2、中断优先级(第二级管理)
为什么要有中断优先级?
CPU同一时间只能响应一个中断请求 。 若同时来了两个或两个以上中断请求,就必须有先有后 。 !!!
为此将 5个中断源分成高级、低级两个级别,高级优先,由 IP控制。
IP PX0PT0PX1PT1PS——————
P S ——串口的中断优先级别
PT1 ——定时 / 计数器 T1的中断优先级别
PX1 ——外部中断 1 的中断优先级别
PT0 ——定时 / 计数器 T0的中断优先级别
PX0 ——外部中断 0 的中断优先级别该位是,1”时,为高级优先级该位是,0”时,为低级优先级同一级中的 5个中断源的优先顺序是,
/INT0中断
T0溢出中断
/INT1中断
T1溢出中断串口中断高低出厂前已由厂家固化顺序
——事先约定中断优先原则,( 概括为四句话 )
1,低级不打断高级
2,高级不睬低级
3,同级不能打断
4、同级、同时中断,事先约定 。
事件 1 事件 2子程序 2子程序 1
中断 嵌套 的概念:
主程序中断中断四,MCS-51中断的响应过程
CPU每个机器周期都需要顺序检查每个中断源,当检测到有中断请求时,能否响应,还要看下述情况是否存在:
( 1) CPU正处理相同级别或更高级别的中断;
( 2) 正在执行指令,还未到最后一个机器周期;
( 3)正在执行的指令是 RETI或访问 IP,IE指令,则执行完上述指令后,再执行一条指令后,才会响应新中断。
日常生活中 的中断与 单片机 中断的比较:
某同学 单片机 过程说明正在看书 执行主程序有人找出去 中断信号 中断请求暂停看书 暂停执行主程序 中断响应书中作记号 当前 PC入栈 保护断点出去做事 执行中断程序 中断服务回来继续看 返回主程序 中断返回响应过程,( 假设已使某中断请求标志置 1)
( 1) 先使相应优先级状态触发器置 1;
( 2) 执行一个硬件子程序的调用,
1) 硬件清零相应中断请求标志 ( TI,RI除外 )
2) 将当前 PC内容压入堆栈 ——保护断点;
3)将中断服务子程序入口地址送 PC——转移。
返回过程,( RETI执行后 )
( 1) 使相应优先级状态触发器清 0。
( 2) 从堆栈中弹出栈顶的两个字节内容送 PC——恢复断点 。
( 3) CPU接着中断处继续执行原程序。
注意,1) 保护断点与保护现场以及恢复断点与恢复现场的区别 。
2) 外部中断响应时间在 3 ~ 8个机器周期之间 。
利用外部中断实现单步操作,
8031
0INT
+5v
在主程序中,
CLR IT0
SETB EA
SETB PX0
SETB EX0
………
在中断服务子程序中,
JNB P3.2,$
JB P3.2,$
RETI
小结:
1,MCS-51单片机中断系统有几个中断源? 分别是什么?
事先约定的优先顺序是怎样的?
2,如何进行中断允许控制? 如何进行中断优先级控制?
3、中断优先的规则是什么?
§ 4-2 定时 / 计数器一、定时 / 计数器的结构
51子系列单片机内有 两个 十六位 增一 定时 / 计数器
TH0 计数值高八位
TL0 计数值低八位
TH1 计数值高八位
TL1 计数值低八位
TMOD
TCON
工作方式定时 / 计数控制控制控制
1、工作方式控制寄存器 TMOD
TMOD M0M1C / GATEM0M1C / GATE T T
T1 T0
GATE —— 门控位 。
GATE = 0 启动不受 /INT0或 /INT1的控制;
GATE = 1 启动受 /INT0 或 /INT1 的控制。
C//T —— 外部计数器 / 定时器方式选择位
C//T = 0 定时方式;
C //T = 1 计数方式 。
M1M2 ——工作模式选择位(编程可决定四种工作模式) 。
2、定时 / 计数器控制寄存器 TCON
TCON TF1 TR
1
TF0 TR
0
IE1 IT1 IE0 IT0
TR0 —— 定时 / 计数器 0运行控制位 。
软件置位,软件复位。
能否启动定时 / 计数器工作与 GATE有关,分两种情况:
GATE = 0 时,若 TRi = 1,开启 Ti计数工作; (i = 0或 1)
若 TRi = 0,停止 Ti计数 。
GATE = 1 时,若 TRi = 1 且 /INTi = 1时开启 Ti计数;
若 TRi = 1 且 /INTi = 0时不能开启 Ti计数 。
若 TRi = 0,停止 Ti计数。
TR1 —— 定时 / 计数器 1运行控制位 。 ( 用法与 TR1类似 )
二、定时 / 计数器的四种工作模式
M1 M0 模式 说明
0 0 0 13位定时 /计数器高八位 TH( 7 ~ 0) + 低五位 TL( 4 ~ 0)
0 1 1 16位定时 /计数器
TH( 7 ~ 0) + TL( 7 ~ 0)
1 0 2 8位计数初值自动重装
TL( 7 ~ 0) TH( 7 ~ 0)
1 1 3 T0运行,而 T1停止工作,8位定时 /计数。
1,模式 0
计数寄存器 TLi低 5位 + THi8位
( T1,T0的等效逻辑结构 )
C//T = 0 ——定时; C//T = 1 —— 对外计数 。
定时,fosc / 12 = 1 /( 12/fosc) = 1 / T
波形等间隔,次数已定,时间确定即对机器周期进行计数。
左图定时时间为 N*T
T
N个方波计数:脉冲不等间隔。
每个下降沿计数一次确认一次负跳变需两个机器周期,
所以,计数频率最高为 fosc / 24。
2,模式 1
与模式 0相似 。
与模式 0的区别:计数位数不同 。
计数 寄 存 器,THi( 高 8位) + TLi( 低 8位)
(逻辑图)
3,模式 2
与模式 0,1的区别,1) 计数位数不同;
2)初值自动重装。
(逻辑图)
4,模式 3
T0定时 /计数,而 T1停止计数,但可作波特率发生器 。 T0分成两独立定时 /计数器 TL0和 TH0。
TL0使用 C//T,GATE,TR0,/INT0,TF0定时 /计数,
TH0使用 TR1,TF1 因此,只能用于定时
( 逻辑图 )
模式 3时,T1可定时为模式 0,1,2的定时 /计数,但不可中断,所以一般只作串口波特率发生器用。
(逻辑图)
编程前确定参数:
( 1) 定时 /计数器 —— T0,T1选择其一,
( 2) 工 作 方 式 —— C//T及 GATA,
( 3) 计 数 初 值 —— 加 1计数,16位。
00
10
10
4
6
MN
X
计数,X=M- N; M=213=8192( 模式 0)
M=216=65536( 模式 1 )
M=28=256 ( 模式 2、
模式 3)
定时,X=M–N =M – t/T( t为所要求的定时时间,T为机器周期)
( 4)工 作 模 式 —— M1,M0
四,定时 /计数器的应用编制初始化程序:
1)写 TMOD;
2) 确定 IE,IP;
3) 写计数初值;
4)启动计数( TRi)
例 1,设计一个能产生 t=1ms的周期信号发生器,试编程 。
解:选 T0; C//T=0,GATE= 0
N = t / T = t /[12× ( 1/fosc) ]= 500
所以,X = M - 500,
模式 0,模式 1均可,取模式 0,M=213=8192
X = 8192- 500 = 7692 = 1E0CH
= 0001 1110 000 0 1100B,1E0CH
0 1 1 0 0
TL0
1 1 1 1 0 0 0 0
TH0
F0H 0C
H
先将低五位放入 TL0中,再将剩余的数从右向左数出八位放入 TH0中。
LJMP MAIN
ORG 000BH
LJMP INSE1
ORG 1000H
MAIN,MOV SP,#60H
MOV TL0,#0CH
MOV TH0,#0F0H
MOV TMOD,#00H
SETB TR0
SETB ET0
SETB EA
SJMP $
………
ORG 0000H
INSE1,MOV TL0,#0CH
MOV TH0,#0F0H
CPL P10
RETI
小结,1,MCS-51单片机内有几个定时计数器?
如何计数?
2,T0,T1有几种工作方式?
3、编程应用前要事先确定的参数有几个?
布置作业,P141 9
§ 4-3 定时 / 计数器的应用
TMOD M0M1C / GATEM0M1 C/ GATE T T
TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
复习,
例 2、设 fosc = 6MHz,利用单片机内定时 /计数器及 P10口线输出
1000个脉冲,脉冲周期为 2mas,试编程。
8031
P1.0
T1 2ms
T = 12× 1/fosc = 2us
选取 T0定时; T1计数。
设 T0采用中断方式产生周期为 2ms方波,T1对该方波计数,当输出至第 1000个脉冲时,使 TF1置 1。 在主程序中用查询方法,检测到 TF1变 1时,关掉 T0,停止输出方波 。
T0,T1参数的确定:
T0模式 0,定时:脉宽为脉冲周期的一半所以,X = 213- 1ms / 2us = 0001 1110 0000 1100B
TH0 = 0F0H ; TL0 = 0CH
T1模式 1,计数,N = 1000
则 X = 65536- 1000 = 64536 = 0FC18H
( 若选模式 0也可以,此时 X = 7192=1C18H)
程序:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TOS
ORG 1000H
MAIN,MOV TMOD,#50H; T0定时,模式 0; T1计数,模式 1
MOV TL0,#0CH
MOV TH0,#0F0H
MOV TL1,#18H
MOV TH1,#0FCH
SETB TR1
SETB TR0
SETB ET0
SETB EA
WAIT,JNB TF1,WAIT; 查询 1000个脉冲计够没有到?
CLR EA
CLR ET0
ANL TCON,#0FH; 停 T0,T1
SJMP $
TOS,MOV TL0,#0CH
MOV TH0,#0F0H
CPL P10
RETI
END
0INT
1INT
P3.2
P3.1
例 3,脉冲参数测量 ——GATE功能的使用 。
脉冲高电平 ( 计数 ) 长度值存于 21H,20H中,
脉冲低电平长度存于 23H,22H中 。
电路连接如下图所示 。
解,复习 GATE的用法:
GATE = 0时,TRi = 1,即可启动 Ti定时 / 计数
GATE = 1时,TRi = 1,且 =1,才启动定时 / 计数。
被测信号
1
8031
21a 3
INTi
T0计数 T1计数
ORG 0000H
LJMP MAIN
ORG 2000H
MAIN,MOV TMOD,#99H ; T0,T1均工作在定时,;模式 1,GATE=1
MOV A,#00H ; T0,T1赋计数初值 00H,; 定时最长时间为 0000 ~ 65536
MOV TL0,A
MOV TH0,A
MOV TL1,A
MOV TH1,A
TEST0,JB P32,TEST0 ; 检测是否到 a点
SETB TR0 ; 到 a点,TR0 = 1,做好取计时值准备 。
TEST1,JNB P32,TEST1; 检测是否到 1点
SETB TR1 ; 到 1点 T0计时; TR1 = 1,做好 T1计时准备 。
TEST2,JB P32,TEST2 ; 检测是否到 2点
CLR TR0 ; 到 2点,停止 T0计时,T1开始计时 。
MOV 20H,TH0 ; 保存 T0计时结果
MOV 21H,TL0
TEST3,JB P33,TEST3 ; 检测是否到 3点
CLR TR1 ; 到 3点,停止 T1计数
MOV 22H,TH1 ; 保存 T1计数结果
MOV 23H,TL1
LCALL DISP
SJMP $
小结,1,定时 /计数的四种方式是怎样的?
2,如何计算计数初值? 如何编程送入计数初值?
3,GATE的用法是怎样的?
布置作业,P141 10,11
§ 4-4 MCS-51单片机串行接口一,串行通信概述
1、什么叫串行通信?
在生活中同学们排横队行走 ——并行;排纵队行走 ——串行。
计算机中在传输信息、数据时也有并行、串行的问题。
P1.0
P1.1
P1.2
P1.3
RXD
TXD
单片机外设 1
外设 2
1
0
0
1
0
0
1
1
1
1
1 0 1 0
1 0 0 0
接收设备发送设备
2,同步通信,异步通信同步 ——发送设备时钟与接收设备时钟严格一致。
校验字符 2 校验字符 1 数据 n ……

数据 2 数据 1 同步字符 2 同步字符 1
异步 ——发送时钟与接收时钟不一定相等。
空闲位 停止位 奇偶校验位 5~8位数据 起始位 空闲位
3、串行通信的方向单工 A

B
发半双工
A
发收
B
收发例如:广播电台 收音机例如,对讲机全双工
A
发收
B
收发例如,电话机
4,波特率即串行通信速率 。 b/s,bps
在异步通信中,单位时间内所传送的有效二进制位数 ——波特率 。
举例,设有一帧信息,1个起始位,8个数据位,1个停止位,传输速率为每秒 240个字符 。 求波特率 。
解,( 1+ 8+ 1) × 240 = 2400 b/s = 2400波特 。
5、串行通信接口发送,CPU
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
发送寄存器 SBUF
01 D0D1D2D3D4D5D6D7
发送时钟,
接收,
D0D1D2D3D4D5D6D71 0
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
CPU
接收时钟接收数据寄存器 SBUF
二,MCS-51机串行接口单片机内有通用异步接收 /发送器 UART。
全双工,4种工作方式,波特率可编程设置,可中断。
1,串口的组成从编程角度讲来看主要由以下寄存器组成。
SBUF——串行发送 / 接收数据缓冲器是两个物理单元,共用一个地址( 99H)
SMOD
PCON——电源管理寄存器
SMOD位用于决定波特率的倍数。 0 20 = 1倍
1 21 = 2倍
SCON——串行口控制寄存器
SM0 SM1 SM2 REN TB8 RB8 TI RI
TI / RI,中断请求标志位(前面已讲过)
RB8,接收的第九位数
TB8,发送的第九位数
REN,允许接收控制位
SM2,多机通信控制位(常与 RB8配合,决定是否激活 RI)
SM0,SM1,工作方式选择位(四种工作方式)
2,串行口的工作方式
( 1)方式 0:同步移位寄存器方式波特率固定为 fosc / 12
RXD —— 接收发送数据
TXD —— 产生同步移位脉冲接收 /发送完,置位 RI / TI,( 要求 SM2 = 0)
D7 D6 D5 D4
D3
D2 D1 D0
D0 D1 D2 D3 D4 D5 D6 D7
发送接收无起始位,无停止位 。可用于并口的扩展。
( 2)方式 1,8位 UART
波特率为( 2SMOD× T1的溢出率) / 32,可变。
一帧信息 10位。
D0D1D2D3D4D5D6D7停止位 起始位 发送
D7D6D5D4D3D2D1D0起始位 停止位 接收送 RB8
发送完置位 TI。
当接收到数据后,置位 RI是有条件的 。 即:
REN = 1,RI = 0 且 SM2 = 0或 SM2 = 1但是接收到的停止位为 1。
此时,数据装载 SBUF,RI置 1,停止位进入 RB8。
( 3)方式 2、方式 3,9位 UART
一般 用于多机通信。一帧信息 11位 。
D0D1D2D3D4D5D6D7TB
8
停止位 起始位 发送发送完数据置位 TI。
TB
8
D7D6D5D4D3D2D1D0起始位 停止位 接收接收到有效数据完毕,置位 RI的条件,
REN = 1,RI = 0 且 SM2 = 0或接收到第 9位数据为 1,
此时,数据装载 SBUF,RI置 1,第 9位数据( TB8) RB8。
送 RB8
方式 2波特率,( 固定 ) 2SMOD / 64 × fosc
3,波特率的设置方式 0,方式 2固定 。
方式 1,方式 3可变 。 波特率 = 2SMOD / 32 × ( T1的溢出率 )
T1溢出率 = 单位时间内溢出次数 = 1 /( T1的定时时间 )
而 T1的定时时间 t就是 T1溢出一次所用的时间 。 此情况下,一般设
T1工作在模式 2( 8位自动重装初值 ) 。
N = 28- t / T,t = ( 28- N) T =( 28- N) × 12 / fosc
所以,T1溢出率 = 1/t = fosc / 12( 28- N),
故,波特率 = 2SMOD / 32 × fosc / 12( 256- N) 。
若已知波特率,则可求出 T1的计数初值:
y = 256- 2SMOD× fosc / ( 波特率× 32× 12)
巩固新课:
例、若 fosc = 6MHz,波特率为 2400波特,设 SMOD = 1,则定时 /计数器 T1的计数初值为多少?并进行初始化编程。
解,X= 256- 2SMOD× fosc / ( 2400× 32× 12) = 242.98≈ 243 = F3H
fosc = 11.0592MHz,波特率为 2400,设 SMOD = 0,则 X = F4H 。
初始化编程,MOV TMOD,#20H
MOV PCON,#80H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
MOV SCON,#50H
小结:
1,什么叫串行通信?
2,UART叫什么? ( 通用异步接收 /发送器 )
3,单工,半双工,全双工?
4,串口工作用到哪些寄存器? ( PCON,SCON,SBUF)
5,串口有几种工作方式?
6、波特率如何设置?( T1的计数初值如何确定)
布置作业,P141 7,9,10