定时计数器
1. 定时计数器本质
定时计数器本质是计数。对机器周期计数,则可算得时间。也可以对外部脉冲计数。
用定时计数器前,要控制许多开关(相关寄存器的各个位)。这些开关的同时作用就可以使得定时计数器发挥不同的作用。
2. 定时计数器初始化
2.1 选择工作方式
MOV TMOD,#00000000B
方式寄存器TMOD: GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0
高四位为T1,低四位为T0
-
GATE:是否允许外部控制(如计数外部中断)
-
C/T :1为counter ,0选择timer
-
M1M0组合起来用,为二进制的0,1,2,3,代表选择对应的4中mode
-
方式0:8+5
为了和以前的版本兼容。
-
方式1:8+8
方式0和1的差别仅在TL是5位还是8位
-
方式2:TH0等于TL0
TL0计数溢出,同时机器自动将TH0的值(初值)给TL0,改善了前两种方式需要重新赋初值造成的误差。
-
方式3:
实际工程用更高级的单片机时,有新增硬件,代替方式3。用不上。
-
2.2 计算初值
MOV TH0,#0
MOV TL0,#0EEH
; T0初始化
t = ( 2 n − a ) × T t = (2^n-a)×T t=(2n−a)×T
t需要计时的时间,n为计时器位数(如方式0是将T0当作13位(8+5)计时器使用),a是初值,T是机器周期。
将a算得后,填入TH0,TL0(单片机是8位的,因此将T0拆成高低8位,只需要填入对应位数就好了,比如方式0TL0是a的后5位)。
2.3 控制是否运行计数器或打开中断
SETB TR0;允许T0计数
控制寄存器TCON: TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0
高四位为定时计数器,低四位为中断
下面以T0为例
-
TR0为运行控制位,即打开此开关,才允许运行T0计数
-
TF0为标志溢出位(flag)。通过要计时多久,算出初值。从初值开始加一,当溢出时,计时结束。此时经过时间就是我们设计需要的时间。溢出, TF0就置1。
3.例子:计时输出脉冲
fosc=6MHz。用定时器T0方式1,以查询方式,在P1.0口输出周期为500us的脉冲。
分析:脉冲周期为500us,即高低电平各占250us。计算出a=65411。
MOV TMOD,#00000001B;选择工作方式
SETB TR0;运行定时计数器
LOOP: MOV TH0,#0FFH;给定时计数器赋初值
MOV TL0,#083H
WT: JNB TF0,WT;溢出,顺序执行,否则在当前步骤等待(查询)
CLR TF0;清0溢出位,以便下次使用
CPL P1.0;取反,即输出脉冲
LJMP LOOP;跳到LOOP,重新赋初值,进行下一次计时