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

[复制链接]
 楼主| 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 | 显示全部楼层
这样的延时再准也没意义啊,你能把它当时钟用吗?
既然精确度要求不是很高,就没必要钻牛角尖了
gaihuishi0613 发表于 2011-6-9 13:00 | 显示全部楼层
这样写延时得到的延时时间肯定是不准确的,
顶多只能是个大概,
最好用定时器,
取系统时间也行
llp133 发表于 2011-6-11 09:26 | 显示全部楼层
3楼得正解
airwill 发表于 2011-6-11 09:57 | 显示全部楼层
楼主不要纠结在这个问题上了, 推荐 5 楼的办法.
那只是教科书上示例的延时程序.  
要得到准确的定时, 就是要采用定时器.
MCU_Jason 发表于 2011-6-15 16:35 | 显示全部楼层
顶3楼。做工程的有的地方不用太钻,动手测试看现象比冥思苦想来的快。 3# NE5532
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

203

帖子

1

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