2.5 中断函数
单片机的中断可概述为:由于某一随机事件的发生,单片机暂停原程序的运行,转去执行另一程序(随机事件),处理完毕后又自动返回原程序继续运行,其发生过程如图2.2所示,其中中断源、主程序、中断服务程序简述如下。
中断源:引起中断的原因,或能发生中断申请的来源。
主程序:单片机现在运行的程序。
中断服务程序:处理中断事件的程序。
2.5.1 interrupts()和noInterrupts()
在Arduino中,interrupts函数与noInterrupts函数分别负责打开与关闭总中断,这两个函数均为无返回值函数,无参数。
2.5.2 attachInterrupt(interrput,function,mode)
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);
}
2.5.3 detachInterrupt(interrput)
detachInterrupt函数用于取消中断,参数interrupt表示所要取消的中断源。
时间: 2024-10-27 04:54:50