一文详解定时器方式/控制/状态寄存器
Posted timerring
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文详解定时器方式/控制/状态寄存器相关的知识,希望对你有一定的参考价值。
一、定时器方式寄存器TMOD(89H)
TMOD的地址为89H,不可按位寻址,只能用字节指令设置定时器工作方式。低半字节定义定时器T0,高半字节定义定时器T1。复位时,TMOD所有位均为零。
- 功能选择位 C/T:
=0,定时功能,计数内部机器周期脉冲;
=1,计数功能,计数引脚T0(T1)输入的负脉冲。 - 方式选择位M1、M0:4种工作方式:
- 门控方式选择位GATE :
=0,非门控方式(内部启动):
- TRx=1,启动定时器工作;
- TRx=0,停止定时器工作。
=1,门控方式(外部启动):
- TRx=1且引脚INTx=1才启动。
GATE:门控位,决定定时器/计数器的启动开关信号(图中的K2)是否受外部中断请求信号的影响。
- 门控位对定时计数器启动开关信号的控制作用如下图所示:
- 确定定时器工作方式指令:
MOV TMOD,#方式字
例:设T0用方式2非门控定时,T1用方式1门控计数。
MOV TMOD,#0D2H
TMOD各位定义及具体意义
二、定时器控制/状态寄存器TCON(88H)
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
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取反一次即可。
- 选择工作模式
T0的模式字为TMOD=00H,即
M1M0=00,C/T=0,GATE=0,其余位为0
- 计算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
- 采用查询方式的程序
程序清单:
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 ;重复循环
- 采用定时器溢出中断方式的程序
程序清单:
主程序
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 1602动态显示仿真设计基于8086步进电机转动控制设计
资料转发分享基于8086 8253定时计数器方波发生器仿真基于8086 1602动态显示仿真设计基于8086步进电机转动控制设计