外部中断的使用

2016-01-101.6万
AI 快速预览详细 收起
本文介绍了Arduino外部中断的概念及其应用。通过一个生动的例子,解释了中断是如何工作的。文章详细说明了如何定义中断函数、设置中断触发模式,并提供了具体的代码示例。最后,文章还展示了如何在实际项目中应用外部中断,例如使用旋转编码器或制作监控装置。
1.什么是中断?

试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得不去开门,同时不得不放停下生命中最重要的事情——吃饭。打开门后,你发现只是一个查水表的,你检查了水表读数并告诉了查水表的人。关上门,你马不停蹄的又投入了于食物的作战中。
我们来分析一下这个颇具传奇性的故事,在这里人生的主旋律——吃饭,就是你的主程序,而敲门声,就是一个中断信号,它让你不得不去执行你的人生插曲——开门接客这个中断函数。完成这个小插曲后,你又要投入到主线剧情 吃饭这个主程序上。

现在我想告诉你一个惊天秘密,其实你妈欺骗了你,你根本不是他们亲生的,你是人造人,而你的大脑里装备了一个Arduino控制器!你的型号是 Arduino 吃货,之所以叫这么2的名字,是因为你的loop的写法问题。我们来看看你的loop函数


  1. void loop() {
  2.   吃();
  3. }
复制代码

吃,是的,你没有看错,你的人生是如此的幸福,就是不断的 吃();循环
但实际上,你还有附加功能 开门();
  1. void 开门(){
  2. 打开门;
  3. if(门口的人==女神)
  4.     跪舔();
  5. if(门口的人==查水表的)
  6.     报告水表读数();
  7. }
复制代码

为了让你能顺利执行 开门();动作,你的亲生父母还得在Setup函数中设置 开门();这个动作何时启动。(也可能是你后妈设定的),具体的方法是attachInterrupt(中断通道, 中断函数, 触发方式); ,在这里中断通道就是你的耳朵(不要问为什么不是屁股),触发 开门();这个函数的方式是 敲门声
  1. void setup(){
  2.   attachInterrupt(耳朵, 开门, 敲门声);//耳朵传感器在此不做介绍,有兴趣的自行研究
  3. }
复制代码

这样设定后,你每次听到敲门声,就不得不去打开门,并执行相应的动作了。
也许你对这样的人物设定不太满意,但这就是你的宿命,少年。

忘记你蛋碎的屌丝设定吧,我们要开始严肃的讨论问题了
2.各种型号Arduino外部中断引脚

外部中断在不同的Arduino型号上位置也不同,只有外部中断发生在以下端口,Arduino才能捕获到,以下例举了常见的几种型号的外部中断引脚标号。
型号int.0int.1int.2int.3int.4int.5
UNO\Ethernet23    
Mega25602321201918
Leonardo3201  
Due 所有IO口均可

3.中断函数,中断触发模式与设置中断

中断函数就是你要去执行的函数,这个函数不能带任何参数,且没有返回类型。如:
  1. void hello()
  2. {
  3.   Serial.println("hello");
  4. }
复制代码

中断模式就是你的中断触发方式。在大多数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.例程
外部中断的使用也是非常简单的,下面我们来看一个官方提供的例程
  1. int pin = 13;
  2. volatile int state = LOW;
  3. void setup()
  4. {
  5.   pinMode(pin, OUTPUT);
  6.   attachInterrupt(0, blink, CHANGE);//当int.0电平改变时,触发中断函数blink
  7. }
  8. void loop()
  9. {
  10.   digitalWrite(pin, state);
  11. }
  12. void blink()//中断函数
  13. {
  14.   state = !state;
  15. }
复制代码

5.应用
利用外部中断,可以在很多地方提高你程序的运行效率.
同时你也可以运用以上知识,使用  旋转编码器   http://www.arduino.cn/thread-2423-1-1.html
或者最一个 简单监控装置




转自:Arduino教程——外部中断的使用-Arduino中文社区
http://www.arduino.cn/thread-2421-1-1.html

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(5)
孙毅
孙毅
哇塞,都会使用中断了啊?!这么高级?
qq815076543322
qq815076543322
作者
回复孙毅
不会 学习中
dsweiliang
dsweiliang
学习学习
qq815076543322
qq815076543322
作者
回复dsweiliang
大家一起学习
qq815076543322
qq815076543322
作者
回复dsweiliang
评论内容
凌风清羽
凌风清羽
好久不学Arduino啦,再跟楼主好好学学~~
qq815076543322
qq815076543322
作者
回复凌风清羽
我也在学习
hnyzcj
hnyzcj
干嘛你俩是不是搞个中断集合
qq815076543322
qq815076543322
作者
回复hnyzcj
重复了吗
丄帝De咗臂
丄帝De咗臂
Arduino外部中断-DF创客社区-分享创造的喜悦 https://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=12132
qq815076543322
qq815076543322
作者
回复丄帝De咗臂
重复了?
- 没有更多了 -