1.外部中断的常用功能
外部中断经常用来记录外部脉冲的个数,也就是当我们使用外部中断1时,如果想记录自身单片机的某个引脚的下降沿个数,只需用杜邦线把这个引脚和P3.3连接即可。
比如P2.3引脚产生这样的电平无规律跳转,则下降沿的个数为5
所以我们就用外部中断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,画出状态图一目了然!
拔了杜邦线再复位开发板就是显示0了。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程