进一步理解中断函数

点击打开在线编译器,边学边练

1.另一个外部中断

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

6.10.png

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

6.11.png

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


2.按键触发中断

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

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

6.12.png

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

#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; 
    } 
}

本文固定URL:https://www.dotcpp.com/course/368

上一课:中断函数 下一课:中断的实验现象
第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)