1.另一个外部中断

前面两讲都是围绕外部中断0(P3.2的功能)来讲解,这里我们也还有一个外部中断1(P3.3的功能)。P3.3要想实现上一讲的功能只需杜邦线接下面的IO端口即可

中断函数3

代码就是把“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,大家先熟悉这张图了解一下先

中断函数4

更多中断知识的概念参考《手把手教你学51单片机》文档6.5节。


2.按键触发中断

我们每次要把P3.2和P3.3外部拉低或释放,都需要拔插杜邦线,这样太麻烦,我们可以用按键来取代这些拔插动作,按键按下不放就相当于一直拉低,跟杜邦线一直插着GND一个效果,松开按键就跟杜邦线没插GND一样。

可是P3.2和P3.3没有直接相连的按键,不过没关系,我们把杜邦线这样接,让P3.3和P2.3一起相连,K4的按键动作可以使P2.3和P3.3同步电平

中断函数5

我们要用到按键,所以别忘了初始化按键模块。

#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; 
    } 
}
点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)