什么是中断?
假设一下,你正在家里健身,这时门外传来了敲门声,虽然你的平板支撑时间还没做完,但此时你不得不去开门,同时不得不放暂停计时。立即去打开门,你发现只是房东来查水表,你检查了水表的读数并告诉了房东。立即关上门,你马不停蹄的又继续开始的继续计时健身。
外部中断是单片机实时地处理外部事件的一种内部机制。当外部事件发生后,单片机判断外部事件是否符合外部中断条件,如果符合外部中断条件,则停止CPU正在执行的程序,转而进行中断事件的处理;中断处理完毕后,又返回被中断的程序处,继续执行。
程序实现目的:
按键按下时,LED灯进行0.5秒周期的闪烁
按键再次按下时,LED灯关闭闪烁
硬件设备: ESP32开发板,按键,LED灯
硬件连线图:
模拟视频效果:
Arduino按键中断模拟器视频
编写工具:Arduino IDE:Arduino IDE官网下载
安装教程参考帖子:Arudino IDE使用详细教程
模拟器工具:Wokwi模拟器
主要函数:
attachInterrupt(pin, intRoutine, mode)
这个函数主要用于建立外部中断
参数 | 功能 |
---|---|
pin | 外部事件对应的引脚 |
intRoutine | 处理外部时间的函数名 |
mode | 中断模式 |
内置在 Arduino 的中断触发方式有以下五种:
定义名 | 作用 |
---|---|
RISING | 上升沿触发 |
FALLING | 下降沿触发 |
CHANGE | 边沿触发 |
ONLOW | 低电平触发 |
ONHIGH | 高电平触发 |
使用示例:
#include <Arduino.h>
#define Button 25 //设置按键为GPIO4
#define LED 26 //设置LED为GPIO26
boolean Flag = false;
void setup() {
Serial.begin(115200); //波特率设置为115200
pinMode(Button, INPUT); //按键设置为输入模式
pinMode(LED, OUTPUT); //LED设置为输出模式
attachInterrupt(Button, Flag_Interrupt, ONLOW); //设置外部中断
}
void Flag_Interrupt() //Flag中断函数
{
Flag = !Flag;
}
void Blink_ON()
{
uint16_t cnt=0;
while(true == Flag)
{
digitalWrite(LED,cnt%2);
delay(500);
while(cnt++ == 1000)cnt=0;
}
}
void Blink_OFF()
{
digitalWrite(LED,LOW);
}
void loop()
{
if(true == Flag)
{
Blink_ON();
}
else
{
Blink_OFF();
}
}
实物演示效果:
ESP开发按键中断开关灯