[第七章] [定时器中断]笔记
在原先的程序中,我们希望灯每3秒闪烁一下,并且对按键有反应。 但实际运行时,按键显得非常不灵敏,原因在于程序中的延时函数, 在延时过程中,程序不会进行其他任何工作,因此也就无法检测按键的情况了。 只有在退出延时函数的一瞬间,才会检测按键,这就造成了按键不灵敏的表现。
上述问题可以使用定时器解决,使用定时器控制灯的亮灭时,主程序不用停下来等待, 而是可以再进行其他工作,提高了程序的响应,以及CPU的利用率。
STC ISP可以自动生成定时器代码,这不仅方便,而且不容易出错, 简化了编程的复杂度。 AI8051u的T0、T1、T2、T3、T4和T11都支持24位模式(8位预分频+16位自动重载)。
在主程序中执行STC ISP生成的定时器初始化函数后,单片机会定时产生中断,然后跳转到上面的中断函数中,我们可以在这个中断函数中写我们希望执行的动作。 比如这里改变灯的亮灭状态。
教程中还遇到一个0xfd问题,原因是Keil 8051编译器导致,它把0Xfd到0xff用于保留字,与到这略过,而中文中却会出现这个字符,从而导致问题。 详细的说明在STC的这个文档中:
定时器在单片机内部的实现比较复杂,因为定时器的定制模式较多,比如分频、1T和12T模式,以及到期自动恢复数字,以及溢出中断等,并且定时器的后半部还能作为计数器和中断使用,所以需要设置一系列寄存器,才能把定时器初始化到我们需要的状态。
定时器寄存器的设置可以使用这个公式计算出来。
在实践中,我们完成了2个定时器实践,并且讲师留了一个思考题,如可实现多个定时任务。 我的想法如下: 1:最简单的,我们的单片机上有多个定时器,可以使用这些定时器实现多个定时任务。 2:使用一个周期性触发的定时器,在定时器触发时,判断哪些任务到期,去执行到期的任务,当最后一个任务执行完成后,删除这个定时器。 3:把定时器的时间设置成最近任务的时间,到这个时间执行第一个任务,然后计算剩余任务中的最近任务,把定时器的时间设置为下一个任务,依次反复直到最后一个任务执行完成。
|