极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15209|回复: 6

新手求助 中断问题

[复制链接]
发表于 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);
}
回复

使用道具 举报

发表于 2017-5-5 19:33:26 | 显示全部楼层
本帖最后由 275891381 于 2017-5-5 20:05 编辑

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

}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-5 19:36:13 | 显示全部楼层
275891381 发表于 2017-5-5 19:33
中断里面不要用delay,主函数也少用
用这样的
if (millis() - previousMillis >= 1000)

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

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 2017-5-5 22:48:29 | 显示全部楼层
275891381 发表于 2017-5-5 19:39
中断会打断主函数的delay,delay不知道能不能重载,就是delay执行者,中断又执行一次

好滴 谢谢  我研究研究
回复 支持 反对

使用道具 举报

发表于 2017-5-7 00:23:51 | 显示全部楼层
[kenrobot_code]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);
}[/kenrobot_code]

一个delay都不能用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-24 18:48:05 | 显示全部楼层
Ansifa 发表于 2017-5-7 00:23
[kenrobot_code]int pbIn = 0;                  // 定义中断引脚为0,也就是D2引脚
int ledOut = 12;     ...

额  谢谢  我试试您的代码
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 12:51 , Processed in 0.041509 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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