(1)工作方式0
c/t -定时 / 计数功能选择位。
c/t =“0” ,对片内机器周期进行计数,作定时器用;
c/t =““1” ,对片外从 t0 ( p3.4 )、 t1 ( p3.5 )引脚输入 的外部脉冲信号进行计数 , 作计数器用。
gate -门控位。
gate=0 ,允许软件控制位 tr0 或 tr1 启动定时器;
gate=1 ,允许外中断引脚 int0( 或 int1) 为高电电平,且由软件使 tr0( 或 tr1) 置 1 时,才能启动定时器工作。
当 gate=0 时,封锁或门输出恒为 1 ,使外部中断输入引脚 int0 信号失效,同时又打开与门,由 tr0 控制定时器 t0 的开启和关断。若 tr0=1 ,接通控制开关,启动定时器 t0 工作,计数器被控制为允许计数。若 tr0=0 ,则断开控制开关,停止计数。
当 gate=1 时,与门的输出由 int0 的输入电平和 tr0 位的状态来确定。若 tr0=1 ,则打开与门,外部信号电平通过 int0 引脚直接开启或关断定时器 t0 。 当 int0 为高电平时,允许计数,否则停止计数。这种工作方式可用来测量外部信号的脉冲宽度等。
当 c/t=0 时, 控制开关接通振荡器 12 分频输出端, t0 对机器周期计数。 即定时器工作方式。
当 c/t=1 控制开关与引脚 t0 ( p3.4 )接通,计数器 t0 对来自外部引脚 t0 的输入脉冲计数,当外部信号电平发生由 1 到 0 跳变时,计数器加 1 ,这时, t0 成为外部事件计数器。
注意:定时计数器的计数范围与初值 x 的计算
① 定时器的计数规律:
t0 从某初值 x ,对脉冲计数到 1111111111111b(2 13 d=8192d) 溢出
计数个数: 2 13 - x
② 最大计数范围: 从初值 x = 0d ,计数到 1111111111111b(2 13 d)
③ 定时时间:
定时值 = 计数个数×机器周期
=( 2 13 - x )×机器周期
= ( 2 13 - x )×晶振周期× 12
最大定时值 =( 2 13 - 0 ) ×机器周期
例 1 如要求计数值为 1000 ,试计算定时计数器 t0 的初值
分析:由 213 - x = 1000
得 x = 213 - 1000 = 8192 - 1000
= 1c18h = 0001 1100 0001 1000b
故 th0 = 1 1100 000 = 0e0h
tl0 = 1 1000b = 000 1 1000b = 18h 。
例 2 利用 t0 方式 0 在 p1.0 引脚上输出周期 500us 的方波。设单片机 晶振频率 6mhz 。
分析: 要在 p1.0 输出周期为 500us 的方波,只要 p1.0 每隔 250us 取反一次即可,即定时时间为 250us :
① tmod 寄存器初始化:
tmod.1 tmod.0 m1m0=00 , t0 为方式 0 ;
tmod.2 c/t=0 t0 为定时状态;
tmod.3 gate=0 表示计数不受 int0 控制;
tmod.4 tmod.7 因 t1 不用,可取任意值,这里取为 0 。
故 tmod=00h
② 计算 250us 定时 t0 的初值: 设 t0 的计数初值为 x ,则
x=8067d=1f83h=0001 1111 1000 0011b
故 th0= 1 1111 100 高 8 位 =fch
tl0=0000 0011b 低 5 位 =03h
③ 编写程序。采用查询 tf0 的状态来控制 p1.0 输出
mov tmod , #00h ;置 t0 为方式 0
mov th0 , #0fch ;送计数初值
mov tl0 , #03h
setb tr0 ;启动 t0
loop : jbc tf0 , next ;查询定时时间到否 ?
sjmp loop
next : clr tf0 ; 对溢出标志位清 0
mov th0 , #0fch ;重赋计数初值
mov tl0 , #03h
cpl p1.0 ;输出取反
sjmp loop ; 重复循环
采用查询方式的程序很简单,但在定时器整个计数过程中, cpu 要不断查询溢出时标志 tf0 的状态 , 这就占用了 cpu 工作时间 , 以致 cpu 的效率不高。采用定时溢出中断方式,可以提高 cpu 的效率。
(2)工作方式1
m1 m0=01 th0 高 8 位和 tl0 低 8 位组成一个 16 位定时器 / 计数器
定时器工作于方式1下,其结构与操作几乎与方式 0 完全相同,差别仅在于计数器的位数不同。
注意:定时计数器的计数范围与初值 x 的计算
① 定时器的计数规律:
t0 从初值 x ,一直对脉冲计数到 1111111111111b(216d) 溢出
计数个数: 216 - x = 65536 - x
② 最大计数范围 :从初值 x = 0d ,计数到 1111111111111111b(216d)
计数个数为 216 - 0 = 65536d
③ 定时时间: 定时值 =( 216 - x ) ×机器周期
=( 216 - x ) ×晶振周期× 12
最大定时定时值 =( 216 - 0 ) ×机器周期
例如 . 若单片机晶振为 6mhz ,则 1 个机器周期为 2us
最大定时定时值 =( 216 - 0 ) ×机器周期
= 65536 × 2us = 131ms