请教各位,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;
} 看看终止代码。
启动代码大家都知道,程序引导到 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里去。
所以具体还是要看启动代码(或者终止代码)。 时间有问题吧20000才20毫秒时间人眼无法识别 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;
}
} while里面应该是判断条件。你试试: while(i >0). 在括号里面 i--; led=0; 本帖最后由 fshwen 于 2019-8-1 12:24 编辑
应该是有一个灭灯过程的,只是时间比较短,没有视觉上的感觉,程序在执行完while(){};后出来led=1;但是马上又从头开始执行程序,初始化变量、进入while(){};点亮了LED,如此循环;可以在最后那句LED=1;后加个while(1);死循环,看LED能不能灭来判断前面程序的执行状态 SANSEN 发表于 2019-8-1 11:27
时间有问题吧20000才20毫秒时间人眼无法识别
你说的对,时间果然很短。
LED=0,是灯亮
如果是时间短的话,灯应该不亮啊 晴天2018 发表于 2019-8-1 12:03
while里面应该是判断条件。你试试: while(i >0). 在括号里面 i--; led=0;
谢谢回复
没用,灯还是一直亮。 电路图发上来看看,感觉你这除了上面说的还有别的问题 20000次while循环后,程序很快从main退出了,呵呵,这可不是桌面os,退到哪里了? yangsen 发表于 2019-8-1 13:50
电路图发上来看看,感觉你这除了上面说的还有别的问题
电路很简单,就是在实验板上,P0.0接发光管,发光管接限流电阻,电阻接5V。
程序排除故障,通常会设立一些断点,例如要按一下某个键,程序才会继续執行。 while(1){}这是个死循环,不会跳出。 bios 发表于 2019-8-1 12:23
你说的对,时间果然很短。
LED=0,是灯亮
如果是时间短的话,灯应该不亮啊
按代码看不应该出常亮这种效果,要么P0口的这个pin击穿了要么二极管阳极接的电压高于单片机的电源。不知道你用的那种51,是不是有配置IO为输入下拉的。信息不全只能瞎猜。 单片机没有操作系统,程序是不能结束的,必须有一个死循环,否则会出现不确定的状态,你程序的问题就出在这儿。 一直亮不是很正常吗?你的程序就是一直亮的写法啊!首先端口值为0就是亮灯。程序一开头将其设置为1,灯灭了一下,但仅仅是一下子,下两个语句端口就设为0了,于是灯就亮了!然后这个循环了20000次,好了,继续下去到最后的语句,端口又被设为1,此时灯灭了一下。结束整个程序。但是单片机在整个程序结束后又会返回开头处执行,于是又继续开始。那个整个时间段灯亮的时间与灯灭的时间比是20000:2,所以以人眼来看,那就是一直亮着。对么?
页:
[1]
2