C语言精确延时设计

在用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--);

}

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值