目录
中断定义
程序运行过程中时常需要监控一些事件的发生,如对某一传感器的检测结果做出反应。使用轮询的方式进行检测时效率较低,等待时间较长,而使用中断方式进行检测时则可以达到实时检测的效果。
当中断被触发时,控制器会暂停当前正在运行的主程序,而跳去运行中断程序,当中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。如此便可以达到实时响应处理事件的效果。
外部中断是由外部设备发起请求的中断。要想使用外部中断,就需要了解中断引脚的位置,根据外部设备选择中断模式,以及编写一个中断被触发后需要执行的中断函数。
中断引脚
ARDUINO中的外部中断通常是由Pin口电平改变触发的。每种型号的ARDUINO板都有数个PIn口可以用来注册中断
中断模式
为了设置中断模式,还需要了解设备触发外部中断的输入 信号类型。中断模式也就是中断触发的方式。在大多数ARDUINO上支持以下几个中断触发方式
模式名城 | 说明 |
---|---|
LOW | 低电平触发 |
CHANGE | 电平变化触发 |
RISING | 上升沿触发,即高电平变低电平 |
FALLING | 下降沿触发,即低电平变高电平 |
中断函数
除了设置中断模式外,还需要编写一个响应中断的处理程序——中断函数,当中断被触发后,便可以让Arduino运行该中断函数。中断函数就是当中断被触发后要去执行的函数,该函数不能带有任何参数,且返回类型为空
这些准备工作完成后,还需要在setup()中使用attachInterrrupt()函数对中断引脚进行初始化配置,以开启arduino的外部中断功能,其用法如下:
(1)attachInterrupt(interrupt, function,mode)
功能:对中断引脚进行初始化配置
参数:
interrupt,中断编号,注意,这里的中断编号并不是引脚编号
function,中断函数名,当中断被触发后即会运行此函数所代表的中断函数。
mode,中断模式
detachInterrupt(interrupt)
功能:禁用外部中断
参数:
interrrupt,需要禁用的中断编号
实验:外部中断实现LED开关
将LED灯接到5号数字输出,2号引脚注册为外部中断引脚,接一个按键开关,当按下开关时改变LED的状态
bool state = true;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
attachInterrupt(0,StateChange,FALLING);
pinMode(5,OUTPUT);
pinMode(2,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
if(state){
digitalWrite(5,HIGH);
}
else
digitalWrite(5,LOW);
}
void StateChange(){
state= !state;
}
利用外部中断将BUTTON按钮做为选择器
设置两个BUTTON按钮分别连接两个LED,初始时两个LED都为熄灭状态,当按下按钮1时,LED1点燃,再次按下BUTTON1时,LED1熄灭,当按下BUTTON2时,LED2点燃,LED1熄灭,同样按下BUTTON1,LED2熄灭。
bool rstate = false;
bool bstate = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
attachInterrupt(0,RStateChange,FALLING);
attachInterrupt(1,BStateChange,FALLING);
pinMode(5,OUTPUT);
pinMode(7,OUTPUT);
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(5,rstate);
digitalWrite(7,bstate);
}
void RStateChange(){
rstate = !rstate;
bstate = false;
}
void BStateChange(){
bstate = !bstate;
rstate = false;
}