定时器中断基础
如何理解定时器
定时器是单片机的一个重要外设,也是单片机的一大利器,要了解定时器,首先要了解单片机的运行;初学定时器的时候,我们可能常常会疑惑,为什么要用定时器中断来代替软件延时,为什么软件延时的精确度无法保证,接下来的讲解将带你解决这个问题
定时器,顾名思义,如果将单片机比作人,那么定时器就是秒表,假设我们需要延时三分钟,三分钟后做事件A
使用软件延时相当于人在盯着秒表读秒,这三分钟就没法做其他事情了
使用定时器延时则相当于这个秒表每三分钟就会报一次警,只需要在报警时做事件A就可以了
假设我们需要单片机做一个周期性的工作,那么采用定时器延时与采用软件延时就是如下的情形:
使用定时器延时的时候,在完成Timer0的初始化之后,Timer0开始计时,当达到初始化要求的值时,定时器溢出,溢出标志位TF0 = 1,执行中断函数(蓝色部分),其中与延时相关的过程都由定时器通过硬件完成,不干扰单片机执行程序的其他内容,这意味着在Timer0溢出前,单片机都可以去做其他事(白色部分)
而在使用软件延时的时候,单片机实际上在消耗大量的算力在执行延时相关的指令,上图中红色的部分,在延时过程中由于单片机被占用去做延时的工作,无法做其他事情,造成了资源的浪费
定时器的初始化
以一条简单的Timer0定时1ms为例
void Init_Timer0()
{
TMOD = 0x01;
TH0 =(65535-50000)/256;
TL0 =(65535-50000)%256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
其中涉及的需要配置的寄存器无非是以下几个:
TMOD ( Timer Mode) 定时器模式设置具体详见数据手册
TCON(Timer Control)定时器控制中的TR0(定时器运行允许),TF0(溢出标志,溢出时被置1)
IE(Interrupt Enable)中断允许中的EA(总中断允许),ET0(中断溢出允许,相当于例子中允许秒表的报警功能)
TH0(Timer High)定时时长配置的高八位
TL0(Timer Low)定时时长配置的低八位(51是8位机,设置高八位和低八位可以将原先的8位延长至16位,增长定时时长)
使用定时器完成数码管的扫描
利用定时器的延时替代数码管动态扫描中的delay,这样做的好处就是给予了单片机大量的时间去处理数码管显示以外的内容,这在需要延时的iic协议获取数据并将数据显示在数码管上的场景中效果尤为突出