51定时计数器

定时计数器


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=(2na)×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,重新赋初值,进行下一次计时
       

你可能感兴趣的:(51定时计数器)