查看: 144963|回复: 133

Arduino教程——外部中断的使用

  [复制链接]
  • TA的每日心情
    奋斗
    2018-8-17 09:12
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2012-12-14 15:26 | 显示全部楼层 |阅读模式
    本帖最后由 奈何col 于 2014-9-1 01:37 编辑

    1.什么是中断?

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

    现在我想告诉你一个惊天秘密,其实你妈欺骗了你,你根本不是他们亲生的,你是人造人,而你的大脑里装备了一个arduino控制器!你的型号是 Arduino 吃货,之所以叫这么2的名字,是因为你的loop的写法问题。我们来看看你的loop函数。
    [C++] 纯文本查看 复制代码
    void loop() {
      吃();
    }

    吃,是的,你没有看错,你的人生是如此的幸福,就是不断的 吃();循环
    但实际上,你还有附加功能 开门();
    [C++] 纯文本查看 复制代码
    void 开门(){
    打开门;
    if(门口的人==女神)
        跪舔();
    if(门口的人==查水表的)
        报告水表读数();
    }

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

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

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

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

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

    中断函数就是你要去执行的函数,这个函数不能带任何参数,且没有返回类型。如:
    [C++] 纯文本查看 复制代码
    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++] 纯文本查看 复制代码
    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.应用
    利用外部中断,可以在很多地方提高你程序的运行效率.
    同时你也可以运用以上知识,使用  旋转编码器   http://www.arduino.cn/thread-2423-1-1.html
    或者最一个 简单监控装置
    如果以上内容对你有帮助,你可以通过打赏支持作者

    2人打赏

  • TA的每日心情
    无聊
    2017-1-24 10:00
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2012-12-14 22:35 | 显示全部楼层
    力挺奈何呀。。。。。。要是以后的介绍都这么写,就太吸引人了。。。。。。要是奈何的书也这么出,出成这个风格。。。。。。那就会减少很多人的不理解。。。。。。感动呀。。。。。。奈何加油~>_<~+等着待续呢
  • TA的每日心情
    开心
    2015-9-22 09:46
  • 签到天数: 272 天

    [LV.8]以坛为家I

    发表于 2012-12-15 06:20 | 显示全部楼层
    这篇写的幽默、吸引眼球,很不错。特此表扬,以资鼓励!

    该用户从未签到

    发表于 2012-12-26 11:21 | 显示全部楼层
    支持支持,哈哈
  • TA的每日心情
    开心
    2015-12-17 12:01
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2012-12-14 16:15 | 显示全部楼层
    沙发,期待。
  • TA的每日心情
    无聊
    2017-1-24 10:00
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2012-12-14 22:39 | 显示全部楼层
    求定时中断什么的呀。。。。。。奈何加油~
     发表于 2012-12-15 11:45
    Array[tthread=zuojianzhong_hua, 孤叶寒冰]http://app.qlogo.cn/mbloghead/7b58ea60f2555b0d94f2[/tthread]

    该用户从未签到

    发表于 2012-12-15 11:58 | 显示全部楼层
    学习了,谢谢奈何

    该用户从未签到

    发表于 2012-12-15 12:41 | 显示全部楼层
    多谢,多出这样的好教程

    该用户从未签到

    发表于 2012-12-17 13:21 | 显示全部楼层
    学习了,这个风格好,我等屌丝大爱
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    体验OneNET,登录就送好礼
    体验OneNET,登录就送好礼
    OneNET--中国移动物联网开发平台,解决协议适配、海量连接、数据存储、设备管理等物
    初学arduino求助
    初学arduino求助
    大佬们,我想问一下,我现在想做一个程序:按下开关持续时间t,延迟7.77t后点亮led0.
    Arduino模拟USB鼠标
    Arduino模拟USB鼠标
    [md]### 模拟鼠标控制 下面将使用摇杆模块和Arduino Leonardo模拟USB鼠标。 [/md] [s
    ATK-esp8266WiFi模块
    ATK-esp8266WiFi模块
    我的esp8266模块以前烧进去过一次,半年没玩了。重新烧就提示错误了[/backcolor] 这是
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表