中国IEEE
关于我们 | 会员登陆 | 收藏本站 | 留 言 薄
 

 | 网站首页 | 电子知识 | 单片机知识 | 电路设计 | 微电子技术 | SCADA系统 | 资源下载 | 给我留言 | 视频教程 | ieee | 
热门搜索关键字: 单片机教程 | 三极管微电子 |  C语言汇编语言SCADA元器件IEEE |
cnieee.com baidu
栏目导航  
栏目更新推荐  
·红外遥控及C语言51红外遥控解码程序
·8051单片机C语言数据采集程序
·Keil C51和 标准C语言的异同…
·C51延时程序
·数字滤波常用的软件方法
·渐变LED流水灯程序(C源程序)
·99计数器C语言版本
·3x4矩阵键盘的扫描程序(C语言)
点击TOP(10)  
  • 此栏目下没有热点文章
  • 图片文章  

    C语言嵌入式系统编程…

    C语言嵌入式系统编程…

    C语言嵌入式系统编程…
     
    您现在的位置: 中国IEEE中国电气电子工程师网 >> 单片机知识 >> 编程语言 >> 单片机C语言 >> 正文

    C51延时程序
    文章来源:本站整理 点击数: 更新时间:2008-6-6 【字体:
    (欢迎光临中国IEEE,希望本文能对您有所帮助http://www.cnieee.com)


    相关文章:

    红外遥控及C语言51红外遥控解码程序
    LCD驱动芯片1335控制器C51源程
    Keil C51和 标准C语言的异同…
    C51 内存优化…

  • 上一个文章:

  • 下一个文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
    关于〖C51延时程序〗的最新评论:
    一个处理的很经典的延时程序
    有个好帖,从精度考虑,它得研究结果是:
     void delay2(unsigned char i) 
          {
            while(--i); 
            } 
    为最佳方法。


    分析:假设外挂12M(之后都是在这基础上讨论)
    我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:
    delay2(0):延时518us         518-2*256=6
    delay2(1):延时7us(原帖写“5us”是错的,^_^)
    delay2(10):延时25us           25-20=5
    delay2(20):延时45us           45-40=5
    delay2(100):延时205us         205-200=5
    delay2(200):延时405us         405-400=5

    见上可得可调度为2us,而最大误差为6us。
    精度是很高了!

    但这个程序的最大延时是为518us 显然不
    能满足实际需要,因为很多时候需要延迟比较长的时间。


    那么,接下来讨论将t分配为两个字节,即uint型的时候,会出现什么情况。

    void delay8(uint t)
    {
     while(--t);
    }
    我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:
    delay8(0):延时524551us         524551-8*65536=263
    delay8(1):延时15us
    delay8(10):延时85us            85-80=5  
    delay8(100):延时806us          806-800=6
    delay8(1000):延时8009us        8009-8000=9
    delay8(10000):延时80045us      80045-8000=45
    delay8(65535):延时524542us     524542-524280=262

    如果把这个程序的可调度看为8us,那么最大误差为263us,但这个延时程序还是不能满足要求的,因为延时最大为524.551ms。

    那么用ulong t呢?
    一定很恐怖,不用看编译后的汇编代码了。。。






    那么如何得到比较小的可调度,可调范围大,并占用比较少得RAM呢?请看下面的程序:

    /*--------------------------------------------------------------------
    程序名称:50us 延时
    注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振
    例子提示:调用delay_50us(20),得到1ms延时
    全局变量:无
    返回:    无
    --------------------------------------------------------------------*/
    void delay_50us(uint t)
    {
     uchar j;  
     for(;t>0;t--)   
      for(j=19;j>0;j--) 
       ;
    }

    我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:
    delay_50us(1):延时63us             63-50=13
    delay_50us(10):延时513us           503-500=13  
    delay_50us(100):延时5013us         5013-5000=13
    delay_50us(1000):延时50022us       50022-50000=22

    赫赫,延时50ms,误差仅仅22us,作为C语言已经是可以接受了。再说要求再精确的话,就算是用汇编也得改用定时器了。

    /*--------------------------------------------------------------------
    程序名称:50ms 延时
    注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振
    例子提示:调用delay_50ms(20),得到1s延时
    全局变量:无
    返回:    无
    --------------------------------------------------------------------*/
    void delay_50ms(uint t)
    {
     uint j;   
    /****
    可以在此加少许延时补偿,以祢补大数值传递时(如delay_50ms(1000))造成的误差,
    但付出的代价是造成传递小数值(delay_50ms(1))造成更大的误差。
    因为实际应用更多时候是传递小数值,所以补建议加补偿!
    ****/
     for(;t>0;t--) 
      for(j=6245;j>0;j--) 
            ;
    }
    我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:
    delay_50ms(1):延时50 010           10us
    delay_50ms(10):延时499 983         17us
    delay_50ms(100):延时4 999 713      287us
    delay_50ms(1000):延时4 997 022     2.978ms

    赫赫,延时50s,误差仅仅2.978ms,可以接受!

    上面程序没有才用long,也没采用3层以上的循环,而是将延时分拆为两个程序以提高精度。应该是比较好的做法了。

    有再好的写法,请跟帖

    [1] [2] 下一页

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明网站地图 | 名站导航 | 管理登录 | 
    本站资源部分来自互联网,如侵犯您的权利,我们将予以删除  鲁ICP备08006092号
    本站欢迎同类网站做友情链接,QQ留言
    中国IEEE 中国电气电子工程师网 版权所有