各位帮我看看这两个延时程序有什么不一样

[复制链接]
3275|14
 楼主| xuchunke 发表于 2008-4-26 10:57 | 显示全部楼层 |阅读模式
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0;
/*延时程序
由Delay 参数确定延迟时间
*/
void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
void main()
{ for(;;)
{ P10=!P10; //取反P1.0 引脚
mDelay(1000);
}
}



#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0;
/*延时程序
由Delay 参数确定延迟时间
*/
void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
void main()
{ for(;;)
{ P10=!P10; //取反P1.0 引脚
mDelay(1000);
}
}
为什么在2051单片机上跑的大相径庭。
上一个程序延时时间非常短
后一个延时时间很明显

dld2 发表于 2008-4-26 11:15 | 显示全部楼层

是不是和优化有关

非常短的那个,for循环被优化掉了。
 楼主| xuchunke 发表于 2008-4-26 11:26 | 显示全部楼层

不太明白

问dld2 一下什么叫被优化
开芯行者 发表于 2008-4-26 11:42 | 显示全部楼层

没看出来

楼主没贴错吧,还是我眼神不好,看了半天没看出区别啊,晕呀.
dld2 发表于 2008-4-26 11:54 | 显示全部楼层

编译环境有优化选项

你可以在菜单里找一找
 楼主| xuchunke 发表于 2008-4-26 16:34 | 显示全部楼层

调试的一点心得

这两个延时程序有本质的区别
我看了一下它们各自的汇编代码,整个第一层循环汇编完后都是21条,而在单片机中延时靠的就是指令时间来延时,这就是说第一个延时程序是跑了1000次循环,而第二个是跑了124次,而每次循环所用的时间都没有太大差别(主要取决于汇编的指令类型和条数)从而就导致了这两个延时程序有很大的差别。
grady1125 发表于 2008-4-26 20:16 | 显示全部楼层

是不是老了啊

看了10遍都没看出又哪个字母不一样
狂崽 发表于 2008-4-26 21:59 | 显示全部楼层

晕,眼花了,都一样的啊

jerkoh 发表于 2008-4-26 22:04 | 显示全部楼层

re

我觉得楼主发的是大家来找茬
哈哈
 楼主| xuchunke 发表于 2008-4-27 09:54 | 显示全部楼层

发错了

发错了
两个程序如下
给大家添麻烦了

#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0;
/*延时程序
由Delay 参数确定延迟时间
*/
void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
void main()
{ for(;;)
{ P10=!P10; //取反P1.0 引脚
mDelay(1000);
}
}

#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit P1_0=P1^0;
void mDelay(unsigned int Delay)
{ unsigned int i;
for(i=0;i<124;i++)
{for(;Delay>0;Delay--){;}
}
}
void main ()
{for(;;)
{P1_0=!P1_0;
mDelay(1000);}}
walnutcy 发表于 2008-4-27 10:46 | 显示全部楼层

晕,我昨晚就开始看这个帖子,当时没好意思说,

还以为是自己困了,

你这两个当然有本质的不同啦,,

for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
执行下来,比较的次数为mDelay(1000): 1000*124

for(i=0;i<124;i++)
{for(;Delay>0;Delay--){;}
}
}
这个下来才多少啊???  124+1000

逛晕...................
walnutcy 发表于 2008-4-27 10:49 | 显示全部楼层

是狂晕,,,又多点了一下键盘

gyt 发表于 2008-4-27 15:40 | 显示全部楼层

很有意思

grady1125 发表于 2008-4-27 22:57 | 显示全部楼层

第二个没有重新赋值

void mDelay(unsigned int Delay)
{ unsigned int i;
for(i=0;i<124;i++)
{for(;Delay>0;Delay--){;}
}
}

应该是:
void mDelay(unsigned int Delay)

  unsigned int i;
  unsigned int temp;
for(i=0;i<124;i++)
{
   temp=Delay;
   for(;temp>0;temp--){;}
}
}
狂崽 发表于 2008-4-27 23:34 | 显示全部楼层

同意11L和14L

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

本版积分规则

4

主题

12

帖子

1

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