(一)简介
Arduino Uno中断是一种特殊的功能机制,它允许Arduino在执行其他任务时,立即响应特定的事件或信号。
就比如程序在执行的时候,要按下停止按钮来中断执行,那么就要用到外部中断功能
中断的定义与类型
- 定义:中断是计算机硬件和操作系统中常用的一种技术,它允许程序在特定事件发生时立即中断当前执行的代码,并跳转到预定义的中断处理函数中执行特定的操作。
- 类型:在Arduino Uno中,中断主要分为外部中断和定时器中断两种。
定时器中断:通过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函数
⑤实验程序----使用中断
我们写一个zhong函数,里面再写将led熄灭
这样在程序识别到中断信号时,将会执行"zhong"函数的内容
在中断程序执行完之后,继续执行while函数
- void loop() {
- while(1){
- digitalWrite(13, HIGH);
- delay(500);
- }
- }
- void zhong(){
-
- digitalWrite(13, LOW);
- }
⑥有中断现象
(三)练习题
题目:
按钮控制灯(如果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() {
- // 可以添加一些调试信息或空操作
- }