查看: 1218|回复: 25

[已解决] 关于中断函数的请教

[复制链接]
  • TA的每日心情
    郁闷
    2020-7-22 15:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-7-20 23:02 | 显示全部楼层 |阅读模式
    本帖最后由 JLK 于 2020-7-23 11:17 编辑

    小白自学arduino:这个程序有办法在不去掉delay的情况下让led当开关按下时(2号引脚接开关)立刻熄灭吗,中断函数好像返回时还是会继续执行delay。
    QQ图片20200720230250.png

    该用户从未签到

    发表于 2020-7-22 17:02 | 显示全部楼层
    JLK 发表于 2020-7-22 10:04
    int nval = val;
      unsigned long nLastTime = millis();
      while (millis() - nLastTime

    millis():获取系统从开始运行到目前为止的毫秒数

    int nval = val;
    把val当前的值,赋值给变量nval

    unsigned long nLastTime = millis();
    把当前毫秒数,赋值给变量nLastTime

    while (millis() - nLastTime <= 5000)
    当前毫秒数,和之前记录下的毫秒数,如果相差5000以内,就执行循环。说的直白一点,就是如果不到5秒就执行循环,超过5秒就跳出循环,如果循环内没有任何处理语句的话,那么就和delay(5000)起到一样的作用。

    if (nval != nval) break;
    这条语句之前笔误了,应该是if (nval != val) break,这条语句放在while循环里,如果之前记录的val和现在的val不一样,就跳出循环。也就是你中断执行的时候,val的值会变,一旦val变了,这里就马上跳出while循环,而while后面没有任何语句了,那么就从loop开始重新执行,这样就达到你的要求了。
  • TA的每日心情
    开心
    2020-9-30 06:28
  • 签到天数: 89 天

    [LV.6]常住居民II

    发表于 2020-7-21 09:10 | 显示全部楼层
    最简单的方法是把digitalWrite放到中断函数里面。
  • TA的每日心情
    郁闷
    2020-7-22 15:13
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-7-21 10:25 | 显示全部楼层
    ifeue 发表于 2020-7-21 09:10
    最简单的方法是把digitalWrite放到中断函数里面。

    能具体说说吗,谢谢了
  • TA的每日心情
    开心
    2020-9-30 06:28
  • 签到天数: 89 天

    [LV.6]常住居民II

    发表于 2020-7-21 10:49 | 显示全部楼层
    把digitalWrite(pin, LOW);放在val = 0; 的下面。
  • TA的每日心情
    开心
    2020-9-30 06:28
  • 签到天数: 89 天

    [LV.6]常住居民II

    发表于 2020-7-21 10:49 | 显示全部楼层
    JLK 发表于 2020-7-21 10:25
    能具体说说吗,谢谢了

    把digitalWrite(pin, LOW);放在val = 0; 的下面。
  • TA的每日心情
    无聊
    2020-8-1 21:53
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2020-7-21 11:03 | 显示全部楼层
    用计数器代替delay,实现
  • TA的每日心情
    郁闷
    2020-7-22 15:13
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-7-21 11:17 | 显示全部楼层
    ifeue 发表于 2020-7-21 10:49
    把digitalWrite(pin, LOW);放在val = 0; 的下面。

    明白了,这样可以是可以,但是我的想法是中断函数返回时不执行那个delay,因为后期我想把led换成电机的,现在只是拿led测试一下
  • TA的每日心情
    开心
    2020-9-30 06:28
  • 签到天数: 89 天

    [LV.6]常住居民II

    发表于 2020-7-21 11:24 | 显示全部楼层
    JLK 发表于 2020-7-21 11:17
    明白了,这样可以是可以,但是我的想法是中断函数返回时不执行那个delay,因为后期我想把led换成电机的, ...

    再加一个全局的flag变量,在中断中flag置1,在loop中判断flag为1时不执行delay,同时把flag置0,
  • TA的每日心情
    郁闷
    2020-7-22 15:13
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-7-21 15:21 | 显示全部楼层
    ifeue 发表于 2020-7-21 11:24
    再加一个全局的flag变量,在中断中flag置1,在loop中判断flag为1时不执行delay,同时把flag置0, ...

    int pin = 13;
    volatile int val = 1;
    int flag;

    void setup(){
      Serial.begin(9600);
      pinMode(pin, OUTPUT);
      attachInterrupt(digitalPinToInterrupt(2), blink, FALLING);
    }

    void loop(){
      
      if(val == 1){
        digitalWrite(pin,HIGH);
        Serial.println("val=");
        Serial.println(val);
        if(flag == 1){
          delay(5000);
          flag = 0;
          Serial.println("flag =");
          Serial.print(flag);
        }
        }
      else{
        digitalWrite(pin,LOW);
        Serial.println(val);
        delay(5000);
      }
    }
    void blink() {
      val = 0;
      flag = 1;
      }


    好像还是不行,因为中断函数在运行delay的时候中断,然后返回时还是会继续运行完delay才会继续往下
  • TA的每日心情
    郁闷
    2020-7-22 15:13
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-7-21 15:29 | 显示全部楼层
    sangshu 发表于 2020-7-21 11:03
    用计数器代替delay,实现

    是millis()吗?具体说说,谢谢了
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    关于第三方IDE
    关于第三方IDE
    刚开始玩esp8266,用arduino做了几个例子,太蛋疼,开始找第三方ide,目前只研究了vsc
    arduino蓝牙接口串口显示为乱码
    arduino蓝牙接口串口显示
    各位看一下代码,我这串口无论怎么改,通过手机发送信息都是乱码。 #include
    开源!白菜白光T12控制器 全新UI界面
    开源!白菜白光T12控制器
    *声明:本项目源于https://github.com/wagiminator/ATmega-Soldering-Station 采用CC3
    关于arduino端口问题,萌新求助帖
    关于arduino端口问题,萌
    已经下好了 arduino的ide 可以从设备管理器看到 连接的板的名称, 但是不能从ide中找
    ESP8266烧录错误
    ESP8266烧录错误
    -首先-ESP8266新手 使用Arduino IDE Mac版开发, 对eps8266进行例程对烧录,总是报错
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表