0x00 介绍
定时器是一种计时器,可以在一定时间间隔内产生中断信号。在51单片机中,定时器可以用来控制外设的工作时间或者进行时间测量等操作。
自动重载和非自动重载是定时器的两种工作模式。在自动重载模式下,定时器计数器达到设定值后会自动重新开始计数,循环往复。而在非自动重载模式下,定时器计数器达到设定值后会停止计数,需要手动重新启动计数器。
举个例子,比如我们需要控制一个LED灯每隔1秒钟闪烁一次。我们可以使用51单片机的定时器,将定时器设定为1秒钟,并选择自动重载模式。当定时器计数器达到1秒钟时,会产生中断信号,我们可以在中断服务函数中控制LED灯的闪烁。这样就可以实现LED灯每隔1秒钟闪烁一次的效果。
0x01 代码示例
定时器 0 16位 自动重载
void Timer0_Isr(void) interrupt 1
{
// 这里直接写中断里面的代码即可
}
void Timer0_Init(void) //100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x50; //设置定时初始值
TH0 = 0xFB; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
定时器 0 16位 不自动重载
void Timer0_Isr(void) interrupt 1
{
// 最大的区别就在这,在这里甩开重新指定定时器的初值
TL0 = 0x50; //设置定时初始值
TH0 = 0xFB; //设置定时初始值
//下面在写中断函数里面的东西。
}
void Timer0_Init(void) //100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x50; //设置定时初始值
TH0 = 0xFB; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
0x02 总结
各有各的好处。并不是说非自动重载一无是处,他可以做可变的定时器。定时器里面写进去公式即可。
有一点需要注意。定时器里面如果是1us,还写了非常复杂的中断函数,那么很有可能,还没执行完,又到时间要进中断。
所以中断里面的函数尽量简单,或者就是返回出一些值,进到别的函数里面去处理,