【说明】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++);
}

本例存在误差,但影响不大。