Arduino uno教程⑤:外部中断,附练习题 【连载】

科技   2024-11-25 08:01   广东  

性能参数
①主控芯片:ATmega328P
②数字输入输出引脚:14个
③PWM引脚:6个
④储存(存放代码的空间)32KB
⑤运存(运行时的存储)2KB;EEPROM(掉电保存空间)1KB
⑥晶振16MHz
在线仿真:https://wokwi.com/

Arduino uno教程①:安装Arduino IDE

Arduino uno教程②:开发板及点灯测试

Arduino uno教程③:按钮控制LED灯,附练习题

Arduino uno教程④:模拟量,使用ADC测电压

Arduino uno教程⑤:外部中断,附练习题


(一)简介

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函数。

⑤实验程序----使用中断

我们写一个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() { // 可以添加一些调试信息或空操作}


待续...



END

 免费申请开发板 


投稿/推广/合作/加群 请扫码添加微信

(请备注来意,加群请备注城市-称呼-行业岗位信息)




面包板社区
分享电子技术干货,工程师福利!EET电子工程专辑、ESM国际电子商情、EDN电子技术设计官方社区。
 最新文章