while(1)中有什么奇怪的东西导致无法循环
while(1){
key_value = Keyboard_scan();
ad3 = Adconv(1,0);
bai=ad3/100;
shi=(ad3%100)/10 ;
ge=ad3%10;
for(i=0;i<bai;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
}
for(i=0;i<8;i++)
delay_ms(255);
for(i=0;i<shi;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
}
for(i=0;i<8;i++)
delay_ms(255);
for(i=0;i<ge;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
}
for(i=0;i<8;i++)
delay_ms(255);
}
这段代码里有什么问题呢,为什么while(1)里的内容并没有循环,而是只执行了一遍 本帖最后由 jackybany 于 2014-1-2 09:35 编辑
有没有其他函数关系到i和j 光看while,你系统里没有中断? key_value = Keyboard_scan(); 是干嘛用的?系统运行到这里会暂停等待你的输入吧?再说了,key_value这个变量你到后边再也没用过,是怎么回事? 还有一种可能是你的单片机有看门狗,但是你用的时候没有禁止。或没有考虑。 里面还有死循环吧. 注释掉一些语句测试 jackybany 发表于 2014-1-2 09:30
有没有其他函数关系到i和j
有函数关系到i和j但是没有地方调用那些函数啊~
RE: while(1)中 奇怪的无法循环
hcambridge 发表于 2014-1-2 09:35光看while,你系统里没有中断?
没有中断的! Vrcaj7z2se 发表于 2014-1-2 09:37
key_value = Keyboard_scan(); 是干嘛用的?系统运行到这里会暂停等待你的输入吧?再说了,key_value这个变 ...
没有啊,这只是一个函数,运行过去了,然后下面的蜂鸣器也响了,但是响完以后就不再循环了! shuidiyu 发表于 2014-1-2 09:55
没有啊,这只是一个函数,运行过去了,然后下面的蜂鸣器也响了,但是响完以后就不再循环了! ...
把这行注掉再试。 qqliyunpeng 发表于 2014-1-2 09:41
还有一种可能是你的单片机有看门狗,但是你用的时候没有禁止。或没有考虑。 ...
这是完整的main 里面并没有打开看门狗啊
void main(void)
{
uchar i,j,key_value,bai,shi,ge;
P1 = 0xf8;
P2 = 0xFF;
P3 = 0xff;
while(1)
{
// key_value = Keyboard_scan();
// AD_H = 1;
ad3 = Adconv(1,0); bai=ad3/100;shi=(ad3%100)/10 ; ge=ad3%10;
for(i=0;i<bai;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
}
for(i=0;i<8;i++)
delay_ms(255);
for(i=0;i<shi;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
}
for(i=0;i<8;i++)
delay_ms(255);
for(i=0;i<ge;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
}
for(i=0;i<8;i++)
delay_ms(255);
// ad7 = Adconv2(1,0);
// // AD_H = 0;
// // AD_L = 1;
// ad5 = Adconv(1,1);
// // AD_L = 0;
// switch(key_value)
// {
// case 1: //吸液
// Act_in();
// break;
// case 2: //放液
// Act_out();
// break;
// case 3:
// break;
// default:
// break;
// }
}
} Vrcaj7z2se 发表于 2014-1-2 10:02
把这行注掉再试。
刚才试过了,还是不行,值执行一遍,不知道死在哪里了,看门狗的问题吗?没有打开看门口 有可能是调用的函数有问题 仿真,跟踪下看看。 有的MCU默认上电开看门狗的,要先关闭,就像C8051F的 按guer说的,最好还是仿真跟踪看一下 firewind 发表于 2014-1-2 10:19
有可能是调用的函数有问题
你是指这个 Adconv(1,0); 函数吗?! guer 发表于 2014-1-2 10:33
仿真,跟踪下看看。
没有仿真器的! ndt2000 发表于 2014-1-2 10:40
有的MCU默认上电开看门狗的,要先关闭,就像C8051F的
哦,我看看怎么关闭开门狗,之前都没有用过看门狗! shuidiyu 发表于 2014-1-2 10:45
你是指这个 Adconv(1,0); 函数吗?!
所有引用的函数都有可能,检查一下程序有没有跑飞吧 试试
while (1) Buzzer ();
运行一下,看看能响多久? firewind 发表于 2014-1-2 11:46
所有引用的函数都有可能,检查一下程序有没有跑飞吧
找到原因了只要有下面这段代码,程序就死! for(i=0;i<shi;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
} stdio 发表于 2014-1-2 11:59
试试
while (1) Buzzer ();
由于这段代码引起的,具体还不清楚! for(i=0;i<shi;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
} shuidiyu 发表于 2014-1-2 12:57
由于这段代码引起的,具体还不清楚!
90%是因为你的看门狗复位了。 117433525 发表于 2014-1-2 13:07
90%是因为你的看门狗复位了。
刚刚发现 for(i=0;i<8;i++)
delay_ms(255);
for(i=0;i<shi;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
}
for(i=0;i<8;i++)
delay_ms(255);
执行一遍不循环
for(i=0;i<8;i++)
delay_ms(255);
for(i=0;i<shi;i++)
{
Buzzer();
for(j=0;j<2;j++)
delay_ms(255);
}
for(i=0;i<8;i++)
delay_ms(255); Buzzer();
而在后面加上buzzer();后就可以一直循环了,看反汇编也找不到问题奇怪了 shuidiyu 发表于 2014-1-2 13:57
刚刚发现
执行一遍不循环
大家看看这句汇编代码!是不是错了!但是还是不知道是如何引起程序不循环的! shuidiyu 发表于 2014-1-2 14:35
大家看看这句汇编代码!是不是错了!但是还是不知道是如何引起程序不循环的! ...
哦 ,明白了这段汇编!原来是当a加到8的时候才跳转!{:lol:} 不过为什么程序没有从跳转的地方继续执行呢!{:dizzy:} 楼主能上传完整的工程么 lcw_swust 发表于 2014-1-2 15:11
楼主能上传完整的工程么
恩,好 的! shuidiyu 发表于 2014-1-4 16:11
恩,好 的!
大概看了下楼主的程序,没发现问题。
猜测是ad3 为0,导致蜂鸣器没有响的条件,而不是while没循环。
楼主试试把ad3=Adconv(1,0);改成ad3=123; lcw_swust 发表于 2014-1-13 10:39
大概看了下楼主的程序,没发现问题。
猜测是ad3 为0,导致蜂鸣器没有响的条件,而不是while没循环。
楼主 ...
好的 ,我试试!
页:
[1]