原创 C语言精确延时设计

2007-7-22 12:34 6485 9 10 分类: MCU/ 嵌入式

    在用C语言写程序时,初学者遇到的一个难题时精确延时程序的设计。我刚开始用C语言写程序时同样遇到了这个问题,后来参考了一些文章和实际设计后才知道了精确延时程序的设计。


    我现在就用两种方法来实现,一种是while()语句,另一种是for()语句,这两种语句均可产生汇编语句中的DJNZ语句,以12MHZ晶振为例(说明:在编写C程序时,变量尽量使用unsigned char,如满足不了才使用unsigned int):


    1.delay=99;while(--delay);


产生的汇编代码为:


000FH    MOV    08H,#63H


0012H    DJNZ    08H,0012H


这样产生的延时时间为:(99+1)×2us。最小延时时间为2us,若加上对delay赋值语句,则最小为4us。


 


    2.for(i=delay;i>0;i--);


产生的汇编代码同while()语句。


 


    下面来举例几个延时函数:


    一. 500ms延时子程序


void delay500ms(void)


{


    unsigned char i,j,k;


    for(i=15;i>0;i--)


    for(j=202;j>0;j--)


    for(k=81;k>0;k--);


}


产生的汇编代码:


C:0x0800    7F0F     MOV      R7,#0x0F


C:0x0802    7ECA     MOV      R6,#0xCA


C:0x0804    7D51     MOV      R5,#0x51


C:0x0806    DDFE     DJNZ     R5,C:0806


C:0x0808    DEFA     DJNZ     R6,C:0804


C:0x080A    DFF6     DJNZ     R7,C:0802


C:0x080C    22       RET     


计算分析:


程序共有三层循环


一层循环n:R5*2 = 81*2 = 162us                  DJNZ  2us


二层循环m:R6*(n+3) = 202*165 = 33330us          DJNZ  2us + R5赋值 1us = 3us


三层循环: R7*(m+3) = 15*33333 = 499995us        DJNZ  2us + R6赋值 1us = 3us


循环外:   5us            子程序调用 2us + 子程序返回 2us + R7赋值 1us  = 5us


延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms


计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5


 


    二. 200ms延时子程序


void delay200ms(void)


{


    unsigned char i,j,k;


    for(i=5;i>0;i--)


    for(j=132;j>0;j--)


    for(k=150;k>0;k--);


}


 


    三. 10ms延时子程序


void delay10ms(void)


{


    unsigned char i,j,k;


    for(i=5;i>0;i--)


    for(j=4;j>0;j--)


    for(k=248;k>0;k--);


}


 


    四. 1s延时子程序


void delay1s(void)


{


    unsigned char h,i,j,k;


    for(h=5;h>0;h--)


    for(i=4;i>0;i--)


    for(j=116;j>0;j--)


    for(k=214;k>0;k--);


}


以上的这先希望对大家有帮组,如有不足之处请指出,如有更好的方法也可以告诉我,大家一起分享。

文章评论1条评论)

登录后参与讨论

用户91610 2007-8-20 16:49

拜读了,谢谢

相关推荐阅读
用户1657917 2008-06-24 15:10
STM32上位机控制演示软件
STM32项目/学习计划表项目名称 STM32上位机控制演示软件请点击以下链接更新您的个人资料(包括“职位,部门,单位名称,地址,邮编,电子邮箱,电话”),以便我们能及时联系您并快速发送开发套件。ht...
用户1657917 2008-04-03 16:27
串口调试软件V1.0
        这两天用VC++写了个串口调试软件,是用MSComm 控件编写的,虽然串口调试的软件多的满天飞,但是本人初涉串口编程,写这么个软件对以以后应用串口编程还是受益匪浅的。        这...
用户1657917 2008-04-01 16:03
关于radio button控件的使用问题
    用过这个控件的都知道他们之间都是互斥的,但是编程是总是找不到属性设置,在网上查找资料,上面说设置成一组就可以了。但是我把他们的GROUP属性选中了,但是运行时还是不行,没有办法再找,终于在一个...
用户1657917 2008-03-31 11:57
学习串口通信编程
    在公司实习也一个多月了,前段时间调好了AIAO板,接下来又有新任务了。。。准备设计编写基于RS485的多主多从协议,类似于IBM的Token Ring协议,先在电脑间联网写个VC程序测试,所以...
用户1657917 2008-02-21 15:05
汉字转Unicode软件
    这是我学了几天C++后所写的第一个软件,目的是出于前段时间学习AT指令时所需,使用AT指令发短信需要用Unicoe码发送汉字。也算是自己学习C++的练手软件,现在发布给有需要的朋友。本人的第一...
用户1657917 2007-09-25 22:35
DIY迷你CPLD核心板
    这两天用敷铜板做了块迷你的CPLD核心板,把所有的IO口全部都引了出来,还引出了几个CLK的脚,到今天为止已经钻孔、焊接、调试成功,正常下载程序了,呵呵,如有什么不足之处请各位大虾指出,不胜感...
我要评论
1
9
关闭 站长推荐上一条 /2 下一条