性能参数
①主控芯片:ATmega328P
②数字输入输出引脚:14个
③PWM引脚:6个
④储存(存放代码的空间)32KB
⑤运存(运行时的存储)2KB;EEPROM(掉电保存空间)1KB
⑥晶振16MHz
在线仿真:https://wokwi.com/
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() {
// 可以添加一些调试信息或空操作
}
待续...
(请备注来意,加群请备注城市-称呼-行业岗位信息)