找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4676|回复: 2
收起左侧

[求助]关于while和for编译器的疑问~

[复制链接]
ID:21340 发表于 2010-1-25 18:50 | 显示全部楼层 |阅读模式

ps:P0口接八位LED管,低电平点灯;

程序1:

#include<reg52.h>
sbit D1=P0^0;
void delay_while_s(unsigned int ns)
{while(ns)
 {unsigned int i=51177;
 while(i--);
 ns--;}
}
void main()
{
delay_while_s(1);
D1=0;
delay_while_s(1);
}

程序2:
#include<reg52.h>
sbit D1=P0^0;
void delay_for_ms(unsigned int xms)
{unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
delay_for_ms(500);
D1=0;
delay_for_ms(500);
}

现象如下:程序一烧录51单片机中,led1管每1s钟亮灭循环(即一直循环闪烁);
 而程序二中,则先灭后亮,不闪烁,点亮后一直保持点亮状态;
 从上述程序中可以看出for,和while语句都是作为延时功能作用,为什么会发生两种不同的现象?

望高手解答下~本人不胜感激。。

 

[此贴子已经被作者于2010-1-26 14:34:22编辑过]
回复

使用道具 举报

ID:2724 发表于 2010-1-26 03:30 | 显示全部楼层
如果换成这样呢?
void main()
{
 while(1)
 {
 delay_for_ms(500);
 D1=0;
 delay_for_ms(500);
 }
}
回复

使用道具 举报

ID:21340 发表于 2010-1-26 14:32 | 显示全部楼层

换成这样当然肯定跟第二个效果一样了~

主要问这个不是为结果,只是想知道为什么会产生这样的区别;

似乎是跟编译器转化成汇编的方式有关。。

我经过单步观察是第一个经过一次程序的运行,单片机内部中断返回时无程序继续操作产生错误,因为单片机不会停止工作,所以遇到这种错误无法执行就选择复位,故而没有D1=1;也能闪烁(复位上电各引脚都是高电平的)

而用for的那句延时在执行完一遍之后还能返回至程序的开头即void后重新开始,因而单片机不产生复位操作,D1=0也就一直保持下去。。

但总觉得疑惑,为什么单片机用while会使程序发生错误而导致上电复位操作。。

[此贴子已经被作者于2010-1-26 14:33:41编辑过]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表