[国产单片机] 大家看看这个程序,菜鸟求助!

[复制链接]
1739|14
 楼主| 韦贵山 发表于 2013-12-2 13:02 | 显示全部楼层 |阅读模式
本帖最后由 韦贵山 于 2013-12-2 13:08 编辑

#include<reg52.h>
#include<intrins.h>
void delay1ms(unsigned int i)
{
unsigned char j;
while(i--)
{
for(j=0;j<115;j++)          //1ms基准延时程序
{
  ;
}
}  
}
void main()
{
P0=0xfe;
P1=0x7f;  // 0111 1111
  while(1){        
              P0=_crol_(P0,1);
                  P1=_cror_(P1,1);
              delay1ms(500);
                        }
}


     我用的开发板是锐志2.0的,我想问的就是延迟函数,AT89S52晶振是12M,时钟周期就是1/12M(us),机器周期就是12X(1/12M)=1us,指令周期4X1us=4us,延迟函数for循环115次,时间加起来也就是115X4=460us,但是教程说是1ms,求解!
     虽然这种延迟方式没有释放CPU,但是我还是想知道是460us,还是1ms,求解,谢谢啦!




McuPlayer 发表于 2013-12-2 13:14 | 显示全部楼层
for或者while循环的delay函数,有些不靠谱,不同的优化会有不同,甚至编译器的版本都有差异
以你实测的为准,不要依靠所谓自动工具

评分

参与人数 1威望 +1 收起 理由
韦贵山 + 1

查看全部评分

 楼主| 韦贵山 发表于 2013-12-2 13:20 | 显示全部楼层
我也觉得是这样,但是我想知道的是,在理想状态下,这个函数是否延迟1ms?
yushan210 发表于 2013-12-2 13:51 | 显示全部楼层
如果你用的是keil你可以用sec查看延时 人家可能就是这么查看来定义的
 楼主| 韦贵山 发表于 2013-12-2 13:54 | 显示全部楼层
恩恩,灰常感谢
ayb_ice 发表于 2013-12-2 14:06 | 显示全部楼层
"指令周期4X1us=4us"

这个是谁说的
122541325 发表于 2013-12-2 14:07 | 显示全部楼层
for(1=1000;i>0;i--)
      for(j=110;j>0;j--);
这个单击全速执行按钮,程序自动停在第一个for语句所在行,时间为423.18us
再单击全速执行按钮,程序自动停在第二个for语句所在行,时间为968.31272ms,所以约为1S

评分

参与人数 1威望 +1 收起 理由
韦贵山 + 1

查看全部评分

 楼主| 韦贵山 发表于 2013-12-2 14:24 | 显示全部楼层
ayb_ice 发表于 2013-12-2 14:06:05 |只看该作者 回复 |返回版面
"指令周期4X1us=4us"

这个是谁说的

指令周期不是有单周期,双周期,四周期的吗,我是按最久的算
前功尽弃 发表于 2013-12-2 15:40 | 显示全部楼层
这个指令周期是对于汇编来说的,你精确定时的话,还用定时器来做吧
 楼主| 韦贵山 发表于 2013-12-2 17:48 | 显示全部楼层
fengsheng8898 发表于 2013-12-2 22:45 | 显示全部楼层
软件延时不准确,用定时器来作延时吧
 楼主| 韦贵山 发表于 2013-12-2 23:08 | 显示全部楼层
ayb_ice 发表于 2013-12-3 08:26 | 显示全部楼层
韦贵山 发表于 2013-12-2 14:24
ayb_ice 发表于 2013-12-2 14:06:05 |只看该作者 回复 |返回版面
"指令周期4X1us=4us"

不是按多少,实际是多少就多少

软件延时想要准确,就要用汇编写,这样就与编译器无关了,不受优化影响
fzy_666 发表于 2013-12-3 08:35 | 显示全部楼层
这个不一定准确,如果你在延时期间进了中断和没进中断,延时时间是不一样的,如果没有开中断,可以去看一下汇编指令,然后再算出来,最好用定时器做
 楼主| 韦贵山 发表于 2013-12-3 10:28 | 显示全部楼层
恩恩,受益匪浅,谢谢各位前辈的热心回答
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

565

帖子

1

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