【Delay】常用的延迟函数

来源:互联网 发布:ubuntu 分辨率不能调 编辑:程序博客网 时间:2024/05/21 17:38

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

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

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

1.  微秒级延迟

1.1   4us以内

#include<reg52.h>#include<intrins.h>#define uint unsigned intvoid 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 intvoid 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++);}
本例存在误差,但影响不大。






0 0
原创粉丝点击