1. 程式人生 > >【Delay】常用的延遲函式

【Delay】常用的延遲函式

【說明】1. 以下延遲函式均只適用於12M晶振;

2. 每個延遲效果均通過斷點測試驗證;

3. 除NOP精確延遲外,其餘分為us級、ms級、s級延遲,誤差不大。

1.  微秒級延遲

1.1   4us以內

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int

void main()	 <span style="white-space:pre">	</span>//延時3μs
{    
    uint a,b;
    a=1;                    
    _nop_();
    _nop_();
    _nop_();
    b=2;                   
    while(1);
}

本例直接使用_nop_();每使用一次,即精確延時1us。

1.2 10us以內

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
void delay_7us() <span style="white-space:pre">	</span>//延時7us
{
    _nop_();
    _nop_();
    _nop_();
}

       本例延遲7μs。其中使用了3個_nop_( )語句,每句執行時間為1 μs;而主函式呼叫delay_7us( )時,需先執行一個LCALL指令:2 μs;最後還需執行RET指令:2 μs。總計7μs。

類推之,增加_nop_( )的個數即可做相應的精確延時

1.310的N倍 us

void delay_us(uint n) <span style="white-space:pre">		</span>//延時10*n子程式</span>
{
    while(n--);

}
本例大致延遲10xN個us。

2.  毫秒級延遲

2.1 任意毫秒

void delay_ms(uint ms)  <span style="white-space:pre">	</span>//延時x ms子程式
{
    uint i,j;
    for(i=0;i<ms;i++)
        for(j=0;j<124;j++);
}
本例存在誤差,偏大,單迴圈1.007019ms ;當內迴圈j<123時則偏小 。

3.   秒級延遲

3.1 任意秒

void delay_s(uint s) <span style="white-space:pre">		</span>//延時x s子程式
{
    uint i,j;
    for(i=0;i<s;i++)
        for(j=0;j<21738;j++);
}
本例存在誤差,但影響不大。