概述
检测与控制中,许多场合都要用到计数功能和定时功能。实现定时/计数这些功能,有3种主要方法:软件定时、数字电路的硬件定时、可编程定时/计数器。
-
软件定时
软件定时就是一个循环程序,执行这一程序段所需的时间就是延时时间。 -
数字电路硬件定时
这种硬件定时采常用小规模集成电路器件,如用555定时芯片构成定时电路,它不占用CPU的时间,但是这种电路的定时时间要靠电路中的元件参数来确定。在硬件电路连接好以后,要改变定时时间,就要改变电路中的电子元件,使用起来很不方便。 -
可编程定时/计数器
可编程定时/计数器是为了方便微型计算机系统的设计和应用而研制的,它既是硬件定时,又可以很容易地通过软件来确定和改变定时时间,通过软件编程就能够满足不同的定时和计数要求。
###结构
定时器/计数器T0由特殊功能寄存器TH0、TL0构成,
定时器/计数器T1由特殊功能寄存器TH1、TL1构成。
具有定时器和计数器2种工作模式,4种工作方式(方式0、方式1、方式2和方式3)。
- 计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数\
- 定时器工作模式是对单片机的时钟振荡器信号经片内12分频后的内部脉冲信号计数。
###4种工作方式
M1M0 | 方式 | 特点 |
---|---|---|
0 0 | 0 | 13位定时器/计数器 |
0 1 | 1 | 16位定时器/计数器 |
1 0 | 2 | 自动装入时间常数的8位定时器/计数器 |
1 1 | 3 | 对T0分为两个8位独立计数器;对T1置方式3时停止工作 |
###对外部输入的计数信号的要求
-
当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。
-
当输入信号产生负跳变时,计数器的值增1。
-
每个机器周期的S5P2期间,都对外部输入引脚T0或T1进行采样。
###定时器/计数器的编程和应用
步骤
(1)确定工作方式,即给方式控制寄存器TMO D写入控制字。
(2)计算定时器/计数器初值,并将初值写入寄存器TL和TH。
(3)根据需要,对中断控制寄存器IE置初值,确定是否开放定时器中断。
(4)使运行控制寄存器TCON中的TRx置1,启动定时器/计时器。
练习
\2. AT89S51单片机内设有几个可编程的定时器/计数器?它们可以有哪几种工作模式?哪几种工作方式?如何选择和设定?各有什么特点?
定时器/计数器四种工作方式由TMOD中的M1 M0两位确定,如下表所示。
M1M0 | 方式 | 特点 |
---|---|---|
0 0 | 0 | 13位定时器/计数器 |
0 1 | 1 | 16位定时器/计数器 |
1 0 | 2 | 自动装入时间常数的8位定时器/计数器 |
1 1 | 3 | 对T0分为两个8位独立计数器;对T1置方式3时停止工作 |
7.AT89S51单片机的晶振频率为6MHz,若要求定时值分别为0.1ms和10ms,定时器0工作在方式0、方式1和方式2,其定时器初值各应是多少?
****答:****(1) 0.1ms
方式0:
0.1×10-3=(213-X)×12/(6×106)
所以:X=8142=1111111001110B
T0低5位01110B=0EH
T0高8位:11111110B=FEH
方式1: 0.1×10-3= (216-X) ×12/(6×106)
所以:X=65486=FFCEH
方式2: 0.1×10-3= (28-X) ×12/(6×106)
所以:X=206=CEH
(2) 10ms
方式0: 10×10-3=(213-X) ×12/(6×106)
所以:X=3192=110001111000B
T0低5位11000B=18H
T0高8位:01100011B=63H
方式1: 10×10-3=(216-X) ×12/(6×106)
所以:X=60536=EC78H
方式2:在此情况下最长定时为512μs,无法一次实现定时10ms,可用0.1ms定时循环100次
11.定时器/计数器作为外部中断源使用时,需要如何初始化?以T0为例通过程序说明。
*答:* 初始化程序:
```
MOV TMOD, #06H
MOV TL0, #0FFH
MOV TH0, #0FEH
SETB TR0
SETB EA
SETB ET0
```
14.已知单片机时钟振荡频率为6MHz,利用T0定时器,在P1.1引脚上输出连续方波,波形如图9-23所示。
图9-23 题15波形图
****解:****首先计算定时常数:
100us 方式0 Tc=FE0EH; 方式1 Tc=FFCEH; 方式2 Tc=CEH
150us 方式0 Tc=FD15H; 方式1 Tc=FFB5H; 方式2 Tc=B5H
****方法一****:采用方式一,定时器中断。
流程图:
ORG 0000H
LJMP START
ORG 000BH
LJMP TINT0
ORG 0100H
START: MOV TMOD, #01H
MOV TL0, #0CEH
MOV TH0, #0FFH
SETB TR0
SETB EA
SETB ET0
SETB 20H.0
SETB P1.1
SJMP $
TINT0: JNB 20H.0, NEXT
MOV TL0, #0B5H
MOV TH0, #0FFH
CLR P1.1
CPL 20H.0
SJMP LAST
NEXT: MOV TL0, #0CEH
MOV TH0, #0FFH
SETB P1.1
CPL 20H.0
LAST:RETI
****方法二****: 采用方式2 定时器中断 加延时程序
流程图:
ORG 0000H
LJMP START
ORG 000BH
LJMP TINT0
ORG 0100H
START: MOV TMOD, #02H
MOV TL0, #0CEH
MOV TH0, #0CEH
SETB TR0
SETB EA
SETB ET0
SETB 20H.0
SETB P1.1
SJMP $
TINT0: JNB 20H.0, NEXT
CLR TR0
CLR P1.1
LCALL DELAY
CPL 20H.0
SETB TR0
SJMP LAST
NEXT: SETB P1.1
CPL 20H.0
LAST: RETI
DELAY: MOV R7, #8
DELAY1: DJNZ R7, DELAY1
RET