【Delay】常用的延遲函式
阿新 • • 發佈:2019-01-28
【說明】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 任意毫秒
本例存在誤差,偏大,單迴圈1.007019ms ;當內迴圈j<123時則偏小 。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++); }
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++);
}
本例存在誤差,但影響不大。