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