一、基础知识:
    关中断Interrupt()、开中断noInterrupt()函数,可以被中断的代码Interrupt()不可以被中断的代码
    noInterrupt(),代码用法如下:
    外部中断函数:
    attachInterrupt(interrupt, function, mode)
    1)interrupt:中断号,UNO只能使用 0或1 ,即代表D2 与D3口。
    2)function:调用中断函数,中断发生时调用的函数。
    3)mode:中断触发模式。

    UNO R3 支持四种中断触发模式:
    LOW 当针脚输入为低时,触发中断
    CHANGE 当针脚输入发生改变时,触发中断
    RISING 当针脚输入由低变高时,触发中断
    FALLING 当针脚输入由高变低时,触发中断
    注意:
    1:中断服务程序不能够有参数和返回值。即void FunctionName(void){……..}
    2:在中断函数中delay()函数将不再起作用
    3:在中断函数中millis()函数的值将不会增加
    4:得到的串行数据将会丢失
    5:需要在中断函数内部更改的值需要声明为volatile类型

    二、代码案例:

    1. int pin = 13; //LED灯的引脚
    2. volatile int state = LOW; //设置LED灯状态
    3. void setup()
    4. {
    5. pinMode(pin, OUTPUT);
    6. attachInterrupt(digitalRead(2), blink, CHANGE); //设置触发类型为CHANGE,中断号0,即数字2口
    7. }
    8. void loop()
    9. {
    10. digitalWrite(pin, state); //对观察灯写入状态值
    11. }
    12. void blink() //触发函数
    13. {
    14. state = !state; //将状态变量求反
    15. }

    三、取消中断函数:detachInterrupt(interrupt)
    interrupt 是中断号。执行此语句后,系统不会对中断有反应,即上例中,系统不会再对灯状态进行改变。
    三、定时中断
    Arduino已经为我们写好了定时中断的库函数了,我们可以直接直接使用,这对于对底层了解较少的同学来说真是一个好消息。常用的库有FlexiTimer2.h和MsTimer2.h,这两个库的用法是大同小异的。下面对其中的几个常用的函数进行详细的介绍。这两个库你可以很轻松的从网上下载。
    1.void set(unsigned long ms, void (f)())
    这个函数设置定时中断的时间间隔和调用的中断服务程序。ms表示的是定时时间的间隔长度,单位是ms,void(
    f)()表示被调用中断服务程序,只写函数名字就可以了。
    2.void start()
    开启定时中断
    3.void stop()
    关闭定时中断
    注意:以上三个函数都是在MsTimer2的作用于中进行的,在使用时都要加上作用域,如:MsTimer2::start();可以通过下面这个例子来详细的了解一下定时中断。

    1. #include <MsTimer2.h> //定时器库的 头文件
    2. void flash() //中断处理函数,改变灯的状态
    3. {
    4. static boolean output = HIGH;
    5. digitalWrite(13, output);
    6. output = !output;
    7. }
    8. void setup()
    9. {
    10. pinMode(13, OUTPUT);
    11. MsTimer2::set(500, flash); // 中断设置函数,每 500ms 进入一次中断
    12. MsTimer2::start(); //开始计时
    13. }
    14. void loop(){}