1
第 5章 80C51的中断系统及定时 /计数器
5.1 80C51的中断系统
5.2 80C51的中断处理过程
5.3 80C51的定时 /计数器
2
5.1 80C51的中断系统
5.1.1 80C51的中断系统结构
一、中断的概念
计算机具有实时处理能力,能对外界发生的事件进
行及时处理,这是依靠它们的中断系统来实现的。
CPU在处理某一事件 A时,发生了另一事件 B请求 CPU
迅速去处理( 中断发生 ); CPU暂时中断当前的工作,
转去处理事件 B( 中断响应和中断服务 );待 CPU将事
件 B处理完毕后,再回到原来事件 A被中断的地方继续
处理事件 A( 中断返回 ),这一过程称为 中断 。
3
引起 CPU中断的根源,称为中断源。中断源向 CPU提
出的中断请求。 CPU暂时中断原来的事务 A,转去处理事
件 B。对事件 B处理完毕后,再回到原来被中断的地方(即
断点),称为中断返回。实现上述中断功能的部件称为中
断系统(中断机构)。
主 程 序 A
响 应
返 回
断 点
R E T I
…
…
中 断 服 务 程 序 B
4
随着计算机技术的应用,人们发现中断技
术不仅解决了快速主机与慢速 I/O设备的数据
传送问题,而且还具有如下优点:
?分时操作 。 CPU可以分时为多个 I/O设备服
务,提高了计算机的利用率;
?实时响应 。 CPU能够及时处理应用系统的
随机事件,系统的实时性大大增强;
?可靠性高 。 CPU具有处理设备故障及掉电
等突发性事件的能力,从而使系统可靠性提
高。
5
二,80C51中断系统的结构
80C51的中断系统有 5个中断源,2个优先
级,可实现二级中断嵌套 。
E X 0
E A P X 0
0
1
E T 0
P T 0
0
1
E X 1
P X 1
0
1
E T 1
P T 1
0
1
E S
P S
0
1
≥ 1
R I
T I
S C O N
T C O N
I E 0
T F 0
I E 1
T F 1
1
0
1
0
1
I T 0
I T 1
I N T 0
I N T 1
T 0
T 1
R X
T X
I E
I P
1
1
1
1
1
1
1
1
0
硬 件 查 询
自
然
优
先
级
自
然
优
先
级
中 断 入 口
中 断 入 口
高
级
低
级
中 断 源
中 断 源
6
5.1.2 80C51的中断源
一、中断源
1,( P3.2)。可由 IT0(TCON.0)选择其为低电平有效
还是下降沿有效。当 CPU检测到 P3.2引脚上出现有效的中
断信号时,中断标志 IE0(TCON.1)置 1,向 CPU申请中断。
2,( P3.3)。可由 IT1(TCON.2)选择其为低电平有效
还是下降沿有效。当 CPU检测到 P3.3引脚上出现有效的中
断信号时,中断标志 IE1(TCON.3)置 1,向 CPU申请中断。
3,TF0( TCON.5),片内定时 /计数器 T0溢出中断请求标
志。当定时 /计数器 T0发生溢出时,置位 TF0,并向 CPU申
请中断。
4,TF1( TCON.7),片内定时 /计数器 T1溢出中断请求标
志。当定时 /计数器 T1发生溢出时,置位 TF1,并向 CPU申
请中断。
5,RI( SCON.0)或 TI( SCON.1),串行口中断请求标志。
当串行口接收完一帧串行数据时置位 RI或当串行口发送完
一帧串行数据时置位 TI,向 CPU申请中断。
INT0
INT1
7
二, 中断请求标志
1,TCON的中断标志
IT0( TCON.0),外部中断 0触发方式控制位。
当 IT0=0时,为电平触发方式。
当 IT0=1时,为边沿触发方式(下降沿有效)。
IE0( TCON.1),外部中断 0中断请求标志位。
IT1( TCON.2),外部中断 1触发方式控制位。
IE1( TCON.3),外部中断 1中断请求标志位。
TF0( TCON.5),定时 /计数器 T0溢出中断请求标志位。
TF1( TCON.7),定时 /计数器 T1溢出中断请求标志位。
8
2,SCON的中断标志
?RI( SCON.0),串行口接收中断标志位。当允
许串行口接收数据时,每接收完一个串行帧,由
硬件置位 RI。同样,RI必须由软件清除。
?TI( SCON.1),串行口发送中断标志位。当
CPU将一个发送数据写入串行口发送缓冲器时,
就启动了发送过程。每发送完一个串行帧,由硬
件置位 TI。 CPU响应中断时,不能自动清除 TI,
TI必须由软件清除。
9
一、中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是
由中断允许寄存器 IE控制的。
5.1.3 80C51中断的控制
?EX0(IE.0),外部中断 0允许位;
?ET0(IE.1),定时 /计数器 T0中断允许位;
?EX1(IE.2),外部中断 0允许位;
?ET1(IE.3),定时 /计数器 T1中断允许位;
?ES( IE.4),串行口中断允许位;
?EA (IE.7),CPU中断允许(总允许)位。
10
二、中断优先级控制
80C51单片机有两个中断优先级,即可实现二级中断服务
嵌套。每个中断源的中断优先级都是由中断优先级寄存器 IP中
的相应位的状态来规定的 。
?PX0( IP.0),外部中断 0优先级设定位;
?PT0( IP.1),定时 /计数器 T0优先级设定位;
?PX1( IP.2),外部中断 0优先级设定位;
?PT1( IP.3),定时 /计数器 T1优先级设定位;
?PS ( IP.4),串行口优先级设定位。
11
同一优先级中的中断申请不止一个时,则有中
断优先权排队问题。同一优先级的中断优先权排队,
由中断系统硬件确定的自然优先级形成,其排列如
所示:
12
80C51单片机的中断优先级有三条原则:
?CPU同时接收到几个中断时,首先响应优先级别最高
的中断请求。
?正在进行的中断过程不能被新的同级或低优先级的中
断请求所中断。
?正在进行的低优先级中断服务,能被高优先级中断请
求所中断。
为了实现上述后两条原则,中断系统内部设有两个
用户不能寻址的优先级状态触发器 。其中一个置 1,表
示正在响应高优先级的中断,它将阻断后来所有的中
断请求;另一个置 1,表示正在响应低优先级中断,它
将阻断后来所有的低优先级中断请求。
13
5.2 80C51单片机中断处理过程
一、中断响应条件
CPU响应中断的条件是:
? 中断源有中断请求;
? 此中断源的中断允许位为 1;
? CPU开中断(即 EA=1)。
同时满足时,CPU才有可能响应中断 。
5.2.1 中断响应条件和时间
14
CPU执行程序过程中,在每个机器周期
的 S5P2期间,中断系统对各个中断源进行
采样 。这些采样值在下一个机器周期内按
优先级和内部顺序被依次查询。
如果某个中断标志在上一个机器周期的
S5P2时被置成了 1,那么它将于现在的查
询周期中及时被发现。接着 CPU便执行一
条由中断系统提供的硬件 LCALL指令,转
向被称作中断向量的特定地址单元,进入
相应的中断服务程序。
15
遇以下任一条件,硬件将受阻,不产生 LCALL指令:
?CPU正在处理同级或高 优先级中断;
?当前查询 的机器周期 不是所执行指令的最后一个机器
周期 。即在完成所执行指令前,不会响应中断,从而保
证指令在执行过程中不被打断;
?正在执行 的指令为 RET,RETI或任何访问 IE或 IP寄存
器的指令。即只有在这些指令后面至少再执行一条指令
时才能接受中断请求。
若由于上述条件的阻碍中断未能得到响应,当条件
消失时该中断标志却已不再有效,那么该中断将不被响
应。就是说,中断标志曾经有效,但未获响应,查询过
程在下个机器周期将重新进行 。
16
二、中断响应时间
某中断的响应时序如图:
S1
保 护 断 点, 长 调 用 至 入 口 中 断 服 务
S2
S3 S4 S5 S6 S1 S2
S3 S4 S5 S6 S1 S2
S3 S4 S5
S6 S1
S2
S3 S4 S5 S6
S1
S2
S3
S4 S5 S6
标 志 查 询
标 志
锁 存
ε
中 断
有 效
M1 M2 M3 M4 M5
?若 M1周期的 S5P2前某中断生效,在 S5P2期间其中
断请求被锁存到相应的标志位中去; M2恰逢指令的
最后一个机器周期,且该指令不是 RETI或访问 IE、
IP的指令。于是,M3和 M4便可以执行硬件 LCALL
指令,M5周期将进入了中断服务程序。
?80C51的中断响应时间(从标志置 1到进入相应的中
断服务),至少要 3个完整的机器周期。
17
?将相应的优先级状态触发器置 1(以阻断
后来的同级或低级的中断请求)。
?执行一条硬件 LCALL指令,即把程序计
数器 PC的内容压入堆栈保存,再将相应的
中断服务程序的入口地址送入 PC。
?执行中断服务程序。
中断响应过程的前两步是由中断系统内部
自动完成的,而中断服务程序则要由用户
编写程序来完成。
5.2.2 中断响应过程
18
5.2.3 中断返回
RETI指令的具体功能是:
?将中断响应时压入堆栈保存的断点地址从栈
顶弹出送回 PC,CPU从原来中断的地方继续
执行程序;
? 将相应中断优先级状态触发器清 0,通知中
断系统,中断服务程序已执行完毕。
注意,不能用 RET指令代替 RETI指令。在中
断服务程序中 PUSH指令与 POP指令必须成对
使用,否则不能正确返回断点 。
19
若外部中断定义为电平触发方式,中断标志位
的状态随 CPU在每个机器周期采样到的外部中断
输入引脚的电平变化而变化,这样能提高 CPU对
外部中断请求的响应速度。但外部中断源若有请求,
必须把有效的 低电平保持到请求获得响应时为止,
不然就会漏掉; 而在中断服务程序结束之前,中断
源又必须撤消其有效的低电平,否则中断返回之后
将再次产生中断。
电平触发方式适合于外部中断输入以低电平输入且
中断服务程序能清除外部中断请求源的情况。例如,
并行接口芯片 8255的中断请求线在接受读或写操
作后即被复位,因此,以其去请求电平触发方式的
中断比较方便。
20
若外部中断定义为边沿触发方式,在相继连续的两
次采样中,一个周期采样到外部中断输入为高电平,
下一个周期采样到为低电平,则在 IE0或 IE1中将锁存
一个逻辑 1。即便是 CPU暂时不能响应,中断申请标
志也不会丢失,直到 CPU响应此中断时才清零。这
样,为保证下降沿能被可靠地采样到,外中断引脚上
的高低电平(负脉冲的宽度)均至少要保持一个机器
周期 (若晶振为 12MHz时,为 1微秒)。
边沿触发方式适合于以负脉冲形式输入的外部中断
请求,如 ADC0809的转换结束标志信号 EOC为正脉
冲,经反相后就可以作为 80C51的中断输入。
21
5.2.4 中断程序举例
22
ORG 0000H
START,LJMP MAIN ;跳转到主程序
ORG 0003H
LJMP INTO ;转向中断服务程序
ORG 0030H ;主程序
MAIN,CLR IT0 ;设为电平触发方式
SETB EA ; CPU开放中断
SETB EX0 ;允许中断
MOV DPTR,#1000H ;设置数据区地址指针
… …
ORG 0200H ;中断服务程序
INT0,PUSH PSW ;保护现场
PUSH ACC
CLR P3.0 ;由 P3.0输出 0
NOP
NOP
SETB P3.0 ;由 P3.0输出 1,撤除
MOV A,P1 ;输入数据
MOVX @DPTR,A ;存入数据存储器
INC DPTR ;修改数据指针,指向下一个单元
… …
POP ACC ;恢复现场
POP PSW
RETI ;中断返回
23
例 多外部中断源的系统示例。
设有 5个外部中断源,中断优先级排队顺序为:
XI0,XI1,XI2,XI3,XI4。试设计它们与 80C51单
片机的接口。
24
ORG 0003H
LJMP INSE0 ;转外部中断 0服务程序入口
ORG 0013H
LJMP INSE1 ;转外部中断 1服务程序入口
… …
… …
INSE0,PUSH PSW ; XI0中断服务程序
PUSH ACC
… …
… …
POP ACC
POP PSW
RETI
25
INSE1,PUSH PSW ;中断服务程序
PUSH ACC
JB P1.0,DV1 ; P1.0为 1,转 XI1中断服务程序
JB P1.1,DV2 ; P1.1为 1,转 XI2中断服务程序
JB P1.2,DV3 ; P1.2为 1,转 XI3中断服务程序
JB P1.3,DV4 ; P1.3为 1,转 XI4中断服务程序
INRET,POP ACC
POP PSW
RETI
DV1,… … ; XI1中断服务程序
AJMP INRET
DV2,… … ; XI2中断服务程序
AJMP INRET
DV3,… … ; XI3中断服务程序
AJMP INRET
DV4,… … ; XI4中断服务程序
AJMP INRET
26
5.3 80C51的定时 /计数器
实现定时功能,比较方便的办法是利用单片
机内部的定时 /计数器 。也可以采用下面三种
方法:
?软件定时,软件定时不占用硬件资源,但占用了
CPU时间,降低了 CPU的利用率。
?采用时基电路定时,例如采用 555电路,外接必要
的元器件(电阻和电容),即可构成硬件定时电路。
但在硬件连接好以后,定时值与定时范围不能由软
件进行控制和修改,即不可编程。
?采用可编程芯片定时,这种定时芯片的定时值及
定时范围很容易用软件来确定和修改,此种芯片定
时功能强,使用灵活。在单片机的定时 /计数器不够
用时,可以考虑进行扩展。
27
2个 16位 定时器 /计数器
—— (52系列有 3个 16位 Timer)
定时器,对片内机器时钟 (周期方波 )进行计数
计数器,对 Tx引脚 输入的负脉冲进行计数
与 Timer工作有关的特殊功能寄存器:
TCON 和 TMOD
可通过软件设置有关参数
概述:
28
5.3.1 定时 /计数器的结构和工作原理
一、定时 /计数器的结构
定时 /计数器的实质是加 1计数器( 16位),由高 8位和低 8
位两个寄存器组成。 TMOD是定时 /计数器的工作方式寄存
器,确定工作方式和功能; TCON是控制寄存器,控制 T0、
T1的启动和停止及设置溢出标志 。
G
A
T
E
C
/
T
M
1
M
0
G
A
T
E
C
/
T
M
1
M
0
T H 1 T L 1 T H 0 T L 0
T 1 方 式
T 0 方 式
T 1 引 脚
T 0 引 脚
机 器 周
期 脉 冲
内 部 总 线
T M O D
T C O N
外 部 中 断 相 关 位
T
F
1
T
R
1
T
F
0
T
R
0
29
二、定时 /计数器的工作原理
加 1计数器输入的计数脉冲有两个来源,一个是由
系统的时钟振荡器输出脉冲经 12分频后送来;一个
是 T0或 T1引脚输入的外部脉冲源。每来一个脉冲
计数器加 1,当加到计数器为全 1时,再输入一个脉
冲就使计数器回零,且计数器的溢出使 TCON中
TF0或 TF1置 1,向 CPU发出中断请求(定时 /计数
器中断允许时)。如果定时 /计数器工作于定时模
式,则表示定时时间已到;如果工作于计数模式,
则表示计数值已满。
可见,由溢出时计数器的值减去计数初值才是加
1计数器的计数值 。
30
?设置为定时器模式时,加 1计数器是对内部机器周期
计数( 1个机器周期等于 12个振荡周期,即计数频率
为晶振频率的 1/12)。 计数值 N乘以机器周期 Tcy就
是定时时间 t 。
?设置为 计数器模式时,外部事件计数脉冲由 T0或 T1
引脚输入到计数器。在每个机器周期的 S5P2期间采
样 T0,T1引脚电平。当某周期采样到一高电平输入,
而下一周期又采样到一低电平时,则计数器加 1,更
新的计数值在下一个机器周期的 S3P1期间装入计数
器。由于检测一个从 1到 0的下降沿需要 2个机器周期,
因此要求被采样的电平至少要维持一个机器周期。当
晶振频率为 12MHz时,最高计数频率不超过 1/2MHz,
即计数脉冲的周期要大于 2 微秒 。
31
5.3.2 定时 /计数器的控制
80C51单片机定时 /计数器的工作由两个特殊功
能寄存器控制。 TMOD用于设置其工作方式;
TCON用于控制其启动和中断申请。
一、工作方式寄存器 TMOD
工作方式寄存器 TMOD用于设置定时 /计数器的
工作方式,低四位用于 T0,高四位用于 T1。其格式
如下:
32
GATE:门控位。 GATE= 0时,只要用软件使 TCON中的
TR0或 TR1为 1,就可以启动定时 /计数器工作; GATA= 1时,
要用软件使 TR0或 TR1为 1,同时外部中断引脚或也为高电
平时,才能启动定时 /计数器工作。即此时定时器的启动条
件,加上了或引脚为高电平这一条件。
:定时 /计数模式选择位。 = 0为定时模式; =1
为计数模式。
M1M0:工作方式设置位。定时 /计数器有四种工作方式,
由 M1M0进行设置。
C/T C/TC/T
33
二、控制寄存器 TCON
TCON的低 4位用于控制外部中断,已在前面介绍。 TCON的高 4位用于
控制定时 /计数器的启动和中断申请。其格式如下:
?TF1( TCON.7),T1溢出中断请求标志位。 T1计数溢出时由硬件自
动置 TF1为 1。 CPU响应中断后 TF1由硬件自动清 0。 T1工作时,CPU
可随时查询 TF1的状态。所以,TF1可用作查询测试的标志。 TF1也可
以用软件置 1或清 0,同硬件置 1或清 0的效果一样。
?TR1( TCON.6),T1运行控制位。 TR1置 1时,T1开始工作; TR1置
0时,T1停止工作。 TR1由软件置 1或清 0。所以,用软件可控制定时 /
计数器的启动与停止。
?TF0( TCON.5),T0溢出中断请求标志位,其功能与 TF1类同。
?TR0( TCON.4),T0运行控制位,其功能与 TR1类同。
34
定时器 /计数器的初始化
在使用定时器 /计数器之前由软件设置其功能,即初始化。
1、初始化的步骤
( 1)确定工作模式(计数 /定时)、工作方式和启动控制方式,并
写入 TMOD寄存器
( 2)设置定时或计数初值:可直接写入 TH0,TL0或 TH1,TL1中。
16位计数初值必须分两次写入对应计数器
( 3)根据要求确定是否采用中断方式:直接对 IE位赋值。开中断时,
对应位置,1”;采用程序查询方式时,IE位应清 0以进行中断屏蔽
( 4)启动定时 /计数器:使用 SETB TRi指令启动
若第一步设置为软启动,即 GATE设置为 0时,执行指令后,定时 /计
数器开始工作。
若 GATE设置为 1时,还必须由外部中断引脚 和 共同控制,
只有外部引脚电平为高时,执行指令后,定时 /计数器开始工作。
0INT 1INT
35
2、计数初值的计算
最大计数值 M与定时 /计数器工作方式有关:
方式 0,M=213=8192
方式 1,M=216=65536
方式 2,M=28=256
方式 3,M=256,定时 /计数器分成两个独立的 8位计数器,所
以 TH0,TL0的 M均为 256
T0和 T1均为加 1计数器,当加到最大值( 00H或 0000H)时,
产生溢出,将 TCON寄存器的 TF位置 1,产生溢出中断。
计数器初值 X的计算公式:
( 1)计数工作模式时 X= M-计数值
( 2)定时工作模式时
X= M-计数值= M- t/T=M - (fosc x t)/12
fosc为晶振频率,t为要求定时的时间。
36
例,MCS- 51主频为 6MHz,要求产生 1ms的定时,试计算计
数初值 X。设定时器工作于方式 1。
X= 216-( 6× 106× 1× 10-3) /12=65536-500=65036=FE0CH
3、初始化举例
T0为计数方式,对外部脉冲计数 100次,硬启动,禁止中断,
选工作方式 2。 T1为定时工作方式,定时 25ms,选择工作方式
1,允许中断,软启动; fosc= 12MHz,编写初始化程序。
初值 X0= 256-100= 156= 9CH
初值 X1= 65536-( 12× 25× 1000) /12= 40536= 9E58H
方式控制字,00011110B 即 1EH
37
初始化程序:
MOV TMOD,#1EH ;写工作模式字
MOV TH0,#9CH ; T0计数初值,TH0值自动重新装入 TL0
MOV TL0,#9CH
MOV TH1,#9EH ;T1计数初值
MOV TL1,#58H
MOV IE,#10001000B ; T1开中断
SETB TR0 ;启动 T0,但要等到 为 1时真正启动
SETB TR1 ;启动 T1
0INT
38
5.3.3 定时 /计数器的工作方式
一、方式 0
方式 0为 13位计数,由 TL0的低 5位(高 3位未用)和 TH0
的 8位组成。 TL0的低 5位溢出时向 TH0进位,TH0溢出时,
置位 TCON中的 TF0标志,向 CPU发出中断请求。
T F 1
T R 1
T F 0
T R 0
G A T E
C / T
M 1
M 0
G A T E
C / T
M 1
M 0
1
&
≥ 1
1
0
T 0 引 脚
I N T 0 引 脚
0
0
机 器 周 期
T H 0 T L 0
8 位 5 位
溢 出
T C O N
T M O D
D 0
D 7
D 7
D 0
申 请
中 断
1
39
定时器模式时 有,N= t/ Tcy
计数初值计算的公式为:
定时器的初值还可以采用计数个数直接取补法获得 。
计数模式时,计数脉冲是 T0引脚上的外部脉冲。
门控位 GATE具有特殊的作用。当 GATE=0时,经反相后使
或门输出为 1,此时仅由 TR0控制与门的开启,与门输出 1
时,控制开关接通,计数开始; 当 GATE=1时,由外中断引
脚信号控制或门的输出,此时控制 与门的开启由外中断引
脚信号和 TR0共同控制 。当 TR0=1时,外中断引脚信号引脚
的 高电平启动计数,外中断引脚信号引脚的 低电平停止计
数 。这种方式常用来测量外中断引脚上正脉冲的宽度。
13X = 2 -N
40
例:在 P1.0引脚输出周期为 4ms宽的方波。
分析:只要每间隔 2ms将 P1.0取反一次即可,设选用 T0定时
器完成定时 2ms功能。
初值计算,X0= 213-( 12× 106× 2× 10-3) /12=6192=1830H
由于采用工作方式 0,计数器 13位。
0001,1000,0011,0000B ( 1830H)
TH0占高 8位(取 D5~ D12) 1100,0001B
TL0高 3位补 0,0001,0000B
所以 X0的实际值应为,1100,0001,0001,0000B即 C110H
根据题意设置方式控制字 TMOD= 00H
上电复位后,TMOD各位均为 0,所以此字可以不用写入。
源程序如下:
41
ORG 0010H
MOV TH0,#C1H ; T0计数初值 X0
MOV TL0,#10H
SETB TR0 ;启动 T0
LOOP1:JBC TF0,LOOP2; 查询 T0计数是否溢出,同时清除 TF0
AJMP LOOP1 ;若溢出重新设置计数初值
LOOP2:MOV TH0,#C1H
MOV TL0,#10H
CPL P1.0 ;输出取反
SJMP LOOP1 ;重复循环
42
16X =2 -N
二、方式 1
方式 1的计数位数是 16位,由 TL0作为低 8位,TH0
作为高 8位,组成了 16位加 1计数器 。
T F 1
T R 1
T F 0
T R 0
G A T E
C / T
M 1
M 0
G A T E
C / T
M 1
M 0
1
&
≥ 1
1
0
T 0 引 脚
I N T 0 引 脚
1
0
机 器 周 期
T H 0 T L 0
8 位 8 位
溢 出
T C O N
T M O D
D 0
D 7
D 7
D 0
申 请
中 断
计数个数与计数初值的关系为:
43
例:用定时器 0产生一个 50Hz的方波,由 P1.1输出,仍用程序查
询方式,振荡频率为 12MHz。
解:方波周期 T=1/50= 0.02s=20ms,定时值为 10ms。
计数初值 X0= 216-( 12× 106× 10× 10-3) /12
=65536-10000=55536=D8F0H
源程序如下:
ORG 0010H
MOV TMOD,#11H ; T0工作于方式 1,定时模式
SETB TR0 ;启动 T0
LOOP,MOV TH0,#D8H ; T0计数初值
MOV TL0,#F0H
JNB TF0,$ ;若 T0无溢出则原地等待,$为地址计数器
CLR TF0 ;若产生溢出,清除中断请求标志位
CPL P1.1 ; P1.1取反输出,输出方波
SJMP LOOP ;重复循环
44
8X=2 -N
三、方式 2
方式 2为自动重装初值的 8位计数方式。
初始化编程时,THi和 TLi都装入该计数初值。方式 2特别适合于用
作较精确的脉冲信号发生器。尤其适用于串口波特率发生器。
T F 1
T R 1
T F 0
T R 0
G A T E
C / T
M 1
M 0
G A T E
C / T
M 1
M 0
1
&
≥ 1
1
0
T 0 引 脚
I N T 0 引 脚
1
0
机 器 周 期
T H 0
T L 0
8 位
溢 出
T C O N
T M O D
D 0
D 7
D 7
D 0
申 请
中 断
计数个数与计数初值的关系为,
45
例:用 T0工作于方式 2,要求每计数满 200次,将 P1.1端取反。
分析,T0工作于计数方式下,外部计数脉冲由 T0( P3.5)引脚
引入,每来一个由 1至 0的跳变计数器加 1,由程序查询 TF0的状
态。
初值 X= 28-200=56=38H, TH0=TL0=38H,TMOD=06H
源程序,ORG 0010H
MOV TMOD,06H
MOV TH0,#38H ; T0计数初值
MOV TL0,#38H
SETB TR0 ;启动 T0
LOOP1:JBC TF0,LOOP2 ;若 TF0= 1,则转 LOOP2,同时 TF0= 0
SJMP LOOP1 ;否则一直等待
LOOP2,CPL P1.1 ; P1.1 取反输出
SJMP LOOP1
46
四、方式 3
方式 3只适用于定时 /计数器 T0,定时器 T1处于方式 3时相当
于 TR1=0,停止计数。
工作方式 3将 T0分成为两个独立的 8位计数器 TL0和 TH0 。
T F 1
T R 1
T F 0
T R 0
G A T E
C / T
M 1
M 0
G A T E
C / T
M 1
M 0
1
&
≥ 1
1
0
T 0 引 脚
I N T 0 引 脚
1
1
机 器 周 期
T H 0
T L 0
8 位
溢 出
T C O N
T M O D
D 0 D 7
D 0
申 请
中 断
机 器 周 期
8 位
申 请
中 断
溢 出
47
其中 TL0使用原有 T0的控制位和引脚,如,C/, GATE、
TR0,TF0,T0(P3.4)以及 (P3.2)引脚。此方式下的 TL0
除作为 8位计数器外,其功能和操作与方式 0,1完全相同,可
作定时也可作计数用。
该方式下的 TH0,只可用作简单的内部定时器功能,它借用
定时器 T1的控制位和溢出标志位 TR1和 TF1,同时占用 T1的中
断源。 TH0的启动和关闭仅受 TR1的控制,TR1= 1,TH0启动
定时; TR1= 0,TH0停止定时工作。
当 T0工作于方式 3时,TH0占用了 T1的控制位和溢出标志位
TR1和 TF1,但定时器 T1仍可工作于方式 0、方式 1和方式 2,
作为串行口波特率发生器,或用于任何不需要中断的场合。
T
0INT
48
设某用户系统中已使用了两个外部中断源,并设置 T1工作于
方式 2,作串行口波特率发生器。现要求增加一个外部中断源
并由 P1.0输出一个 10KHz的方波,单片机 fosc为 12MHz。
分析:为了不增加其他硬件开销,可设置 T0工作于方式 3计数
方式。把 T0的引脚作附加的外部中断输入端,TL0的计数初值
为 FFH;当检测到 T0引脚由 1至 0的负跳变时,TL0立即产生溢
出,申请中断,相当于边沿触发的外部中断源。
T0的模式 3下,TL0作计数用,而 TH0可用作 8位的定时器,定
时器控制 P1.0输出 10KHz的方波信号。
P1.0输出方波的信号为 10KHz,周期为 1/10KHz= 0.1ms。
TH0定时为 0.05ms,TL0的计数初值为 FFH; TH0的计数初值
X= 28-( 0.05× 10-3× 12× 106) /12=216=D8H
49
程序,ORG 0010H
MOV TMOD,#27H ;T0工作于方式 3,计数; T1工作于方式 2,定时
MOV TL0,#FFH ; TL0的计数初值
MOV TH0,#D8H ; TH0的计数初值
MOV TH1,#data[H] ; data为根据波特率要求设置的常数
MOV TL1,#data[L]
MOV TCON,#55H ;外中断 0,1边沿触发,启动 T0,T1
MOV IE,#9FH ;开放全部中断
TL0溢出中断服务程序(由 000BH)转来
TL0OF,MOV TL0,#FFH ; TL0重装计数初值
…
RETI
TH0溢出中断服务程序(由 001BH)转来
TH0OF,MOV TH0,#D8H ; TH0重装计数初值
CPL P1.0 ;取反输出
50
运行中读定时 /计数器
80C51可以随时读写计数寄存器 TLx和 THx,例实时显示计数值。
在读取操作时应注意分时读取 TLx和 THx。例如:先读 TLx,再读 THx,
如果此时定时 /计数器还在运行,在读 THx之前刚好 TLx溢出,向 THx
产生进位,则读得的 TLx值就是不正确的;同样,先读 THx,再读
TLx时也可能产生这种错误。
解决方法:先读 THx,再读 TLx,再重读 THx,若两次读得的 THx值相
同,则可以确定读入的数据是正确的,若两次读得的 THx值不一致,
则必须重读。
程序:
RDTIME,MOV A,TH0 ;先读 TH0
MOV R0,TL0 ;读入 TL0并存入 R0
CJNE A,TH0,RDTIME ;再读 TH0,与上次读入值比较,若不等重读
MOV R1,A ;若相等,存 TH0在 R1中
RET
51
5.3.4 定时 /计数器用于外部中断扩展
扩展方法是,将定时 /计数器设置为计数器方式,计数初值
设定为满程,将待扩展的外部中断源接到定时 /计数器的外部
计数引脚。从该引脚输入一个下降沿信号,计数器加 1后便产
生定时 /计数器溢出中断。
例如,利用 T0扩展一个外部中断源。将 T0设置为计数器方式,
按方式 2工作,TH0,TL0的初值均为 0FFH,T0允许中断,
CPU开放中断。 其初始化程序如下:
MOV TMOD,#06H ;置 T0为计数器方式 2
MOV TL0,#0FFH ;置计数初值
MOV TH0,#0FFH
SETB TR0 ;启动 T0工作
SETB EA ; CPU开中断
SETB ET0 ;允许 T0中断
52
5.3.5 定时 /计数器应用举例
初始化程序应完成如下工作:
?对 TMOD赋值,以确定 T0和 T1的工作方式。
?计算初值,并将其写入 TH0,TL0或 TH1,TL1。
?中断方式时,则对 IE赋值,开放中断。
?使 TR0或 TR1置位,启动定时 /计数器定时或计数。
53
例 利用定时 /计数器 T0的方式 1,产生 10ms的定时,
并使 P1.0引脚上输出周期为 20ms的方波,采用中
断方式,设系统时钟频率为 12 MHz。
解,1、计算计数初值 X:
由于晶振为 12 MHz,所以机器周期 Tcy为 1μS。
所以:
N= t/ Tcy = 10× 10- 3/1× 10- 6= 10000
X= 65536- 10000= 55536= D8F0H
即应将 D8H送入 TH0中,F0H送入 TL0中
2、求 T0的方式控制字 TMOD:
M1M0=01,GATE=0,C/T=0,可取方式控制
字为 01H;
54
ORG 0000H
LJMP MAIN ;跳转到主程序
ORG 000BH ; T0的中断入口地址
LJMP DVT0 ;转向中断服务程序
ORG 0100H
MAIN,MOV TMOD,#01H ;置 T0工作于方式 1
MOV TH0,#0D8H ;装入计数初值
MOV TL0,#0F0H
SETB ET0 ; T0开中断
SETB EA ; CPU开中断
SETB TR0 ;启动 T0
SJMP $ ;等待中断
DVT0,CPL P1.0 ; P1.0取反输出
MOV TH0,#0D8H ;重新装入计数值
MOV TL0,#0F0H
RETI ;中断返回
END
55
思考题及习题
1,80C51有几个中断源?各中断标志是如何产生的?又是如何
复位的? CPU响应各中断时,其中断入口地址是多少?
2、某系统有三个外部中断源 1,2,3,当某一中断源变低电平
时便要求 CPU处理,它们的优先处理次序由高到低为 3,2,1,
处理程序的入口地址分别为 2000H,2100H,2200H。试编写
主程序及中断服务程序(转至相应的入口即可)。
3、外部中断源有电平触发和边沿触发两种触发方式,这两种触
发方式所产生的中断过程有何不同?怎样设定?
4、定时 /计数器工作于定时和计数方式时有何异同点?
5、定时 /计数器的 4种工作方式各有何特点?
6、要求定时 /计数器的运行控制完全由 TR1,TR0确定和完全由、
高低电平控制时,其初始化编程应作何处理?
第 5章 80C51的中断系统及定时 /计数器
5.1 80C51的中断系统
5.2 80C51的中断处理过程
5.3 80C51的定时 /计数器
2
5.1 80C51的中断系统
5.1.1 80C51的中断系统结构
一、中断的概念
计算机具有实时处理能力,能对外界发生的事件进
行及时处理,这是依靠它们的中断系统来实现的。
CPU在处理某一事件 A时,发生了另一事件 B请求 CPU
迅速去处理( 中断发生 ); CPU暂时中断当前的工作,
转去处理事件 B( 中断响应和中断服务 );待 CPU将事
件 B处理完毕后,再回到原来事件 A被中断的地方继续
处理事件 A( 中断返回 ),这一过程称为 中断 。
3
引起 CPU中断的根源,称为中断源。中断源向 CPU提
出的中断请求。 CPU暂时中断原来的事务 A,转去处理事
件 B。对事件 B处理完毕后,再回到原来被中断的地方(即
断点),称为中断返回。实现上述中断功能的部件称为中
断系统(中断机构)。
主 程 序 A
响 应
返 回
断 点
R E T I
…
…
中 断 服 务 程 序 B
4
随着计算机技术的应用,人们发现中断技
术不仅解决了快速主机与慢速 I/O设备的数据
传送问题,而且还具有如下优点:
?分时操作 。 CPU可以分时为多个 I/O设备服
务,提高了计算机的利用率;
?实时响应 。 CPU能够及时处理应用系统的
随机事件,系统的实时性大大增强;
?可靠性高 。 CPU具有处理设备故障及掉电
等突发性事件的能力,从而使系统可靠性提
高。
5
二,80C51中断系统的结构
80C51的中断系统有 5个中断源,2个优先
级,可实现二级中断嵌套 。
E X 0
E A P X 0
0
1
E T 0
P T 0
0
1
E X 1
P X 1
0
1
E T 1
P T 1
0
1
E S
P S
0
1
≥ 1
R I
T I
S C O N
T C O N
I E 0
T F 0
I E 1
T F 1
1
0
1
0
1
I T 0
I T 1
I N T 0
I N T 1
T 0
T 1
R X
T X
I E
I P
1
1
1
1
1
1
1
1
0
硬 件 查 询
自
然
优
先
级
自
然
优
先
级
中 断 入 口
中 断 入 口
高
级
低
级
中 断 源
中 断 源
6
5.1.2 80C51的中断源
一、中断源
1,( P3.2)。可由 IT0(TCON.0)选择其为低电平有效
还是下降沿有效。当 CPU检测到 P3.2引脚上出现有效的中
断信号时,中断标志 IE0(TCON.1)置 1,向 CPU申请中断。
2,( P3.3)。可由 IT1(TCON.2)选择其为低电平有效
还是下降沿有效。当 CPU检测到 P3.3引脚上出现有效的中
断信号时,中断标志 IE1(TCON.3)置 1,向 CPU申请中断。
3,TF0( TCON.5),片内定时 /计数器 T0溢出中断请求标
志。当定时 /计数器 T0发生溢出时,置位 TF0,并向 CPU申
请中断。
4,TF1( TCON.7),片内定时 /计数器 T1溢出中断请求标
志。当定时 /计数器 T1发生溢出时,置位 TF1,并向 CPU申
请中断。
5,RI( SCON.0)或 TI( SCON.1),串行口中断请求标志。
当串行口接收完一帧串行数据时置位 RI或当串行口发送完
一帧串行数据时置位 TI,向 CPU申请中断。
INT0
INT1
7
二, 中断请求标志
1,TCON的中断标志
IT0( TCON.0),外部中断 0触发方式控制位。
当 IT0=0时,为电平触发方式。
当 IT0=1时,为边沿触发方式(下降沿有效)。
IE0( TCON.1),外部中断 0中断请求标志位。
IT1( TCON.2),外部中断 1触发方式控制位。
IE1( TCON.3),外部中断 1中断请求标志位。
TF0( TCON.5),定时 /计数器 T0溢出中断请求标志位。
TF1( TCON.7),定时 /计数器 T1溢出中断请求标志位。
8
2,SCON的中断标志
?RI( SCON.0),串行口接收中断标志位。当允
许串行口接收数据时,每接收完一个串行帧,由
硬件置位 RI。同样,RI必须由软件清除。
?TI( SCON.1),串行口发送中断标志位。当
CPU将一个发送数据写入串行口发送缓冲器时,
就启动了发送过程。每发送完一个串行帧,由硬
件置位 TI。 CPU响应中断时,不能自动清除 TI,
TI必须由软件清除。
9
一、中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是
由中断允许寄存器 IE控制的。
5.1.3 80C51中断的控制
?EX0(IE.0),外部中断 0允许位;
?ET0(IE.1),定时 /计数器 T0中断允许位;
?EX1(IE.2),外部中断 0允许位;
?ET1(IE.3),定时 /计数器 T1中断允许位;
?ES( IE.4),串行口中断允许位;
?EA (IE.7),CPU中断允许(总允许)位。
10
二、中断优先级控制
80C51单片机有两个中断优先级,即可实现二级中断服务
嵌套。每个中断源的中断优先级都是由中断优先级寄存器 IP中
的相应位的状态来规定的 。
?PX0( IP.0),外部中断 0优先级设定位;
?PT0( IP.1),定时 /计数器 T0优先级设定位;
?PX1( IP.2),外部中断 0优先级设定位;
?PT1( IP.3),定时 /计数器 T1优先级设定位;
?PS ( IP.4),串行口优先级设定位。
11
同一优先级中的中断申请不止一个时,则有中
断优先权排队问题。同一优先级的中断优先权排队,
由中断系统硬件确定的自然优先级形成,其排列如
所示:
12
80C51单片机的中断优先级有三条原则:
?CPU同时接收到几个中断时,首先响应优先级别最高
的中断请求。
?正在进行的中断过程不能被新的同级或低优先级的中
断请求所中断。
?正在进行的低优先级中断服务,能被高优先级中断请
求所中断。
为了实现上述后两条原则,中断系统内部设有两个
用户不能寻址的优先级状态触发器 。其中一个置 1,表
示正在响应高优先级的中断,它将阻断后来所有的中
断请求;另一个置 1,表示正在响应低优先级中断,它
将阻断后来所有的低优先级中断请求。
13
5.2 80C51单片机中断处理过程
一、中断响应条件
CPU响应中断的条件是:
? 中断源有中断请求;
? 此中断源的中断允许位为 1;
? CPU开中断(即 EA=1)。
同时满足时,CPU才有可能响应中断 。
5.2.1 中断响应条件和时间
14
CPU执行程序过程中,在每个机器周期
的 S5P2期间,中断系统对各个中断源进行
采样 。这些采样值在下一个机器周期内按
优先级和内部顺序被依次查询。
如果某个中断标志在上一个机器周期的
S5P2时被置成了 1,那么它将于现在的查
询周期中及时被发现。接着 CPU便执行一
条由中断系统提供的硬件 LCALL指令,转
向被称作中断向量的特定地址单元,进入
相应的中断服务程序。
15
遇以下任一条件,硬件将受阻,不产生 LCALL指令:
?CPU正在处理同级或高 优先级中断;
?当前查询 的机器周期 不是所执行指令的最后一个机器
周期 。即在完成所执行指令前,不会响应中断,从而保
证指令在执行过程中不被打断;
?正在执行 的指令为 RET,RETI或任何访问 IE或 IP寄存
器的指令。即只有在这些指令后面至少再执行一条指令
时才能接受中断请求。
若由于上述条件的阻碍中断未能得到响应,当条件
消失时该中断标志却已不再有效,那么该中断将不被响
应。就是说,中断标志曾经有效,但未获响应,查询过
程在下个机器周期将重新进行 。
16
二、中断响应时间
某中断的响应时序如图:
S1
保 护 断 点, 长 调 用 至 入 口 中 断 服 务
S2
S3 S4 S5 S6 S1 S2
S3 S4 S5 S6 S1 S2
S3 S4 S5
S6 S1
S2
S3 S4 S5 S6
S1
S2
S3
S4 S5 S6
标 志 查 询
标 志
锁 存
ε
中 断
有 效
M1 M2 M3 M4 M5
?若 M1周期的 S5P2前某中断生效,在 S5P2期间其中
断请求被锁存到相应的标志位中去; M2恰逢指令的
最后一个机器周期,且该指令不是 RETI或访问 IE、
IP的指令。于是,M3和 M4便可以执行硬件 LCALL
指令,M5周期将进入了中断服务程序。
?80C51的中断响应时间(从标志置 1到进入相应的中
断服务),至少要 3个完整的机器周期。
17
?将相应的优先级状态触发器置 1(以阻断
后来的同级或低级的中断请求)。
?执行一条硬件 LCALL指令,即把程序计
数器 PC的内容压入堆栈保存,再将相应的
中断服务程序的入口地址送入 PC。
?执行中断服务程序。
中断响应过程的前两步是由中断系统内部
自动完成的,而中断服务程序则要由用户
编写程序来完成。
5.2.2 中断响应过程
18
5.2.3 中断返回
RETI指令的具体功能是:
?将中断响应时压入堆栈保存的断点地址从栈
顶弹出送回 PC,CPU从原来中断的地方继续
执行程序;
? 将相应中断优先级状态触发器清 0,通知中
断系统,中断服务程序已执行完毕。
注意,不能用 RET指令代替 RETI指令。在中
断服务程序中 PUSH指令与 POP指令必须成对
使用,否则不能正确返回断点 。
19
若外部中断定义为电平触发方式,中断标志位
的状态随 CPU在每个机器周期采样到的外部中断
输入引脚的电平变化而变化,这样能提高 CPU对
外部中断请求的响应速度。但外部中断源若有请求,
必须把有效的 低电平保持到请求获得响应时为止,
不然就会漏掉; 而在中断服务程序结束之前,中断
源又必须撤消其有效的低电平,否则中断返回之后
将再次产生中断。
电平触发方式适合于外部中断输入以低电平输入且
中断服务程序能清除外部中断请求源的情况。例如,
并行接口芯片 8255的中断请求线在接受读或写操
作后即被复位,因此,以其去请求电平触发方式的
中断比较方便。
20
若外部中断定义为边沿触发方式,在相继连续的两
次采样中,一个周期采样到外部中断输入为高电平,
下一个周期采样到为低电平,则在 IE0或 IE1中将锁存
一个逻辑 1。即便是 CPU暂时不能响应,中断申请标
志也不会丢失,直到 CPU响应此中断时才清零。这
样,为保证下降沿能被可靠地采样到,外中断引脚上
的高低电平(负脉冲的宽度)均至少要保持一个机器
周期 (若晶振为 12MHz时,为 1微秒)。
边沿触发方式适合于以负脉冲形式输入的外部中断
请求,如 ADC0809的转换结束标志信号 EOC为正脉
冲,经反相后就可以作为 80C51的中断输入。
21
5.2.4 中断程序举例
22
ORG 0000H
START,LJMP MAIN ;跳转到主程序
ORG 0003H
LJMP INTO ;转向中断服务程序
ORG 0030H ;主程序
MAIN,CLR IT0 ;设为电平触发方式
SETB EA ; CPU开放中断
SETB EX0 ;允许中断
MOV DPTR,#1000H ;设置数据区地址指针
… …
ORG 0200H ;中断服务程序
INT0,PUSH PSW ;保护现场
PUSH ACC
CLR P3.0 ;由 P3.0输出 0
NOP
NOP
SETB P3.0 ;由 P3.0输出 1,撤除
MOV A,P1 ;输入数据
MOVX @DPTR,A ;存入数据存储器
INC DPTR ;修改数据指针,指向下一个单元
… …
POP ACC ;恢复现场
POP PSW
RETI ;中断返回
23
例 多外部中断源的系统示例。
设有 5个外部中断源,中断优先级排队顺序为:
XI0,XI1,XI2,XI3,XI4。试设计它们与 80C51单
片机的接口。
24
ORG 0003H
LJMP INSE0 ;转外部中断 0服务程序入口
ORG 0013H
LJMP INSE1 ;转外部中断 1服务程序入口
… …
… …
INSE0,PUSH PSW ; XI0中断服务程序
PUSH ACC
… …
… …
POP ACC
POP PSW
RETI
25
INSE1,PUSH PSW ;中断服务程序
PUSH ACC
JB P1.0,DV1 ; P1.0为 1,转 XI1中断服务程序
JB P1.1,DV2 ; P1.1为 1,转 XI2中断服务程序
JB P1.2,DV3 ; P1.2为 1,转 XI3中断服务程序
JB P1.3,DV4 ; P1.3为 1,转 XI4中断服务程序
INRET,POP ACC
POP PSW
RETI
DV1,… … ; XI1中断服务程序
AJMP INRET
DV2,… … ; XI2中断服务程序
AJMP INRET
DV3,… … ; XI3中断服务程序
AJMP INRET
DV4,… … ; XI4中断服务程序
AJMP INRET
26
5.3 80C51的定时 /计数器
实现定时功能,比较方便的办法是利用单片
机内部的定时 /计数器 。也可以采用下面三种
方法:
?软件定时,软件定时不占用硬件资源,但占用了
CPU时间,降低了 CPU的利用率。
?采用时基电路定时,例如采用 555电路,外接必要
的元器件(电阻和电容),即可构成硬件定时电路。
但在硬件连接好以后,定时值与定时范围不能由软
件进行控制和修改,即不可编程。
?采用可编程芯片定时,这种定时芯片的定时值及
定时范围很容易用软件来确定和修改,此种芯片定
时功能强,使用灵活。在单片机的定时 /计数器不够
用时,可以考虑进行扩展。
27
2个 16位 定时器 /计数器
—— (52系列有 3个 16位 Timer)
定时器,对片内机器时钟 (周期方波 )进行计数
计数器,对 Tx引脚 输入的负脉冲进行计数
与 Timer工作有关的特殊功能寄存器:
TCON 和 TMOD
可通过软件设置有关参数
概述:
28
5.3.1 定时 /计数器的结构和工作原理
一、定时 /计数器的结构
定时 /计数器的实质是加 1计数器( 16位),由高 8位和低 8
位两个寄存器组成。 TMOD是定时 /计数器的工作方式寄存
器,确定工作方式和功能; TCON是控制寄存器,控制 T0、
T1的启动和停止及设置溢出标志 。
G
A
T
E
C
/
T
M
1
M
0
G
A
T
E
C
/
T
M
1
M
0
T H 1 T L 1 T H 0 T L 0
T 1 方 式
T 0 方 式
T 1 引 脚
T 0 引 脚
机 器 周
期 脉 冲
内 部 总 线
T M O D
T C O N
外 部 中 断 相 关 位
T
F
1
T
R
1
T
F
0
T
R
0
29
二、定时 /计数器的工作原理
加 1计数器输入的计数脉冲有两个来源,一个是由
系统的时钟振荡器输出脉冲经 12分频后送来;一个
是 T0或 T1引脚输入的外部脉冲源。每来一个脉冲
计数器加 1,当加到计数器为全 1时,再输入一个脉
冲就使计数器回零,且计数器的溢出使 TCON中
TF0或 TF1置 1,向 CPU发出中断请求(定时 /计数
器中断允许时)。如果定时 /计数器工作于定时模
式,则表示定时时间已到;如果工作于计数模式,
则表示计数值已满。
可见,由溢出时计数器的值减去计数初值才是加
1计数器的计数值 。
30
?设置为定时器模式时,加 1计数器是对内部机器周期
计数( 1个机器周期等于 12个振荡周期,即计数频率
为晶振频率的 1/12)。 计数值 N乘以机器周期 Tcy就
是定时时间 t 。
?设置为 计数器模式时,外部事件计数脉冲由 T0或 T1
引脚输入到计数器。在每个机器周期的 S5P2期间采
样 T0,T1引脚电平。当某周期采样到一高电平输入,
而下一周期又采样到一低电平时,则计数器加 1,更
新的计数值在下一个机器周期的 S3P1期间装入计数
器。由于检测一个从 1到 0的下降沿需要 2个机器周期,
因此要求被采样的电平至少要维持一个机器周期。当
晶振频率为 12MHz时,最高计数频率不超过 1/2MHz,
即计数脉冲的周期要大于 2 微秒 。
31
5.3.2 定时 /计数器的控制
80C51单片机定时 /计数器的工作由两个特殊功
能寄存器控制。 TMOD用于设置其工作方式;
TCON用于控制其启动和中断申请。
一、工作方式寄存器 TMOD
工作方式寄存器 TMOD用于设置定时 /计数器的
工作方式,低四位用于 T0,高四位用于 T1。其格式
如下:
32
GATE:门控位。 GATE= 0时,只要用软件使 TCON中的
TR0或 TR1为 1,就可以启动定时 /计数器工作; GATA= 1时,
要用软件使 TR0或 TR1为 1,同时外部中断引脚或也为高电
平时,才能启动定时 /计数器工作。即此时定时器的启动条
件,加上了或引脚为高电平这一条件。
:定时 /计数模式选择位。 = 0为定时模式; =1
为计数模式。
M1M0:工作方式设置位。定时 /计数器有四种工作方式,
由 M1M0进行设置。
C/T C/TC/T
33
二、控制寄存器 TCON
TCON的低 4位用于控制外部中断,已在前面介绍。 TCON的高 4位用于
控制定时 /计数器的启动和中断申请。其格式如下:
?TF1( TCON.7),T1溢出中断请求标志位。 T1计数溢出时由硬件自
动置 TF1为 1。 CPU响应中断后 TF1由硬件自动清 0。 T1工作时,CPU
可随时查询 TF1的状态。所以,TF1可用作查询测试的标志。 TF1也可
以用软件置 1或清 0,同硬件置 1或清 0的效果一样。
?TR1( TCON.6),T1运行控制位。 TR1置 1时,T1开始工作; TR1置
0时,T1停止工作。 TR1由软件置 1或清 0。所以,用软件可控制定时 /
计数器的启动与停止。
?TF0( TCON.5),T0溢出中断请求标志位,其功能与 TF1类同。
?TR0( TCON.4),T0运行控制位,其功能与 TR1类同。
34
定时器 /计数器的初始化
在使用定时器 /计数器之前由软件设置其功能,即初始化。
1、初始化的步骤
( 1)确定工作模式(计数 /定时)、工作方式和启动控制方式,并
写入 TMOD寄存器
( 2)设置定时或计数初值:可直接写入 TH0,TL0或 TH1,TL1中。
16位计数初值必须分两次写入对应计数器
( 3)根据要求确定是否采用中断方式:直接对 IE位赋值。开中断时,
对应位置,1”;采用程序查询方式时,IE位应清 0以进行中断屏蔽
( 4)启动定时 /计数器:使用 SETB TRi指令启动
若第一步设置为软启动,即 GATE设置为 0时,执行指令后,定时 /计
数器开始工作。
若 GATE设置为 1时,还必须由外部中断引脚 和 共同控制,
只有外部引脚电平为高时,执行指令后,定时 /计数器开始工作。
0INT 1INT
35
2、计数初值的计算
最大计数值 M与定时 /计数器工作方式有关:
方式 0,M=213=8192
方式 1,M=216=65536
方式 2,M=28=256
方式 3,M=256,定时 /计数器分成两个独立的 8位计数器,所
以 TH0,TL0的 M均为 256
T0和 T1均为加 1计数器,当加到最大值( 00H或 0000H)时,
产生溢出,将 TCON寄存器的 TF位置 1,产生溢出中断。
计数器初值 X的计算公式:
( 1)计数工作模式时 X= M-计数值
( 2)定时工作模式时
X= M-计数值= M- t/T=M - (fosc x t)/12
fosc为晶振频率,t为要求定时的时间。
36
例,MCS- 51主频为 6MHz,要求产生 1ms的定时,试计算计
数初值 X。设定时器工作于方式 1。
X= 216-( 6× 106× 1× 10-3) /12=65536-500=65036=FE0CH
3、初始化举例
T0为计数方式,对外部脉冲计数 100次,硬启动,禁止中断,
选工作方式 2。 T1为定时工作方式,定时 25ms,选择工作方式
1,允许中断,软启动; fosc= 12MHz,编写初始化程序。
初值 X0= 256-100= 156= 9CH
初值 X1= 65536-( 12× 25× 1000) /12= 40536= 9E58H
方式控制字,00011110B 即 1EH
37
初始化程序:
MOV TMOD,#1EH ;写工作模式字
MOV TH0,#9CH ; T0计数初值,TH0值自动重新装入 TL0
MOV TL0,#9CH
MOV TH1,#9EH ;T1计数初值
MOV TL1,#58H
MOV IE,#10001000B ; T1开中断
SETB TR0 ;启动 T0,但要等到 为 1时真正启动
SETB TR1 ;启动 T1
0INT
38
5.3.3 定时 /计数器的工作方式
一、方式 0
方式 0为 13位计数,由 TL0的低 5位(高 3位未用)和 TH0
的 8位组成。 TL0的低 5位溢出时向 TH0进位,TH0溢出时,
置位 TCON中的 TF0标志,向 CPU发出中断请求。
T F 1
T R 1
T F 0
T R 0
G A T E
C / T
M 1
M 0
G A T E
C / T
M 1
M 0
1
&
≥ 1
1
0
T 0 引 脚
I N T 0 引 脚
0
0
机 器 周 期
T H 0 T L 0
8 位 5 位
溢 出
T C O N
T M O D
D 0
D 7
D 7
D 0
申 请
中 断
1
39
定时器模式时 有,N= t/ Tcy
计数初值计算的公式为:
定时器的初值还可以采用计数个数直接取补法获得 。
计数模式时,计数脉冲是 T0引脚上的外部脉冲。
门控位 GATE具有特殊的作用。当 GATE=0时,经反相后使
或门输出为 1,此时仅由 TR0控制与门的开启,与门输出 1
时,控制开关接通,计数开始; 当 GATE=1时,由外中断引
脚信号控制或门的输出,此时控制 与门的开启由外中断引
脚信号和 TR0共同控制 。当 TR0=1时,外中断引脚信号引脚
的 高电平启动计数,外中断引脚信号引脚的 低电平停止计
数 。这种方式常用来测量外中断引脚上正脉冲的宽度。
13X = 2 -N
40
例:在 P1.0引脚输出周期为 4ms宽的方波。
分析:只要每间隔 2ms将 P1.0取反一次即可,设选用 T0定时
器完成定时 2ms功能。
初值计算,X0= 213-( 12× 106× 2× 10-3) /12=6192=1830H
由于采用工作方式 0,计数器 13位。
0001,1000,0011,0000B ( 1830H)
TH0占高 8位(取 D5~ D12) 1100,0001B
TL0高 3位补 0,0001,0000B
所以 X0的实际值应为,1100,0001,0001,0000B即 C110H
根据题意设置方式控制字 TMOD= 00H
上电复位后,TMOD各位均为 0,所以此字可以不用写入。
源程序如下:
41
ORG 0010H
MOV TH0,#C1H ; T0计数初值 X0
MOV TL0,#10H
SETB TR0 ;启动 T0
LOOP1:JBC TF0,LOOP2; 查询 T0计数是否溢出,同时清除 TF0
AJMP LOOP1 ;若溢出重新设置计数初值
LOOP2:MOV TH0,#C1H
MOV TL0,#10H
CPL P1.0 ;输出取反
SJMP LOOP1 ;重复循环
42
16X =2 -N
二、方式 1
方式 1的计数位数是 16位,由 TL0作为低 8位,TH0
作为高 8位,组成了 16位加 1计数器 。
T F 1
T R 1
T F 0
T R 0
G A T E
C / T
M 1
M 0
G A T E
C / T
M 1
M 0
1
&
≥ 1
1
0
T 0 引 脚
I N T 0 引 脚
1
0
机 器 周 期
T H 0 T L 0
8 位 8 位
溢 出
T C O N
T M O D
D 0
D 7
D 7
D 0
申 请
中 断
计数个数与计数初值的关系为:
43
例:用定时器 0产生一个 50Hz的方波,由 P1.1输出,仍用程序查
询方式,振荡频率为 12MHz。
解:方波周期 T=1/50= 0.02s=20ms,定时值为 10ms。
计数初值 X0= 216-( 12× 106× 10× 10-3) /12
=65536-10000=55536=D8F0H
源程序如下:
ORG 0010H
MOV TMOD,#11H ; T0工作于方式 1,定时模式
SETB TR0 ;启动 T0
LOOP,MOV TH0,#D8H ; T0计数初值
MOV TL0,#F0H
JNB TF0,$ ;若 T0无溢出则原地等待,$为地址计数器
CLR TF0 ;若产生溢出,清除中断请求标志位
CPL P1.1 ; P1.1取反输出,输出方波
SJMP LOOP ;重复循环
44
8X=2 -N
三、方式 2
方式 2为自动重装初值的 8位计数方式。
初始化编程时,THi和 TLi都装入该计数初值。方式 2特别适合于用
作较精确的脉冲信号发生器。尤其适用于串口波特率发生器。
T F 1
T R 1
T F 0
T R 0
G A T E
C / T
M 1
M 0
G A T E
C / T
M 1
M 0
1
&
≥ 1
1
0
T 0 引 脚
I N T 0 引 脚
1
0
机 器 周 期
T H 0
T L 0
8 位
溢 出
T C O N
T M O D
D 0
D 7
D 7
D 0
申 请
中 断
计数个数与计数初值的关系为,
45
例:用 T0工作于方式 2,要求每计数满 200次,将 P1.1端取反。
分析,T0工作于计数方式下,外部计数脉冲由 T0( P3.5)引脚
引入,每来一个由 1至 0的跳变计数器加 1,由程序查询 TF0的状
态。
初值 X= 28-200=56=38H, TH0=TL0=38H,TMOD=06H
源程序,ORG 0010H
MOV TMOD,06H
MOV TH0,#38H ; T0计数初值
MOV TL0,#38H
SETB TR0 ;启动 T0
LOOP1:JBC TF0,LOOP2 ;若 TF0= 1,则转 LOOP2,同时 TF0= 0
SJMP LOOP1 ;否则一直等待
LOOP2,CPL P1.1 ; P1.1 取反输出
SJMP LOOP1
46
四、方式 3
方式 3只适用于定时 /计数器 T0,定时器 T1处于方式 3时相当
于 TR1=0,停止计数。
工作方式 3将 T0分成为两个独立的 8位计数器 TL0和 TH0 。
T F 1
T R 1
T F 0
T R 0
G A T E
C / T
M 1
M 0
G A T E
C / T
M 1
M 0
1
&
≥ 1
1
0
T 0 引 脚
I N T 0 引 脚
1
1
机 器 周 期
T H 0
T L 0
8 位
溢 出
T C O N
T M O D
D 0 D 7
D 0
申 请
中 断
机 器 周 期
8 位
申 请
中 断
溢 出
47
其中 TL0使用原有 T0的控制位和引脚,如,C/, GATE、
TR0,TF0,T0(P3.4)以及 (P3.2)引脚。此方式下的 TL0
除作为 8位计数器外,其功能和操作与方式 0,1完全相同,可
作定时也可作计数用。
该方式下的 TH0,只可用作简单的内部定时器功能,它借用
定时器 T1的控制位和溢出标志位 TR1和 TF1,同时占用 T1的中
断源。 TH0的启动和关闭仅受 TR1的控制,TR1= 1,TH0启动
定时; TR1= 0,TH0停止定时工作。
当 T0工作于方式 3时,TH0占用了 T1的控制位和溢出标志位
TR1和 TF1,但定时器 T1仍可工作于方式 0、方式 1和方式 2,
作为串行口波特率发生器,或用于任何不需要中断的场合。
T
0INT
48
设某用户系统中已使用了两个外部中断源,并设置 T1工作于
方式 2,作串行口波特率发生器。现要求增加一个外部中断源
并由 P1.0输出一个 10KHz的方波,单片机 fosc为 12MHz。
分析:为了不增加其他硬件开销,可设置 T0工作于方式 3计数
方式。把 T0的引脚作附加的外部中断输入端,TL0的计数初值
为 FFH;当检测到 T0引脚由 1至 0的负跳变时,TL0立即产生溢
出,申请中断,相当于边沿触发的外部中断源。
T0的模式 3下,TL0作计数用,而 TH0可用作 8位的定时器,定
时器控制 P1.0输出 10KHz的方波信号。
P1.0输出方波的信号为 10KHz,周期为 1/10KHz= 0.1ms。
TH0定时为 0.05ms,TL0的计数初值为 FFH; TH0的计数初值
X= 28-( 0.05× 10-3× 12× 106) /12=216=D8H
49
程序,ORG 0010H
MOV TMOD,#27H ;T0工作于方式 3,计数; T1工作于方式 2,定时
MOV TL0,#FFH ; TL0的计数初值
MOV TH0,#D8H ; TH0的计数初值
MOV TH1,#data[H] ; data为根据波特率要求设置的常数
MOV TL1,#data[L]
MOV TCON,#55H ;外中断 0,1边沿触发,启动 T0,T1
MOV IE,#9FH ;开放全部中断
TL0溢出中断服务程序(由 000BH)转来
TL0OF,MOV TL0,#FFH ; TL0重装计数初值
…
RETI
TH0溢出中断服务程序(由 001BH)转来
TH0OF,MOV TH0,#D8H ; TH0重装计数初值
CPL P1.0 ;取反输出
50
运行中读定时 /计数器
80C51可以随时读写计数寄存器 TLx和 THx,例实时显示计数值。
在读取操作时应注意分时读取 TLx和 THx。例如:先读 TLx,再读 THx,
如果此时定时 /计数器还在运行,在读 THx之前刚好 TLx溢出,向 THx
产生进位,则读得的 TLx值就是不正确的;同样,先读 THx,再读
TLx时也可能产生这种错误。
解决方法:先读 THx,再读 TLx,再重读 THx,若两次读得的 THx值相
同,则可以确定读入的数据是正确的,若两次读得的 THx值不一致,
则必须重读。
程序:
RDTIME,MOV A,TH0 ;先读 TH0
MOV R0,TL0 ;读入 TL0并存入 R0
CJNE A,TH0,RDTIME ;再读 TH0,与上次读入值比较,若不等重读
MOV R1,A ;若相等,存 TH0在 R1中
RET
51
5.3.4 定时 /计数器用于外部中断扩展
扩展方法是,将定时 /计数器设置为计数器方式,计数初值
设定为满程,将待扩展的外部中断源接到定时 /计数器的外部
计数引脚。从该引脚输入一个下降沿信号,计数器加 1后便产
生定时 /计数器溢出中断。
例如,利用 T0扩展一个外部中断源。将 T0设置为计数器方式,
按方式 2工作,TH0,TL0的初值均为 0FFH,T0允许中断,
CPU开放中断。 其初始化程序如下:
MOV TMOD,#06H ;置 T0为计数器方式 2
MOV TL0,#0FFH ;置计数初值
MOV TH0,#0FFH
SETB TR0 ;启动 T0工作
SETB EA ; CPU开中断
SETB ET0 ;允许 T0中断
52
5.3.5 定时 /计数器应用举例
初始化程序应完成如下工作:
?对 TMOD赋值,以确定 T0和 T1的工作方式。
?计算初值,并将其写入 TH0,TL0或 TH1,TL1。
?中断方式时,则对 IE赋值,开放中断。
?使 TR0或 TR1置位,启动定时 /计数器定时或计数。
53
例 利用定时 /计数器 T0的方式 1,产生 10ms的定时,
并使 P1.0引脚上输出周期为 20ms的方波,采用中
断方式,设系统时钟频率为 12 MHz。
解,1、计算计数初值 X:
由于晶振为 12 MHz,所以机器周期 Tcy为 1μS。
所以:
N= t/ Tcy = 10× 10- 3/1× 10- 6= 10000
X= 65536- 10000= 55536= D8F0H
即应将 D8H送入 TH0中,F0H送入 TL0中
2、求 T0的方式控制字 TMOD:
M1M0=01,GATE=0,C/T=0,可取方式控制
字为 01H;
54
ORG 0000H
LJMP MAIN ;跳转到主程序
ORG 000BH ; T0的中断入口地址
LJMP DVT0 ;转向中断服务程序
ORG 0100H
MAIN,MOV TMOD,#01H ;置 T0工作于方式 1
MOV TH0,#0D8H ;装入计数初值
MOV TL0,#0F0H
SETB ET0 ; T0开中断
SETB EA ; CPU开中断
SETB TR0 ;启动 T0
SJMP $ ;等待中断
DVT0,CPL P1.0 ; P1.0取反输出
MOV TH0,#0D8H ;重新装入计数值
MOV TL0,#0F0H
RETI ;中断返回
END
55
思考题及习题
1,80C51有几个中断源?各中断标志是如何产生的?又是如何
复位的? CPU响应各中断时,其中断入口地址是多少?
2、某系统有三个外部中断源 1,2,3,当某一中断源变低电平
时便要求 CPU处理,它们的优先处理次序由高到低为 3,2,1,
处理程序的入口地址分别为 2000H,2100H,2200H。试编写
主程序及中断服务程序(转至相应的入口即可)。
3、外部中断源有电平触发和边沿触发两种触发方式,这两种触
发方式所产生的中断过程有何不同?怎样设定?
4、定时 /计数器工作于定时和计数方式时有何异同点?
5、定时 /计数器的 4种工作方式各有何特点?
6、要求定时 /计数器的运行控制完全由 TR1,TR0确定和完全由、
高低电平控制时,其初始化编程应作何处理?