單片機(jī)精確毫秒延時(shí)函數(shù)
對(duì)于需要精確延時(shí)的應(yīng)用場(chǎng)合,需要精確知道延時(shí)函數(shù)的具體延時(shí)時(shí)間。以C語(yǔ)言編寫(xiě)的單片機(jī)延時(shí)函數(shù)網(wǎng)上有兩個(gè)不同的版本(都說(shuō)是延時(shí)n毫秒),分別如下:
void delay(uint x) //延時(shí)X毫秒
{
uint y,z;
for(z=x;z>0;z--)
for(y=110;y>0;y--);
}
void delay_ms(uint n) //延時(shí)n毫秒
{
uchar i;
while(n--)
{
for(i=0;i<120;i++);
}
}
上述兩個(gè)函數(shù)的實(shí)現(xiàn)方法是一樣的,只是給的時(shí)間常數(shù)不同,一個(gè)是110,另一個(gè)是120。近來(lái)工作因?yàn)閷?duì)時(shí)間的精度要求很高,就特地驗(yàn)證了下這兩個(gè)函數(shù)運(yùn)行時(shí)所用的時(shí)間。 主程序?yàn)椋?/p>
void main(void)
{
delay(1);
}
反匯編之后(推薦用C51智能反編譯器,不過(guò)要手工加上ORG地址和END結(jié)束符):
標(biāo)號(hào) 指令 地址 機(jī)器碼 機(jī)器周期
ORG 0000H
Q0000: LJMP Q0021 ;0000 02 00 21
;==========================================================================
ORG 0003H
Q0003: SETB C ;0003 D3 1
MOV A,R7 ;0004 EF 1
SUBB A,#00H ;0005 94 00 1
MOV A,R6 ;0007 EE 1
SUBB A,#00H ;0008 94 00 1
JC Q0020 ;000A 40 14 2
MOV R5,#6EH ;000C 7D 6E 1
MOV R4,#00H ;000E 7C 00 1
Q0010: MOV A,R5 ;0010 ED 1
DEC R5 ;0011 1D 1
JNZ Q0015 ;0012 70 01 2
DEC R4 ;0014 1C 1
Q0015: MOV A,R5 ;0015 ED 1
ORL A,R4 ;0016 4C 1
JNZ Q0010 ;0017 70 F7 2
MOV A,R7 ;0019 EF 1
DEC R7 ;001A 1F 1
JNZ Q0003 ;001B 70 E6 2
DEC R6 ;001D 1E 1
SJMP Q0003 ;001E 80 E3 2
Q0020: RET ;0020 22 2
;====================RESET 00-7F AND SET SP=07H============================
ORG 0021H
Q0021: MOV R0,#7FH ;0021 78 7F
CLR A ;0023 E4
Q0024: MOV @R0,A ;0024 F6
DJNZ R0,Q0024 ;0025 D8 FD
MOV SP,#07H ;0027 75 81 07
LJMP Q002D ;002A 02 00 2D
;====================MAIN PROGRAM==========================================
ORG 002DH
Q002D: MOV R7,#01H ;002D 7F 01 1
MOV R6,#00H ;002F 7E 00 1
LJMP Q0003 ;0031 02 00 03 2
;==========================================================================
END
單步執(zhí)行可以跟蹤程序的運(yùn)行,給個(gè)最終的結(jié)果就是總的執(zhí)行機(jī)器周期數(shù)為 :
第一個(gè)函數(shù):4+9+8*110+4+9=906
第二個(gè)函數(shù):4+9+8*120+4+9=986
如果單片機(jī)的晶振是12M,則一個(gè)機(jī)器周期的時(shí)間為12/(12*10e6)=1us
可見(jiàn)第二個(gè)程序更接近1ms(0.986us)的時(shí)間,第一個(gè)是0.906us
當(dāng)晶振是11.05926M時(shí),第一個(gè)延時(shí)函數(shù)的精確延時(shí)時(shí)間是983us,第二個(gè)是1069.8us,可見(jiàn)第一個(gè)函數(shù)的延時(shí)時(shí)間更精確一些。
而且延時(shí)時(shí)間越長(zhǎng),誤差就越大。
編輯:admin 最后修改時(shí)間:2018-05-18