單片機(jī)延時(shí)方法總結(jié)
3、注意DJNZ R6,Delay2是在166次循環(huán)后執(zhí)行1次的(時(shí)間為MOV機(jī)器周期+本身機(jī)器周期,3*2=6μs),直到166*200次后,R6=0,才執(zhí)行DJNZ R5,Delay1。
4、DJNZ R5,Delay1是在R5不為0的時(shí)候循環(huán)回去。時(shí)間也為6μs。
5、時(shí)間總計(jì):166*200*25*6μs+200*25*6μs+25*6μs=5010150μs,合計(jì)5.01015ms(編程的人都遇到過類似的潛逃循環(huán),此程序忽略了執(zhí)行MOV的時(shí)間,只計(jì)算了循環(huán)所用時(shí)間,即166*200*25*6/1000000=4.98ms,近似5ms)。
程序改進(jìn):
去掉NOP命令,整數(shù)化1ms需要的延時(shí)常數(shù)。
Delay: MOV R5,#25 ;5ms延時(shí)——MOV指令占用1機(jī)器周期時(shí)間
Delay1: MOV R6,#200 ;200ms延時(shí)
Delay2: MOV R7,#250 ;1ms延時(shí)常數(shù)
Delay3: ;NOP ;空指令,什么都不做,停留1機(jī)器周期時(shí)間
DJNZ R7,Delay3 ;R7減1賦值給R7,如果此時(shí)R7不等于零,轉(zhuǎn)到Delay3執(zhí)行。——2機(jī)器周期時(shí)間
DJNZ R6,Delay2
DJNZ R5,Delay1
此時(shí)時(shí)間總計(jì):250*200*25*4μs+200*25*6μs+25*6μs=5030150μs。時(shí)間占用誤差反而比未改進(jìn)的時(shí)候大,可修正,將R7-30150/(25*200*4)=248(因?yàn)镽7=250循環(huán)1次占用2個(gè)機(jī)器周期,4μs,計(jì)算等于R7-1.5075,將時(shí)間減小到小于5ms,剩余時(shí)間另補(bǔ),取248)。則:時(shí)間總計(jì):248*200*25*4μs+200*25*6μs+25*6μs=4990150μs,需要補(bǔ):5000000-4990150=9850μs,9850/2=4925機(jī)器周期。補(bǔ)一個(gè)MOV R4,#200,4個(gè)NOP,還需4920機(jī)器周期,將其約分,得到24*205=4920。如何建立函數(shù)根據(jù)實(shí)際代碼調(diào)整,如下:
Delay: MOV R5,#25 ;5ms延時(shí)——MOV指令占用1機(jī)器周期時(shí)間
Delay1: MOV R6,#200 ;200ms延時(shí)
Delay2: MOV R7,#250 ;1ms延時(shí)常數(shù)
Delay3: ;NOP ;空指令,什么都不做,停留1機(jī)器周期時(shí)間
DJNZ R7,Delay3 ;R7減1賦值給R7,如果此時(shí)R7不等于零,轉(zhuǎn)到Delay3執(zhí)行?!?機(jī)器周期時(shí)間
DJNZ R6,Delay2
DJNZ R5,Delay1
NOP
NOP
NOP
NOP
MOV R3,#6
Delayadd: MOV R4,#205
MOV R2,#0H
DJNZ R3,Delayadd
解析205*24調(diào)整為205*6——這是因?yàn)镈elay循環(huán)為4機(jī)器周期代碼,因此將24/4=6。請計(jì)算:205*6*4=4920;4920+5=4925。時(shí)間補(bǔ)充正好。此時(shí)時(shí)間計(jì)算:248*200*25*4μs+200*25*6μs+25*6μs=4990150μs+4925*2μs=5000000μs合計(jì)5ms。
理論上1μs都不差(僅為科學(xué)探討,具體晶振頻率的誤差多大作者并不明確)。
c語言相關(guān)文章:c語言教程
塵埃粒子計(jì)數(shù)器相關(guān)文章:塵埃粒子計(jì)數(shù)器原理 晶振相關(guān)文章:晶振原理
評論