考虑一辆快速行驶的汽车,如果它突然被相反方向的另一辆车撞到,首先发生的事情是,汽车中的加速度计传感器感应到突然减速并触发微控制器的外部中断车。然后基于该中断,微控制器产生电信号以立即展开安全气囊。汽车中的微控制器同时监控许多事情,例如感应汽车的速度、检查其他传感器、控制空调温度等。那么是什么让安全气囊在几秒钟内突然打开?答案是中断,这里使用了一个具有最高优先级的中断信号。
中断的另一个简单示例是对“触摸”感具有最高优先级的触摸屏手机。几乎每个电子设备都有某种中断来“中断”常规过程并在特定事件上执行一些更高优先级的事情。服务中断后恢复常规进程。
因此从技术上讲,中断是一种机制,通过该机制,I/O 或指令可以暂停处理器的正常执行并像它具有更高的优先级一样让自己得到服务。例如,执行正常执行的处理器可能会被某个传感器中断以执行 ISR(中断服务程序)中存在的特定进程。执行完 ISR 处理器可以再次恢复正常执行。
中断类型
有两种类型的中断:
硬件中断:当外部事件发生时发生,例如外部中断引脚将其状态从 LOW 变为 HIGH 或 HIGH 变为 LOW。
软件中断:根据软件的指令发生。例如定时器中断是软件中断。
Arduino中的中断
现在我们将了解如何在 Arduino Board中使用中断。它有两种类型的中断:
外部中断
引脚变化中断
外部中断:
这些中断由硬件解释并且非常快。这些中断可以设置为在 RISING 或 FALLING 或 LOW 电平的事件上触发。
引脚变化中断:
Arduinos 可以通过使用引脚更改中断来启用更多的中断引脚。在基于 ATmega168/328 的 Arduino 板上,任何引脚或所有 20 个信号引脚都可以用作中断引脚。它们也可以使用上升沿或下降沿触发。
在 Arduino 中使用中断
为了在 Arduino 中使用中断,需要了解以下概念。
中断服务程序 (ISR)
中断服务程序或中断处理程序是一个包含少量指令的事件。当发生外部中断时,处理器首先执行 ISR 中存在的这些代码,然后返回到它离开正常执行的状态。
ISR在 Arduino 中具有以下语法:
attachInterrupt(digitalPinToInterrupt(pin),ISR,模式);
digitalPinToInterrupt(pin):在 Arduino Uno、NANO 中,用于中断的引脚为 2,3 和 mega 2,3,18,19,20,21。在此处指定用于外部中断的输入引脚。
ISR:外部中断完成时调用的函数。
模式:要触发的转换类型,例如下降、上升等。
RISING:当引脚从低电平变为高电平时触发中断。
FALLING:当引脚从 HIGH 变为 LOW 时触发中断。
CHANGE:当引脚从 LOW 变为 HIGH 或 HIGH 变为 LOW 时触发中断(即当引脚状态发生变化时)。
使用中断时的一些条件
中断服务程序功能 (ISR) 必须尽可能短。
Delay() 函数在 ISR 中不起作用,应避免使用。
在这个Arduino 中断教程中,一个数字从 0 开始递增,两个按钮用于触发中断,每个按钮都连接到 D2 和 D3。LED 用于指示中断。如果按下一个按钮,LED 亮起,显示屏显示中断 2 并熄灭,当按下另一个按钮时,LED 熄灭,显示屏显示中断 1 并熄灭。
所需组件
Arduino 板(在本教程中使用 Arduino NANO)
按钮 - 2
LED - 1
电阻器 (10K) - 2
液晶显示器 (16x2) - 1
面包板
连接电线
电路原理图
Arduino Nano 和 16x2 LCD 显示器之间的电路连接:
两个按钮在引脚 D2 和 D3 处连接到 Arduino Nano。它们用于使用两个外部中断,一个用于打开 LED,另一个用于关闭 LED。每个按钮都有一个接地的 10k下拉电阻。因此,按下按钮时为逻辑高(1),未按下时为逻辑低(0)。下拉电阻是强制性的,否则输入引脚 D2 和 D3 处会有浮动值。
LED还用于指示已触发中断或已按下按钮。
Arduino中断编程
在本教程中,一个数字从 0 开始递增,该数字在连接到 Arduino Nano 的 (16x2) LCD 中连续显示,每当按下左按钮(中断引脚 D3)时,LED 亮起并显示 Interrupt2,当右按钮时(中断引脚 D2)被按下,LED 熄灭,显示屏显示 Interrupt1。
本教程末尾提供了带有工作视频的完整代码。
1. 首先包含 LCD 显示器的头文件,然后定义用于连接 Arduino Nano 的 LCD 引脚。
#includeLiquidCrystal lcd (7,8,9,10,11,12); //定义LCD显示引脚RS、E、D4、D5、D6、D7
2.在 void setup()函数中,首先在 LCD 显示屏上显示一些介绍信息。在此处了解有关将LCD 与 Arduino 连接的更多信息。
lcd.开始(16,2); lcd.setCursor(0,0); lcd.print("电路文摘"); lcd.setCursor(0,1); lcd.print("ArduinoInterrupt"); 延迟(3000); lcd.clear();
3. 然后在同一个 void setup() 函数中必须指定输入和输出引脚。引脚 D13 连接到 LED 的阳极,因此该引脚必须定义为输出。
pinMode(13,输出);
4. 现在编程中最重要的部分是attachInterrupt()函数,它也包含在void setup()中。
attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,RISING); attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,RISING);
这里指定引脚 2 为外部中断,当 D2 引脚有 RISING(低到高)时调用buttonPressed1函数。并且引脚 3 也用于外部中断,当 D3 引脚有 RISING 时调用 buttonPressed2 函数。
5.在 void loop() 内部,一个数字 (i) 从零递增并打印在 LCD(16x2) 上。
lcd.clear(); lcd.print("计数器:"); lcd.print(i); ++i; 延迟(1000);
在同一个 void loop() 中,digitalWrite()用于连接 LED 阳极的引脚 D13。根据可变输出中的值LED 将打开或关闭
数字写入(13,输出);
6. 最重要的部分是根据attachInterrupt()函数中使用的名称创建一个中断处理函数。
由于使用了两个中断引脚 2 和 3,因此需要两个 ISR。在此编程中,使用了以下 ISR
buttonPressed1():
无效 buttonPressed1() { 输出 = 低; lcd.setCursor(0,1); lcd.print("中断 1"); }
当按下引脚 D2 上的按钮时(上升沿)执行此功能。此功能将输出状态更改为低电平,导致 LED 关闭并在 LCD 显示屏上打印“interrupt1”。
buttonPressed2():
无效按钮Pressed2() { 输出=高; lcd.setCursor(0,1); lcd.print("中断2"); }
当按下引脚 D3 上的按钮时执行此功能。此功能将输出状态更改为高电平,导致 LED 亮起并在 LCD 显示屏上打印“interrupt2”。
Arduino 中断演示
1. 按下左侧的PUSH BUTTON 时,LED 亮起,LCD 显示Interrupt2。
2.当按下右侧的PUSH BUTTON时,LED熄灭,LCD显示Interrupt1
这就是中断在正常执行之间触发任何重要任务的有用方式。
//使用 Arduino 中断
//电路文摘
#include
LiquidCrystal lcd(7,8,9,10,11,12); // 定义 LCD 显示引脚 RS,E,D4,D5,D6,D7
volatile int 输出 = 低;
诠释 i = 0;
无效设置()
{
lcd.begin(16,2); // 将 LCD 设置为 16x2 类型
lcd.setCursor(0,0);
lcd.print("电路文摘");
lcd.setCursor(0,1);
lcd.print("ArduinoInterrupt");
延迟(3000);
lcd.clear();
pinMode(13,输出);
attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,RISING);// 用于在上升沿(从低到高)的 pin2 处创建外部中断的函数
attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,RISING); // 用于在上升沿(从低到高)的 pin3 上创建外部中断的函数
}
无效循环()
{
lcd.clear();
lcd.print("计数器:");
lcd.print(i);
++i;
延迟(1000);
数字写入(13,输出);//根据输出值打开或关闭 LED
}
void buttonPressed1() //按下 pinD2 上的按钮时执行 ISR 函数
{
output = LOW; //将输出值更改为低
lcd.setCursor(0,1);
lcd.print("中断 1");
}
void buttonPressed2() //按下 pinD3 上的按钮时执行 ISR 函数
{
output = HIGH; //将输出值更改为
高 lcd.setCursor(0,1);
lcd.print("中断2");
}
-
中断
+关注
关注
5文章
895浏览量
41366 -
Arduino
+关注
关注
187文章
6461浏览量
186569 -
中断编程
+关注
关注
0文章
5浏览量
7375
发布评论请先 登录
相关推荐
评论