定时器对于每个MCU来说都是非常重要的功能,实现精确的定时器,测频率,产生PWM都是靠的定时器,定时器的位数决定了定时器的精度,目前就我们所遇到有8位的定时器,16位的定时器,32位的定时器。功能一个比一个强。位数越高PWM的精度就越高,变化就越细腻,便于控制。51的定时就AT89X51来说有两个定时器T0和T1,52单片机又增加了一个T2。每个定时器都有4中工作模式,第一种:13位的定时器,第二种是16位的定时器,第三种:8位的自动重载。第四种就是T0分离的两个8位定时器。而T1停止工作。
要想熟练的运用这些东西不是靠的死记硬背,东西是死的人是活的。学习这类东西其实调试和看头文件,研究头文件和调试的窗口,你就可以迅速的掌握一款单片机。在看数据手册,你就会很容易的理解他们。
这张图已经把很多东西说明清楚了,定时器的振荡频率是晶振的12分频,意思就是说我们平时有的12MHz的晶振时,定时的每个计数都是1us.而且可以看出16位的定时器实际是由两个8位的定时组成的。最后溢出置位TF1.至于那个外部中断就是测方波的脉宽的了。
#include<reg52.h>
void t0_init(void)
{
TMOD |= 0x01; //定时的工作模式和定时或者计数
TH0 = -50000>>8;
TL0 = -50000%255; //将一个数分配到两个8位寄存器中
ET0 = 1; //打开定时器0的局部中断使能
}
void main(void)
{
t0_init();
EA = 1; //使能全局中断
TR0= 1; //定时器开始计数
for(;;) //等待定时器溢出中断。这个是定时器中断的方法,是硬件的,我们可以用查询的方式,就是软件来做的。判断TF0的情况,
{
PCON = 0x01; //停止CPU的活动,节能。降低功耗。
}
}
void t0_overflow_isr(void) interrupt 1 //中断服务程序
{
TH0 = -50000>>8;
TL0 = -50000&255;//51的定时器功能弱,不能自己重装,必须软件手动重装,。然每次都是从0开始计数到0xffff
P1 ^= 0x01;//每次取反P1.0口。
}
值得注意的是51的定时器就是一个一直向上加的定时器,直到溢出,而其它的单片机定时就有很多的模式,设定一个值进行比较,或者溢出了不管一直在计数等到第二次又触发,或者是减的,等等,千万不要以为单片机就只有一个定时器溢出。多想想,不定期更新中。