精华内容
下载资源
问答
  • 使用attachInterrupt()函数,利用Arduino的引脚触发中断程序arduino不是所有引脚都能实现中断,具体要求见下表: Arduino控制板 支持中断的引脚 Uno, Nano, Mini 2, 3 Mega, Mega2560, MegaADK 2, 3, 18...

    使用attachInterrupt()函数,利用Arduino的引脚触发中断程序。arduino不是所有引脚都能实现中断,具体要求见下表:

    Arduino控制板支持中断的引脚
    Uno, Nano, Mini2, 3
    Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
    Micro, Leonardo0, 1, 2, 3, 7
    Zero除4号引脚以外的所有数字引脚
    MKR1000 Rev.10, 1, 4, 5, 6, 7, 8, 9, A1, A2
    Due所有数字引脚

    语法

    attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
    

    参数

    pin: 中断引脚号
    ISR: 中断服务程序名
    mode:中断模式

    中断模式(mode):

    LOW: 当引脚为低电平时触发中断服务程序
    CHANGE: 当引脚电平发生变化时触发中断服务程序
    RISING: 当引脚电平由低电平变为高电平时触发中断服务程序
    FALLING: 当引脚电平由高电平变为低电平时触发中断服务程序

    注意事项:

    • 中断函数不能有任何参数,也没有任何返回值。
    • 通常ISR需要越短小精悍越好!每次Arduino只能运行一个ISR函数,其它ISR函数只有在当前的ISR函数执行结束以后,才能按照其优先级别顺序执行。
    • millis()函数的运行依赖Arduino开发板的中断功能,因此ISR函数中的millis()函数是无法正常运行的。micros() 也是类似的情况,不能使用delay()函数和millis()函数。 delayMicroseconds() 不需要任何计数器就可以运行,所以delayMicroseconds() 运行是不会受到影响的。
    • 一般情况下,ISR函数与主程序之间传递数据是依靠全局变量来实现的。为了确保全局变量在ISR函数中可以正常的工作,应该将可能被ISR函数中使用的全局变量声明为volatile类型。
    展开全文
  • Arduino中断例程及常用arduino开发板中断引脚汇总

    千次阅读 多人点赞 2019-03-04 00:59:59
    文章目录外部中断常用arduino开发板外部中断引脚外部中断程序编写外部中断函数外部中断模式例程定时器中断例程 外部中断 常用arduino开发板外部中断引脚 不同的Arduino开发板外部中断引脚不同,总结常用的有如下几个...

    外部中断

    常用arduino开发板外部中断引脚

    不同的Arduino开发板外部中断引脚不同,总结常用的有如下几个:

    • UNO
    int.0int.1
    23

    具体见图:
    UNO

    • Ethernet
    int.0int.1
    23
    • Nano
    int.0int.1
    23

    具体见图:
    nano

    • Mini
    int.0int.1
    23

    具体见图:
    mini

    • Mega2560
    int.0int.1int.2int.3int.4int.5
    2321201918

    具体见图:
    mega

    • Leonardo
    int.0int.1int.2int.3
    3201

    具体见图:
    Leonardo

    • micro
    int.0int.1int.2int.3
    32RX1TX1

    micro

    • Yun(详情见图)
    int.0int.1int.2int.3
    18192021

    具体见图
    yun

    • 2009
    int.0int.1int.2int.3
    18192021

    具体见图:
    2009

    int.0int.1
    23
    • pro
    int.0int.1
    23

    具体见图:
    pro

    • promini
    int.0int.1
    23

    具体见图:
    promini

    外部中断程序编写

    外部中断函数

    中断函数即执行的函数,这个函数无返回值且没有参数。
    定义中断函数后,在Setup初始化函数中配置如下函数:

    attachInterrupt(interrupt, function, mode);
    //interrupt为中断号,function为中断函数,mode为中断触发模式
    

    在Arduino Due中,中断设置为:

    attachInterrupt(pin, function, mode);
     //due 的每个IO口均可进行外部中断,故引脚号为中断号。
    

    退出中断所有型号的控制板都可用中断分离函数detachInterrupt(interrupt );来取消中断设置。

    外部中断模式

    外部中断分为四种模式:

    LOW低电平触发
    CHANGE电平变化时触发(高电平变低电平、低电平变高电平)
    RISING上升沿触发
    FALLING下降沿触发
    HIGH高电平触发(该中断模式仅适用于Arduino due)

    例程

    以按键触发为例,准备材料:

    • Uno\Nano板

    • 下载数据线

    • 面包板及杜邦线

    • LED灯

    • 常用限流电阻
      如图连接
      连接图

    int LED = 13;       //定义LED为数字引脚13
    int key = 2;      //按键触发中断0
    char state = LOW;//标志位
    void setup() {
     pinMode(LED, OUTPUT);         //LED为输出模式
      pinMode(key, INPUT_PULLUP);        //输入模式
      attachInterrupt(0, blink, FALLING);//下降沿触发中断0,调用blink函数
    }
    
    void loop() {
      if (state == HIGH) {        // 如果state为HIGH
        state = LOW;
       digitalWrite(LED, HIGH);  // 亮
        delay(500);          //延时500ms
      }
      else {
        digitalWrite(LED, LOW);    // 否则,灭
      }
    }
    void blink() {               //中断函数blink()
      state = !state;             //一旦中断触发,state状态反转
    }
    

    效果为,每按下一次按键LED灯就闪一次。
    类似可套用于其他工程中。

    定时器中断

    首先需要添加MsTimer2库,并在程序中引用头文件 MsTimer2.h。

    例程

    使用例程如下:

    #include <MsTimer2.h>     //定时器库的头文件
     
    int num = 0; //计数
     
    //中断服务程序
    void onTimer()
    {
      Serial.print("The num is : ");
      Serial.println(num++);
    }
     
    void setup()
    {
      Serial.begin(9600); //初始化串口
      
      MsTimer2::set(1000, onTimer); //设置定时器中断,(时长,中断函数)
      MsTimer2::start(); //开始计时
    }
     
    void loop(){
    }
    
    

    打开串口查看器
    效果为:
    The num is : 0
    The num is : 1
    The num is : 2
    ……
    以此类推

    展开全文
  • Arduino中断

    千次阅读 多人点赞 2018-08-05 16:56:23
    中断的概念:  我们通过生活中一个简单的例子来让大家了解中断。当你正在家中看书时,突然电话铃响了,你停止看书,去接电话,和来电话的人进行... Arduino中的中断可以分为两类:外部中断和定时中断。下面我就...

    中断的概念:

         我们通过生活中一个简单的例子来让大家了解中断。当你正在家中看书时,突然电话铃响了,你停止看书,去接电话,和来电话的人进行交谈,通话结束后回来继续从刚才停止的位置看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。现在大家是不是对中断有了一个清晰地了解呢?

    中断的分类:

         Arduino中的中断可以分为两类:外部中断和定时中断。下面我就对其做一个详细的介绍。

    外部中断: 一般是指由外设发出的中断请求,即中断源在外部如:键盘中断、打印机中断等。外部中断需要外部中断源发出中断请求才能发中断。

    定时中断:主程序在运行的过程中听一段时间就进行一次中断,执行中断服务程序,不需要中断源的中断请求触发,这是有的自动进行的。

         我们可以根据实际情况的不同来确定使用什么样的中断。

    中断的函数:

    一、首先我们要介绍的是关中断和开中断即Interrupt()和noInterrupt()函数,用法如下

     

    可以被中断的代码

    Interrupt()

    不可以被中断的代码

    noInterrupt()

    可以被中断的代码

     

    二、外部中断

    1. attachInterrupt(interrupt, function, mode)

         1)interrupt:中断号,UNO只能使用 0或1 ,即代表D2 与D3口。

         2)function:调用中断函数,中断发生时调用的函数。

         3)mode:中断触发模式。

          UNO R3 支持四种中断触发模式:

          LOW          当针脚输入为低时,触发中断

          CHANGE     当针脚输入发生改变时,触发中断

          RISING       当针脚输入由低变高时,触发中断

          FALLING     当针脚输入由高变低时,触发中断

    注意:

    1:中断服务程序不能够有参数和返回值。即void  FunctionName(void){........}

    2:在中断函数中delay()函数将不再起作用

    3:在中断函数中millis()函数的值将不会增加

    4:得到的串行数据将会丢失

    5:需要在中断函数内部更改的值需要声明为volatile类型

    下面就给出一个官方实例:

    int pin = 13;                                   //LED灯的引脚

    volatile int state = LOW;                  //设置LED灯状态

     

    void setup()

    {

      pinMode(pin, OUTPUT);

      attachInterrupt(0, blink, CHANGE);  //设置触发类型为CHANGE,中断号0,即数字2口

    }

     

    void loop()

    {

      digitalWrite(pin, state);                  //对观察灯写入状态值

    }

     

    void blink()                                      //触发函数

    {

      state = !state;                               //将状态变量求反

    }

    这个例子很简单大家可以动手试着做一做。

     

    2.detachInterrupt(interrupt)

    当我们需要取消中断时,我们有下面的命令。

    detachInterrupt(interrupt)

    interrupt 是中断号。执行此语句后,系统不会对中断有反应,即上例中,系统不会再对灯状态进行改变。

     

    三、定时中断

         Arduino已经为我们写好了定时中断的库函数了,我们可以直接直接使用,这对于对底层了解较少的同学来说真是一个好消息。常用的库有FlexiTimer2.h和MsTimer2.h,这两个库的用法是大同小异的。下面对其中的几个常用的函数进行详细的介绍。这两个库你可以很轻松的从网上下载。

    1.void set(unsigned long ms, void (*f)())

         这个函数设置定时中断的时间间隔和调用的中断服务程序。ms表示的是定时时间的间隔长度,单位是ms,void(*f)()表示被调用中断服务程序,只写函数名字就可以了。

     

    2.void start()

         开启定时中断

     

    3.void stop()

         关闭定时中断

     

    注意:以上三个函数都是在MsTimer2的作用于中进行的,在使用时都要加上作用域,如:MsTimer2::start();可以通过下面这个例子来详细的了解一下定时中断。

    #include <MsTimer2.h>                    //定时器库的 头文件

    void flash()                                       //中断处理函数,改变灯的状态

    {                       

      static boolean output = HIGH;

      digitalWrite(13, output);

      output = !output;

    }

     

    void setup()

    {

      pinMode(13, OUTPUT);

     

      MsTimer2::set(500, flash);               // 中断设置函数,每 500ms 进入一次中断

      MsTimer2::start();                           //开始计时

    }

     

    void loop(){}

     

        

     

    展开全文
  • Arduino中断学习

    2021-02-20 15:08:36
    文章目录Arduino中断一、外部中断学习1、Arduino 开发板的外部中断引脚2、一个从轮询到中断的代码改进1) 轮询示例2) Arduino attachInterrupt()中断示例3) 通过设置ATMEG328单片机的寄存器设置中断示例4) 通过中断...

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    Arduino中断

    interruput 执行中断过程需要做两件事
    1) 保存可能需要储存和处理的所有信息位,
    2) 中断将恢复该信息,然后执行原先的操作
    中断有两种形式,内部时间中断和外部中断
    1) 内部中断时Arduino微处理器内部可能会出发中断,
    2) 外部中断,外部触发中断,UNO的2,3号端口可以触发中断


    一、外部中断学习

    1、Arduino 开发板的外部中断引脚

    带中断的数字引脚 attachInterrupt()的第一个参数是中断号。 通常,您应该使用digitalPinToInterrupt(pin)将实际的数字引脚转换为特定的中断号。 例如,如果连接到引脚3,则使用digitalPinToInterrupt(3)作为attachInterrupt()的第一个参数。

    表1:Arduino 开发板的外部中断引脚

    板子可用于外部中断的数字引脚
    Uno, Nano, Mini, other 328-based2, 3
    Uno WiFi Rev.2, Nano Everyall digital pins
    Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
    Micro, Leonardo, other 32u4-based0, 1, 2, 3, 7
    Zeroall digital pins, except 4
    MKR Family boards0, 1, 4, 5, 6, 7, 8, 9, A1, A2
    Nano 33 IoT2, 3, 9, 10, 11, 13, 15, A5, A7
    Nano 33 BLE, Nano 33 BLE Senseall pins
    Dueall digital pins
    101all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE)

    表2:Arduino 开发板的中断引脚对应的中断编号

    开发板INT0INT1INT2INT3INT4INT5
    Uno,Ethernet23
    Mega25602321201918
    leonardo32017

    2、一个从轮询到中断的代码改进

    通过Pin2上的开关触发中断,点亮LED

    1) 轮询示例

    方式1:轮询的方式按按钮,点亮LED,代码:

    //pins
    const unit8_t btn_pin = 2 ;
    const unit8_t led_pin = 5;
    
    //globals
    unit8_t led_state = LOW;
    unit8_t btn_pre = HIGH;
    
    void setup() {
      pinMode(btn_pin, INPUT_PULLUP);
      pinMode(led_pin, OUTPUT);
    }
    
    void loop() {
      //poll for button push
      unit8_t btn_state = digitalRead(btn_pin);
      if ((btn_state == LOW) && (btn_pre == HIGH))  //电位下降
      {
      led_state = ! led_state;
        digitalWrite(led_pin, led_state);
      }
      btn_pre = btn_state;
      delay(500);
    }
    
    
    

    2) Arduino attachInterrupt()中断示例

    方式2:
    通过外部中断实现功能,必须将按钮开关接在中断端口2,3上
    在端口2发生中断,该终端位INT0程序执行停止
    在端口3发生中断,该终端位INT1程序执行停止
    函数:attachInterrupt()
    attachInterrupt( interrupt, ISR, mode)

    代码:

    //pins
    const unit8_t btn_pin = 2 ;
    const unit8_t led_pin = 5;
    
    //globals
    unit8_t led_state = LOW;
    
    void setup(){
    pinMode(btn_pin, INPUT_PULLUP);
    pinMode(led_pin, OUTPUT);
    attatchinterrupt(digitalPinToInterrupt, toggle, FALLING);
    }
    
    void loop(){
    
    delay(500);
    }
    
    void toggle(){
    led_state =! led_state;
    digitalWrite(led_pin,led_state);
    }
    
    

    3) 通过设置ATMEG328单片机的寄存器设置中断示例

    通过手动控制寄存器,设置数字写入功能,这将不需要读取和写入引脚的功能
    代码如下(示例):

    //pins
    const unit8_t btn_pin = 2 ;
    const unit8_t led_pin = 5;
    
    void setup(){
    //设置PD的寄存器,设置btn_pin为输入,并且内部上拉的作用
    DDRD &=~(1<<btn_pin);    //设置btn_pin为输入
    PORTD |= (1<<btn_pin);    //设置引脚btn_pin为上拉电阻模式,输出高电平
    
    //设置led_pin为输出
    DDRD |= (1<<led_pin);  //设置led_pin为输出
    //设置 INT0 下降沿触发中断 
    EICRA |= (1<<ISC01);  
    EICRA &=~(1<<ISC00); //ISC00表示执行中断将在下降时触发
    
    //INT0 中断使能
    EIMSK |= (1<<INT0);     
    
    //全局中断使能
    sei();      //sei()开启中断,cli()关闭中断;
    }
    
    void loop(){
    
    delay(500);
    }
    
    ISR(INT0_vect)    //INT0中断函数
    {
    PORTD ^= (1<< led_pin); //将led引脚的输出值反转
    }
    
    

    4) 通过中断标记控制中断示例

    代码如下(示例):
    //全局变量中断标记来控制内部中断方式实现
    //pins
    const unit8_t btn_pin = 2 ;
    const unit8_t led_pin = 5;
    
    //globals
    volatile unit8_t flag=0;  //中断标记
    
    void setup(){
    //设置PD的寄存器,设置btn_pin为输入,并且内部上拉的作用
    DDRD &=~(1<<btn_pin);    //设置btn_pin为输入
    PORTD |= (1<<btn_pin);    //设置引脚btn_pin为上拉电阻模式,输出高电平
    
    //设置led_pin为输出
    DDRD |= (1<<led_pin);  //设置led_pin为输出
    //设置 INT0 下降沿触发中断 
    EICRA |= (1<<ISC01);  
    EICRA &=~(1<<ISC00); //ISC00表示执行中断将在下降时触发
    
    //INT0 中断使能
    EIMSK |= (1<<INT0);     
    
    //全局中断使能
    sei();      //sei()开启中断,cli()关闭中断;
    }
    
    void loop(){
    if (flag){
    PORTD ^= (1<< led_pin); //将led引脚的输出值反转
    flag = 0;
    }
    
    delay(500);
    }
    
    ISR(INT0_vect)
    {
     flag=1;
    }
    
    
    

    该处使用的url网络请求的数据。


    展开全文
  • Arduino的面向对象的中断处理程序库。 它使用内置的C ++虚拟方法作为回调,而不是内置的函数使用的简单C函数指针。 这允许进行更干净的面向对象的设计,这对于库尤其有用。 性能应与的内置版本,因为它基于原始...
  • ARDUINO 中断

    2019-10-03 01:48:37
    设置中断函数 ...当中断发生时,该函数会取代正在执行的程序。大多数的Arduino板有两个外部中断:0(数字引脚2)和1(数字引脚3)。arduino Mege有四个外部中断:数字2(引脚21),3(20针),4...
  • Arduino 中断

    2019-03-26 16:18:21
    中断(interrupt)停止Arduino的当前工作,以便可以完成一些其他工作。 假设你坐在家里和别人聊天。突然电话响了。你停止聊天,拿起电话与来电者通话。当你完成电话交谈后,你回去和电话响之前的那个人聊天。 同样,...
  • arduino中断

    2019-09-20 05:47:48
    根据本人实验,MJDuino UNO版本有时回因为中断函数的调用导致程序停止运行。 查看原文: http://surenpi.com/2014/11/29/%e4%b8%ad%e6%96%ad/ 转载于:https://my.oschina.net/surenpi/blog/891680
  • 各种Arduino外部中断程序

    万次阅读 2017-02-12 14:57:08
    CPU执行时原本是按程序指令一条一条向下顺序执行的。 但如果此时发生了某一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务). 待CPU将事件B处理完毕后, 再回到原来...
  • arduino 中断 和millis语句 Arduino中支持如下几种中断: RESET中断、外部中断、定时器中断。 对于单片机来说,中断是指CPU在处理... ① RESET中断:就是当RESET管脚接低电平,则中止当前程序,重启CPU ② 定时器中断
  • Arduino 中断和定时器

    千次阅读 2016-01-05 19:08:23
    1. 外部中断的引脚: 2. 定时器
  • Arduino 定时器中断 外部中断

    万次阅读 多人点赞 2019-04-09 17:29:31
    但如果此时发生了某一件事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务),待CPU将事件B处理完毕后,再回到原来被中断的地方继续执行程序(中断返回),这一过程成...
  • Arduino定时中断

    千次阅读 2019-08-15 23:14:37
    Arduino定时中断Arduino中的定时器插入链接与图片如何插入一段漂亮的代码片创建一个表格设定内容居中、居左、居右参考文献 对于Arduino新手来说,刚开始使用实例的Blink亮灯代码,其实就开始进入了定时器的世界,...
  • arduino中断和一些问题

    千次阅读 2015-12-28 14:09:05
    上次做的arduino小项目在测试过程中发现了一些小问题,至此又引出了一系列问题。大概是这样的,之前检测烟雾传感器使用电位器分压替代的,今天找到了打火机和小木棍就点火实测了一把(好久没玩火了)。测试过程中...
  • arduino定时器(MsTimer2)学习 通过一段代码讲解来学习吧 #include<MsTimer2.h> //MsTimer2库 int a; //定义一个全局变量,将在被调用的中断函数中使用 void fals(){ //中断函数 static int i=0; //定义的一...
  • Arduino 中断和睡眠状态初步尝试_2

    千次阅读 2018-03-15 13:37:09
    source:http://www.arduino.cn/forum.php?mod=viewthread&amp;tid=2421&amp;page=1#pid82211、什么是中断? (这里就不多解释了,主要讲一下具体使用) 2、各种板子的中断:UNO、NANO、ProMINI这仨板子都是...
  • 看起来,还是有几个基于中断的计数器的。或许,可以根据这个做一个任务调度的调度器。先测试一下计数器: #include "SoftwareSerial.h" unsigned long counter_ms; unsigned long counter_us; void setup() { /...
  • Arduino 中断和睡眠状态初步尝试_1

    千次阅读 2018-03-14 17:12:51
     因为没有中断,你不能让你的Arduino进入睡眠状态,并期望它再次唤醒(一般来说,在有限的情况下,有办法在没有中断的情况下从睡眠中唤醒)。如果你不能入睡,一直工作你的能量很快就会消耗殆尽。睡眠模式消耗的...
  • Arduino-中断

    2019-05-25 06:17:00
    中断的分类:Arduino中的中断可以分为两类:外部中断和定时中断 外部中断:一般是指由外设发出的中断请求,即中断源在外部。如键盘中断、打印机中断等。外部中断需要外部中断源发出中断请求才能发中断。定时中断:...
  • 由于arduino官方提供的红外遥控程序是通过扫描和延时的方式实现的,不稳定。这里使用外部中断加定时器1来实现红外遥控nec协议的解码。 板子:arduino uno 中断引脚:2 定时器:1 实现功能:可以接收nec协议的红外...
  • 对于任何一块单片机,我们都系需要学习I/O、ADC、中断、定时器、计数器、串口通信、存储、库文件,本节主要介绍 Arduino 开发中经常用到的外部中断、时钟的使用以及定时器中断的使用方法和注意事项。
  • 看了这篇文章后才恍然大悟,部分内容转自这篇文章 ... 我说为什么我用中断MsTimer2函数,三轴加速器数据发不出来 原来不论是 IIC/TWI, 或是 SPI, 以及硬串口、软串口甚至 Serial.print 都是要靠... Arduino 一旦进入
  • 程序的制作方式也很多,你可以自己代码开发,找专业团队定制开发,使用小程序开发工具……在不懂技术的情况下,大多数商家会选择小程序第三方开发工具。这也是一种对新手比较友好的制作小程序的方式,现在已经...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,991
精华内容 796
关键字:

arduino中断程序怎么写