定时/计数器
一、定时器/计数器的基本性能特点
- 定时/计数器简称定时器
- 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