打印

延时程序的时间不对,帮忙看一下?

[复制链接]
2224|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sankyo_feng|  楼主 | 2011-5-21 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sankyo_feng 于 2011-5-21 23:29 编辑

void delayus(unsigned int us)//us级延时,延时时间为us*2(1~65535)
{
  while(us)
  {
us--;
   }
}
void delayms(unsigned int ms)//ms级延时,延时时间1*ms
{
  while(ms)
   {
     unsigned int us=500;
     while(us)
      {
        us--;
       }
  ms--;
    }
}

#include <reg51.h>
#include <delay.h>

void main()
{

   while(1)
   {
      P2=0X00;
   delayms(500);
   P2=0XFF;
   delayms(500);
    }
}
我的晶振是12MHZ,STC90C52,delayus(10)应该是20us吧?delayms(500)应该是500ms吧?可是我的主程序,延时不对劲啊,时间有点长?

相关帖子

沙发
mmax| | 2011-5-21 23:07 | 只看该作者
unsigned int us=500;
     while(us)
      {
        us--;
       }

这段代码的执行时间跟:
1)CPU位数有关,8位、16位的CPU都不同;
2)跟CPU主频、指令周期有关。是否有流水线。
3)跟编译器有关系,可能编译成不同的汇编代码;
4)跟编译器选择的优化选项有关,选择最优优化时,可能这几句话都会被屏蔽掉;
5)程序里面如果有大量中断,也会影响时间。

使用特权

评论回复
板凳
NE5532| | 2011-5-22 09:07 | 只看该作者
这种C语言写延迟,最好不要去算,直接拿示波器看,准了就是准了。

使用特权

评论回复
地板
老鱼探戈| | 2011-6-8 13:21 | 只看该作者
这样的延时再准也没意义啊,你能把它当时钟用吗?
既然精确度要求不是很高,就没必要钻牛角尖了

使用特权

评论回复
5
gaihuishi0613| | 2011-6-9 13:00 | 只看该作者
这样写延时得到的延时时间肯定是不准确的,
顶多只能是个大概,
最好用定时器,
取系统时间也行

使用特权

评论回复
6
llp133| | 2011-6-11 09:26 | 只看该作者
3楼得正解

使用特权

评论回复
7
airwill| | 2011-6-11 09:57 | 只看该作者
楼主不要纠结在这个问题上了, 推荐 5 楼的办法.
那只是教科书上示例的延时程序.  
要得到准确的定时, 就是要采用定时器.

使用特权

评论回复
8
MCU_Jason| | 2011-6-15 16:35 | 只看该作者
顶3楼。做工程的有的地方不用太钻,动手测试看现象比冥思苦想来的快。 3# NE5532

使用特权

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

本版积分规则

21

主题

203

帖子

1

粉丝