第六章
单片微机的定时器 /计数器
原理及应用
在单片微机应用系统中, 常常会需要定时或计数, 通常
采用以下三种方法来实现:
1.硬件法
硬件定时功能完全由硬件电路完成, 不占用 CPU时间 。
但当要求改变定时时间时, 只能通过改变电路中的元件参数来
实现, 很不灵活 。
2,软件法
软件定时是执行一段循环程序来进行时间延时, 优点是
无额外的硬件开销, 时间比较精确 。 但牺牲了 CPU的时间,所以
软件延时时间不宜长, 而在实时控制等对响应时间敏感的场合
也不能使用 。 。
6-1 概述
3.可编程定时器/计数器
可编程定时器/计数器最大特点是可以通过软件编程来实现定时
时间的改变,通过中断或查询方法来完成定时功能或计数功能。
有专门的可编程定时器/计数器芯片可供选用,比如 Intel 8253。
还有一些日历时钟芯片,如菲利浦公司的 PCF8583等。
80C51包含有两个 16位的定时器/计数器,T0和 T1;
80C52包含有三个 16位的定时器/计数器,T0,T1和 T2;在
80C51系列的部分产品 ( 如 Philips公司的 80C552) 中, 还包含有
一个用做看门狗的 8位定时器 ( T3) 。
定时器/计数器的核心是一个加 1计数器, 其基本功能是
计数加 1。
若是对单片微机的 T0,T1 或 T2引脚上输入的一个 1到 0
的跳变进行计数增 l,即是计数功能 。
若是对单片微机内部的机器周期进行计数, 从而得到定
时, 这就是定时功能 。
定时功能和计数功能的设定和控制都是通过软件来设定
的 。
80C51的定时器 /计数器除了可用作定时器或计数器之外,
还可用作串行接口的波特率发生器 。
T0,T1 的内部结构简图示于 图 6- 1中 。 从图中可以看
出, T0,T1由以下几部分组成:
? 计数器 TH0,TL0和 TH1,TL1;
? 特殊功能寄存器 TMOD,TCON;
? 时钟分频器;
? 输入引脚 T0,T1。
6.2 定时器/计数器 T0,T1
⒈ T0,T1 的方式寄存器 ——TMOD
字节地址为 89H。
TMOD的格式如下:低 4位用来定义 T0,高 4位用来定
义 T1
6.2.1 与定时器/计数器 T0,T1有关的
特殊功能寄存器
D7 D6 D5 D4 D3 D2 D1 D0
GATE C/T M1 M0 GATE C/T M1 M0
T1 T0
各位的意义如下:
? GATE——门控位
GATE= 1时, 由外部中断引脚, 和 TR0,TR1共同来启动
定时器 。 当 引脚为高电平时, TR0置位启动定时器 T0;当
引脚为高电平时, TR1置位, 启动定时器 T1。
GATE= 0时, 仅由 TR0和 TR1置位来启动定时器 T0和 T1。
C/ T——功能选择位
C/T= 1时, 选择计数功能; C/T= 0时, 选择定时功能 。
T0,T1 的计数、定时功能是通过 TMOD中的 C/T位来选择的。
① 定时器, 设置 C/T= 0
计数输入信号是内部时钟脉冲, 每个 机器周期 使寄存器的值增 1。
每个机器周期等于 12个振荡周期, 故计数速率为振荡周期的 1/
12。 当采用 12MHz的晶体时, 计数速率为 1MHz。 定时器的定时
时间, 与系统的振荡频率 fosc,计数器的长度和初始值等有关 。
② 计数器, 设置 C/T= 1
通过引脚 T0( P3.4) 和 T1(P3.5)对外部信号进行计数 。 在
每个机器周期的 S5P2期间, CPU采样引脚的输入电平 。 若前一机
器周期采样值为 1,下一机器周期采样值为 0,则计数器增 1,此
后的机器周期 S3P1期间, 新的计数值装入计数器 。
所以检测一个 1到 0的跳变 需要两个机器周期, 故计数脉冲频率
不能高于振荡脉冲频率的 1/ 24。
? M1,M0——工作方式选择位 。
由于有 M1和 M0两位, 可以有四种工作方式, 如 表 6- 1所
示 。
⒉ 定时器/计数器 T0,T1的控制寄存器 ——TCON
控制寄存器 TCON是一个逐位定义的 8位寄存器, 字节地址为
88H,位寻址的地址为 88H~ 8FH。 其格式如下:
位地

8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
位功

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
其中各位的意义如下:
? TF1( TCON,7) ——定时器/计数器 T1的溢出标志 。
T1溢出时, 该位由内部硬件置位 。 若中断开放, 即响应
中断, 进入中断服务程序后, 由硬件自动清 0;若中断禁止,
可用于判跳, 用软件清 0。
? TR1( TCON,6) ——T1的运行控制位 。
用软件控制, 置 l时, 启动 T1;清 0时, 停止 T1。
? TF0( TCON,5) ——T0的溢出标志 。
T0溢出时, 该位由内部硬件置位 。 若中断开放, 即响应
中断, 进入中断服务程序后, 由硬件自动清 0;若中断
禁止, 可用于判跳, 用软件清 0。
? TR0( TCON,4) ——T0的运行控制位 。
用软件控制, 置 1时, 启动 T0;清 0时, 停止 T0。
? IE1( TCON,3) ——外部中断 1下降沿触发标志位 。
? IE0( TCON,I) ——外部中断 0下降沿触发标志位 。
? IT1( TCON,0) ——外部中断 1触发类型选择位 。
? IT0( TCON,0) ——外部中断 0触发类型选择位 。
TCON的低 4位与中断有关, 已在第五章, 中断系统, 中讨论
过 。
复位后,TCON的所有位均清 0。 T0和 T1均是关断的。
⒊ T0,T1 的数据寄存器
由 TH1(地址为 8DH),TL1(地址为 8BH)和 TH0(地址为
8CH),TL0(地址为 8AH)寄存器所组成 。 复位后, 所有这四个寄
存器全部清零 。
⒋ 定时器 /计数器中断
⑴ 中断允许寄存器 IE
? EA位 --中断允许总控制位
? ET0位, ET1位, ET2位 --T0,T1和 T2的中断允许控制位 。
某位 =0,则禁止对应定时器 /计数器的中断 。
某位 =1,则允许对应定时器 /计数器的中断 。
⑵ 中断矢量
定时器 T0,000BH
定时器 T1,001BH
定时器 T2,002BH
⑶ 中断优先级寄存器 IP
PT0位, PT1位, PT2位 --T0,T1和 T2中断优先级控制
位 。
某位为 0,则相应的定时器 /计数器的中断为低优先级;
某位为 1,则相应的定时器 /计数器的中断为高优先级 。
根据对 TMOD寄存器中 M1和 M0的设定, T0可选择四
种不同的工作方式, 而 T1只具有三种工作方式 ( 即方式 0,方
式 1和方式 2) 。
⒈ 方式 0,13位定时器 /计数器
当 TMOD中的 M1= 0,M0= 0时, 选定方式 0工作 。
从 图 6–2中可看到:
C/T位的电平为 0或 1,用来设定是作定时器或计数器 。
6.2.2 定时器/计数器 T0,T1 的工作方式
门控位 GATE可用作对 INTx引脚上的高电平时间进行计量 。
由 图 6–2上可看出, 当 GATE= 0时, A点为高电平, 定时器/计数
器的启动/停止由 TRx决定 。 TRx= 1,定时器/计数器启动;
TRx= 0,定时器/计数器停止 。
当 GATE= 1时, A点的电位由 INTx决定, 因而 B点的电位就
由 TRx和 INTx决定, 即定时器/计数器的启动/停止由 TRx和
INTx两个条件决定 。
计数溢出时, TFx置位 。 如果中断允许, CPU响应中断并转入中
断服务程序, 由内部硬件清 TFx。 TFx也可以由程序查询和清零 。
⒉ 方式 1,16位定时器 /计数器
当 TMOD中的 M1= 0,M0= l时, 选定方式 1工作 。
方式 1时, T0,T1的逻辑结构如 图 6- 3所示 。 这种方式下, 计
数寄存器由 16位组成, THx高 8位和 TLx的低 8位 。
计数时, TLx溢出后向 THx进位, THx溢出后将 TFx置
位, 如果中断允许, CPU响应中断并转入中断服务程序, 由
内部硬件清 TFx。 TFx也可以由程序查询和清零 。
⒊ 方式 2:定时常数自动重装载的 8位定时器 /计数器
当 TMOD中的 M1= 1,M0= 0时, 选定方式 2工作 。 这种方式
是将 16位计数寄存器分为两个 8位寄存器, 组成一个可重载的 8
位计数寄存器 。 方式 2时定时器 /计数器 T0,T1的逻辑结构如
图 6- 4所示 。
在方式 2中, TLx作为 8位计数寄存器, THx作为 8位计数常数
寄存器 。
当 TLx计数溢出时, 一方面将 TFx置位, 并向 CPU申请中断;
另一方面将 THx的内容重新装入 TLx中, 继续计数 。
计数时,TLx的低 5位溢出后向 THx进位,THx溢出后将 TFx置
位,并向 CPU申请中断。方式 0时的结构如 图 6- 2所示。这种
方式下,计数寄存器由 13位组成,即 THx高八位 (作计数器 )和
TLx的低 5位 (32分频的定标器 )构成。 TLx的高 3位未用。重新
装入不影响 THx的内容。
方式 2适合于作为串行口波特率发生器使用 。
⒋ 方式 3
当 TMOD中的 M1= l,M0= 1时, 选定方式 3工作 。 这种方式
是是将 T0分为一个 8位定时器/计数器和一个 8位定时器,
TL0用于 8位定时器/计数器, TH0用于 8位定时器 。 方式 3时
定时器/计数器 T0,T1逻辑结构分别如 图 6–5,图 6–6所示 。
⑴ 工作方式 3下的定时器 /计数器 T0
方式 3时, T0的结构见 图 6–5 所示 。 其工作与方式 0时相同, 只
是此时的计数器为 8位计数器 TL0,它占用了 T0的 GATE、
INT0,启动/停止控制位 TR0,T0引脚 (P3.4) 以及 计数溢出
标志位 TF 0和 T0的中断矢量 (地址为 000BH)等 。
⑵ 工作方式 3下的定时器 /计数器 T1
T0方式 3时, T1的结构如图 6–6所示, T1只可选方式 0,1或 2。
作串行口波特率发生器时, T1的计数输出直接去串行口, 只需
设置好工作方式, 串行口波特率发生器自动开始运行, 如要停
止工作, 只需向 T1送一个设为工作方式 3的控制字即可 。
80C52中的 T2是一个 16位的, 具有自动重装载和捕获能
力的定时器/计数器 。 在 T2的内部, 除了两个 8位计数器 TL2、
TH2和控制寄存器 T2CON及 T2MOD之外, 还设置有捕获寄存
器 RCAP2L( 低字节 ) 和 RCAP2H( 高字节 ) 。 T2的计数脉冲
源可以有两个:一个是内部机器周期, 另一个是由 T2( P1,0)
端输入的外部计数脉冲 。 T2象 T0,T1一样, 既可用做定时器,
也可用做计数器, 由 T2CON中的 C/T位的电平所决定 。 T2有 3
种工作方式 ∶ 自动重装载, 俘获和波特率发生器方式, 由
T2CON中有关位决定 。
输入引脚 T2( P1,0) 是外部计数脉冲输入端;输入引
脚 T2EX( P1,1) 是外部控制信号输入端 。
6.3 定时器/计数器 T2
⒈ 控制寄存器 T2CON
T2控制寄存器 T2CON是一个逐位定义的特殊功能
寄存器,其格式如下:
位地址 CFH CEH CDH CCH CBH CAH C9H C8H
位功能 TF2 EXF2 RCL
K
TCLK EXE
N2
TR2 C/T2 CP/R
L2
6.3.1 定时器/计数器 T2中的
特殊功能寄存器
TF2( T2CON,7) ——T2 溢出标志。
定时器 T2溢出时置位,并申请中断。只能靠软件清除。
但在波特率发生器方式下,也即 RCLK= 1或 TCLK= 1时,
定时器溢出不对 TF2置位。
? EXF2( T2CON,6) ——T2外部标志。
当 EXEN2= 1,且 T2EX引脚上出现负跳变而造成捕获或重
装载时 EXF2置位,申请中断。这时若已允许 T2中断,CPU
将响应中断,转向中断服务程序。 EXF2要靠软件来清除。
? RCLK( T2CON,5) ——接收时钟标志 。
靠软件置位或清除, 用以选择 T2或 T1作串行口接收波特
率发生器 。 RCLK= 1时, 用 T2溢出脉冲作为串行口的接收
时钟; RCLK= 0时, 用 T1的溢出脉冲作接收时钟 。
? TCLK( T2CON,4) ——发送时钟标志 。
靠软件置位或清除, 用以选择 T2或 T1作串行口发送波特
率发生器 。 TCLK= l时, 用 T2溢出脉冲作为串行口的发送
时钟; TCLK= 0时, 用 T1的溢出脉冲作发送时钟 。
? EXEN2( T2CON,3) ——T2外部允许标志 。
靠软件设置或清除, 以允许或禁止用外部信号来触发捕获
或重装载操作 。 当 EXEN2= l时, 若 T2未用作串行口的波特率发生
器, 则在 T2EX端出现的信号负跳变时, 将造成 T2捕获或重装载,
并置 EXF2标志为 1,请求中断 。 EXEN2= 0时, T2EX端的外部信号
不起作用 。
? TR2( T2CON,2) ——T2运行控制位 。
靠软件设置或清除, 以决定 T2是否运行 。 TR2= 1,启动 T2,
否则停止 。
?C/T2( T2CON,1) ——T2的定时器方式或计数器方式选
择位 。
靠软件设置或清除 。 T2有计数和定时两种功能,,由控制
位 C/T2决定 。
C/T2= 0时, 选择定时器工作方式 。 TH2和 TL2对机器周期
进行计数 。 每个机器周期使 TL2寄存器的值增 1。 计数脉冲
的频率为 1/ 12振荡器频率 。
C/ T2= 1时, 选择计数器工作方式, 下降沿触发 。 计数脉冲自 T2
( P1,0) 引脚输入, TH2和 TL2作外部信号脉冲计数器用, 每当外
部脉冲负跳变时, 计数器值增 1。 其工作情况和时序关系与定时器
/计数器 T0和 T1的完全一样, 对外部计数脉冲的要求也相同 。 在每
个机器周期的 S5P2期间, CPU采样引脚的输入电平 。 若前一机器周
期采样值为 1,下一机器周期采样值为 0,则计数器增 1,此后的机
器周期 S3P1期间, 新的计数值装入计数器 。 所以检测一个 1到 0的跳
变需要两个机器周期, 故 外部脉冲频率不超过振荡器频率的 1/ 24。
? CP/ RL2( T2CON,0) ——捕获/重装载标志 。
用软件设置或清除 。 CP/ RL2= l选择捕获功能, 这时若
EXEN2= 1,且 T2EX端的信号负跳变时, 发生捕获操作 。 CP
/ RL2= 0,选择重装载功能, 这时若 T2溢出或在 EXEN2= 1
条件下 T2EX端信号负跳变, 都会造成自动重装载操作 。 当
RCLK= l或 TCLK= l时, CP/ RL2控制位不起作用, T2 被强
制工作于重装载方式 。 重装载发生于 T2溢出时, 常用来作
波特率发生器 。
T2CON中的各位都是可位寻址的, 因此所有标志或控制位都
可以靠软件来设置或清除 。
T2控制寄存器 T2CON的复位值 =00000000B
⒉ 方式控制寄存器 ——T2MOD
方式控制寄存器 T2MOD是 80C52/ 54/ 58芯片新增添的,T2的
方式控制寄存器,字节地址为 C9H。其格式如下:
位地

D7 D6 D5 D4 D3 D2 D1 D0
位功

- - - - - - T2OE DCEN
该寄存器定义了 2位, 它们的含义是:
? T2OE( T2MOD,l) ——T2输出允许位 。
当 T2OE= 1时, 允许时钟输出至 T2( P1,0) 引脚 。 这
一位仅对 80C54/ 80C58有定义 。
⒊ 数据寄存器 ——TH2,TL2
T2有一个 16位的数据寄存器, 是由高 8位寄存器 TH2和低 8位
寄存器 TL2所组成 。 它们都只能字节寻址, 相应的字节地址为
CDH和 CCH。 这两个寄存器都是读/写寄存器 。
复位后,所有这两个寄存器全部清零。
⒋ 捕获寄存器 ——RCAP2H,RCAP2L
T2中的捕获寄存器是一个 16位的数据寄存器,由高 8位寄存器
RCAP2H和低 8 位寄存器 RCAP2L所组成。它们也都只能字节寻址,
相应的字节地址为 CBH和 CAH。
捕获寄存器 RCAP2H和 RCAP2L,用于捕获计数器 TL2,TH2
的计数状态,或用来预置计数初值的。 TH2,TL2和 RCAP2H、
RCAP2L之间接有双向缓冲器(三态门)。
复位后, 所有这两个寄存器全部清零 。
T2的工作方式用控制位 CP/ RL2( T2CON,0)和 RCLK
+ TCLK来选择。 T2可能有三种工作方式( 表 6- 2):捕获方式、
自动重转载方式和波特率发生器方式。
⒈ 捕获方式
捕获方式是指:在一定条件下, 自动将计数器 TH2和 TL2的数据
读入捕获寄存器 RCAP2H和 RCAP2L,亦即 TH2和 TL2内容的捕
获是通过捕获寄存器 RCAP2H和 RCAP2L来实现的 。 其工作原理
可参见 图 6- 7。
当 CP/ RL2= l时, 选择捕获方式 。 捕获操作发生于下述两种情
况下:
6.3.2 定时器/计数器 T2的工作方式
⑴ 定时器 2的寄存器 TH2和 TL2溢出时, 打开重装载三态缓冲器,
把 TH2和 TL2的内容自动读入到捕获寄存器 RCAP2H和 RCAP2L
中 。 同时, 溢出标志 TF2置 1,申请中断 。
⑵ 当 EXEN2= l且 T2EX( P1,1) 端的信号有负跳变时, 将
发生捕获操作 。 同时标志 EXF2置 1,申请中断 。
若 T2的中断是被允许的, 则无论发生 TF2= l还是 EXF2= l,
CPU都会响应中断, 此中断向量的地址为 002BH。 响应中断后,
应用软件清除中断申请 。 TF2和 EXF2都是直接可寻址位, 可采
用 CLR TF2和 CLR EXF2指令实现清除中断申请的功能 。
⒉ 自动重装载方式
自动重装载方式是指:在一定条件下, 自动地将捕获寄存器
RCAP2H和 RCAP2L的数据装入计数器 TH2和 TL2中 。
一般说来捕获寄存器 RCAP2H和 RCAP2L在这里起预置
计数初值的功能 。 对 8XC52,其工作原理可参见 图 6- 8。
当 CP/ RL2= 0时, 选择自动重装载方式 。
重装载操作发生于下述两种情况下:
⑴ T2的寄存器 TH2和 TL2溢出时, 打开重装载三态缓冲器,
把捕获寄存器 RCAP2H和 RCAP2L的内容自动装载到 TH2和
TL2中 。 同时, 溢出标志 TF2置 1,申请中断 。
⑵ 当 EXEN2= 1且 T2EX( P1,1) 端的信号有负跳变时, 将发
生重装载操作 。 同时标志 EXF2置 1,申请中断 。
若 T2的中断是被允许的, 则无论发生 TF2= 1还是 EXF2= 1,
CPU都会响应中断, 此中断向量的地址为 002BH。 响应中断后,
应用软件撤除中断申请 。 TF2 和 EXF2都是直接可寻址位, 可
采用 CLR TF2和 CLR EXF2指令实现撤除中断申请的功能 。
⒊ 波特率发生器方式
当 T2CON中 RCLK十 TCLK= 1时, T2工作于波特率发生器方式,
即其溢出脉冲用做串行口的时钟 。 T2的波特率发生器方式下的结构
图示于 图 6- 9中 。 在 T2CON中, RCLK选择串行通信接收波特率发
生器, TCLK选择发送波特率发生器, 因而, 发送和接收的波特率
可以不同 。
此时, T2的输入时钟可由内部时钟决定, 也可由外部时钟决定 。
若 C/ T2= 0,选用内部时钟, 对机器周期计数, 计数脉冲的频率
为 1/ 12振荡器频率,
若 C/T2= 1,选用外部时钟, 该时钟由 T2( P1,0) 端输入, 每当
外部脉冲负跳变时, 计 数器值增 l。 外部脉冲频率不超过振荡器频
率的 l/ 24。
由于脉冲溢出时, RCAP2H和 RCAP2L的内容会自动装载
到 TH2和 TL2中, 故波特率的值还决定于 RCAP2H和 RCAP2L装
载初值 。
RCLK+ TCLK还用于选择 T1还是 T2作串行通信的波特率
发生器 。 由 图 6- 9可看出, 这两位的值用来控制两个电子开关的
位置 。 值为 0时, 选用 T1做波特率发生器;值为 1时, 选用 T2做波
特率发生器 。
当 T2用做波特率发生器时, TH2的溢出不使 TF2置位, 不产生
中断 。 因而, 当 T2用做波特率发生器时, 没有必要禁止中断 。
当 T2用做波特率发生器时, 若 EXEN2置 1,则 T2EX端的信号产
生负跳变时, EXF2将置 1,但不会发生重装载或捕获操作 。 这时,
T2EX可以作为一个附加的外部中断源 。
在波特率发生器工作方式下, 在 T2计数过程中 ( 即 TR2= 1
之后 ), 不能再读/写 TH2和 TL2的内容 。
如果读, 则读出的结果不会精确 ( 因为每个状态加 1) ;如果写,
则会影响 T2的溢出而使波特率不稳定 。 在 T2计数过程中, 可以
读出但不能改写 RCAP2H和 RCAP2L的内容 。 需要访问 RCAP2H和
RCAP2L,应事先关闭定时器工作 。
T3有时俗称看门狗 ( watchdog), 它的作用是强迫单
片微机进入复位状态, 使之从硬件或软件故障中解脱出来 。
在实际应用中, 由于现场的各种干扰或者程序设计错误, 可
能使单片微机的程序进入了, 死循环, 或, 非程序区, (如
表格数据区 ) 之后, 在一个设定的时间 (监视时间间隔, 视应
用场合要求而定 )内, 假如用户程序没有重装监视定时器 T3,
监视电路将产生一个系统复位信号, 强迫单片微机退出, 死
循环, 或, 非程序区,, 重新进行, 冷启动, 或, 热启
动, 。
在飞利浦 80C552中, 监视定时器 T3由一个 11位的分频
器和 8位定时器 T3组成, 如 图 6一 10所示 。
6.4 监视定时器 (看门狗 )T3
预分频器输入为晶振 1/12的信号,晶振为 12MHz时,输
入为 1MHz,而 8位定时器 T3每隔时间 t加 1:
t= 12× 2048/fosc
当晶振为 12MHz时,t为 2ms。
若 8位定时器溢出,则产生一个尖脉冲,它将复位
8× C552,同时在 RST引脚上也将产生 1个正的复位尖脉
冲。 T3由外部引脚 /EW和电源控制寄存器中的 PCON,4
( WLE)和 PCON,l( PD)控制。
? EW——看门狗定时器允许, 低电平有效 。
EW= 0时, 允许看门狗定时器, 禁止掉电方式; EW
= 1时, 禁止看门狗定时器, 允许掉电方式 。
WLE( PCON,4) ——看门狗定时器允许重装
标志 。
若 WLE置位, 定时器 T3只能被软件装入, 装入后 WLE
自动清除 。
定时器 T3的重装和溢出, 产生复位的时间间隔, 由装入
T3的值决定, 对于 8× C552,其监视间隔可编程为 2ms至
2× 255ms。
定时器 T3的工作过程:在 T3溢出时, 复位 8XC552,并
产生复位脉冲输出至复位引脚 RST。 为防止系统复位, 必
须在定时器 T3溢出前, 通过软件对其进行重装 。 如果发生
软件或硬件故障, 将使软件对定时器 T3重装失败,
从而 T3溢出导致复位信号的产生 。 用这样的方法可以在软件
失控时, 恢复程序的正常运行 。
首先要确定系统能在不正常状态下维持多久, 这段时间
就设定为监视定时器的最大间隔时间 。 因为 T3是加 1计数器,
T3中装入 0,则监视时间间隔最长, 装入值为 FFH时, 监视时
间间隔最短 。
例,watchdog使用的一段程序如下:
T3 EQU 0FFH ;定时器 T3的地址
PCON EQU 87H ;电源控制寄存器 PCON的地址
WATCH_INTV EQU 156 ;看门狗的时间间隔 (2X100ms)
插在用户程序中对看门狗需要重新装入的地方:
LCALL WATCHDOG
看门狗的服务子程序:
WATCHDOG,ORL PCON,# 10H ;允许定时器 T3重装
MOV T3,# WATCH_ INTV ;装载定时器 T3
RET
⒈ 定时器/计数器溢出率的计算
定时器/计数器运行前, 在其中预先置入的常数, 称
为定时常数或计数常数 ( TC) 。 由于计数器是加 1( 向上 )
计数的, 故而预先置入的常数均应为补码 。
其中:
t——定时时间 。
Tc——机器周期 。
Fosc——晶体振荡器频率 。
L——计数器的长度 。
6.5 定时器 /计数器的应用编程
6.5.1 定时器的应用
对于 T0及 T1:
方式 0 L=13 213= 8 192
方式 1 L= 16 216= 65 536
方式 2 L= 8 28= 256
对于 T2:
L= 16 216= 65 536
TC——定时器/计数器初值, 即定时常数或计数常数 。
定时时间的倒数即为溢出率, 即:
根据要求的定时时间 t,设定的定时器工作方式 (确定 L) 及晶体
振荡频率 fosc,可计算出 TC值 (十进制数 ),再将其转换成二进
制数 TCB,然后再分别送入 THi,TLi( 对于 T0,i= 0;对于
T1,i= l) 。
对于 T0,T1:
方式 0时,TCB=TCH+ TCL,TCH——高 8位, TCL—低 5位
MOV THi,# TCH;送高 8位
MOV TLi,# TCL ;送 低 5位 (高 3位为 0)
方式 1时,TCB=TCH+ TCL,TCH——高 8位, TCL—低 8位
MOV THi,# TCH;送高 8位
MOV TLi,# TCL ;送 低 8位 。
方式 2时,TCB——8位重装载
MOV THi,# TCB;送高 8位 MOV TLi,# TCB ;送
低 8位 。
对于 T2:与 T0,T1的方式 1相同
例 1,要求在 P1,0引脚上产生周期为 2 ms的方波输出 。
已知晶体振荡器的频率为 fosc=6MHz。 可使用 T0作定
时器, 设为方式 0,设定 lms的定时, 每隔 1ms使 P1.0引脚上的
电平变反 。
(1) 解:定时常数计算
振荡器的频率 fosc= 6MHz,机器周期为 2μs,方式 0计数器
长度 L= 13(213= 8 192),定时时间 t= 1ms= 0.001s
定时常数:
TC为 7692= 1E0CH,二进制数 TCB= 0 0 0 1 1 1 1 0 0 0 0
0 1 1 0 0 B,取低 13位, 其中高 8位 TCH= F0H,低 5位为 TCL
= 0CH,计 数 长 度 为 1E0CH=7692, 定 时 为 (8192—
7692)× 2μs=0.001S
TMOD的设定 ( 即控制字 )
( 2) 编 程
ORG 0000H
AJMP MAIN
ORG 000BH ; T0中断矢量
AJMP INQP
ORG 0030H
MAIN,MOV TMOD,# 00H ; 写控制字, 设 T0为定时器;方式 0
MOV TH0,# 0F0H ;写定时常数 (定时 1ms)
MOV TL0,# 0CH
SETB TR0 ;启动 T0
SETB ET0 ;允许 T0中断
SETB EA ;开放 CPU中断
AJMP $ ;定时中断等待
ORG XXXX H ; T0中断服务程序
INQP,MOV TH0,# 0F0H ;重写定时常数
MOV TL0,# 0CH
CPL P1,0 ; P1,0变反输出
RETI ;中断返回
例 2.使用 T1的方式 1,设定 1ms的定时。在 P1,0引脚上产生
周期为 2 ms的方波输出。晶体振荡器的频率为 fosc= 6 MHz。
⑴ 解:
定时常数计算
振荡器的频率 fosc= 6MHz= 6× 106Hz,方式 1计数器长度 L
= 16,2L= 216= 65536 定时时间 t= 1ms= 0.001s
定时常数 TC转换成二进制 TCB= 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 B
= F E 0 CH
所以 TCH= FEH( 高 8位 ), TCL= 0CH( 低 8位 )
TMOD的设定 ( 即控制字 )
定时常数
⑵ 编 程
ORG 0000H
AJMP MAIN
ORG 001BH ; T1中断矢量地址
AJMP INQP
ORG 100H ;主程序入口
MAIN,MOV TMOD,# 10H ;写控制字, T1为定时器,;方式 1
MOV TH1,# 0FEH ;写定时常数, 定时 1ms
MOV TL1,# 0CH
SETB TR1 ;启动 T1
SETB ET1 ;允许 T1中断
SETB EA ;开放 CPU中断
AJMP $
ORG XX XX H ; T1中断服务程序
INQP,MOV TH1,# 0FEH ;重写定时常数
MOV TL1,# 0CH
CPL P1,0 ; P1,0变反输出
RETI ;中断返回
例 3,欲用 80C51产生两个方波, 一个周期为 200μs,另一个
周期为 400μs,该 80C51同时使用串行口, 用定时器/计数
器作为波特率发生器 。
⑴ 这时 T0采用方式 3工作, 其中, TL0产生 200μs定时, 由
P1,0输出方波; TH0产生 400μs定时, 由 Pl,1输出方波;
T1设置为方式 2作波特率发生器用 。 fOCC= 9,216 MHz。
定时常数计算
?TL0定时常数为 TCL0,tl0= 100μs
单位 μs,为十进数制数值 。 十六进制数值为 TL0= B3H。
?TH0定时常数为 TCH0:定时时间为 th0= 200μs
单位 μs,为十进制数值 。 十六进制的值为 TH0= 66 H。
?TH1的波特率 ( 详细计算见串行口部分 )
设波特率为 2400,则定时常数为 TC2= F6H
⑵ 编 程
ORG 0000H
AJMP MAIN
ORG 000BH ; TL0的中断入口
AJMP ITL0
ORG 00lBH ; TH0的中断入口
AJMP ITH0
ORG 0100H
MAIN,MOV SP,# 60H ;设栈指针
MOV TMOD,# 23H ;设 T0为方式 3,TI为 2
MOV TL0,# 0B3H ;设 TL0初值 (100μs定时 )
MOV TH0,# 66H ;设 TH0初值 (200μs定时 )
MOV TL1,# 0F6H ;设 TL1初值 ( 波特率为 2400)
MOV TH1,# 0F6H ;设 TH1初值
SETB TR0 ;启动 TL0
SETB TR1 ;启动 TH0
SETB ET0 ;允许 TL0中断
SETB ET1 ;允许 TH0中断
SETB EA ; CPU中断开放
AJMP $
ORG 0200H
ITL0,MOV TL0,# 0B3H ;重装定时常数
CPL P1,0 ;输出方波 (200μs)
RETI
ITH0,MOV TH0,# 66H ;重装定时常数
CPL P1,1 ;输出方波 (400μs)
RETI
当 TMOD寄存器中 C/T位设置为, 1”时, 定时器
/计数器作为计数器使用, 可对来自单片微机引脚 T0或
T1上的负跳变脉冲进行计数, 计数溢出时可申请中断,
也可查询溢出标志位 TFx。
例 4,假如一个用户系统已使用了两个外部中断源, 即
INT0和, INT1,用户系统要求从 P1.0引脚上输出一个
5KHz的方波, 并要求采用定时器 /计数器作为串行口的
波特率发生器, 另外还需要再增加一个外部中断源 。
6.5.2 计数器的应用
⑴ 把 T0设置为方式 3,把单片微机的引脚 T0作为外部中断源,
TL0设置为计数器, 计数器的定时常数设为 FFH,相当于一
个边沿触发的外部中断源 。 而在 T0方式 3下, TH0只能做 8位
定时器, 用来产生 5KHz方波的定时 。 当 T0设置为方式 3之后,
T1就作为串行口的波特率发生器, 设为方式 2。
由 P1.0引脚上输出 5KH频率的方波,而方波周期为
200μ s,则要求定时时间为 100μ s,若采用 12MHz的晶体振
荡器,则机器周期为 1μ s。
计算时间常数,(28- TC)× 1μs= 100μs
∴ TC= 256- 100= 156
⑵ 编程,ORG 0000H
SJMP MAIN
ORG 000BH
AJMP TL0INT ; TL0中断入口
ORG 001BH
AJMP TH0INT ; TH0中断入口
ORG 0030H
MAIN,MOV TMOD,#27H ;设 T0为方式 3,TL0为计数;器方式, TH0为定时器方式, T1作波特率发生器, 方式 2
MOV TH0,#156 ; TH0定时常数
MOV TL0,#0FFH ; TL0计数常数
MOV TL1,#BAUD ; BAUD根据波特率算出;的时间常数
MOV TH1,#BAUD
MOV TCON,#55H ;置 TR0和 TR1为, 1”,
启 ;动 TL0和 TH0
SETB ET0 ;允许 TR0中断
SETB ET1 ;允许 TR1中断
SETB EA ;允许 CPU中断
SJMP $ ;中断等待
ORG 0100H
TL0INT,MOV TL0,#0FFH ;重置计数长度
(中断处理 )
RETI
TH0INT,MOV TH0,#156 ;重置定时常数
CPL P1.0 ; P1.0引脚输出方波
RETI
门控位 GATE可用作对 INTx引脚上的高电平持续
时间进行计量。当 GATE位设为,1”,并设定时器 /计数
器启动位 TRx为,1”,这时定时器 /计数器定时完全取决
于 INTx引脚,仅当 INTx引脚电平为,1”时,定时器才
工作,换另一角度看,定时器实际记录的时间就是相应
INTx引脚上高电平的持续时间。
6.5.3 门控位 GATE的应用
通过反相器,则可测得相应 INTx引脚上低电平的持续时间。
二个时间的和即为 INTx引脚上输入波形的周期,其倒数即为
INTx引脚上输入波形的频率。还可算出占空比等参数。
例 5.利用定时器/计数器测定图 6- 11所示波形的一个周期长
度。
利用门控信号 GATE启动定时器的方法。设如图示,T0
为定时器,为高电平时,启动定时器; T1为计数器,T1的电
平由 1到 0,计数器计数。
P3.3( INT1)
TR1 置 1 T1开始计时 TR1清零
图 6–11 波形脉冲宽度测试原理
编程:
⑴ 查询法
ORG 0000H
START,MOV TMOD,#90H ;设置 T1为定时器,;方式 1,GATE位置 1
MOV TL1,#00H ;置为最大定时值
MOV TH1,#00H
LP1,JB P3.3,LP1 ; P3.3为高电平, 等待
SETB TR1 ;当 P3.3为低电平时,;置 TR1位为 1
LP2,JNB P3.3,LP2 ;当 P3.3为低电平时, 再等待
LP3,JB P3.3,LP3 ;当 P3.3为高电平时, T1开始定;时计数
CLR TR1 ;当 P3.3为低电平时, 高电平脉宽定;时计数结束
SJMP $
当 fosc= 12MHz时, 机器周期为 1μs,最大被测脉冲宽度为
65536μs (65.536ms)。 由于靠软件进行启动和停止计数, 存在一定
的测量误差 。
若被测波形除了接至 P3.3,另外同时通过一个反相器接至
P3.2 (INT0), 则通过编程同时可以测得波形的高电平宽度和低电
平宽度 。
⑵ 中断法
对于脉冲宽度大于 65.536ms的脉冲, 可以采用对定时溢出
次数进行计数的方法 。 这样, 脉宽为 (定时溢出时间 × 溢出次
数 )+定时时间 。 利用定时器 /计数器来测定脉冲周期的方法参
见 图 6-12。
(1) 设定晶体振荡器为 6 MHz,机器周期 Tc为 2μs,定时器 /计
数器 T0为方式 1,定时溢出时间为 100 ms,
则 T0定时时间常数为,( TH0) = 3CH,( TL0) = B0H
因为外部脉冲同时接至 T1的输入引脚 T1,所以 T1脚上对下
降沿计数二次, 即为外部脉冲的一个周期时间 。 现设 T1为计数器 。
计数值为 2。
当计数值为 1时, 启动定时器;当计数值为 2时, 中断计数器 T1,
并停止定时器 T0的定时 。 T1中断优先级设为高于定时器 T0。
计数初值为 FFFEH:( TH1)= FFH,( TL0)= FEH。
(2) 编 程
ORG 0000H
SJMP MAIN
ORG 000BH ;定时器 T0中断入口
AJMP TIMEO
ORG 00IBH ;定时器 T1中断入口
AJMPTIMEI
ORG 0030H
MAIN,MOV R0,# 0 ;清除 T0定时中断次数计数器
MOV TMOD,# 59H;设 T0为定时器, 方式 1,;门控位 GATE= 1,设 T1为计数器,;方式 1
MOV TH0,# 3CH ; T0定时器初值
MOV TLO,# 0B0H
MOV TH1,# 0FFH ; T1计数器初值
MOV TL1,# 0FEH
SETB TR0 ;启动 T0定时器
SETB TR1 ;启动 T1计数器
MOV IP,# 08H ; T1中断优先级高于 T0
SETB ET1 ;允许 T1中断
SETB ET0 ;允许 T0中断
SETB EA ; CPU开中断
SETB 20H ;设 20H为 T1计数中断标志
LOOP,SETB F0 ;设 F0为 T0定时中断标志
JB F0,$ ; T0定时未溢出, 等待
JB 20H,LOOP ;判 T1计数溢出, 若未溢出;则循环, 否则结束
ORG 0100H
TIMEO,MOV TL0,# 0B0H;重置 T0定时器初值
MOV TH0,# 3CH
INC R0 ; T0定时溢出计数器加 1
CPL F0 ; T0定时中断标志变反
RETI
ORG 0200H
TIMEI:CLR F0 ;清除 T0定时中断标志
CLR 20H ;清除 T1计数中断标志
CLR ET0 ;禁止 T0,T1中断
CLR ET1
CLR EA ;关中断
RETI
可测的最大周期长度为 256× 100ms= 25.6s。若周期大于 25.6S,
则不用 R0作计数器,改用 16位计数器即可。
80C51可以随时读写计数寄存器 TLx和 THx (x为 0
或 1), 用于实时显示计数值等 。
办法是:先读 THx,后读 TLx,再重读 THx,若
两次读得的 THx值是一样的, 则可以确定读入的数据是
正确的;若两次读得的 THx值不一致, 则必须重读 。
6.5.4 运行中读定时器 /计数器
例, 飞读
RDTIME,MOV A,TH0 ;读 TH0
MOV R0,TL0 ;读 TL0并存入 R0
CJNE A,TH0,RDTIME ;再读 TH0,与上次;读入的 TH0比较, 若不等, 重读
MOV R1,A ;存 TH0在 R1中
RET
END
图 6–1 定时器 /计数器 T0,T1的内部结构框图
图 6–2 方式 0时,定时器 /计数器 T0,T1的逻辑结构图
图 6–3 方式 1时,定时器 /计数器 T0,T1的逻辑结构图
图 6–4 方式 2时定时器 /计数器 T0,T1的结构简图
图 6–5 定时器 /计数器 T0方式 3时的逻辑结构图
图 6–6 定时器 /计数器 T0方式 3时,T1的逻辑结构图
图 6–7 定时器 /计数器 T2的捕获方式
图 6–8 定时器 /计数器 T2的自动重装载方式
图 6–9 定时器 /计数器 T2的波特率发生器方式
图 6–10 监视定时器 T3
图 6–12 利用定时器 /计数器测脉冲周期
M1 M0 工作方式 计数器配置
0 0 方式 0 13位计数器
0 1 方式 1 16位计数器
1 0 方式 2 自动重装载的 8位计数器
1 1 方式 3 T0分为两个 8位计数器,T1停止
计数
表 6–1定时器 /计数器的工作方式
RCLK+ TCLK CP/RL2 TR2 工 作 方 式
0 0 1 自动重装载方式
0 1 1 捕获方式
1 × 1 波特率发生器方式
× × 0 关闭
表 6–2 定时器 /计数器 T2的工作方式