闪烁灯程序疑问

[复制链接]
2861|14
 楼主| wyg0216 发表于 2011-12-24 12:34 | 显示全部楼层 |阅读模式
#include<reg51.h>
sbit D1=P1^7;
void delay(void)
{
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
void main(void)
{
D1=0;
delay();
D1=1;
delay();
}
源程序有一个while(1){
D1=0;
delay();
D1=1;
delay();}
我现在烧到单片机里得到的结果是一样的,灯一直在闪。
我的疑问是
void main(void)
{
D1=0;
delay();
D1=1;
delay();
} 灯先亮,延时,灭,延时。应该就结束了。可是为什么还在闪呢?
请有经验的大侠指教一下。
先谢谢了
dengm 发表于 2011-12-24 13:03 | 显示全部楼层
加:
L_STOP:    goto L_STOP;
在 main() 的最后。
 楼主| wyg0216 发表于 2011-12-24 14:15 | 显示全部楼层
谢谢2L。但是我的问题是为什么会闪?程序的流程是?
 楼主| wyg0216 发表于 2011-12-24 14:50 | 显示全部楼层
再就是为什么加一个WHILE(1)???不加不是一样吗??
ychw1986 发表于 2011-12-24 17:13 | 显示全部楼层
有的单片机不是运行到结尾又返回去的
q1074926748 发表于 2011-12-24 23:05 | 显示全部楼层
一般来说规范的程序是 要加上那个while(1)的。你要让他不闪,最后可以给P口赋值
zxcscm 发表于 2011-12-25 13:28 | 显示全部楼层
这是跟keil编译有关 若不加while(1)编译后的汇编最后一句肯定是LJMP 00xx,跳到程序起始位置使程序反复执行
这就说说若程序中没有类似while(1)的死循环,编译器keil会自动给加上
 楼主| wyg0216 发表于 2011-12-25 18:50 | 显示全部楼层
:)
谢谢七楼,我已了解。
huangqi412 发表于 2011-12-25 20:15 | 显示全部楼层
huangqi412 发表于 2011-12-25 20:15 | 显示全部楼层
wukunshan 发表于 2011-12-26 14:11 | 显示全部楼层
dooaoo 发表于 2012-2-16 11:59 | 显示全部楼层
这个我没看太明白,有哪位能再解释一下么?
ghpzhu 发表于 2012-2-16 12:19 | 显示全部楼层
看看编译后的汇编代码是什么样子的应该就清楚了。
akymdklsa 发表于 2012-2-16 12:29 | 显示全部楼层
这个好像是程序运行结束后,若没有死循环使程序停留,程序会自动转到主程序起始处重新执行,就产生了循环的效果
xieshenkui 发表于 2012-2-16 14:18 | 显示全部楼层
不要乱想,什么编译器呀,单片机呀的问题,有很多东西说不清楚,你只要有办法解决掉,以后按个这思路来编程就OK了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

58

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部