shuidiyu 发表于 2014-1-2 09:08:55

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:30:11

本帖最后由 jackybany 于 2014-1-2 09:35 编辑

有没有其他函数关系到i和j

hcambridge 发表于 2014-1-2 09:35:58

光看while,你系统里没有中断?

Vrcaj7z2se 发表于 2014-1-2 09:37:35

key_value = Keyboard_scan(); 是干嘛用的?系统运行到这里会暂停等待你的输入吧?再说了,key_value这个变量你到后边再也没用过,是怎么回事?

qqliyunpeng 发表于 2014-1-2 09:41:38

还有一种可能是你的单片机有看门狗,但是你用的时候没有禁止。或没有考虑。

kayatsl 发表于 2014-1-2 09:42:59

里面还有死循环吧.

fulitun 发表于 2014-1-2 09:43:43

注释掉一些语句测试

shuidiyu 发表于 2014-1-2 09:53:15

jackybany 发表于 2014-1-2 09:30
有没有其他函数关系到i和j

有函数关系到i和j但是没有地方调用那些函数啊~

shuidiyu 发表于 2014-1-2 09:54:17

RE: while(1)中 奇怪的无法循环

hcambridge 发表于 2014-1-2 09:35
光看while,你系统里没有中断?

没有中断的!

shuidiyu 发表于 2014-1-2 09:55:57

Vrcaj7z2se 发表于 2014-1-2 09:37
key_value = Keyboard_scan(); 是干嘛用的?系统运行到这里会暂停等待你的输入吧?再说了,key_value这个变 ...

没有啊,这只是一个函数,运行过去了,然后下面的蜂鸣器也响了,但是响完以后就不再循环了!

Vrcaj7z2se 发表于 2014-1-2 10:02:46

shuidiyu 发表于 2014-1-2 09:55
没有啊,这只是一个函数,运行过去了,然后下面的蜂鸣器也响了,但是响完以后就不再循环了! ...

把这行注掉再试。

shuidiyu 发表于 2014-1-2 10:07:31

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;
//                 }
        }
}

shuidiyu 发表于 2014-1-2 10:09:09

Vrcaj7z2se 发表于 2014-1-2 10:02
把这行注掉再试。

刚才试过了,还是不行,值执行一遍,不知道死在哪里了,看门狗的问题吗?没有打开看门口

firewind 发表于 2014-1-2 10:19:14

有可能是调用的函数有问题

guer 发表于 2014-1-2 10:33:23

仿真,跟踪下看看。

ndt2000 发表于 2014-1-2 10:40:26

有的MCU默认上电开看门狗的,要先关闭,就像C8051F的

ndt2000 发表于 2014-1-2 10:42:19

按guer说的,最好还是仿真跟踪看一下

shuidiyu 发表于 2014-1-2 10:45:27

firewind 发表于 2014-1-2 10:19
有可能是调用的函数有问题

你是指这个 Adconv(1,0); 函数吗?!

shuidiyu 发表于 2014-1-2 10:45:59

guer 发表于 2014-1-2 10:33
仿真,跟踪下看看。

没有仿真器的!

shuidiyu 发表于 2014-1-2 10:46:57

ndt2000 发表于 2014-1-2 10:40
有的MCU默认上电开看门狗的,要先关闭,就像C8051F的

哦,我看看怎么关闭开门狗,之前都没有用过看门狗!

firewind 发表于 2014-1-2 11:46:16

shuidiyu 发表于 2014-1-2 10:45
你是指这个 Adconv(1,0); 函数吗?!

所有引用的函数都有可能,检查一下程序有没有跑飞吧

stdio 发表于 2014-1-2 11:59:18

试试

while (1) Buzzer ();

运行一下,看看能响多久?

shuidiyu 发表于 2014-1-2 12:56:18

firewind 发表于 2014-1-2 11:46
所有引用的函数都有可能,检查一下程序有没有跑飞吧

找到原因了只要有下面这段代码,程序就死!                for(i=0;i<shi;i++)
                {
                        Buzzer();
                        for(j=0;j<2;j++)
                                delay_ms(255);
                }

shuidiyu 发表于 2014-1-2 12:57:12

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);
                }

117433525 发表于 2014-1-2 13:07:39

shuidiyu 发表于 2014-1-2 12:57
由于这段代码引起的,具体还不清楚!

90%是因为你的看门狗复位了。

shuidiyu 发表于 2014-1-2 13:57:22

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 14:35:20

shuidiyu 发表于 2014-1-2 13:57
刚刚发现
执行一遍不循环



大家看看这句汇编代码!是不是错了!但是还是不知道是如何引起程序不循环的!

shuidiyu 发表于 2014-1-2 15:00:17

shuidiyu 发表于 2014-1-2 14:35
大家看看这句汇编代码!是不是错了!但是还是不知道是如何引起程序不循环的! ...

哦 ,明白了这段汇编!原来是当a加到8的时候才跳转!{:lol:} 不过为什么程序没有从跳转的地方继续执行呢!{:dizzy:}

lcw_swust 发表于 2014-1-2 15:11:07

楼主能上传完整的工程么

shuidiyu 发表于 2014-1-4 16:11:40

lcw_swust 发表于 2014-1-2 15:11
楼主能上传完整的工程么

恩,好 的!

lcw_swust 发表于 2014-1-13 10:39:50

shuidiyu 发表于 2014-1-4 16:11
恩,好 的!

大概看了下楼主的程序,没发现问题。
猜测是ad3 为0,导致蜂鸣器没有响的条件,而不是while没循环。
楼主试试把ad3=Adconv(1,0);改成ad3=123;

shuidiyu 发表于 2014-1-17 16:17:04

lcw_swust 发表于 2014-1-13 10:39
大概看了下楼主的程序,没发现问题。
猜测是ad3 为0,导致蜂鸣器没有响的条件,而不是while没循环。
楼主 ...

好的 ,我试试!
页: [1]
查看完整版本: while(1)中有什么奇怪的东西导致无法循环