【Delay】常用的延迟函数

【说明】1. 以下延迟函数均只适用于12M晶振;

2. 每个延迟效果均通过断点测试验证;

3. 除NOP精确延迟外,其余分为us级、ms级、s级延迟,误差不大。

1.  微秒级延迟

1.1   4us以内

#include
#include
#define uint unsigned int

void main()	 	//延时3μs
{    
    uint a,b;
    a=1;                    
    _nop_();
    _nop_();
    _nop_();
    b=2;                   
    while(1);
}

 
  

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

1.2 10us以内

#include
#include
#define uint unsigned int
void delay_7us() 	//延时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) 		//延时10*n子程序
{
    while(n--);

}
本例大致延迟10xN个us。


2.  毫秒级延迟

2.1 任意毫秒

void delay_ms(uint ms)  	//延时x ms子程序
{
    uint i,j;
    for(i=0;i
本例存在误差,偏大, 单循环1.007019ms ;当内循环j<123时则偏小 。


3.   秒级延迟    

3.1 任意秒

void delay_s(uint s) 		//延时x s子程序
{
    uint i,j;
    for(i=0;i
本例存在误差,但影响不大。






你可能感兴趣的:(单片机)