Arduino基础入门篇13—外部中断
1. 中断介绍
我们已经知道,Arduino程序是在loop()中不断的循环的。在程序的运行中,我们时常需要监控一些事件的发生,比如对某一传感器的返回数据进行解析。使用轮询的方式检测,效率比较低,而且随着程序功能增加,轮询到指定功能时需要等待的时间变长。而使用中断方式检测,可以到达实时检测的效果。
中断程序可以看作是一段独立于主程序之外的程序,当中断触发时,控制器会暂停当前正在运行的主程序,而跳转去运行中断程序,中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。如此便可做到实时响应处理事件的效果。
2. 实验材料
-
Uno R3开发板
-
配套USB数据线
-
面包板及配套连接线
-
1个LED灯
-
1个220Ω限流电阻
-
1个震动开关
震动开关,即震动传感器,根据其结构的不同又分为弹簧开关和滚珠开关。
-
弹簧开关,其内部由一根中心金属导电脚和环绕在其外部的弹簧导电脚组成。弹簧震动时会接触到中心导电脚,形成短路闭合状态;
-
滚珠开关,其内部包含有一颗金属滚珠,当震动时滚珠滚动短路两个导电脚,形成短路闭合状态。
3. 实验步骤
-
根据原理图搭建电路。
直插式LED灯负极接开发板GND,正极接220Ω限流电阻,电阻另一端接开发板数字9引脚。震动开关一端接开发板GND,另一端接数字引脚2。
实验原理图如下图所示:
实验原理图实物连接图如下图所示:
实物连接图 -
新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
1/*
2 ShakeSwitch
3 中断检测振动传感器,控制LED灯亮灭
4*/
5int SensorLED = 9; //定义LED为数字引脚9
6int SensorINPUT = 2; //连接震动开关到中断0,也就是数字引脚2
7char state = LOW;
8
9void setup() {
10
11 pinMode(SensorLED, OUTPUT); //LED为输出模式
12 pinMode(SensorINPUT, INPUT_PULLUP); //震动开关为输入模式
13
14 //下降沿触发,触发中断0,调用blink函数
15 attachInterrupt(0, blink, FALLING);
16}
17
18void loop() {
19
20 if (state == HIGH) { // 如果state为HIGH
21 state = LOW;
22 digitalWrite(SensorLED, HIGH); // 亮灯
23 delay(500); //延时500ms
24 }
25 else {
26 digitalWrite(SensorLED, LOW); // 否则,关灯
27 }
28}
29void blink() { //中断函数blink()
30 state = !state; //一旦中断触发,state状态反转
31} -
连接开发板,设置好对应端口号和开发板类型,进行程序下载。
程序下载
4. 实验现象
触发震动后,LED灯点亮一段时间后熄灭。再次触发震动再次点亮。
实验现象
5. 函数介绍
attachInterrupt()
-
描述:外部中断配置函数。
-
函数原型:attachInterrupt(interrupt, ISR, mode)
-
参数:
-
-
interrupt: 中断号。不同Arduino开发板中断号不同。Uno R3有两个外部中断,分别为数字管脚2(中断0)和数字管脚3(中断1)。
-
ISR: 中断处理函数。此函数不带参数,没有返回值。
-
mode: 中断触发方式。
-
-
LOW: 低电平触发。
-
CHANGE:管脚状态改变触发。
-
RISING:上升沿触发。
-
FALLING:下降沿触发。
-
-
-
返回值:无。
6. 实验分析
通过attachInterrupt()函数注册数字管脚2为外部中断,触发方式为下降沿触发。中断处理函数blink()中每触发一次翻转一次state的状态。loop()函数中通过state状态来控制LED灯亮灭。
中断是非常实用的功能,它释放了CPU资源来做更多的事情。很多处理器、控制器都有中断功能,更高级的还包括中断优先级「多个中断同时触发时处理先后问题」和中断嵌套「中断中的中断」。
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com