第 6 课,用定时器中断闪灯,定时器中断的学习
在第二课,我们学习了用指令延时闪灯,但是用指令方式闪灯有 cpu 不能做其他工作的
缺点。
这一课,我们将学习如何使用定时器方式使灯闪烁。
中断的理解。
这里将涉及到单片机中断的应用,在 cpu 的一步步按照指令运行的过程中(主程序),
可能会有其它的更紧急的需要做的事情(中断服务程序),需要 cpu 暂时停止当前的程序(主
程序),做完了(中断服务程序)之后,又可以继续去运行先前的程序(主程序)。就像你正
在吃饭,一边又在给水桶里放水,吃着吃着,水满了,你就得赶快去把水龙头关掉或者换一
个空的水桶,再回来吃饭。
单片机的定时器就像是一个水桶,你让它启动了,也就是水龙头打开了;开始装水了;
定时在每个机器周期不断自动加 1,最后溢出了;水桶的水不断增加,最也就满出来了;定
时器溢出时,你就要去做处理了;水桶的水满了,你也应该处理一下了;处理完后,单片机
又可以回到刚刚开停止的地方继续运行;水桶处理了,先前你在做什么也可以继续去做什么
了。
单片机的主程序是从 0x0000 开始运行的,单片机服务程序从哪里开始运行呢?在 51
里,有多个中断服务程序入口,0 号入口是外中断 0,地址在 0x0003;1 号入口是定时器 0,
在 0x000B;2 号入口是外中断 1;地址在 0x0013,3 号入口是定时器 2;地址在 0x001B,
等等。当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程
序,运行完之后,又跳回到原来的位置继续运行。
在 C51 中,你不用理会中断服务程序放在哪里,会怎么跳转。你只要把某个函数标识
为几号中断服务函数就可以了。在发生了对应的中断时,就会自动的运行这个函数。
请看一下相关的 51 的硬件的书,对定时器工作的寄存器设置做进一步的了解。也可以
做完试验再了解,因为例程中都已经为您设置好了。
请看程序,主程序里的循环里是个死循环,什么也没有做,在实际应用中这里是放的
主程序。
在定时器服务函数里,需要重新置入定时器的值,这样才能保证每次溢出时,都是你
指定的时间。这里置入的是 0x0006,还需要走 0x10000-0x0006 个机器周期才溢出。换成 10
进制也就是每 65530 个机器周期中断一次。我们仿真的晶振是 22118400HZ,每 12 个时钟一
个机器周期。65530×12/22118400= 秒。也就是差不多 28HZ 的闪烁频率。
因为 51 的定时器最大只有 0xffff,溢出的速度很快,无法做出更久的闪烁频率来,这
一课就先观察一下这个 28HZ 左右频率。在下一课我们会用静态变量的办法,做一个长达 1
秒钟的 LED 闪烁频率。
另外,由于 51 从中断发生到进入中断的时间不定
第6课,用定时器中断闪灯,定时器中断的学习 来自淘豆网m.daumloan.com转载请标明出处.