0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Arduino中断的教程

科技观察员 来源:circuitdigest 作者:Pramoth Thangavel 2022-09-09 14:54 次阅读

考虑一辆快速行驶的汽车,如果它突然被相反方向的另一辆车撞到,首先发生的事情是,汽车中的加速度计传感器感应到突然减速并触发微控制器的外部中断车。然后基于该中断,微控制器产生电信号以立即展开安全气囊。汽车中的微控制器同时监控许多事情,例如感应汽车的速度、检查其他传感器、控制空调温度等。那么是什么让安全气囊在几秒钟内突然打开?答案是中断,这里使用了一个具有最高优先级的中断信号。

中断的另一个简单示例是对“触摸”感具有最高优先级的触摸屏手机。几乎每个电子设备都有某种中断来“中断”常规过程并在特定事件上执行一些更高优先级的事情。服务中断后恢复常规进程。

因此从技术上讲,中断是一种机制,通过该机制,I/O 或指令可以暂停处理器的正常执行并像它具有更高的优先级一样让自己得到服务。例如,执行正常执行的处理器可能会被某个传感器中断以执行 ISR(中断服务程序)中存在的特定进程。执行完 ISR 处理器可以再次恢复正常执行。

中断类型

有两种类型的中断:

硬件中断:当外部事件发生时发生,例如外部中断引脚将其状态从 LOW 变为 HIGH 或 HIGH 变为 LOW。

软件中断:根据软件的指令发生。例如定时器中断是软件中断。

Arduino中的中断

现在我们将了解如何在 Arduino Board中使用中断。它有两种类型的中断:

外部中断

引脚变化中断

外部中断:

这些中断由硬件解释并且非常快。这些中断可以设置为在 RISING 或 FALLING 或 LOW 电平的事件上触发。

pYYBAGMa4r2AOHyoAAAKOz08xkQ989.png

引脚变化中断:

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

面包板

连接电线

电路原理

poYBAGMa4reASqY7AAF00bhuE0k475.png

Arduino Nano 和 16x2 LCD 显示器之间的电路连接:

poYBAGMa4rSARZalAAAey2RA2Nk785.png

两个按钮在引脚 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 引脚。

#include                         
LiquidCrystal 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。

pYYBAGMa4qqAZdDMAAZrNPFnJ0o465.png

2.当按下右侧的PUSH BUTTON时,LED熄灭,LCD显示Interrupt1

poYBAGMa4qaAFr2GAAX7AEwioqM892.png

这就是中断在正常执行之间触发任何重要任务的有用方式。
//使用 Arduino 中断

//电路文摘


#include //包括lcd显示库

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

    文章

    884

    浏览量

    41030
  • Arduino
    +关注

    关注

    184

    文章

    6428

    浏览量

    184862
  • 中断编程
    +关注

    关注

    0

    文章

    4

    浏览量

    7357
收藏 人收藏

    评论

    相关推荐

    使用Arduino中断功能检测霍尔传感器附近磁铁的教程

    在本教程中,我们将使用 Arduino中断功能来检测霍尔传感器附近的磁铁并发光 LED。大多数情况下,霍尔传感器将仅与中断一起使用,因为它们的应用需要高读取和执行速度,因此让我们在本教程中也使用
    的头像 发表于 11-25 16:22 4035次阅读
    使用<b class='flag-5'>Arduino</b><b class='flag-5'>中断</b>功能检测霍尔传感器附近磁铁的教程

    #硬声创作季 单片机技术:Arduino中断

    单片机
    Mr_haohao
    发布于 :2022年10月30日 18:56:52

    Arduino中断#单片机

    中断Arduino
    学习硬声知识
    发布于 :2022年11月06日 00:08:02

    使用霍尔效应传感器检测磁铁的存在并制作速度计,防盗报警器等等!

    于检测传感器是否在磁铁附近。Arduino可通过其中断引脚检测此电压变化,并确定磁铁是否靠近传感器。Arduino霍尔效应传感器的基本工作如下图所示。Arduino霍尔效应传感器工作
    发表于 12-04 15:35

    Arduino中断学习资料分享

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录Arduino中断一、外部中断学习1、Arduino 开发板的外部中断
    发表于 02-15 06:38

    Arduino外部中断的相关资料分享

    外部中断外部中断是由控制器设备发起的中断请求。停止再在执行的内容去执行中断函数中的内容Arduino型号int0int1int2int3in
    发表于 02-15 06:34

    arduino有哪几种触发方式

    一、首先是要了解一下arduino中断模式有啥?哪些可以触发中断?二、接着是,了解不同芯片型号的arduino,可以接收外部中断的,有哪些引
    发表于 02-15 06:17

    arduino定时中断和外部中断怎么用?

    arduino定时中断怎么用和外部中断怎么用,可不可以和51单片机一样使用
    发表于 11-08 07:43

    如何使用Arduino中断

    警告:对于按钮,使用数字引脚2非常重要,因为中断仅在某些引脚上起作用!
    的头像 发表于 10-24 14:35 9919次阅读
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>中断</b>

    Arduino的实验例程之串口中断的程序免费下载

    本文档的主要内容详细介绍的是Arduino的实验例程之串口中断的程序免费下载。
    发表于 02-25 17:39 13次下载

    arduino 中断 和millis语句

    arduino 中断 和millis语句Arduino中支持如下几种中断: RESET中断、外部中断
    发表于 12-14 18:49 1次下载
    <b class='flag-5'>arduino</b> <b class='flag-5'>中断</b> 和millis语句

    Arduino中断学习

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录Arduino中断一、外部中断学习1、Arduino 开发板的外部中断
    发表于 12-16 16:47 3次下载
    <b class='flag-5'>Arduino</b><b class='flag-5'>中断</b>学习

    Arduino 外部中断

    外部中断外部中断是由控制器设备发起的中断请求。停止再在执行的内容去执行中断函数中的内容Arduino型号int0int1int2int3in
    发表于 12-16 16:51 11次下载
    <b class='flag-5'>Arduino</b> 外部<b class='flag-5'>中断</b>

    arduino系列教程之触摸开关(外部中断)开关小灯led

    一、首先是要了解一下arduino中断模式有啥?哪些可以触发中断?二、接着是,了解不同芯片型号的arduino,可以接收外部中断的,有哪些引
    发表于 12-16 16:51 8次下载
    <b class='flag-5'>arduino</b>系列教程之触摸开关(外部<b class='flag-5'>中断</b>)开关小灯led

    ARDUINO微控制器外部中断处理

    电子发烧友网站提供《ARDUINO微控制器外部中断处理.zip》资料免费下载
    发表于 10-27 11:50 2次下载
    <b class='flag-5'>ARDUINO</b>微控制器外部<b class='flag-5'>中断</b>处理