极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13859|回复: 4

关于外部中断中使用延时的问题

[复制链接]
发表于 2014-11-18 09:44:16 | 显示全部楼层 |阅读模式

如何在中断程序中实现延时功能呢?
像delay()等延时函数在中断程序中是不可用的。

我想实现一个点灯的延时程序,通过中断pin 2去控制pin 13点灯,当按下pin 2时灯亮一秒,然后灭掉。
pin 2被上拉,当按下按钮时,pin 2直接接地。

程序如下:无法实现我需要的功能
  1. int pin = 13;

  2. void setup()
  3. {
  4.   pinMode(pin,OUTPUT);
  5.   attachInterrupt(0,blink,FALLING);
  6. }

  7. void loop()
  8. {
  9.   digitalWrite(pin,LOW);
  10. }

  11. void blink()
  12. {
  13.   unsigned long time,time1;
  14.   time=millis();
  15.   for(time1=time;(time1-time)<100;time1=millis())
  16.   {
  17.    digitalWrite(pin,HIGH);
  18.   }
  19.   digitalWrite(pin,LOW);
  20. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-11-18 09:45:10 | 显示全部楼层
我是想用millis()来实现延时的
回复 支持 反对

使用道具 举报

发表于 2014-11-18 10:49:08 | 显示全部楼层
只能用循环,大致估算一个机器周期,然后换算为时间来试试了

你希望多精确?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-18 10:59:00 | 显示全部楼层
不需要太精确,大致差不多就行了。
回复 支持 反对

使用道具 举报

发表于 2014-11-18 11:28:35 | 显示全部楼层
  1. int pin = 13;
  2. int state = 0;
  3. long previousMillis = 0;         
  4. void setup()
  5. {
  6.   pinMode(pin, OUTPUT);
  7.   attachInterrupt(0, blink, FALLING);
  8. }
  9. void loop()
  10. {
  11.         previousMillis = millis();
  12.         if(!state) digitalWrite(pin, LOW);
  13.           while(state)
  14.           {
  15.                   digitalWrite(pin, HIGH);
  16.                 if((millis() - previousMillis) > 1000)
  17.                 state = 0;               
  18.           }
  19. }
  20. void blink()
  21. {
  22.   state = 1;
  23. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 00:27 , Processed in 0.035132 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表