5655浏览
查看: 5655|回复: 11

[入门] 外部中断的使用

[复制链接]
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

丄帝De咗臂  高级技匠

发表于 2016-1-10 18:18:20

Arduino外部中断-DF创客社区-分享创造的喜悦  https://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=12132
回复

使用道具 举报

hnyzcj  版主

发表于 2016-1-10 19:42:21

干嘛你俩是不是搞个中断集合
回复

使用道具 举报

凌风清羽  中级技匠

发表于 2016-1-10 20:47:03

好久不学Arduino啦,再跟楼主好好学学~~
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-10 21:33:44

丄帝De咗臂 发表于 2016-1-10 18:18
Arduino外部中断-DF创客社区-分享创造的喜悦  https://mc.dfrobot.com.cn/forum.php?mod=viewthr ...

重复了?
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-10 21:34:04

hnyzcj 发表于 2016-1-10 19:42
干嘛你俩是不是搞个中断集合

重复了吗
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-10 21:34:33

凌风清羽 发表于 2016-1-10 20:47
好久不学Arduino啦,再跟楼主好好学学~~

我也在学习
回复

使用道具 举报

dsweiliang  初级技神

发表于 2016-1-10 22:54:26

学习学习
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-10 23:17:35

回复

使用道具 举报

孙毅  初级技匠

发表于 2016-1-11 00:27:46

哇塞,都会使用中断了啊?!这么高级?
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-11 16:34:49

孙毅 发表于 2016-1-11 00:27
哇塞,都会使用中断了啊?!这么高级?

不会 学习中
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-1-11 16:35:00


大家一起学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail