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

Posted timerring

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文详解定时器方式/控制/状态寄存器相关的知识,希望对你有一定的参考价值。

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

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

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

  • 功能选择位 C/T:
    =0,定时功能,计数内部机器周期脉冲;
    =1,计数功能,计数引脚T0(T1)输入的负脉冲。
  • 方式选择位M1、M0:4种工作方式:

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

  • 门控方式选择位GATE :
    =0,非门控方式(内部启动):
  • TRx=1,启动定时器工作;
  • TRx=0,停止定时器工作。

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

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

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

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

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

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

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

MOV   TMOD,#0D2H

TMOD各位定义及具体意义

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

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

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

一文详解定时器方式/控制/状态寄存器_方式0_05

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


以上是关于一文详解定时器方式/控制/状态寄存器的主要内容,如果未能解决你的问题,请参考以下文章

基于8086 8253定时计数器方波发生器仿真-微机原理

资料转发分享基于8086 8253定时计数器方波发生器仿真基于8086 1602动态显示仿真设计基于8086步进电机转动控制设计

资料转发分享基于8086 8253定时计数器方波发生器仿真基于8086 1602动态显示仿真设计基于8086步进电机转动控制设计

可预置初值的计数器各种设定方式详解

Systick系统滴答定时器

4.10 51单片机-使用计数器测量NE555脉冲频率