本帖最后由 zl2168 于 2017-8-17 21:10 編輯
【例3-24】 延時(shí)程序是單片機(jī)應(yīng)用系統(tǒng)常用的模塊程序。試按下列要求編寫延時(shí)子程序:
⑴ 延時(shí)1ms,fOSC=6MHz;
⑵ 延時(shí)10ms,fOSC=12MHz;
⑶ 延時(shí)0.5s,fOSC=12MHz。
解:⑴ 延時(shí)1ms。fOSC =6MHz,一個(gè)機(jī)器周期為2ms,DJNZ指令為2個(gè)機(jī)器周期。
DY1ms: MOV R7,#250 ;置循環(huán)次數(shù)(指令為1個(gè)機(jī)器周期)
LOP: DJNZ R7,LOP ;250×2機(jī)周=500機(jī)周
RET ;子程序返回(單獨(dú)Keil調(diào)試時(shí),需用END替代RET)
上述子程序?qū)嶋H延時(shí)(500 +1)機(jī)周×2ms/機(jī)周=1002ms。
⑵ 延時(shí)10ms。fOSC =12MHz,一個(gè)機(jī)器周期為1ms。
DY10ms: MOV R6,#20 ;置外循環(huán)次數(shù)
DY1: MOV R7,#250 ;置內(nèi)循環(huán)次數(shù)
DY2: DJNZ R7,DY2 ;250×2機(jī)周=500機(jī)周
DJNZ R6,DY1 ;500機(jī)周×20=10000機(jī)周
RET ;子程序返回(單獨(dú)Keil調(diào)試時(shí),需用END替代RET)
實(shí)際延時(shí)[(500+2+1)×20+1]機(jī)周×1ms /機(jī)周=10061ms。
⑶ 延時(shí)0.5s。fOSC=12MHz,一個(gè)機(jī)器周期為1ms。
DY05s: MOV R5,#5 ;置外循環(huán)次數(shù)
DY0: MOV R6,#200 ;置中循環(huán)次數(shù)
DY1: MOV R7,#250 ;置內(nèi)循環(huán)次數(shù)
DY2: DJNZ R7,DY2 ;250×2機(jī)周=500機(jī)周
DJNZ R6,DY1 ;500機(jī)周×200 =100000機(jī)周
DJNZ R5,DY0 ;100000機(jī)周×5=500000機(jī)周
RET ;子程序返回(單獨(dú)Keil調(diào)試時(shí),需用END替代RET)
實(shí)際延時(shí){[(2×250+2+1)×200+2+1]×5+1}機(jī)周×1ms/機(jī)周=503016ms。
說明: RET(返回)指令需與子程序調(diào)用指令成對(duì)出現(xiàn),單獨(dú)執(zhí)行時(shí)會(huì)出錯(cuò)。因此,Keil調(diào)試時(shí),需去除RET指令,用END替代RET,才能得到正確的延時(shí)時(shí)間。但實(shí)際調(diào)用時(shí),仍需加上RET指令,延時(shí)時(shí)間增加2機(jī)周。 以上摘自張志良編著《80C51單片機(jī)實(shí)用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學(xué)習(xí)51單片機(jī)原理,程序(雙解c和匯編)語(yǔ)句條條有注解,便于閱讀理解,便于自學(xué)。
|