1.另一个外部中断
前面两讲都是围绕外部中断0(P3.2的功能)来讲解,这里我们也还有一个外部中断1(P3.3的功能)。P3.3要想实现上一讲的功能只需杜邦线接下面的IO端口即可
代码就是把“EX0”改为“EX1”,“IT0”改为“IT1”。
interrupt后面的0要改为2,函数名我们改为“EXTI1_IRQHandler()”
#include <reg52.h> #include <function.h>//详见第六章第8讲 void main() { IT1 = 1; //下降沿触发模式 EX1 = 1; EA = 1; LED_Init();//初始化LED硬件模块 while(1); } void EXTI1_IRQHandler() interrupt 2 { LED2=!LED2; }
再次提醒,杜邦线的一头接的是P3.3。
至于interrupt后面的数字为什么要为2,大家先熟悉这张图了解一下先
更多中断知识的概念参考《手把手教你学51单片机》文档6.5节。
2.按键触发中断
我们每次要把P3.2和P3.3外部拉低或释放,都需要拔插杜邦线,这样太麻烦,我们可以用按键来取代这些拔插动作,按键按下不放就相当于一直拉低,跟杜邦线一直插着GND一个效果,松开按键就跟杜邦线没插GND一样。
可是P3.2和P3.3没有直接相连的按键,不过没关系,我们把杜邦线这样接,让P3.3和P2.3一起相连,K4的按键动作可以使P2.3和P3.3同步电平
我们要用到按键,所以别忘了初始化按键模块。
#include <reg52.h> #include <function.h>//详见第六章第8讲 void main() { IT1 = 1; //下降沿触发模式 EX1 = 1; EA = 1; LED_Init();//初始化LED硬件模块 KEY_Init();//初始化按键功能模块 while(1); } void EXTI1_IRQHandler() interrupt 2 { LED2=!LED2; }
3.去抖动
按键似乎没能很灵敏的按一下松手LED2就跳变一次亮或灭的效果,那是因为我们没有延时消抖,一个按键动作就存在好几个下降沿了,导致中断函数被执行了几遍。
在中断函数中加延时就可以消除这种失灵现象了,不过在以后编程里不能在中断函数里使用延时,这样会使程序的执行效率大打折扣,我们本次只是作为测试代码才在中断函数里用延时。
#include <reg52.h> #include <function.h>//详见第六章第8讲 void main() { IT1 = 1; //下降沿触发模式 EX1 = 1; EA = 1; LED_Init();//初始化LED硬件模块 KEY_Init();//初始化按键功能模块 while(1); } //请把P3.3和P2.3用杜邦线连接起来 void EXTI1_IRQHandler() interrupt 2 { delay_ms(50);//去抖动 if(INT1==0) //P3.3是否还处于低电平的稳定接触状态,INT1已在“#include <reg52.h>”中定义好了 { LED2=!LED2; } }
这样就可以达到按下松手一次,LED2的状态只能取反一次的灵敏效果。如果我们一直按着不放,LED2也只是跳变一次而已,有点像不支持连按功能,这是因为“IT1=1;”的原因。
要是改为“IT1=0;”,这样K4按键就有种支持连按的感觉从而LED2就会不停闪烁了。按键按下一直不放就会不停地进入中断函数。
#include <reg52.h> #include <function.h>//详见第六章第8讲 void main() { IT1 = 0; //低电平状态下触发 EX1 = 1; EA = 1; LED_Init();//初始化LED硬件模块 KEY_Init();//初始化按键功能模块 while(1); } //请把P3.3和P2.3用杜邦线连接起来 void EXTI1_IRQHandler() interrupt 2 { delay_ms(50);//去抖动 if(INT1==0) //P3.3是否还处于低电平的稳定接触状态 { LED2=!LED2; } }
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程