單片機延時精確計算
下面以最基礎(chǔ)的51單片機去做說明:
本文引用地址:http://butianyuan.cn/article/201611/315776.htm我這邊用我之前debug過的2個延時程序,晶振使用12M:
void delay_us_fun (unsigned int i)//us延時
{
while (i--);
}
這個是用來微秒級延時的,他在不同的參數(shù)i下,延時時間分別為實際為(9*i+16)us,這些延時的實際時間一般可以通過開發(fā)環(huán)境keil C51中模擬一下,看下時鐘就知道了。
匯編好點的話也可以直接看匯編計算或者直接寫匯編程序。
這時我們可以使用下面宏去調(diào)用上面的接口
#define _delay_us(i)delay_us_fun((i)/9)
這邊顯然有點誤差的。但是數(shù)值越大,誤差就相對小點。
僅僅需要幾us的延時,使用_NOP_();
下面ms級延時一樣。
void delay_ms_fun (unsigned int mDelay1)//ms延時
{
unsigned int mDelay2;
for (; mDelay1 > 0; mDelay1--)
{
for (mDelay2 = 0; mDelay2 < 123; mDelay2++)
{
}
}
}
#define _delay_ms(i)delay_ms_fun((i*1000L)/998L)//實際為(i*1000-13)/998
總而言之,就是根據(jù)單片機的指令,還有每個指令占用的時鐘周期計算出相對應(yīng)的精確延時。
評論