打印

初学C51求助:灯闪5次为什么不会停,先谢了!

[复制链接]
3827|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hxdjb|  楼主 | 2008-7-17 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
wangkj| | 2008-7-17 13:44 | 只看该作者

while(0);

 while(1);

使用特权

评论回复
板凳
hxdjb|  楼主 | 2008-7-17 13:55 | 只看该作者

WANGKJ谢谢您的帮助!

使用特权

评论回复
地板
mousebat04| | 2008-7-17 15:36 | 只看该作者

2楼的能行吗?

你定义的unsigned char count=5;,,,无符号字符型呀?无论怎么自减都没有<0的时候。
应该定义 int count=5;

使用特权

评论回复
5
jiangrh| | 2008-7-17 17:19 | 只看该作者

初学C51求助:灯闪5次为什么不会停,先谢了!

二楼讲的是对的!!

使用特权

评论回复
6
xwj| | 2008-7-17 17:21 | 只看该作者

2楼对,4楼错。

使用特权

评论回复
7
huangqi412| | 2008-7-17 20:44 | 只看该作者

6楼也对,4f,不能小于0可以等于0啊

使用特权

评论回复
8
hujiangd| | 2008-7-17 21:27 | 只看该作者

while(0)改成break也成 不过就只能闪烁5次了

使用特权

评论回复
9
mcumi| | 2008-7-18 14:07 | 只看该作者

wo ye shi xin shou

void main()       //
{
unsigned char count=5;
  
    while((count--) != 0) 
    {
     delay10ms();
     pout=1;
     delay10ms();
     pout=0;      
     }  

   
}

使用特权

评论回复
10
wangkj| | 2008-7-18 14:41 | 只看该作者

程序执行完后,后继续执行,后面空的ROM中的代码是FFFF

意思是nop指令,直到IP指针ffff后变成0,相当于reset。
所以,break是不行的。执行这些语句,几ms就完成了。现在的
单片机很快

使用特权

评论回复
11
hbicecream| | 2008-7-18 15:33 | 只看该作者

根本就地址溢出

使用特权

评论回复
12
李娜| | 2008-7-18 20:12 | 只看该作者

真逗!

void main()       //
{
unsigned char count=5;
  
    while(count--) 
    {
     delay10ms();
     pout=1;
     delay10ms();
     pout=0;      
     }  
     while(1);
   }

使用特权

评论回复
13
lixiang040| | 2008-7-18 20:29 | 只看该作者

12lou

同意while(1)

使用特权

评论回复
14
zl040901| | 2008-7-18 23:39 | 只看该作者

xx

为什么while(0)
不会停止啊
能不能解释一下

使用特权

评论回复
15
忠心耿耿| | 2008-7-19 08:58 | 只看该作者

while(0);就不会动行到这个,

之后单片机跳出主程序,又从开始动行了

使用特权

评论回复
16
zl040901| | 2008-7-19 10:33 | 只看该作者

00

while(1)不是说相当于复位吗,它不是又会 从主程序开始运行

使用特权

评论回复
17
太阳之母| | 2008-7-19 11:26 | 只看该作者

呵呵

LS:
谁告诉你while(1)相当于复位?
如果不是你想当然这么认为的,而是真的有人这么告诉你的,你去扇他(她就算了)俩大嘴巴!然后再扇自己一大嘴巴!

while的语法大致是:
... ...
while(条件)  语句;
其它语句;
... ...

意思是当条件满足时,就执行后面的语句,执行完了这个语句再去检测这个条件是否满足,如果满足就再次执行后面的语句,... ...,这个过程不断反复,直到条件不满足才会走到下一步,去执行其它语句。

而所谓“条件满足”,就是指()里面的值不等于0,现在在()里面直接放个1,1当然是不等于0,这个结论是由幼儿园中班的娃娃精确推导出来的,不用怀疑吧?

好了,现在的写法是:while(1);
在while(1)的后面似乎没有语句啊?
有的,空语句,空语句也是语句,执行空语句就是什么也不做,于是这个写法就意味着:反复检测1是否不等于0,很变态的,对吧?
不过没办法,因为我们需要让程序就停在这里别往下走了。

为什么我们有这样的要求呢?程序这玩意儿,你不让它停下来,它就往下继续走啊!
看起来main()函数已经结束了,后面没有代码了啊?它还往哪儿走呢?
C程序最后总是要变成代码放到存储器里的,main()函数结束了,她的代码就到这里了,可存储器里在此之后还有啥码子就不好说了(就算后面没有真实的存储器了,代码存储空间还是有的,CPU从没有真实存储单元的地址里读回来的一般都是FF)。代码存储空间是有限的,比如51,代码空间就是64K,这64K空间都走完了,就又回到0地址上了,就等价于重新开始了。
你一开始用的是while(0);灯亮了5次以后走到这里,检测“0是否不等于0”,结论显然为“否”,于是继续往下走,跑出main()函数了,后面很快就把64K代码空间都走完了,又回到开头了,....,不停的循环,你的灯就不停的亮5次,再亮5次,.....。





使用特权

评论回复
18
李娜| | 2008-7-19 11:54 | 只看该作者

真逗!

void main()      
{
unsigned char count=10;
  
    while(count--)    //注意这条语句的写法!与while(条件){ }一样,何
    {                 //   时退出{ }? 
     delay10ms();
     pout=!pout;
      }  
     while(1);
 }

 
 

使用特权

评论回复
19
zl040901| | 2008-7-19 13:04 | 只看该作者

00

谢谢,太阳之母,讲的太详细了

使用特权

评论回复
20
太阳之母| | 2008-7-19 13:13 | 只看该作者

呵呵

18楼:
先判断count是否等于0,不等于0则给count做减1运算并且执行后面的{},否则就直接走到{}后面去。等价于:

... ...
while(count)
{
     delay10ms();
     pout=!pout;
     count--;
}
... ...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

131

主题

242

帖子

2

粉丝