一文详解定时器方式控制状态寄存器

一、定时器方式寄存器TMOD(89H)

image-202208152****8757

TMOD的地址为89H,不可按位寻址,只能用字节指令设置定时器工作方式。低半字节定义定时器T0,高半字节定义定时器T1。复位时,TMOD所有位均为零。

  • 功能选择位 C/T:

    =0,定时功能,计数内部机器周期脉冲;

    =1,计数功能,计数引脚T0(T1)输入的负脉冲。

  • 方式选择位M1、M0:4种工作方式:

image-202208152****5050

  • 门控方式选择位GATE :

    =0,非门控方式(内部启动):

    • TRx=1,启动定时器工作;

    • TRx=0,停止定时器工作。

    =1,门控方式(外部启动):

    • TRx=1且引脚INTx=1才启动。

GATE:门控位,决定定时器/计数器的启动开关信号(图中的K2)是否受外部中断请求信号的影响。

  • 门控位对定时计数器启动开关信号的控制作用如下图所示:

image-202208152****1727

  • 确定定时器工作方式指令:
MOV TMOD,#方式字

例:设T0用方式2非门控定时,T1用方式1门控计数。

    MOV   TMOD,#0D2H

TMOD各位定义及具体意义

二、定时器控制/状态寄存器TCON(88H)

image-202208152****6764

TCON的位地址位88H,可按位寻址。复位时,TCON所有位均为零。

  • 启动控制位TR0、TR1

    =0,停止定时器工作

    =1,启动定时器工作

例:启动T0: SETB TR0

  • 溢出中断标志位TF0、TF1
    • 定时器溢出使TFx=1,引起中断请求,CPU响应
    • Tx中断后,自动清0 TFx。
    • 可用软件检测TFx,必须软件清0。
WAIT:JBC TF0,NEXT;检测T0是否溢出

      SJMP   WAIT    ;未溢出,继续检测

NEXT: …      ;溢出,TF0清0,处理溢出

TCON;各位定义及具体的意义

三、可预置初值的16位加1计数器TH0、TL0、 TH1、TL1

预置T0初值指令:

       MOV   TH0,#XH

       MOV   TL0,#XL

由方式选择位M1、M0设定

接下来会具体介绍几个方式:

四、方式0

  • 13位定时/计数器。 THx 8位和TLx低5位组成13位加1
  • 计数器,此种方式与MCS-48系列兼容,如果不是为了兼容的目的,一般不用方式0.
  • 方式0的全部功能,方式1都可以代替。

4.1 方式0介绍

当M1M0两位为00时,为工作方式0(13位)

  • C/T=0时,作为定时器方式工作,T0对机器周期计数,其定时时间为:

(213- T0初值)×时钟周期×12

img

4.2 应用举例

使用定时/计数器进行定时或计数之前,首先要通过软件对它进行初始化。初始化包括下述步骤:

  • 确定工作方式:对TMOD寄存器赋值;
  • 置定时/计数器初值:对TH0、TL0或TH1、TL1寄存器赋值;
  • 初值X的计算方法如下:
    • 计数方式时:X=N-M
    • 定时方式时:X=N-t/T

在上两式中,M为计数模值,即从计数器启动到溢出时所需计数值;N为十三位计数器, t为定时值T为机器周期。

  • 根据需要,开放定时器中断、设定中断优先级:对IE、IP寄存器赋值;

  • 启动定时/计数器:使TCON寄存器的TR0或TR1置位,或由加到引脚INTX上的外部信号电平启动。

    例:利用T0方式0产生宽度为2μs,周期为2ms的定时负脉冲,由P1.7送出,系统采用12MHz的晶振。

解:由于晶振为12MHz,机器周期为1μs,这样利用T0方式0产生周期为2ms定时的初值X初值为:

X =N-t/T

​ =213-2×10-3/(1×10-6)

​ =8192-2000

​ =6192

​ =1830H

​ =1100000110000B

则TH0=11000001B=0C1H,TL0=00010000B=10H

由于CLR bit和NOP指令的执行时间为1个机器周期,当晶振为12MHz时,这两条指令的执行时间都为1μs。这样,每当定时时间到时,利用T0产生中断,在中断服务程序中,先执行CLR P1.7和NOP两条指令,然后执行SETB P1.7,最后重装TH0和TL0的初值,就可以产生题目所要求的定时脉冲。

置T0为定时方式0,GATE=0,C/T=0,

H, T1不用,可任意,一般取0,故TMOD=00H,并由TR0启停T0。

初始化程序:MOV TMOD , #00H
MOV TH0 , #0C1H
MOV TL0 , #10H ;初始化T0
MOV IE , #82H ;开T0中断
SETB TR0 ;启动T0
… … …
T0溢出中断服务程序:
T0INT:CLR P1.7
NOP
SETB P1.7
MOV TH0,#0C1H;T0重置初值
MOV TL0,#10H
RETI

例:利用T0的工作模式0产生1ms定时,在P1.0引脚输出周期为2ms的方波。设单片机晶振频率fosc=12MHz。编程实现其功能。

解:要在P1.0引脚输出周期为2ms的方波,只要使P1.0每隔1ms取反一次即可。

  1. 选择工作模式

​ T0的模式字为TMOD=00H,即

​ M1M0=00,C/T=0,GATE=0,其余位为0

  1. 计算1ms定时时T0的初值

​ (213-X)×1/12 × 10-6×12=1×10-3 s

​ X=7193D=11100000 11000B

​ T0的低5位:11000B=18H即 (TL0)=18H

​ T0的高8位:11100000B=E0H即 (TH0)=E0H

  1. 采用查询方式的程序

程序清单:

​ MOV TMOD,#00H ;设置T0为模式0

​ MOV TL0,#18H ;送初值

​ MOV TH0,#0E0H

​ SETB TR0 ;启动定时

LOOP:JBC TF0,NEXT ;查询定时时间到否

​ SJMP LOOP

NEXT:MOV TL0,#18H ;重装计数初值

​ MOV TH0,#0E0H

​ CPL P1.0 ;取反

​ SJMP LOOP ;重复循环

  1. 采用定时器溢出中断方式的程序

    程序清单:

    主程序

           ORG  0000H

   RESET: AJMP MAIN     ; 跳过中断服务程序区

           ORG  0030H

    MAIN: MOV  TMOD,#00H   ;设置T0为模式0

           MOV  TL0,#18H     ;送初值

           MOV  TH0,#0E0H

           SETB  EA           ;CPU开中断

           SETB  ET0         ;T0中断允许

           SETB  TR0          ;启动定时

    HERE:SJMP  HERE   ;等待中断,虚拟主程序

中断服务程序

  ORG  000BH

        AJMP CTC0

        ORG  0120H

  CTC0: MOV  TL0,#18H ;重新装如初值

        MOV  TH0,#0E0H 

        CPL P1.0       ;P1.0取反

        RETI
#嵌入式#
全部评论
这些好熟悉啊,以前都学过
点赞 回复 分享
发布于 2022-08-18 12:59 陕西

相关推荐

07-20 21:57
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
06-13 10:15
门头沟学院 Java
想去夏威夷的大西瓜在...:我也是27届,但是我现在研一下了啥项目都没有呀咋办,哎,简历不知道咋写
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务