本节书摘来华章计算机《Arduino开发实战指南:机器人卷》一书中的第2章 ,第2.5节,黄文恺 伍冯洁 陈 虹 编著更多章节内容可以访问云栖社区“华章计算机”公众号查看。
单片机的中断可概述为:由于某一随机事件的发生,单片机暂停原程序的运行,转去执行另一程序(随机事件),处理完毕后又自动返回原程序继续运行,其发生过程如图2.2所示,其中中断源、主程序、中断服务程序简述如下。中断源:引起中断的原因,或能发生中断申请的来源。主程序:单片机现在运行的程序。中断服务程序:处理中断事件的程序。
在Arduino中,interrupts函数与noInterrupts函数分别负责打开与关闭总中断,这两个函数均为无返回值函数,无参数。
attachInterrupt函数用于设置外部中断,有3个参数,分别表示中断源、中断处理函数和触发模式,它们的具体含义如下。中断源:可选0或者1,对应2或者3号数字引脚。中断处理函数:指定中断的处理函数,是一段子程序,当中断发生时执行该子程序部分,其中参数值为函数的指针。触发模式:有四种类型——LOW(低电平触发)、CHANGE(变化时触发)、RISING(低电平变为高电平触发)、FALLING(高电平变为低电平触发)数字引脚D2口接按钮开关,D4口接LED1(红色),D5口接LED2(绿色),LED3为板载LED灯,每秒闪烁一次。使用中断0来控制LED1,中断1来控制LED2。按下按钮,马上响应中断,由于中断响应速度快,LED3不受影响,继续闪烁。该示例的程序清单如下:
volatile int state1=LOW,state2=LOW; int LED1=4; int LED2=5; int LED3=13; // 使用板载的LED灯 void setup() { pinMode(LED1,OUTPUT); pinMode(LED2,OUTPUT); pinMode(LED3,OUTPUT); attachInterrupt(0,LED1_Change,LOW); // 低电平触发 attachInterrupt(1,LED2_Change,CHANGE); // 任意电平变化触发 } void loop() { digitalWrite(LED3,HIGH); delay(500); digitalWrite(LED3,LOW); delay(500); } void LED1_Change() { state1=!state1; digitalWrite(LED1,state1); delay(100); } void LED2_Change() { state2=!state2; digitalWrite(LED2,state2); delay(100); }detachInterrupt函数用于取消中断,参数interrupt表示所要取消的中断源。
相关资源:ARDUINO开发实战指南