一、定时器/计数器的基本性能特点
- 定时/计数器简称定时器
- 8051单片机有2个16位的定时/计数器
定时器0(T0)和定时器1(T1);
它们都有定时器或事件计数的功能,可用于定时控制、延时、对外部事件计数和检测等场合。
- T0由2个特殊功能寄存器TH0和TL0构成
- T1则由TH1和TL1构成
- 作计数器时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数,当输入脉冲信号从1到0的负跳变时,计数器就自动加1。计数的最高频率一般为振荡频率的1/24。
二、定时/计数器工作方式
- 每个定时/计数器有4种工作模式,也就是每个定时器可构成4种电路结构模式。
- 在模式0、1和2,T0和T1的工作模式相同。
- 在模式3,两个定时器的模式不同。
1.TMOD定时器方式寄存器
2.TCON定时器控制/状态寄存器
启动控制位TR0、TR1
=0,停止定时器工作
=1,启动定时器工作
例:启动T0: SETB TR0
溢出中断标志位TF0、TF1
定时器溢出使TFx=1,引起中断请求,CPU响应Tx中断后,自动清0
可用软件检测TFx,必须软件清0。
1 WAIT:JBC TF0,NEXT;检测T0是否溢出
2 SJMP WAIT ;未溢出,继续检测
3 NEXT: … ;溢出,TF0清0,处理溢出
3.可预置初值的16位加1计数器TH0、TL0、 TH1、TL1
预置T0初值指令: MOV TH0,#XH
MOV TL0,#XL
二. 定时器工作模式 由模式选择位M1、M0设定
1.模式0
13位定时/计数器。 THx 8位和TLx低5位组成13位加1计数器
计数外部脉冲个数:1~8192(213)
定时时间(T=1s):1s ~8.19ms
2.模式1
16位定时/计数器。 THx8位和TLx8位组成16位加1计数器
计数外部脉冲个数:1~65536(216)
定时时间(T=1s):1s ~ 65536×T= 65.54ms
3. 模式2
自动恢复初值8位定时/计数器。TLx为8位加1计数器,THx为8位初值重装寄存器。
用于需要重复定时和计数的场合。
最大计数值:256 (28)
最大定时时间(T=1s): 256s
4. 模式3
T0分成2个8位定时器:TL0定时/计数器和TH0定时器
TL0占用T0控制位:C/T,TR0,GATE;
TH0占用T1控制位:TR1。
T1不能使用方式3工作
定时器/计数器的初始化
一、定时/计数器常数X的计算
计数功能:X= 2n -计数值 n:8/13/16
定时功能:X= 2n - t/T t:定时时间、T:机器周期
二、定时器的初始化
确定工作模式:对TMOD寄存器正确赋值;
确定定时初值:计算初值,直接将初值写入寄存器的TH0、TL0或TH1、TL1;
根据需要,对IE置初值,开放定时器中断;
启动定时/计数器,对TCON寄存器中的TR0或TR1置位,置位以后,计数器即按规定的工作模式和初值进行计数或开始定时。
三. 初始化程序格式
1 MOV TMOD,# 模式字 ;选择模式
2 MOV THx, #XH ;装入Tx时间常数
3 MOV TLx, #XL
4 (SETB EA ) ;开总中断(可选)
5 (SETB ETx) ;允许定时器中断(可选)
6 SETB TRx ;启动Tx定时器
四、 溢出处理程序格式——查询和中断
1.查询方式:先查询定时器溢出标志,再进行溢出处理。
1 … ;定时器初始化
2 WAIT:JBC TFx,PT ;检测溢出标志
3 SJMP WAIT
4 PT: MOV THx,#XH ;重装时间常数
5 MOV TLx,#XL
6 … ;溢出处理
7 SJMP WAIT
2.中断方式:初始化后执行其他任务,中断服务程序处理溢出
1 ORG 0000H
2 LJMP MAIN
3 ORG 000BH(001BH) ;Tx中断入口
4 LJMP PTS
5 MAIN: … ;初始化后执行其他程序
6 PTS: … ;溢出中断服务程序
7 MOV THx,#XH ;重装时间常数
8 MOV TLx,#XL
9 RETI ;中断返回
例题
一、定时器模式0的应用
例3-7-1:由P1.0输出方波信号,周期为2ms,设fosc= 12MHz。解:每隔1ms改变一次P1.0的输出状态。用T0非门控方式0定时。计算定时器初值:X = 213 - t/T = 213 -1000/1 = 7192 = 1C18H
TH0=E0H,TL0=18H
(1)查询方式:
1 START: MOV TMOD,#00H ; 设置定时器0模式0
2 MOV TL0, #18H ;装载定时器0初值
3 MOV TH0, #0E0H ;
4 SETB TR0 ;启动定时器0
5 LOOP: JBC TF0,PTF0 ;查询定时器0溢出标志
6 SJMP LOOP ;未溢出,继续查询
7 PTF0: CPL P1.0 ;若溢出,P1.0口取反
8 MOV TL0,# 18H ;重新装载定时器0
9 MOV TH0,# E0H
10 SJMP LOOP ;继续查询溢出标志
(2)中断方式
1 ORG 0000H ;定位以下代码起始地址
2 AJMP MAIN ;跳转至主程序代码段
3 ORG 000BH ;定位定时器0中断入口矢量地址
4 AJMP PT0INT ;跳转至中断服务子程序
5 ORG 0100H ;定位主程序代码段起始地址
6 MAIN: MOV SP,#60H ;设置硬件堆栈指针
7 MOV TMOD,#00H ;设置定时器0工作于模式0
8 MOV TL0,#18H ;装载定时器0计数初值
9 MOV TH0,#E0H
10 SETB EA ;开放总中断
11 SETB ET0 ;允许定时器0中断
12 SETB TR0 ;启动定时器0
13 HERE: SJMP HERE ;原地跳转,等待中断到来
14 PT0INT:CPL P1.0 ; 中断服务子程序,P1.0口取反
15 MOV TL0,#18H ;装载定时器0计数初值
16 MOV TH0,#0E0H
17 RETI ;中断返回
二、定时器模式1的应用
例3-7-2:用定时器0模式1在P1.0口上输出50Hz方 波,单片机振荡时钟12MHz,采用查询方式。
解:初值x计算结果
X=55536
1 MOV TMOD, #01H ;设置定时器0模式1
2 SETB TR0 ;启动定时器0
3 LOOP: MOV TH0, #0D8H ;装载初值
4 MOV TL0, #0F0H
5 JNB TF0, $ ;查询溢出标志
6 CLR TF0 ;则清溢出标志
7 CPL P1.0 ;P1.0口取反
8 SJMP LOOP ;转回LOOP处
三、定时器模式2的应用
自动重载,定时器0和1相同,定时器1可作波特率发生器
11.059MHz晶振,定时器1产生1200波特率
(TH1)=232=E8H
MOV TMOD, #20H
MOV TL1, #0E8H
MOV TH1, #0E8H
SETB TR1
四 门控制位GATE的应用—测量脉冲宽度
GATE门可使定时器Tx(T0或T1)的启动计数受INTx的控制,可测量引脚INTx(P3.2或P3.3) 上正脉冲的宽度(机器周期数) 。
例3-7-3利用T1门控位GATE测试INT1引脚上出现的正脉冲的宽度。
分析:
根据设计要求,将T1设定为定时工作模式1、GATE=1;
当TR1=1时,一旦INT1引脚上出现高电平就开始计数,直到出现低电平为止。
然后读取TH1、TL1中的计数值,分别送到寄存器A和B中。
由于工作在定时模式,计数器计数的是机器周期的脉冲数;
将脉冲数转化成时间,就可得到正脉冲的宽度。
由于定时器最长为16位计数器,因此被测脉冲高电平的宽度一般不能超过65536个机器周期。
参考程序:(1)假设被测脉宽≤65536个机器周期
1 ORG 0100H
2 MAIN: MOV TMOD, #90H ;设置T1为模式1
3 MOV TL1, #00H ;计数器初值为0
4 MOV TH1, #00H
5 LOOP: JB P3.3, LOOP ;等待INT1低
6 SETB TR1 ;如INT1为低,启动T1
7
8 LOOP1: JNB P3.3, LOOP1 ;等待INT1升高,开始计数
9
10 LOOP2: JB P3.3, LOOP2 ;等待INT1降低,停止计数
11 CLR TR1 ;停止T1计数
12 MOV A, TL1 ;T1计数值的低8位送A
13 MOV B, TH1 ;T1计数值的高8位送B
2)若脉宽≥65535个机器周期,中断方式记录TH1TL1溢出中断次数。
1 SETB TR1 ;开启T1
2 SETB ET1 ;允许T1中断
3 SETB EA ;开放总中断
4 WAIT2: JNB P3.3,WAIT2 ;等待正脉冲到来
5 WAIT3: JB P3.3,WAIT3 ;等待正脉冲结束
6 CLR TR1 ;关闭T1
7 MOV IE,#00 ;关闭中断
8 MOV R2,TL1 ;读出T1
9 MOV R3,TH1
10 LCALL PPS ;计算脉宽
11 HERE: SJMP HERE ;其他任务
12 PRIC: INC R4 ;记录溢出次数
13 RETI
14 PPS: … ;计算脉宽子程序
计算脉宽的子程序的计算式如下:
脉宽t = (R4 ×216 + R3 R2 ) ×T (T为机器周期
五、定时器长定时方法的应用
长定时方法:增加一个软件计数器或一个硬件计数器。
例3-7-4 P1.7驱动LED亮1秒灭1秒地闪烁,设时钟频率为6MHz。硬件方式: T0定时,T1计数T0的定时跳变信号P1.0的负跳变次数,计满5个跳变为1秒。
1 START: MOV TMOD,#61H
2 MOV TL1, #0FBH
3 MOV TH1, #0FBH
4 CLR P1.0
5 SETB TR1
6 LOOP1: CPL P1.7
7 LOOP2 : MOV TL0, #3CH
8 MOV TH0, #0B0H
9 SETB TR0
10 LOOP3: JBC TF0, LOOP4
11 SJMP LOOP3
12 LOOP4: CPL P1.0
13 JBC TF1, LOOP1
14 SJMP LOOP2