原文:http://www.arduino.cn/thread-2421-1-1.html

1.什么是中断?

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

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

void loop()
{
吃();
}

吃,是的,你没有看错,你的人生是如此的幸福,就是不断的 吃();循环
但实际上,你还有附加功能 开门();

void 开门()
{
打开门;
if(门口的人==女神)
跪舔();
if(门口的人==查水表的)
报告水表读数();
}

为了让你能顺利执行 开门();动作,你的亲生父母还得在Setup函数中设置 开门();这个动作何时启动。(也可能是你后妈设定的),具体的方法是attachInterrupt(中断通道,
中断函数, 触发方式); ,在这里中断通道就是你的耳朵(不要问为什么不是屁股),触发 开门();这个函数的方式是 敲门声。

void setup()
{
attachInterrupt(耳朵, 开门, 敲门声);//耳朵传感器在此不做介绍,有兴趣的自行研究
}

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

忘记你蛋碎的屌丝设定吧,我们要开始严肃的讨论问题了 
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.中断函数,中断触发模式与设置中断

中断函数就是你要去执行的函数,这个函数不能带任何参数,且没有返回类型。如:

?
1
2
3
4
void

holle()
{
  Serial.println("holle");
}

中断模式就是你的中断触发方式。在大多数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.例程
外部中断的使用也是非常简单的,下面我们来看一个官方提供的例程

int pin = ;
volatile int state = LOW; void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(, blink, CHANGE);//当int.0电平改变时,触发中断函数blink
} void loop()
{
digitalWrite(pin, state);
} void blink()//中断函数
{
state = !state;
}

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

[Arduino] 外部中断的更多相关文章

  1. Arduino的外部中断

    Arduino的中断函数格式为attachInterrupt(interrput,function,mode). attachInterrupt函数用于设置外部中断,有3个参数,interrput表示 ...

  2. STM32f103之外部中断

    一.背景 有个需求,IO口检测上升沿,然后做相应的动作.在此记录STM32F103的外部中断结构及配置方法, 以备下次快速上手使用. 有许多不太明白,又是老司机(:-D)帮忙,真的是站在别人的肩膀上会 ...

  3. STM32之EXTI——外部中断

    互联网的广大网友,大家早上中午晚上好.EXTI...故名思义..EX表外,出..I表示Intrrupt..所以合起来就是外部中断...说到这..我觉得我最近的六级水平(背单词)又进了一步,稍微自夸了下 ...

  4. 转别人的 STM32外部中断使用注意事项

    前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...

  5. STM32外部中断初理解

    PA0,PB0...PG0--->EXTI0 PA1,PB1...PG1--->EXTI1 ....... PA15,PB15...PG15--->EXTI15 以上为GPIO和中断 ...

  6. STM32——外部中断EXIT实现

    外部中断实现步骤: 一.初始化,包括:1.AFIO时钟中断和GPIO时钟使能:                          2.GPIO初始化                           ...

  7. STM32 GPIO外部中断总结

    一.STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处.STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB ...

  8. 向linux内核中添加外部中断驱动模块

    本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...

  9. STM32学习笔记(九) 外部中断,待机模式和事件唤醒

    学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为 ...

随机推荐

  1. 杭电1010Tempter of the Bone

    Tempter of the Bone Problem Description The doggie found a bone in an ancient maze, which fascinated ...

  2. POJ3041Asteroids(二分图最少顶点覆盖)

    最少顶点覆盖 = 二分图最大匹配 证明见   http://hi.baidu.com/keeponac/item/111e3438988c786b7d034b56

  3. C#委托及事件处理机制浅析

    事件可以理解为某个对象所发出的消息,以通知特定动作(行为)的发生或状态的改变.行为的发生可能是来自用户交互,如鼠标点击:也可能源自其它的程序逻辑.在这里,触发事件的对象被称为事件(消息)发出者(sen ...

  4. python安装(windows)

    1.python安装(windows) 1.1 下载安装包 https://www.python.org/downloads/ 1.2 安装 python2.7默认安装路径:C:\python27 注 ...

  5. 结构类模式(七):代理(Proxy)

    定义 为其他对象提供一种代理以控制对这个对象的访问. 代理模式也叫做委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应 ...

  6. OC:属性、点语法、KVC

    //属性的属性 属性定义在一个 .h文件里,在这个.h文件里可以定义实例变量(就是这个类的特征),也可以通过   @protery(属性约束关键字) 属性名字类型 属性名 来定义一些属性,在prope ...

  7. [转载]SQL Server内核架构剖析

    原文链接:http://www.sqlserver.com.cn 我们做管理软件的,主要核心就在数据存储管理上.所以数据库设计是我们的重中之重.为了让我们的管理软件能够稳定.可扩展.性能优秀.可跟踪排 ...

  8. STL 速解

    STL(Standard Template Library)是C++的标准模版库. STL概述 STL的一个重要概念是数据结构和算法的分离,这使得STL变得十分通用.例如:由于STL的sort()函数 ...

  9. 一条结合where、group、orderby的linq语法

    DataTable dt = (from x in dsResult.Tables[0].AsEnumerable() where DataTrans.CBoolean(x["IsCheck ...

  10. 升级xcode时更换appid账户

    转自:http://blog.csdn.net/zhuzhihai1988/article/details/39803743 为了免下载安装Xcode,安装时使用了别人提供的Xcode.dmg安装,而 ...