bios 发表于 2019-8-1 11:16:19

请教各位,while程序有疑惑,请帮忙!

LED低电平的时候亮,可是下面的程序,为什么灯一直亮吗,哪里错了吗,一直找不出原因来。
我的本意,是让while里面的参数,-1后进行判断的同时,减到0时,跳出循环,可是出错。
程序如下:

#include<reg52.h>

sbit led=P0^0;
unsigned int i;

void main()
{
i=20000;
led=1;

while(i--)
{
led=0;
}
led=1;
}

夏国特 发表于 2019-8-6 17:53:46

看看终止代码。
启动代码大家都知道,程序引导到 main() ,但跳出 main() 之后就很少有人关注了,终止代码方式不一样。
有的在最后安排一条复位指令,有的安排一条停机指令,有个输出终止运行的状态信息,有的啥也不做根本就没有这部分。

我这个启动代码在执行完 main() 之后是停在这的。

void __thumb_startup(void)

{
                // Setup registers
                __init_registers();


                // setup hardware
                __init_hardware();


                //        zero-fill the .bss section
                zero_fill_bss();


                //      initialize the floating-point library

#ifdef __VFPV4__

                __fp_init();

#endif

                //        call C++ static initializers
                __call_static_initializers();


                // initializations before main, user specific
                __init_user();


                //        call main(argc, &argv)
                exit(main(0, argv));


                //        should never get here

                while (1);
}

另一个BOOTLOADER 的在做完IAP之后是重启或者重映射加载到APP里去。

所以具体还是要看启动代码(或者终止代码)。

SANSEN 发表于 2019-8-1 11:27:54

时间有问题吧20000才20毫秒时间人眼无法识别

haisens 发表于 2019-8-1 11:32:05

while 执行完就跳出去了,单片机不知道干什么去了。
void delay(unsigned int i)

    while(i)
   {
   i--;
   }

void main()
{
// i=20000;
led=1;

while(1)
{
    delay(2000);
    led=0;
    delay(2000);
    led=1;
}

晴天2018 发表于 2019-8-1 12:03:13

while里面应该是判断条件。你试试: while(i >0). 在括号里面 i--; led=0;

fshwen 发表于 2019-8-1 12:21:31

本帖最后由 fshwen 于 2019-8-1 12:24 编辑

应该是有一个灭灯过程的,只是时间比较短,没有视觉上的感觉,程序在执行完while(){};后出来led=1;但是马上又从头开始执行程序,初始化变量、进入while(){};点亮了LED,如此循环;可以在最后那句LED=1;后加个while(1);死循环,看LED能不能灭来判断前面程序的执行状态

bios 发表于 2019-8-1 12:23:49

SANSEN 发表于 2019-8-1 11:27
时间有问题吧20000才20毫秒时间人眼无法识别

你说的对,时间果然很短。
LED=0,是灯亮
如果是时间短的话,灯应该不亮啊

bios 发表于 2019-8-1 12:30:30

晴天2018 发表于 2019-8-1 12:03
while里面应该是判断条件。你试试: while(i >0). 在括号里面 i--; led=0;

谢谢回复
没用,灯还是一直亮。

yangsen 发表于 2019-8-1 13:50:50

电路图发上来看看,感觉你这除了上面说的还有别的问题

ace919 发表于 2019-8-1 14:58:28

20000次while循环后,程序很快从main退出了,呵呵,这可不是桌面os,退到哪里了?

bios 发表于 2019-8-1 15:16:53

yangsen 发表于 2019-8-1 13:50
电路图发上来看看,感觉你这除了上面说的还有别的问题

电路很简单,就是在实验板上,P0.0接发光管,发光管接限流电阻,电阻接5V。

EEV1234 发表于 2019-8-1 16:16:34

程序排除故障,通常会设立一些断点,例如要按一下某个键,程序才会继续執行。

清风碧雪 发表于 2019-8-1 18:49:43

while(1){}这是个死循环,不会跳出。

yangsen 发表于 2019-8-2 12:44:41

bios 发表于 2019-8-1 12:23
你说的对,时间果然很短。
LED=0,是灯亮
如果是时间短的话,灯应该不亮啊

按代码看不应该出常亮这种效果,要么P0口的这个pin击穿了要么二极管阳极接的电压高于单片机的电源。不知道你用的那种51,是不是有配置IO为输入下拉的。信息不全只能瞎猜。

ntwhq 发表于 2019-8-2 19:00:10

单片机没有操作系统,程序是不能结束的,必须有一个死循环,否则会出现不确定的状态,你程序的问题就出在这儿。

无敌吴刚 发表于 2019-8-2 22:14:36

一直亮不是很正常吗?你的程序就是一直亮的写法啊!首先端口值为0就是亮灯。程序一开头将其设置为1,灯灭了一下,但仅仅是一下子,下两个语句端口就设为0了,于是灯就亮了!然后这个循环了20000次,好了,继续下去到最后的语句,端口又被设为1,此时灯灭了一下。结束整个程序。但是单片机在整个程序结束后又会返回开头处执行,于是又继续开始。那个整个时间段灯亮的时间与灯灭的时间比是20000:2,所以以人眼来看,那就是一直亮着。对么?
页: [1] 2
查看完整版本: 请教各位,while程序有疑惑,请帮忙!