1.什么是中断? [C++] 纯文本查看 复制代码 代码 |
|
001 002 003 |
|
吃,是的,你没有看错,你的人生是如此的幸福,就是不断的 吃();循环
但实际上,你还有附加功能 开门();
[C++] 纯文本查看 复制代码
代码
001
002
003
004
005
006
007
void
开门(){
打开门;
if
(门口的人==女神)
跪舔();
if
(门口的人==查水表的)
报告水表读数();
}
为了让你能顺利执行 开门();动作,你的亲生父母还得在Setup函数中设置 开门();这个动作何时启动。(也可能是你后妈设定的),具体的方法是attachInterrupt(中断通道, 中断函数, 触发方式); ,在这里中断通道就是你的耳朵(不要问为什么不是屁股),触发 开门();这个函数的方式是 敲门声。
[C++] 纯文本查看 复制代码
代码
001
002
003
void
setup(){
attachInterrupt(耳朵, 开门, 敲门声);
//耳朵传感器在此不做介绍,有兴趣的自行研究
}
这样设定后,你每次听到敲门声,就不得不去打开门,并执行相应的动作了。
也许你对这样的人物设定不太满意,但这就是你的宿命,少年。
忘记你蛋碎的屌丝设定吧,我们要开始严肃的讨论问题了 {:soso_e197:}
2.各种型号Arduino外部中断引脚
外部中断在不同的Arduino型号上位置也不同,只有外部中断发生在以下端口,Arduino才能捕获到,以下例举了常见的几种型号的外部中断引脚标号。
型号 |
int.0 |
int.1 |
int.2 |
int.3 |
int.4 |
int.5 |
UNO\Ethernet |
2 |
3 |
|
|
|
|
Mega2560 |
2 |
3 |
21 |
20 |
19 |
18 |
Leonardo |
3 |
2 |
0 |
1 |
|
|
Due |
所有IO口均可 |
3.中断函数,中断触发模式与设置中断
中断函数就是你要去执行的函数,这个函数不能带任何参数,且没有返回类型。如:
[C++] 纯文本查看 复制代码
代码
001
002
003
004
void
hello()
{
Serial.println(
"hello"
);
}
中断模式就是你的中断触发方式。在大多数arduino上有以下四种触发方式:
LOW 低电平触发
CHANGE 电平变化,高电平变低电平、低电平变高电平
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发(该中断模式仅适用于Arduino due)
在定义中断函数后,要使用外部中断,你只需要在程序的Setup部分配置好中断函数即可,配置函数如下:
attachInterrupt(interrupt, function, mode);//interrupt为你中断通道编号,function为中断函数,mode为中断触发模式
需要注意的是在Arduino Due中,中断设置有点不同:
attachInterrupt(pin, function, mode); //due 的每个IO均可以进行外部中断,所以这里第一个参数为pin,即你使用的引脚编号。
如果在程序中途,你不需要使用外部中断了,你可以用中断分离函数detachInterrupt(interrupt );来取消这一中断设置。
同样在Arduino Due上,该函数为detachInterrupt(interrupt );。
4.例程
外部中断的使用也是非常简单的,下面我们来看一个官方提供的例程
[C++] 纯文本查看 复制代码
代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
int
pin = 13;
volatile
int
state = LOW;
void
setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
//当int.0电平改变时,触发中断函数blink
}
void
loop()
{
digitalWrite(pin, state);
}
void
blink()
//中断函数
{
state = !state;
}
5.应用
利用外部中断,可以在很多地方提高你程序的运行效率.