魔鬼1993 发表于 2017-5-5 19:21:41

新手求助 中断问题

用的 UNO 板子,进行中断学习实验。程序预期目标:主程序控制13脚自带灯一直闪烁,用2脚作为外部中断的控制引脚,中断后执行的程序是让12脚的LED以1秒的速度闪烁
实际效果:13脚正常闪烁,并在中断后停止;
          12灯中断后一直闪烁不停,并且速度比程序上的1秒要快的多。

希望达到效果:13正常1秒12中断后正常闪烁一次,然后自动停止,并程序回到主程序继续


程序:
int pbIn = 0;                  // 定义中断引脚为0,也就是D2引脚
int ledOut = 12;                // 定义输出指示灯引脚
volatile int state = LOW;

void setup()
{   
pinMode(13, OUTPUT);   // 定义默认输入状态
// 置ledOut引脚为输出状态
pinMode(ledOut, OUTPUT);
//pinMode(ledOut, INPUT);
// 监视中断输入引脚的变化
attachInterrupt(pbIn, stateChange, RISING);
}
void loop()                     
{
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
}
void stateChange()
{
digitalWrite(12,HIGH);
delay(1000);
digitalWrite(12,LOW);

//state = !state;   
//digitalWrite(ledOut, state);
}

275891381 发表于 2017-5-5 19:33:26

本帖最后由 275891381 于 2017-5-5 20:05 编辑

中断里面不要用delay,主函数也少用
用这样的
if (millis() - previousMillis >= 1000)
{
    previousMillis = millis();

}

魔鬼1993 发表于 2017-5-5 19:36:13

275891381 发表于 2017-5-5 19:33
中断里面不要用delay,主函数也少用
用这样的
if (millis() - previousMillis >= 1000)


为什么呢?是不是程序延时不利于整个程序效率?   还有这个程序是什么意思呢麻烦仔细说两句谢谢

275891381 发表于 2017-5-5 19:39:58

魔鬼1993 发表于 2017-5-5 19:36
为什么呢?是不是程序延时不利于整个程序效率?   还有这个程序是什么意思呢麻烦仔细说两句谢谢

中断会打断主函数的delay,delay不知道能不能重载,就是delay执行者,中断又执行一次

魔鬼1993 发表于 2017-5-5 22:48:29

275891381 发表于 2017-5-5 19:39
中断会打断主函数的delay,delay不知道能不能重载,就是delay执行者,中断又执行一次

好滴 谢谢我研究研究

Ansifa 发表于 2017-5-7 00:23:51

int pbIn = 0;                  // 定义中断引脚为0,也就是D2引脚
int ledOut = 12;                // 定义输出指示灯引脚
volatile int state = LOW;
int mark = 0;
unsigned long NowTime = 0;
void setup()
{
        pinMode(13, OUTPUT);   // 定义默认输入状态
        // 置ledOut引脚为输出状态
        pinMode(ledOut, OUTPUT);
        //pinMode(ledOut, INPUT);
        // 监视中断输入引脚的变化
        attachInterrupt(pbIn, stateChange, RISING);
}
void loop()
{
        //一秒反转一次状态,不能用delay,会拖住下面12脚没法运行
        if (millis() % 1000 == 0)
        {
                state = !state;
                digitalWrite(13, state);
        }
        //当前时间比记住的大一秒则灭灯
        if (millis() - NowTime > 1000)
        {
                digitalWrite(12, LOW);
        }
}
void stateChange()
{
        //中断亮灯并记住时间
        NowTime = millis();
        digitalWrite(12, HIGH);
}

:) 一个delay都不能用

魔鬼1993 发表于 2017-5-24 18:48:05

Ansifa 发表于 2017-5-7 00:23
int pbIn = 0;                  // 定义中断引脚为0,也就是D2引脚
int ledOut = 12;   ...

额谢谢我试试您的代码
页: [1]
查看完整版本: 新手求助 中断问题