原文:
定时器是单片机的重要功能模块之一,在检测、控制领域有广泛应用。定时器常用作定时时钟,以实现定时检测、定时响应、定时控制,并且可用于产生ms宽的脉
冲信号,驱动步进电机。定时和计数功能最终都是通过计数实现的,若计数的事件源是周期固定的脉冲,则可以实现定时功能,否则只能实现计数功能。因此可以将
定时和计数功能由一个部件实现。
一、定时器/计数器原理
实现定时和计数的方法一般有:软件定时、专用硬件电路和可编程定时器/计数器三种方法。
软件定时:执行一个循环程序进行时间延迟。定时准确,不需要外加硬件电路,但增加CPU开销。
专用硬件电路定时:可实现精确的定时和计数,但参数调节不便。
可编程定时器/计数器:不占用CPU时间,能与CPU并行工作,实现精确的定时和计数,又可以通过编程设置其工作方式和其它参数,因此使用方便。
定时器的基本工作原理是:利用计数器对固定周期的脉冲计数,通过寄存器的溢出来触发中断。
二、定时器的具体应用步骤:
1、使用定时器时主要有两种方法:
1)使用定时中断技术,计时溢出时触发中断,预先设计的中断子程序将被自动调用;
2)使用查询法检查是否出现计时溢出,溢出时执行指定代码。
上述方法中使用的较多的是第一种。
2、具体应用步骤如下:
1) 打开中断允许位:
对 IE 寄存器进行控制,IE寄存器各位的信息如下图所示:
图2.2-1 中断使能寄存器组成
EA: 为0 时关所有中断;为1时开所有中断
ET2:为0时关T2中断;为 1时开T2 中断,只有8032、8052、8752才有此中断
ES: 为0时关串口中断;为 1时开串口中断
ET1:为0时关T1中断;为 1时开T1 中断
EX1:为0时关INT1中断;为1时开INT1中断
ET0:为0时关T0中断;为 1时开T0 中断
EX0:为0时关INT0中断;为1时开INT0中断
2)选择定时器/计时器的工作方式:
定时器TMOD格式,如下图所示 :
图2.2-2定时器TMOD格式
CPU 在每个机器周期内对 T0/T1 检测一次,但只有在前一次检测为 1 和后一次检测为 0时才会使计数器加
1。因此,计数器不是由外部时钟负边沿触发,而是在两次检测到负跳变存在时才进行计数的。由于两次检测需要 24 个时钟脉冲,故 T0/T1
线上输入的 0或 1 的持续时间不能少于一个机器周期。通常,T0 或 T1 输入线上的计数脉冲频率总小于 100kHz。
方式 0:定时器/计时器按 13 位加 1 计数,这 13 位由 TH 中的高 8 位和 TL 中的低 5 位组成,其中TL中的高3 位弃之不用(与MCS-48兼容)。
图2.2-3 定时器0的计数位数
13 位计数器按加 1 计数器计数,计满为 0 时能自动向 CPU 发出溢出中断请求,但要它再次计数,CPU必须在其中断服务程序中为它重装初值。
方式 1:16 位加1计数器,由TH 和TL 组成,在方式 1的工作情况和方式0的相同,只
是计数器值是方式0 的8倍。
图2.2-4 定时器1的计数位数
方式 2:计数器被拆成一个 8 位寄存器 TH 和一个 8 位计数器 TL,CPU 对它们初始化时必须送相同的定时初值。当计数器启动后,TL按8位加1 计数,当它计满回零时,一方面向CPU发送溢出中断请求,另一方面从 TH 中重新获得初值并启动计数。
图2.2-5 定时器2的计数位数
方式 3:T0 和T1 工作方式不同,TH0 和 TL0 按两个独立的 8 位计数器工作,T1 只能按不需要中断的方式2 工作。
在方式 3 下的 TH0 和 TL0 是有区别的:TL0 可以设定为定时器/计时器或计数器模式工作,仍由TR0 控制,并采用TF0
作为溢出中断标志;TH0 只能按定时器/计时器模式工作,它借用TR1和 TF1 来控制并存放溢出中断标志。因此, T1就没有控制位可以用了,故
TL1 在计满回零时不会产生溢出中断请求的。
显然,T0 和T1设定为方式3,实际上就相当于设定了 3个8 位计数器同时工作,其中 TH0和TL0 为两个由软件重装的8
位计数器,TH1 和TL1为自动重装的8位计数器,但无溢出中断请求产生。由于
TL1工作于无中断请求状态,故用它来作为串口可变波特率发生器是最好不过的。
图2.2-6
3)为计数器赋值
计数器初值计算:
TC = M ? C
TC:计数器初值,M:计数器模值(2k),C:把计数器计满的计数值
定时器初值计算:
T = (M ? TC)T计数 或 TC = M ? T/T计数
M:模值,T 计数:单片机时钟周期 TCLK(ΦCLK的倒数)的12 倍;TC 为定时器的定时初值,T为欲定时的时间。
TC = M ? T ×
/12
M:模值,ΦCLK:单片机时钟周期ΦCLK;TC 为定时器的定时初值,T 为欲定时的时间。
例如:单片机主脉冲频率ΦCLK为12MHz,最大定时时间为:
方式0 时 TMAX = 213×1us = 8.192ms
方式1 时 TMAX = 216×1us = 65.536ms
方式2 和方式3 TMAX = 28×1us = 0.256ms
4) 启动计时器
图2.2-7 计时器控制寄存器
TR0:为0时,停T0计数;为1 时,启T0 计数
TF0:为0 时,无T0中断(硬件复位);为1 时,有 T0 溢出中断
TR1:为0时,停 T1计数;为1 时,启T1 计数
TF1:为0 时,无T1中断(硬件复位);为1 时,有 T1 溢出中断
IE1:为0 时,硬件复位;为 1时INT1上有中断
IT1:为0 时,INT1电平触发(软件复位);为1时,INT1负边沿触发
IE0:为0 时,硬件复位;为 1时INT0上有中断
IT0:为0 时,INT0电平触发(软件复位);INT0负边沿触发
三、总结
当然,最重要的工作室编写定时器中断服务程序,当定时器的时间到达(计时溢出)时即触发中断,所编写的相应的程序会被自动执行。
对于方式0、1、3,如果希望定时器能按设定的某固定时间间隔不断触发,还需要在定时中断服务程序中再次设置定时寄存器初值(TH0/TL0或TH1
/TL1),对于方式2则不需要,因为该方式下定时寄存器低字节(TH0或TL1)独立完成计数工作,在定时中断发生时,定时寄存器高字节(TH0
或TH1)的值会自动重新赋给低字节,高字节的值在整个过程中保持不变。
需要注意的是,如果仅在主程序中设置了定时寄存器的初值,中断程序中未重新给定时寄存器赋值,中断程序将以该方式下的最大定时值工作。例如,方式0为13位,最大值为8192;方式1为16位,最大值为65535.
阅读(2048) | 评论(0) | 转发(1) |