打印

单片机延迟函数延迟的大概时间怎么算?

[复制链接]
16599|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
快乐小糊涂|  楼主 | 2011-11-9 22:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
main()
{
   char i,j;
   j=0;
   for(i=0;i<110;i++);
   j=1;
}  
时钟周期为11.0592MHZ,keil仿真时,运行到j=0时为422.09us,运行到j=1时为783.42us,
783.42-422.09=361.33us,但是看到书上说for(i=0;i<110;i++);运行完成大概时间为1000us,
相差这么大。上述语句作为延迟函数的话,延迟时间大概为多少?想了很久都没想明白,哪个大神帮忙解答下,谢谢!

相关帖子

沙发
578391555| | 2011-11-9 23:09 | 只看该作者
我也不太懂,希望哪位大牛帮忙解答一下啊

使用特权

评论回复
板凳
ayb_ice| | 2011-11-10 08:07 | 只看该作者
如果没有开中断的话,仿真肯定是正确的
影响大的原因可能是变量类型导致的,如char,int,long型区别大了,有符号,无符号区别大了,优化设置也有区别,
看反汇编一算就知道了,这种程序最好还是用汇编写比较可行

使用特权

评论回复
地板
airwill| | 2011-11-10 08:27 | 只看该作者
这类问题好象有很多人问过了
看 C 代码当然无从判断。
从反汇编里根据运行,点使用的机器周期数,这是最准的办法。

使用特权

评论回复
5
原野之狼| | 2011-11-10 08:36 | 只看该作者
若是没有开中断  那就用keil simulate一下就可以了
否则 你就得抠汇编了 对照手册慢慢计算吧
若没有simulate 那就用示波器抓一下

使用特权

评论回复
6
Ryanhsiung| | 2011-11-10 08:43 | 只看该作者
这个问题又答一遍了, 以下是COPY先前我的回答:
授人以鱼不如授人以渔,其实我也不太会算!
方法1: 实测
     例 :void main(void)
            {//关掉所有中断,及可以会影响的外设及模块
               delay(200);  GPIOx_XXXX =1;   
                delay(200);  GPIOx_XXXX =0;
            } //用示波器实测I O口的频率
       优点:方便快捷
       缺点:没有考虑进出棧,delay(1)  g与delay(200)/200,可以偏差较在
方法2: 计算
    你可以查看汇编代码(LIST文件 MAP文件中自己找)
    查看指令表,根据频率及指令来确定时间
    优点:这个是最准的
     缺点:这个会比较费时,并要具有一定汇编基础
  我一般用第一种方法,有些程序对时间要要比较准的话我就会用第二种

  再加一句,若要精确延时最好用定时器计数延时来做!

使用特权

评论回复
7
chenczy| | 2011-11-10 11:09 | 只看该作者
最直接的方法就是,从一个IO输出,再用示波器去测IO口,就知道你的延时时间了

使用特权

评论回复
8
NE5532| | 2011-11-10 11:24 | 只看该作者
程序和定时器精度一样,来喷的不跟你们讨论,愿意听的自己想。示波器抓就可以了。

使用特权

评论回复
9
SLEET1986| | 2011-11-10 16:18 | 只看该作者
程序和定时器精度一样,来喷的不跟你们讨论,愿意听的自己想。示波器抓就可以了。
NE5532 发表于 2011-11-10 11:24
:victory:

使用特权

评论回复
10
mugenwon| | 2011-11-10 18:04 | 只看该作者
一般我是直接在软件模拟运行查看时间,你有空不嫌麻烦也可以慢慢研究每条指令占多少时间。

使用特权

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

本版积分规则

0

主题

29

帖子

1

粉丝