📜  Arduino-中断(1)

📅  最后修改于: 2023-12-03 14:59:22.709000             🧑  作者: Mango

Arduino中断

什么是中断?

在计算机科学中,中断指的是计算机执行一个事件时暂停并转而执行另一个事件的行为。中断是计算机系统中的一种异步事件,它没有指定的时间表,也没有明确的开始和结束点。中断通知CPU在指定的时间内处理请求,以便不影响正在进行的活动。

Arduino中的中断

在Arduino中,中断是一种事件处理机制,可以让我们实现程序运行时在预定义事件发生时采取行动的功能。中断处理器独立于主程序,当一个中断事件发生时,它会暂停主程序,并运行预定义的中断函数来处理该事件。完成处理后,中断处理器将控制权还给主程序,使其恢复执行。

Arduino支持的中断

Arduino支持两种类型的中断:

外部中断
  • 外部中断通常是来自硬件的信号,例如按钮、传感器或其他设备的信号。
  • Arduino Uno和Nano支持2个外部中断,而Arduino Mega和Due支持6个外部中断。要使用外部中断,我们需要将其连接到数字引脚上,并设置Arduino的输入引脚模式。
  • 使用attachInterrupt()函数来初始化外部中断,我们需要指定触发类型、中断处理函数和引脚号。

这是一个例子,在引脚2上附加一个下降沿中断,调用一个名为ISR()的中断函数:

int led = 13;

void setup() {
  pinMode(2, INPUT);
  pinMode(led, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(2), ISR, FALLING);
}

void loop() {
  // 主程序
}

void ISR() {
  // 处理中断的代码
}
软件中断
  • 软件中断是通过代码触发的中断,与硬件无关。
  • 软件中断允许我们随时在程序中调用我们自己的中断函数,以执行一些特定的行动。
  • 调用interrupts()函数会开启中断处理,而调用noInterrupts()函数则会禁止中断处理。

这是一个例子,使用软件中断设置一个闹钟:

int led = 13;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  if (millis() > 10000) {  // 等待10秒钟
    digitalWrite(led, HIGH);  // 开启LED
    delay(1000);  // 延迟1秒钟
    noInterrupts();  // 禁用中断
    digitalWrite(led, LOW);  // 关闭LED
    delay(1000);
    interrupts();  // 启动中断
  }
}
结论

中断为我们提供了一种强大的机制,可以在特定事件发生时立即执行代码。Arduino支持两种类型的中断:外部中断和软件中断。我们可以使用attachInterrupt()函数来初始化外部中断,并使用interrupts()和noInterrupts()函数来控制软件中断。