前言
1.什么是中断?
试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得不去开门,同时不得不放停下生命中最重要的事情——吃饭。打开门后,你发现只是一个查水表的,你检查了水表读数并告诉了查水表的人。关上门,你马不停蹄的又投入了于食物的作战中。
我们来分析一下这个颇具传奇性的故事,在这里人生的主旋律——吃饭,就是你的主程序,而敲门声,就是一个中断信号,它让你不得不去执行你的人生插曲——开门接客这个中断函数。完成这个小插曲后,你又要投入到主线剧情 吃饭这个主程序上。
结合单片机来说,外部中断是单片机实时地处理外部事件的一种内部机制。当外部事件发生后,单片机判断外部事件是否符合条件,如果符合外部中断条件,则停止CPU正在执行的程序,转而进行中断事件的处理;中断处理完毕后,又返回被中断的程序处,继续执行。
实验目的
使用外部中断的方法通过按键来控制LED的亮灭和无源蜂鸣器的发声。
软硬件
软件: vscode + platformIO
硬件: BPI-BIT开发板
函数解析
-
attachInterrupt(interrupt, function, mode)
此函数主要建立外部中断
参数 | 功能 |
---|---|
interrupt |
中断通道(外部事件对应的引脚) |
function |
中断函数(处理外部事件的函数) |
mode |
触发方式 |
- arduino上有以下几张触发放方式
定义名 | 触发方式 |
---|---|
LOW | 低电平触发 |
CHANGE | 电平变化(高电平变低电平、低电平变高电平) |
RISING | 上升沿触发 |
FALLING | 下降沿触发 |
HIGH | 高电平触发 |
代码示例
#include "Arduino.h"
bool State = true;
const int led = 18;
const int button = 35;
const int buzzer = 25;
//我们将使用通道0和8位分辨率作为占空比。对于频率,我们将仅设置2000 Hz以进行初始设置。
int freq = 2000;
int channel = 0;
int resolution = 8;
// 中断函数
void warning()
{
State = !State;
}
void setup()
{
// 初始化外部中断、pin
// 当按键按下时,引脚 35 输入的电平由高变低,触发中断函数warning
pinMode(led, OUTPUT);
pinMode(button, INPUT);
//使用ledcSetup功能设置PWM,该功能接收PWM通道,频率和占空 比分辨率作为输入。
ledcSetup(channel, freq, resolution);
ledcAttachPin(buzzer, channel);
attachInterrupt(button, warning, FALLING); // 设置外部中断(下降沿触发)
}
void loop()
{
if (State)
{
digitalWrite(led, HIGH);//小灯亮
ledcWrite(channel,0);//蜂鸣器不发声
}
else
{
ledcWrite(channel,100);//蜂鸣器发声
digitalWrite(led, LOW);//小灯灭
}
}
结论
利用外部中断,可以在很多地方提高你程序的运行效率。