极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7312|回复: 4

外部中断疑问:主事件,中断事件,没有正常工作。

[复制链接]
发表于 2014-6-21 09:23:43 | 显示全部楼层 |阅读模式
主事件:

  数码管0-1-2-3-4每秒变化显示

中断事件:
  
  LED闪5次


疑问1:

当S0合上,即接地时,再接通电源,数码管0-4变化显示正常,比如现在显示是1,我打开S0,LED会亮(有一点频闪的感觉)不是正常的按程序闪5次,然后一直维持这个现象。如果再合上S0,显示从2开始,这就是所谓的接着做主事件。

问题:进入中断时,不是正常的闪5次,按理是5次闪完了数码管接着显示,为什么退不出中断?


疑问2:S0断开再接通电源,LED亮(有一点频闪的感觉)。这就说明程序已在中断了。

问题:中断引脚电平都没变化,怎么进入中断的?


以下是原理图和程序,希望指点:










int pbint = 0;    // 定义中断引脚为0,也就是D2引脚
int led1 = A0;                // 定义输出指示灯引脚





void setup() {  

     pinMode(led1,OUTPUT);     //激活13号引脚,我们需要用它供电            
  pinMode(A1,OUTPUT);   
    for(int n=6;n<=13;n++)
   {
   pinMode(n,OUTPUT);
   }
   attachInterrupt(pbint, intt0, CHANGE);
}


void loop()
{

digitalWrite(A1,1); //这个就是HIGH  和LOW 的另一种写法  0代表LOW   1代表HIGH
   

  /*==========显示0=============*/  
int n0[8]={0,0,0,0,0,0,1,1};      //定义数组 通过0,1定义各数码管的明灭,
  int z=0;
  for(int x=6;x<=13;x++)          //采用循环方式依次点亮指定的数码管led(数组中0为点亮),单位时间只点亮1个led
  {
    digitalWrite(x,n0[z]);         //点亮led语句  X为引脚数  n0[z]为数组z为0-8的变量,来依次读取数组中的值
    z++;
    if (z>=9)                    //防止变量z累加超过了8
    z=0;
  }
  delay(1000);
/*==========显示1=============*/  
int n1[8]={1,0,0,1,1,1,1,1};

  z=0;
  for(int x=6;x<=13;x++)
  {
    digitalWrite(x,n1[z]);
    z++;
    if (z>=9)
    z=0;
  }
  delay(1000);
/*==========显示2=============*/  
int n2[8]={0,0,1,0,0,1,0,1};

  z=0;
  for(int x=6;x<=13;x++)
  {
    digitalWrite(x,n2[z]);
    z++;
    if (z>=9)
    z=0;
  }
delay(1000);  
/*==========显示3=============*/  
  int n3[8]={0,0,0,0,1,1,0,1};

  z=0;
  for(int x=6;x<=13;x++)
  {
    digitalWrite(x,n3[z]);
    z++;
    if (z>=9)
    z=0;
  }
delay(1000);  
/*==========显示4=============*/  

int n4[8]={1,0,0,1,1,0,0,1};
z=0;
  for(int x=6;x<=13;x++)
  {
    digitalWrite(x,n4[z]);
    z++;
    if (z>=9)
    z=0;
  }
delay(1000);
}






void intt0()
{ for(int x=0;x<=5;x++)
  {
    digitalWrite(led1,1);
    delay(1000);
    digitalWrite(led1,0);
    delay(1000);
  }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2014-6-21 09:49:25 | 显示全部楼层
加了一个上拉电阻,现在只存在一个疑问:就是中断程序不能按正常1秒亮和灭。就是很快的频闪数下就退出中断了。求解!
回复 支持 反对

使用道具 举报

发表于 2014-6-21 11:28:02 | 显示全部楼层
中断中不能使用delay,也不该使用delay,因为delay本身也依靠中断,而avr默认中断是不嵌套的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-21 11:51:48 | 显示全部楼层
那有什么方法来在中断中实现亮1秒,灭一秒这样的功能吗?
回复 支持 反对

使用道具 举报

发表于 2014-6-21 12:28:36 | 显示全部楼层
十月华笑 发表于 2014-6-21 11:51
那有什么方法来在中断中实现亮1秒,灭一秒这样的功能吗?

调整程序结构,使用标志位,在loop循环中处理,才是正确的做法,尽量少用delay,因为delay是忙等待,导致浪费CPU,你这种情况应该建立一个简单状态机进行处理,不要怕,尝试去做一下,不要使用任何delay。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 22:14 , Processed in 0.056056 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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