实验中使用到的Arduino开发板型号为Mega 2560。Mega 2560的工作电压为5V,其标明的推荐电压为7~12V,在开发项目的时候,一般要用到变压器。其供电类型有3.3V和5V两种。这里进行中断实验时,没这么麻烦,只需将这块板子和电脑用USB线连接起来即可。

首先,中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。相当于你在读书时听到了敲门声,即中断源向你发出了中断请求,你需要放下书本,先去开门,发现原来是外卖到了。你处理完之后,又回去继续读书,并从你刚才读到的地方继续往下读。如果你是一个机器人的话,你从听到敲门声到回来继续读书的过程,构成了整个的中断过程。写入你大脑中的程序即为软件处理程序,门就是中断装置。

你可以在你的电脑上依次打开“设备管理器-查看-依连接顺序排列资源”,再展开“中断请求”,这时你会看到你的电脑上的各种中断,中断号为0的是“系统计时器”,中断号越小,其优先级越高。所谓优先级,是指当两个或多个中断同时发生时,CPU先响应优先级最高的中断。

中断有很多类型,此处介绍的为定时器中断,即利用板子里的定时器来让中断定时发生,可以精确控制时间。

在写程序之前,需要先在Arduino开发环境中导入一个库,即FlexiTimer2,这个库可以在官网上下载。然后直接打开”项目—加载库—添加一个.ZIP库“,这时,你只需要将之前下载的库在弹出来的文件查询框中点开即可。这时再点开”项目—加载库“,会在下面看到这个库,点击它,在程序中会自动出现预处理命令:

#include <FlexiTimer2.h>

 整个程序如下:

#include <FlexiTimer2.h>

int pin=13;
int buttonpin=2;
void event()
{
    static boolean output=HIGH;
    digitalWrite(buttonpin,output);
    output=!output;
}

void setup() {
    pinMode(pin,OUTPUT);
    pinMode(buttonpin,OUTPUT);
    FlexiTimer2::set(500,1.0/1000,event);
    FlexiTimer2::start();
}
void loop() {
    for(int i=0;i<255;i++){
      analogWrite(pin,i);
      delay(5);
    }
    for(int i=255;i>0;i--){
      analogWrite(pin,i);
      delay(5);
    }
}
首先定义板子上自带的13号灯为pin引脚,然后定义2号引脚。这里需要说明的是,每一类型的Arduino开发板的中断引脚不同,Mega 2560开发板有2,3,21,20,19,18共六个中断引脚。在主程序里写入13号引脚要做的工作——呼吸灯。然后在setup里,初始化这两个引脚。然后便是两个函数:
    FlexiTimer2::set(500,1.0/1000,event);
    FlexiTimer2::start();

第一个函数里有三个参数,首先500指频率,1.0/1000是指时间,即用1秒除以1000,为1ms,第三个是一个函数,在这里即为2号引脚要做的工作。整条语句意思是每过500*1ms,就执行一次event函数。接下来一条语句是让定时器开始工作。

整个event函数,是让2号引脚的电平反转,意思是每隔500ms即0.5s让2号LED灯点亮一次:
void event()
{
    static boolean output=HIGH;
    digitalWrite(buttonpin,output);
    output=!output;
}

现在整个程序已经完成,效果就是在13号灯进行呼吸操作的同时,2号LED灯每隔0.5秒闪烁一次。