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

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

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


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

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



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

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

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

  2.   while(1){
  3.     digitalWrite(13, HIGH);
  4.     delay(500);
  5.   }
  6.   if(bool1 == HIGH)
  7.   {
  8.     digitalWrite(13, LOW);
  9.   }

  10. }

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

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

  2.   while(1){
  3.     digitalWrite(13, HIGH);
  4.     delay(500);
  5.   }

  6. }


  7. void zhong(){
  8.   
  9.     digitalWrite(13, LOW);

  10. }

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



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

答案:
  1. // 定义LED引脚
  2. const int ledPin = 13;

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

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

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