5.3 80C51的定时 /计数器
实现定时功能,比较方便的办法是利用单
片机内部的定时 /计数器 。也可以采用下面三
种方法:
?软件定时,软件定时不占用硬件资源,但占用了
CPU时间,降低了 CPU的利用率。
?采用时基电路定时,例如采用 555电路,外接必要
的元器件(电阻和电容),即可构成硬件定时电路。
但在硬件连接好以后,定时值与定时范围不能由软
件进行控制和修改,即不可编程。
?采用可编程芯片定时,这种定时芯片的定时值及
定时范围很容易用软件来确定和修改,此种芯片定
时功能强,使用灵活。在单片机的定时 /计数器不够
用时,可以考虑进行扩展。
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
二、定时 /计数器的工作原理
加 1计数器 输入的计数脉冲有两个来源,一个是由
系统的时钟振荡器输出脉冲经 12分频后送来;一个
是 T0或 T1引脚输入的外部脉冲源。每来一个脉冲
计数器加 1,当加到计数器为全 1时,再输入一个脉
冲就使计数器回零,且计数器的溢出使 TCON中
TF0或 TF1置 1,向 CPU发出中断请求(定时 /计数
器中断允许时)。如果定时 /计数器工作于定时模
式,则表示定时时间已到;如果工作于计数模式,
则表示计数值已满。
可见,由溢出时计数器的值减去计数初值才是加
1计数器的计数值 。
?设置为定时器模式时,加 1计数器是对内部机器周期
计数( 1个机器周期等于 12个振荡周期,即计数频率
为晶振频率的 1/12)。 计数值 N乘以机器周期 Tcy就
是定时时间 t 。
?设置为 计数器模式时,外部事件计数脉冲由 T0或 T1
引脚输入到计数器。在每个机器周期的 S5P2期间采
样 T0,T1引脚电平。当某周期采样到一高电平输入,
而下一周期又采样到一低电平时,则计数器加 1,更
新的计数值在下一个机器周期的 S3P1期间装入计数
器。由于检测一个从 1到 0的下降沿需要 2个机器周期,
因此要求被采样的电平至少要维持一个机器周期。当
晶振频率为 12MHz时,最高计数频率不超过 1/2MHz,
即计数脉冲的周期要大于 2 ?s。
5.3.2 定时 /计数器的控制
80C51单片机定时 /计数器的工作由两个特殊功
能寄存器控制。 TMOD用于设置其工作方式;
TCON用于控制其启动和中断申请。
一、工作方式寄存器 TMOD
工作方式寄存器 TMOD用于设置定时 /计数器的
工作方式,低四位用于 T0,高四位用于 T1。其格式
如下:
GATE:门控位。 GATE= 0时,只要用软件使 TCON中的
TR0或 TR1为 1,就可以启动定时 /计数器工作; GATA= 1时,
要用软件使 TR0或 TR1为 1,同时外部中断引脚或也为高电
平时,才能启动定时 /计数器工作。即此时定时器的启动条
件,加上了或引脚为高电平这一条件。
:定时 /计数模式选择位。 = 0为定时模式; =1
为计数模式。
M1M0:工作方式设置位。定时 /计数器有四种工作方式,
由 M1M0进行设置。
C/T C/TC/T
二、控制寄存器 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类同。
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
定时器模式时 有,N= t/ Tcy
计数初值计算的公式为:
定时器的初值还可以采用计数个数直接取补法获得 。
计数模式时,计数脉冲是 T0引脚上的外部脉冲。
13X = 2 -N
门控位 GATE具有特殊的作用。当 GATE=0时,经反相后使
或门输出为 1,此时仅由 TR0控制与门的开启,与门输出 1
时,控制开关接通,计数开始; 当 GATE=1时,由外中断引
脚信号控制或门的输出,此时控制 与门的开启由外中断引
脚信号和 TR0共同控制 。当 TR0=1时,外中断引脚信号引脚
的 高电平启动计数,外中断引脚信号引脚的 低电平停止计
数 。这种方式常用来测量外中断引脚上正脉冲的宽度。
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
申 请
中 断
计数个数与计数初值的关系为:
8X=2 -N
三、方式 2
方式 2为自动重装初值的 8位计数方式。
工作方式 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
申 请
中 断
计数个数与计数初值的关系为,
四、方式 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 位
申 请
中 断
溢 出
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中断
5.3.5 定时 /计数器应用举例
初始化程序应完成如下工作:
?对 TMOD赋值,以确定 T0和 T1的工作方式。
?计算初值,并将其写入 TH0,TL0或 TH1,TL1。
?中断方式时,则对 IE赋值,开放中断。
?使 TR0或 TR1置位,启动定时 /计数器定时或计数。
例 利用定时 /计数器 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;
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
思考题及习题
1,80C51有几个中断源?各中断标志是如何产生的?又是如
何复位的? CPU响应各中断时,其中断入口地址是多少?
2、某系统有三个外部中断源 1,2,3,当某一中断源变低电
平时便要求 CPU处理,它们的优先处理次序由高到低为 3,2、
1,处理程序的入口地址分别为 2000H,2100H,2200H。试
编写主程序及中断服务程序(转至相应的入口即可)。
3、外部中断源有电平触发和边沿触发两种触发方式,这两种
触发方式所产生的中断过程有何不同?怎样设定?
4、定时 /计数器工作于定时和计数方式时有何异同点?
5、定时 /计数器的 4种工作方式各有何特点?
6、要求定时 /计数器的运行控制完全由 TR1,TR0确定和完全
由、高低电平控制时,其初始化编程应作何处理?
7、当定时 /计数器 T0用作方式 3时,定时 /计数器 T1可以工作
在何种方式下?如何控制 T1的开启和关闭?
8、利用定时 /计数器 T0从 P1.0输出周期为 1s,脉宽为 20ms
的正脉冲信号,晶振频率为 12MHz。试设计程序。
9、要求从 P1.1引脚输出 1000Hz方波,晶振频率为 12MHz。
试设计程序。
10、试用定时 /计数器 T1对外部事件计数。要求每计数 100,
就将 T1改成定时方式,控制 P1.7输出一个脉宽为 10ms的正
脉冲,然后又转为计数方式,如此反复循环。设晶振频率为
12MHz。
11、利用定时 /计数器 T0产生定时时钟,由 P1口控制 8个指示
灯。编一个程序,使 8个指示灯依次一个一个闪动,闪动频率
为 20次 /秒 (8个灯依次亮一遍为一个周期 )。
12、若晶振频率为 12MHz,如何用 T0来测量 20~ 1s之间的
方波周期?又如何测量频率为 0.5MHz左右的脉冲频率?