金色驼铃 发表于 2012-9-26 16:41:10

arduino小程序求助!!

本帖最后由 金色驼铃 于 2012-9-27 12:21 编辑

本程序的目的是通过判断引脚2为高电平的持继时间,当超过2S时,给引脚8一个高电平。


void loop() {

if (digitalRead(2) == HIGH)//
   {
   delay(50); //去除杂波

      time1 = millis();

    Serial.print("Button-time-1: ");
    Serial.println(time1);

    while ((millis() - time1) >2000)//当高电平时间超过2S时
    {
   Serial.print("timeout:");
   Serial.println(millis()-time1);
   digitalWrite(8,HIGH);
   delay(500);
   digitalWrite(8,LOW);
   delay(500);
   }

问题是当2引脚为高电平时,程序根本不执行while语句,不知道为什么????

Randy 发表于 2012-9-26 16:54:31

你直接在loop()函数里写就好了,就是你利用延时delay();等待延时到2s就执行相应的动作!

飞翔的红猪 发表于 2012-9-26 17:01:49

因为time1 = millis();这一句在时间差不到2秒前一直在不断的初始化,所以millis() - time1) >2000永远不能被执行!!!

金色驼铃 发表于 2012-9-26 17:10:47

飞翔的红猪 发表于 2012-9-26 17:01 static/image/common/back.gif
因为time1 = millis();这一句在时间差不到2秒前一直在不断的初始化,所以millis() - time1) >2000永远不能被 ...

time1 =millis(),这句我的理解是,当2为高位时,time1取当前时间啊,

金色驼铃 发表于 2012-9-26 17:11:27

Randy 发表于 2012-9-26 16:54 static/image/common/back.gif
你直接在loop()函数里写就好了,就是你利用延时delay();等待延时到2s就执行相应的动作!

这个思路正好,我没想到,不过与原来的思路不一样了

飞翔的红猪 发表于 2012-9-26 17:27:37

        if(digitalRead(2)==HIGH)
        {
                delay(50);
                if(digitalRead(2)==HIGH)
                {
                        if(flag==0)//如果原来按键是未按下的
                        {
                                time1=millis();
                                flag=1;//置位标志,防止语句重复运行
                                Serial.print("Button-time-1: ");
                                Serial.println(time1);
                        }
                }
        }
        else flag=0;//如果按键抬起,标志复位
       
        while ((millis() - time1) >2000&&flag==1)//当高电平时间超过2S时
      {
               Serial.print("timeout:");
               Serial.println(millis()-time1);
               digitalWrite(8,HIGH);
               delay(500);
            digitalWrite(8,LOW);
            delay(500);
            }
看看这样是不是符合你的本意?

lzrenjie 发表于 2012-9-26 18:54:48

你的timer1每循环一次都要刷新一次,while的条件永远也没法成立。

aeroboy 发表于 2012-9-26 19:47:47

pulseIn 函数不就可以了吗?
pulseIn用于测量将一个指定的引脚设置为高或低的持续时间。

金色驼铃 发表于 2012-9-27 12:20:33

飞翔的红猪 发表于 2012-9-26 17:27 static/image/common/back.gif
if(digitalRead(2)==HIGH)
        {
                delay(50);


谢谢飞翔的红猪,你的修改正合我意,再次感谢

zhangdeyue1 发表于 2012-9-28 14:26:39

看来论坛好人多~:lol
页: [1]
查看完整版本: arduino小程序求助!!