1.外部中断的常用功能

外部中断经常用来记录外部脉冲的个数,也就是当我们使用外部中断1时,如果想记录自身单片机的某个引脚的下降沿个数,只需用杜邦线把这个引脚和P3.3连接即可。

比如P2.3引脚产生这样的电平无规律跳转,则下降沿的个数为5

中断函数6

所以我们就用外部中断1来实现记录K4按键从按下到松手的抖动过程中经历了多少个下降沿,把下降沿的个数显示在数码管上。

 

2.程序思路

我们定义一个16位的全局变量pulse用来记录P2.3下降沿的个数,在中断函数中的任务就是简单的pulse自加,因为引脚遇到下降沿就会进入中断函数。

在主函数里就是负责数码管显示即可。

 

3.代码

#include <reg52.h> 
#include <function.h>//详见第六章第8讲

u16 pulse=0;
void main()
{  
    u16 x,PULSE_buf;
    IT1 = 1;   //下降沿触发模式
    EX1 = 1;
    EA  = 1;
  
    LED_Init();//初始化LED硬件模块 
    KEY_Init();//初始化按键功能模块
    ShowNumber(pulse);
    while(1)
    {
        SEG_Scan();  
        if(PULSE_buf!=pulse)ShowNumber(pulse);//pulse不再是前一次的值,也就是pulse数值更新了,所以数码管缓存区也要更新pulse的数值以便显示出来
    
        x++;
        if(x>=50)//隔一段时间过来记录此时的pulse数值
        {
            x=0;
            PULSE_buf=pulse;
        }
    }
}
 
//请把P3.3和P2.3用杜邦线连接起来
void EXTI1_IRQHandler() interrupt 2
{
    pulse++;
}

大家多按几次K4,发现按下后松手的一个动作里有时pulse就自加了几次,显示在数码管上的数加了好几下。

 

4.稳定测试

我们再用P2.3提前设定好会产生多少个脉冲,然后观察数码管显示的是不是我们设定好的脉冲数。这里我们让P2.3跳变电平15次,看看数码管显示的数值是多少。

#include <reg52.h> 
#include <function.h>//详见第六章第8讲

u16 pulse=0;
void main()
{  
    u8 i=0;
    IT1 = 1;   //下降沿触发模式
    EX1 = 1;
    EA  = 1;
  
    LED_Init();//初始化LED硬件模块 
    KEY_Init();//初始化按键功能模块
  
    while(i<15)//让P2.3产生脉冲数,然后结束循环
    {
        KEY4=!KEY4;
        i++;
        delay_ms(1);  //让电平保持的时间多一点
    }
  
    ShowNumber(pulse);//更新数码管缓存区内容
  
    while(1)
    {
        SEG_Scan();   //显示脉冲数  
    }
}
 
//请把P3.3和P2.3用杜邦线连接起来
void EXTI1_IRQHandler() interrupt 2
{
    pulse++;
}

数码管显示的是8,画出状态图一目了然!

中断函数7

拔了杜邦线再复位开发板就是显示0了。

点赞(0)

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

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

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

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

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

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

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

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

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