[原创] C51语言模块之延时

piggyfeng   2010-10-16 22:34 楼主

C51语言模块之延时
模块化的原因有:为了需要使用时得心应手,而不必再花太多时间去琢磨;为了使程序一目了然,既方便编程人员也方便学习的人员。
以下便是常用的延时模块:
1.不定短暂延时模块
   void delay( unsigned int  i )
 {
    while ( i -- );
 }
 应用:使用于不要求准确延时的场合,例如数码管动态扫描中,每个管点亮的时间间隔可用此模块,避免显示的重影。总之这种延时都可为了避免数据寄存器的存取延迟导致错误。
2.不精确短暂延时模块
  void delay1ms( unsigned int i )
{
    unsigned int j,k;
    for ( j = 0;j < i;i ++ )
       for ( k = 0;k <120;k ++ );
}
应用:此模块可延时 i *1ms,延时的长短决定于输入的实参。一般用于不需要太精确的系统但又希望知道延时的时间的场合。
3.不精确较长延时模块
  void delay10ms(unsigned int count)
{
  unsigned int i,j,k;
  for(i = 0;i < count;i ++)
     for(j = 0;j < 10;j ++)
 for(k = 0;k < 120;k ++);
}
说明:该模块延时count * 10ms,需要时可输入实参。
PS:由于本人水平所限,总结的东西有所错漏在所难免,敬请指出其中不足,共同学习,共同进步,谢谢!

 

勇往直前,协作共进,开创未来。

回复评论 (8)

谢谢楼主了·····
点赞  2010-10-17 00:43
51指令的话,找单片机小精灵,可以生成精确延时。
点赞  2010-10-17 12:26
xie谢谢楼主的分享,呵呵,很重要
点赞  2010-10-17 13:52
单片机的时间延时其实本来就不准确,可以换种方法尽量弥补
我爱电子!
点赞  2010-10-17 15:46
lz你试过这种延时方式和理想的延时时间差别有多大吗?
就拿void delay( unsigned int  i )
{
    while ( i -- );
}
来说。假如是时钟周期1us,i=1000,实际的时间绝对不会是1ms的,可能差很多,除了用定时器,有什么方法更准确吗?
点赞  2010-10-18 13:51

回复 6楼 sjl2001 的帖子

该模块中若时钟周期是1μs,i = 1000,while(i --)语句执行时间又不是1μs,延时怎么可能会是1ms呢?应该是10ms左右。另外,利用这种延时都不是为了很精确的。
除了定时器,若要延时几ms或者几十ms的,一般都是采取第二、第三模块就可以比较精确了。
其他的方式就有待各位大侠不吝指点了。
勇往直前,协作共进,开创未来。
点赞  2010-10-18 18:28

回复 7楼 piggyfeng 的帖子

是,执行时间是汇编一条指令的执行时间,我以前做去抖的时候只能大概估计,也不能太准确,我就想了解一下,这个假如理想是10ms左右,给多少参数能大概得到这个10ms。

sorry,应该是10ms,不是1ms。呵呵
点赞  2010-10-18 21:00

求学

求学啊
点赞  2013-7-29 00:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复