一、定时器/计数器的基本性能特点

  • 定时/计数器简称定时器
  • 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定时器方式寄存器

 

rxjava 定时器耗电吗 定时器1_寄存器

rxjava 定时器耗电吗 定时器1_初值_02

 

 

2.TCON定时器控制/状态寄存器

rxjava 定时器耗电吗 定时器1_rxjava 定时器耗电吗_03

启动控制位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=1s):1s ~8.19ms

2.模式1
16位定时/计数器。 THx8位和TLx8位组成16位加1计数器

计数外部脉冲个数:1~65536(216)
定时时间(T=1s):1s ~ 65536×T= 65.54ms

3. 模式2

自动恢复初值8位定时/计数器。TLx为8位加1计数器,THx为8位初值重装寄存器。

用于需要重复定时和计数的场合。
最大计数值:256 (28)
最大定时时间(T=1s): 256s

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

rxjava 定时器耗电吗 定时器1_rxjava 定时器耗电吗_04

(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波特率

rxjava 定时器耗电吗 定时器1_rxjava 定时器耗电吗_05

(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中。
由于工作在定时模式,计数器计数的是机器周期的脉冲数;
将脉冲数转化成时间,就可得到正脉冲的宽度。

rxjava 定时器耗电吗 定时器1_初值_06

由于定时器最长为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