单片机的定时器中断
这里先讨论51和52都有的定时器T1,T0
1.51单片机由两组定时器/计数器
2.定时器/计数器与单片机CPU相互独立,互不干扰
3.51单片机定时器/计数器是根据机器内部时钟或者是外部的脉冲信号(P3.4,P3.5两个外部中断输入引脚)对寄存器的数据+1
4.有了定时器/计数器后可以增加单片机的效率,一些简单重复的+1工作可以交给定时器/计数器处理。CPU则去处理一些更为复杂的事情,同时可以解决前面我们所说到的软件延时函数误差大的问题
原理:
当输入脉冲出现则+1,当计数器全部位数计满了(65536),再输入一个脉冲计数器回零,且计数器溢出使相应的标识位置1,向CPU发送中断请求,定时模式表示为时间已经到了,计数模式为计数满了
定时器/计数器工作方式寄存器(TMOD)
这里需要说明的是,我们一般在使用的时候用方式1,方式2在串口通信的时候使用,其余的暂时作为了解即可。
在这里我们只需要对控制工作方式的M1,M0两个控制位进行操作即可,其余的都置0(我暂时不知道其它的位,在什么场景可以涉及到,有兴趣的可以查一下资料了解)
定时器/计数器控制寄存器(TCON)
这里只说明TR1(TR0一样的),TR1置1的时候启动定时器1,可以通过软件进行打开和关闭定时器操作
具体定时器初始化配置代码示范
TMOD=0x01;//选择定时器0的工作方式1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;//括号内减去多少是看实际需要定时多久决定的,这个决定了一个定时器中断经历的时间
EA=1;//打开总中断
ET0=1;//开启定时器中断
TR0=1;//打开定时器
以上就是定时器初始化的步骤
中断服务函数(希望发生中断后干啥)
void T0_time() interrupt 1 //interrupt关键字必须有 1(上一章里面其中一个表各提到的中断序号,必须有)
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;//重装初值
num++;//通过控制num的值可以控制定时多久
}
看到这里,可以回去看看振动小灯的代码了,相信现在的你应该可以理解了。