中断的使用。
中断是单片机系统的一个重要应用,加强了单片机对随机时间的处理能力;例如,主程序中正在处理A事件,突然发生了中断响应,单片机这时就去执行B事件了,等完成了B事件的处理,在返回来处理A事件。
中断分为外部中断和内部中断,顾名思义,外部中断需要外部信号触发, 比如引脚上的电平高低变化;内部中断源自单片机内部,比如定时器,串口事件等。
如果是几个中断同时发生,单片机则要根据中断的优先级来进行响应不同的事件。每个型号的单片机都有自己的中断向量表,因此在程序移植的时候,要注意中断向量值是否与当前的单片机匹配。
以ARDUINO Leonardo为例,D3脚对应外部中断0,D2脚对应外部中断1;
中断关联函数为:
attachInterrupt(interrupt, function, mode);
参数含义:
interrupt:中断号
function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数有时被称为中断服务程序。
mode:发生中断的条件,包含以下四个类型:
我们把轻触开关的一端接D3脚,另一端接GND,执行下面程序:
int pbIn = 0; // 定义中断引脚为0,也就是D3引脚
int ledOut =13; // 定义输出指示灯引脚
volatile int state = LOW; // 定义默认输入状态
void setup()
{
// 置ledOut引脚为输出状态
pinMode(ledOut, OUTPUT);
// 监视中断输入引脚的变化
attachInterrupt(pbIn , stateChange, FALLING );//当电平下降时,触发中断0,执行函数stateChange
}
void loop()
{
// 模拟长时间运行的进程或复杂的任务。
for (int i = 0; i < 100; i++)
{
// 什么都不做,等待10毫秒
delay(10);
}
}
void stateChange()//中断响应程序
{
state = !state;//状态反转
digitalWrite(ledOut, state); //设置管脚状态
}
注意,中断响应程序中不要执行复杂的代码,越简单越好,最好只是简单的数字加减、赋值运算,否则,长时间的中断执行占用,会导致单片机的程序跑乱。
上面代码正常执行结果应该是:每次按下轻触开关,LED的状态就发生改变。