+
+
Posts List
  1. 外部中断
    1. 中断引脚、中断编号、中断模式
    2. 中断函数
    3. 实验:外部中断按钮控制LED灯

Arduino基础(六)外部中断、舵机

外部中断

程序运行过程中可能需要监控某件事件的发生,使用轮询的方式效率低等待时间长,而使用中断方式进行检测可以达到实时监测的效果。
中断程序可以看作是一段独立于主程序之外的程序,中断触发时,主程序会被暂停直到中断程序运行完毕。

中断引脚、中断编号、中断模式

只有中断信号发生在带有外部功能的引脚上,Arduino才能捕获到中断信号并响应。

型号/中断编号 int0 int1 int2 int3 int4 int5
UNO 2 3 - - - -
MEGA 2 3 21 20 19 18
Leonardo 3 2 0 1 - -
Due 所有 引脚 均可 使用 外部 中断
模式 说明
LOW 低电平触发
CHANGE 电平变化触发
RISING 电平升高触发
FALLING 电平降低触发

中断函数

中断函数就是当中断被触发后要执行的函数,不能带有参数且返回类型为空。
还需要在setup()中使用attachInterrupt()函数初始化中断引脚,以开启Arduino外部中断功能。

1
2
attachInterrupt(interrupt, function, mode) //中断开启函数:中断编号 中断函数名 中断模式  
detachInterrupt(interrupt) //中断分离函数:中断编号

实验:外部中断按钮控制LED灯

还是使用之前Arduino基础(一)简单介绍与数字输入和判断的线路。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int pbIn = 0;                  // 定义中断引脚为0,也就是D2引脚
int LED = 13; // 定义输出指示灯引脚
volatile int state = LOW; // 定义默认输入状态

void setup()
{
// 置ledOut引脚为输出状态
pinMode(LED, OUTPUT);

// 监视中断输入引脚的变化
attachInterrupt(pbIn, Switch, CHANGE);
Serial.begin(9600);
}

void loop()
{
// 模拟长时间运行的进程或复杂的任务。
for (int i = 0; i < 100; i++)
{
// 什么都不做,等待10毫秒
delay(1000);
Serial.println(i);
}

}

void Switch()
{
state = !state;
digitalWrite(LED, state);
Serial.print("Switched! state=");
Serial.println(state);
//delay(10000);
}

通过串口输出观察程序运行流程:

也可以看到按键振荡真的很大:

为了避免震荡,我在Switch()函数里面加了delay但是似乎作为中断函数,这个延时是不起作用的,因为程序时刻在监视是否满足中断条件,每满足中断条件的时候,触发的新的中断函数就会覆盖之前的中断函数的执行。

本文作者: rhinoc

本文链接: https://www.rhinoc.top/arduino_6/

版权声明: 本博客所有文章除特别声明外,均采用BY-NC-SA 4.0国际许可协议,转载请注明。

打赏
Love U 3000
  • Through WeChat
  • Through Alipay