嵌入式开发:常用的延迟函数

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

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

 

 

 

 

 

 

 

 


 

全部评论

相关推荐

04-02 16:49
门头沟学院 Java
_bloodstream_:我也面了科大讯飞,主管面的时候听说急招人优先考虑能尽快实习的,我说忙毕设,后面就一直没消息了
点赞 评论 收藏
分享
03-25 19:00
东北大学 Java
程序员牛肉:太好了,是聊天记录。不得不信了。 当个乐子看就好,不要散播焦虑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务