微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > for循环语句实现精确定时

for循环语句实现精确定时

时间:10-02 整理:3721RD 点击:


C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。  以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。

一. 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--);

       }

计算分析:

    程序共有三层循环

    一层循环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--);

}

关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

共有三条延时函数说明如下:

函数调用分两级:一级是小于10US的延时,二级是大于10US的延时

//====================小于10US的【用1US级延时】====================

//----------微秒级延时---------

for(i=X;i>X;i--) 延时时间=(3+5*X)/12   提示(单位us,  X不能大于255)

//================大于10US<小于21.9955Ms的可用【10US级延时函数】===========

void Delay10us(uchar Ms)

{

    uchar data i;

    for(;Ms>0;Ms--)                       

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

}

i=[(延时值-1.75)*12/Ms-15]/4

如想延时60US则  i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;

如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--)  共延时64US


非原创,贴出来供大家学习用!


小编真是好样的                     

支持小编啊!

不错不错哈。!感觉有用。

看起来   有点复杂难懂啊

上一篇:急需求助
下一篇:三星的ARM7 的 S3C44B0X

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top