首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
C语言精确延时计算实验实例
来源:本站整理  作者:佚名  2011-12-16 06:34:57



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


}


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

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:122,343.80000 毫秒