3.进一步理解中断函数

发布日期:2020-12-26 09:10:10 来源:网络转载

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; 
    } 
}
关键词 :
网站违法和不良信息举报邮箱:23139485@qq.com
CopyRight@2020-2030 www.haoapp8.cn All Rights Reserved.C语言学习网版权所有 粤ICP备15061369号
免责声明:本站内容来源于用户自行提供或网络收集,其真实性、准确性和合法性,www.haoapp8.cn不提供任何保证,亦不承担任何法律责任.而产生的法律关系及法律纠纷,由您自行协商解决。