外部中断疑问:主事件,中断事件,没有正常工作。
主事件:数码管0-1-2-3-4每秒变化显示
中断事件:
LED闪5次
疑问1:
当S0合上,即接地时,再接通电源,数码管0-4变化显示正常,比如现在显示是1,我打开S0,LED会亮(有一点频闪的感觉)不是正常的按程序闪5次,然后一直维持这个现象。如果再合上S0,显示从2开始,这就是所谓的接着做主事件。
问题:进入中断时,不是正常的闪5次,按理是5次闪完了数码管接着显示,为什么退不出中断?
疑问2:S0断开再接通电源,LED亮(有一点频闪的感觉)。这就说明程序已在中断了。
问题:中断引脚电平都没变化,怎么进入中断的?
以下是原理图和程序,希望指点:
http://v.youku.com/v_show/id_XNzI5NDYyNzcy.html
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={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); //点亮led语句X为引脚数n0为数组z为0-8的变量,来依次读取数组中的值
z++;
if (z>=9) //防止变量z累加超过了8
z=0;
}
delay(1000);
/*==========显示1=============*/
int n1={1,0,0,1,1,1,1,1};
z=0;
for(int x=6;x<=13;x++)
{
digitalWrite(x,n1);
z++;
if (z>=9)
z=0;
}
delay(1000);
/*==========显示2=============*/
int n2={0,0,1,0,0,1,0,1};
z=0;
for(int x=6;x<=13;x++)
{
digitalWrite(x,n2);
z++;
if (z>=9)
z=0;
}
delay(1000);
/*==========显示3=============*/
int n3={0,0,0,0,1,1,0,1};
z=0;
for(int x=6;x<=13;x++)
{
digitalWrite(x,n3);
z++;
if (z>=9)
z=0;
}
delay(1000);
/*==========显示4=============*/
int n4={1,0,0,1,1,0,0,1};
z=0;
for(int x=6;x<=13;x++)
{
digitalWrite(x,n4);
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);
}
} 加了一个上拉电阻,现在只存在一个疑问:就是中断程序不能按正常1秒亮和灭。就是很快的频闪数下就退出中断了。求解! 中断中不能使用delay,也不该使用delay,因为delay本身也依靠中断,而avr默认中断是不嵌套的。 那有什么方法来在中断中实现亮1秒,灭一秒这样的功能吗? 十月华笑 发表于 2014-6-21 11:51 static/image/common/back.gif
那有什么方法来在中断中实现亮1秒,灭一秒这样的功能吗?
调整程序结构,使用标志位,在loop循环中处理,才是正确的做法,尽量少用delay,因为delay是忙等待,导致浪费CPU,你这种情况应该建立一个简单状态机进行处理,不要怕,尝试去做一下,不要使用任何delay。
页:
[1]