打印
[国产单片机]

大家看看这个程序,菜鸟求助!

[复制链接]
1419|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查看延时 人家可能就是这么查看来定义的

使用特权

评论回复
5
韦贵山|  楼主 | 2013-12-2 13:54 | 只看该作者
恩恩,灰常感谢

使用特权

评论回复
6
ayb_ice| | 2013-12-2 14:06 | 只看该作者
"指令周期4X1us=4us"

这个是谁说的

使用特权

评论回复
7
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
8
韦贵山|  楼主 | 2013-12-2 14:24 | 只看该作者
ayb_ice 发表于 2013-12-2 14:06:05 |只看该作者 回复 |返回版面
"指令周期4X1us=4us"

这个是谁说的

指令周期不是有单周期,双周期,四周期的吗,我是按最久的算

使用特权

评论回复
9
前功尽弃| | 2013-12-2 15:40 | 只看该作者
这个指令周期是对于汇编来说的,你精确定时的话,还用定时器来做吧

使用特权

评论回复
10
韦贵山|  楼主 | 2013-12-2 17:48 | 只看该作者
恩恩

使用特权

评论回复
11
fengsheng8898| | 2013-12-2 22:45 | 只看该作者
软件延时不准确,用定时器来作延时吧

使用特权

评论回复
12
韦贵山|  楼主 | 2013-12-2 23:08 | 只看该作者
恩恩

使用特权

评论回复
13
ayb_ice| | 2013-12-3 08:26 | 只看该作者
韦贵山 发表于 2013-12-2 14:24
ayb_ice 发表于 2013-12-2 14:06:05 |只看该作者 回复 |返回版面
"指令周期4X1us=4us"

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

软件延时想要准确,就要用汇编写,这样就与编译器无关了,不受优化影响

使用特权

评论回复
14
fzy_666| | 2013-12-3 08:35 | 只看该作者
这个不一定准确,如果你在延时期间进了中断和没进中断,延时时间是不一样的,如果没有开中断,可以去看一下汇编指令,然后再算出来,最好用定时器做

使用特权

评论回复
15
韦贵山|  楼主 | 2013-12-3 10:28 | 只看该作者
恩恩,受益匪浅,谢谢各位前辈的热心回答

使用特权

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

本版积分规则

41

主题

565

帖子

1

粉丝