前文:程序中延时功能实现原理:软延时。
定时器的应用在生活中太常见了,比如闹钟、电饭锅定时煮饭以及微波炉定时加热功能等。定时器允许我们预设一个时间,然后开始计时,时间到了它就会发出信号。
我们也可以用定时器实现延时功能。比如我们想要延时 1 毫秒就设定 1 毫秒的定时,接收到定时时间到的信号后再往后执行程序,这样就相当于延时了 1 毫秒。
定时器的原理
定时器在运行时好比是一个人在不停地进行加 1 计数(计数器)。例如:0、1、2、3、...、255、0、1、...。那么,现在有三个问题:
计数的节奏是什么?
计数时应该从多少数到多少?
计数完成后如何通知系统?
计数的节奏
一个机器周期数一个数,即 1 微秒数一个数。详情见:程序中延时功能实现原理:软延时。
计数的起、止点
计数的当前值是存储在特殊功能寄存器 TH 和 TL 中的。这些寄存器是专供计数使用的。定时器有不同的模式,假设选择的是 8 位模式且仅使用 TL 寄存器。那么,计数的起始值就是 TL 寄存器中的初始值。示例:TL 初始值为 0。若想从其它初始值开始计时,设置相应的 TL 寄存器初始值即可。
计数的终止点是 TL 溢出回 0 的时候。对于 8 位寄存器来讲当每位都是 1,即数值为 255 时再增加 1 就会发生溢出。由下图可知,溢出时寄存器会回 0。
通知计数完成
在计数溢出时会产生定时器中断,它是中断系统的一部分。我们可以在程序中定义定时器中断处理函数。在启用中断系统后,当中断发生时 CPU 会停下手头的工作转而去执行中断处理程序。中断处理程序可能是下面这样:
void timer0_handler() interrupt 1
{
0x64; // 从 100 开始计数 =
}
定时器延时比软延时精确得多,这得益于以下几方面:
定时器计数可以独立运行,不占用 CPU 资源
定时器是由时钟信号驱动的
中断系统