本帖最后由 小恶魔owo 于 2024-11-19 16:27 编辑

(一)简介
Arduino Uno中断是一种特殊的功能机制,它允许Arduino在执行其他任务时,立即响应特定的事件或信号。
就比如程序在执行的时候,要按下停止按钮来中断执行,那么就要用到外部中断功能

中断的定义与类型
  • 定义:中断是计算机硬件和操作系统中常用的一种技术,它允许程序在特定事件发生时立即中断当前执行的代码,并跳转到预定义的中断处理函数中执行特定的操作。
  • 类型:在Arduino Uno中,中断主要分为外部中断和定时器中断两种。
外部中断:通过外部引脚上的电平变化触发,常用于检测按钮按下、传感器信号变化等外部事件。Arduino Uno有两个可用的外部中断引脚,即2号和3号引脚。
定时器中断:通过Arduino的定时器模块触发,可以设置为在特定时间间隔内产生中断,常用于周期性任务,如定时采集数据、定时发送数据等。


Arduino Uno开发板只有2个外部中断,分别连接到数字引脚2和3。使用attachInterrupt()函数来定义一个中断,并关联到一个函数。
attachInterrupt(interruptNum, ISR, mode);
复制代码
  • interruptNum: 这是外部中断号,Arduino开发板只有两个引脚支持,分别是GPIO2(中断号0),GPIO3(中断号1)。对于大多数Arduino板,可以直接使用digitalPinToInterrupt(pin)宏将数字引脚pin转换为相应的中断号。
  • ISR:中断触发时调用的函数。
  • mode:指定何种类型的引脚状态改变会触发中断。常用模式有:
    • LOW:引脚为低电平时触发(不推荐,因为会持续触发中断)。
    • CHANGE:引脚电平改变时触发。
    • RISING:引脚电平上升(从低到高)过程中触发。
    • FALLING:引脚电平下降(从高到低)过程中触发。

arduino的外部中断有上升沿触发、下降沿触发、低电平触发、电平改变触发模式。



(二)程序
①设定bool1变量,读取2号引脚的状态,也就是按钮的状态
int bool1 = digitalRead(2);
复制代码

②初始化函数
将13引脚设置输出模式(LED),将2引脚设置输入模式(按钮)
调用中断函数,digitalPinToInterrupt(2)将2号引脚转为中断0,设定一个跳转的函数“zhong”,设置上升沿触发RISING
void setup() {
  •   pinMode(13, OUTPUT);
  •   pinMode(2, INPUT);
  •   attachInterrupt(digitalPinToInterrupt(2), zhong, RISING);//中断函数,2号引脚的中断0,调用中断函数“zhong”,上升沿触发
  • }
  • 复制代码

    ③实验程序----无中断
    没有中断的时候,代码这样写,按下按钮并不会熄灭LED,因为此时程序已经进入while循环,所以程序根本没机会读到while以外的程序
    void loop() {

  •   while(1){
  •     digitalWrite(13, HIGH);
  •     delay(500);
  •   }
  •   if(bool1 == HIGH)
  •   {
  •     digitalWrite(13, LOW);
  •   }

  • }
  • 复制代码

    ④无中断现象
    按下按钮,没有任何反应,依旧在执行while函数
    8d8f58e1b91b24efd6f0 -small-original.gif

    ⑤实验程序----使用中断
    我们写一个zhong函数,里面再写将led熄灭
    这样在程序识别到中断信号时,将会执行"zhong"函数的内容
    在中断程序执行完之后,继续执行while函数
    void loop() {

  •   while(1){
  •     digitalWrite(13, HIGH);
  •     delay(500);
  •   }

  • }


  • void zhong(){
  •   
  •     digitalWrite(13, LOW);

  • }
  • 复制代码

    ⑥有中断现象
    0bbdb2e1604a5b7489c3 -small-original.gif



    (三)练习题
    题目:
    按钮控制灯(如果LED是亮的,就熄灭;如果LED是灭的,就点亮),用到外部中断来控制

    答案:
    // 定义LED引脚
  • const int ledPin = 13;

  • // 设置引脚模式
  • void setup() {
  •   // 初始化LED引脚为输出
  •   pinMode(ledPin, OUTPUT);
  •   
  •   // 初始化按钮引脚为输入,并启用内部上拉电阻
  •   pinMode(2, INPUT);
  •   
  •   // 附加中断服务程序到数字引脚2(即外部中断0)
  •   attachInterrupt(digitalPinToInterrupt(2), toggleLED, FALLING); // 当引脚2的电压从高到低变化时触发中断
  •   
  •   // 初始化LED状态为熄灭
  •   digitalWrite(ledPin, LOW);
  • }

  • // 中断服务程序,用于切换LED状态
  • void toggleLED() {
  •   digitalWrite(ledPin, !digitalRead(ledPin)); // 如果LED是亮的,就熄灭;如果LED是灭的,就点亮
  • }

  • // 主循环(这里不需要执行任何操作,因为所有的逻辑都在中断服务程序中处理)
  • void loop() {
  •   // 可以添加一些调试信息或空操作
  • }
  • 复制代码