本节内容与上一节定时器紧密相关,所以不了解定时器的同学可以看一下上一节。我们日常写程序时一定见过interrupt 1,interrupt 2,interrupt 3这样的代码,但又不知道是什么意思。那么本节的内容便是围绕这个展开的。
一、工作原理
上图就是中断的工作原理的概括。非常简单,就不过多解释了。下面我会介绍一下其中的细节,以及如何操作。
这里是有5个中断源的。对应着5个中断号(这也就对应了开头的interrupt 1,2,3),本节我们主要介绍定时器T0这个中断源,也就是interrupt 1。
ET0:定时器,计数器的中断允许,ET0=1 可以理解为打开了我们定时器的中断。
TF0:结合定时器中断请求的形式可知,我们的定时器如果溢出(65535变成了65536),那么TF0便会自动置1。
二、代码设计
接下来我们用定时器中断法来实现一个简单的流水灯。
先来看主程序。前半部分依然是我们的定时器的报备(只要使用定时器,就一定需要报备),下面的EA=1是中断的总开关(这个下一节会提到,不知道的本节影响也不大)。ET0=1之前说过是中断允许。意味着我马上要使用中断了。TR0=1表示启动定时器。
接下来进入循环。注意while(k<2)是我们本节的重点。在程序执行到while(k<2)时我们的定时器已经启动。再结合T0的中断服务程序可知每过50ms,k会加一。而k的初值是0,也就意味着要经过1s才能跳出循环。结合所学知识,其实不难猜出这个while(k<2)便是一个断点。
结合上述的代码,以及与传统的定时器进行对比。传统定时器需要我们自己手动去查询TF0是否置1了(TF0==0),而中断法便可以不用我们去判断了。
最后是中断服务程序。需要先清溢出,等待下一个50ms到来。
三、总结
本节内容结合了上一节的定时器,由定时器来引出我们的中断服务程序。
本结重点:理解中断的执行程序。
本节难点:寻找断点,并理解其原理。