李貴才
【摘? ? 要】單片機(jī)是一個(gè)小而完善的微型計(jì)算機(jī)系統(tǒng)。它具有體積小、功能強(qiáng)、成本低以及便于嵌入式分布式控制得到了極為廣泛的應(yīng)用。《單片機(jī)技術(shù)及應(yīng)用》是中等職業(yè)教育電子專(zhuān)業(yè)的一門(mén)重要專(zhuān)業(yè)課,不論是對(duì)今后進(jìn)入高職院校深造的同學(xué)們,還是中職學(xué)習(xí)結(jié)束就進(jìn)入社會(huì)就業(yè)的同學(xué)們都是至關(guān)重要的。單片機(jī)的“延時(shí)及計(jì)算問(wèn)題”往往困擾著同學(xué)們,為此總結(jié)一點(diǎn)小小經(jīng)驗(yàn)供參考。
【關(guān)鍵詞】單片機(jī)? 智能型? 延時(shí)? 軟件延時(shí)? 硬件延時(shí)
中圖分類(lèi)號(hào):G4? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A DOI:10.3969/j.issn.1672-0407.2019.12.204
單片機(jī)是一種是采用大規(guī)?;虺笠?guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU、隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)數(shù)器等功能(可能還包括顯示驅(qū)動(dòng)電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個(gè)小而完善的微型計(jì)算機(jī)系統(tǒng)。單片機(jī)具有體積小、功能強(qiáng)、功耗成本低以及便于嵌入式分布式控制得到了極為廣泛的應(yīng)用。
《單片機(jī)技術(shù)及應(yīng)用》是我國(guó)中等職業(yè)教育學(xué)校電子專(zhuān)業(yè)的一門(mén)重要專(zhuān)業(yè)課程,也是參加對(duì)口升學(xué)高考的專(zhuān)業(yè)課之一,不論是對(duì)今后進(jìn)入高職院校深造的同學(xué)們,還是中職學(xué)習(xí)結(jié)束就進(jìn)入社會(huì)就業(yè)的同學(xué)們來(lái)說(shuō)都是至關(guān)重要的一門(mén)專(zhuān)業(yè)課,每位同學(xué)都應(yīng)認(rèn)真學(xué)好這門(mén)課。在這門(mén)課程的教學(xué)中,我發(fā)現(xiàn)單片機(jī)的“延時(shí)及計(jì)算問(wèn)題”往往困擾著同學(xué)們的學(xué)習(xí),一是抽象不好理解,二是不容易計(jì)算。延時(shí)的方法有兩類(lèi)即軟件延時(shí)與硬件延時(shí)。教學(xué)中通過(guò)不斷反思總結(jié),得到一點(diǎn)小小的經(jīng)驗(yàn),希望能對(duì)同學(xué)們的學(xué)習(xí)帶來(lái)一些幫助與啟發(fā)。
1.軟件延時(shí)
即用匯編語(yǔ)言或C語(yǔ)言編寫(xiě)出延時(shí)子程序,單片機(jī)運(yùn)行程序就需要時(shí)間從而達(dá)到延時(shí)的目的。為延長(zhǎng)一定的時(shí)間往往采用循環(huán)體進(jìn)行,讓單片機(jī)反復(fù)執(zhí)行一些無(wú)用的指令,就是為了延時(shí)。下面舉一簡(jiǎn)單例子來(lái)說(shuō)明:用單片機(jī)控制一只發(fā)光二極管閃爍發(fā)光。(中職階段匯編程序?qū)W習(xí)較多,以匯編程序?yàn)槔?。?/p>
例一:
ORG? ? ? 0000H
AJMP? ? ? MAIN
ORG? ? ? 0100H
MAIN:? ?SETB? P1.0
LCALL? ?DELAY
CLR? ? ?P1.0
LCALL? DELAY
SJMP? ? MAIN
DELAY:
MOV? R7,#200
DL1:MOV? R6,#250
DL2:NOP
DJNZ? ?R6,DL2
DJNZ? ?R7,DL1
RET
END
程序中標(biāo)號(hào)“DELAY”所包含的程序就是一段軟件延時(shí)程序。同學(xué)們對(duì)延時(shí)程序編寫(xiě)的格式過(guò)程往往不是問(wèn)題,但是對(duì)工作寄存器Rn的數(shù)字應(yīng)該是多少卻不知道怎樣來(lái)的,如何計(jì)算。要知道延時(shí)時(shí)間的相關(guān)計(jì)算,應(yīng)注意幾點(diǎn):(1)是要知道單片機(jī)應(yīng)用系統(tǒng)中晶體振蕩器的頻率多大,即算出時(shí)鐘周期與機(jī)器周期;(2)是所用指令的機(jī)器周期數(shù),有些指令是單周期,有些指令是雙周期,還有些指令是四周期;(3)是計(jì)算所有延時(shí)指令執(zhí)行的機(jī)器周期數(shù)。其中關(guān)鍵是第三點(diǎn),特別是多層循環(huán)的延時(shí)程序。
例二:1秒延時(shí)子程序(晶振12MHZ,一個(gè)周期為1μs)
DELAY:MOV? R7,#10
DELAY1:MOV? R6,#200
DELAY2:MOV? R5,#248
DJNZ? R5,$
DJNZ? R6,DELAY2
DJNZ? R7,DELAY1
RET
對(duì)每條指令進(jìn)行計(jì)算得出精確延時(shí)時(shí)間為:
1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2
=[(2*248+3)*200+3]*10+3=998033μs≈1s
經(jīng)過(guò)整理得到一個(gè)延時(shí)時(shí)間的計(jì)算公式:延時(shí)時(shí)間=[(2*第一層循環(huán)數(shù)+3)*第二層循環(huán)數(shù)+3]*第三層循環(huán)數(shù)+3,這就是有三層循環(huán)體延時(shí)時(shí)間的計(jì)算公式,當(dāng)然也可以構(gòu)成四層的循環(huán)。若只有兩層或一層循環(huán),那么第三層循環(huán)數(shù)或第二層循環(huán)數(shù)就取1。教學(xué)中有的老師提到,個(gè)別鉆牛角尖的同學(xué)會(huì)問(wèn)到軟件延時(shí)不精確,要十分準(zhǔn)確延時(shí)又咋辦呢?這也能辦到,可以在主延時(shí)程序的后面再加一段程序就可解決。
如上面的例二,還差1967μs可再加這樣一段延時(shí)程序。
DEL:NOP
MOV? R4,#13
DEL1:MOV? R3,#74
DJNZ? R3,DEL1
DJNZ? R4,DEL1
RET
對(duì)每條指令進(jìn)行計(jì)算得出精確延時(shí)時(shí)間為:
1+[1+(1*13)+(2*74*13)+(2*13)+(2*10)+2]
=[(2*74+3)*13+3]+1
=1967μs
為此在例一中我們用單片機(jī)去控制一只發(fā)光二極管的閃爍,亮、滅時(shí)間均為1s,其完整的匯編程序如下。(若晶振頻率12MHZ,一個(gè)周期為1μs)
ORG? ? ? 0000H
AJMP? ? ?MAIN
ORG? ? ? 0100H
MAIN:? ? ?SETB? P1.0
LCALL? ? DELAY
LCALL? ? DEL
CLR? ? ? P1.0
LCALL? ? DELAY
LCALL? ? DEL
SJMP? ? ?MAIN
DELAY:DELAY:MOV? R7,#10
DELAY1:MOV? R6,#200
DELAY2:MOV? R5,#248
DJNZ? ? ?R5,$
DJNZ? ? ?R6,DELAY2
DJNZ? ? ?R7,DELAY1
RET
DEL:? ? ?NOP
MOV? ? ?R4,#13
DEL1:? ? MOV? R3,#73
DJNZ? ? ?R3,DEL1
DJNZ? ? ?R4,DEL1
RET
END
2.硬件延時(shí)。
硬件延時(shí)就是用單片機(jī)內(nèi)部的定時(shí)器/計(jì)數(shù)器T0或T1來(lái)完成。首先分清一個(gè)概念,其實(shí)定時(shí)器和計(jì)數(shù)器的原理都是一樣的,都是“數(shù)”脈沖,有些人強(qiáng)行的認(rèn)為,定時(shí)器是定時(shí)的,計(jì)數(shù)器是計(jì)數(shù)的,那是不對(duì)的。其區(qū)別在于定時(shí)器使用的是內(nèi)部時(shí)鐘脈沖(有時(shí)候也是用外部基準(zhǔn)時(shí)鐘,但情況比較少),因?yàn)闀r(shí)鐘脈沖穩(wěn)定的特點(diǎn),我們就可以通過(guò)計(jì)算脈沖個(gè)數(shù)N,知道時(shí)間T=N*(1/F)(F為時(shí)鐘頻率);計(jì)數(shù)器一般是外部脈沖統(tǒng)計(jì)個(gè)數(shù)。不過(guò)有時(shí)候定時(shí)器和計(jì)數(shù)器聯(lián)合使用,用來(lái)測(cè)量外部脈沖頻率。
對(duì)于51單片機(jī)來(lái)說(shuō),內(nèi)部的兩個(gè)定時(shí)器實(shí)質(zhì)是16位的計(jì)數(shù)器,分別由高8位和低8位兩個(gè)寄存器組成,這兩個(gè)定時(shí)器由兩個(gè)8位特殊功能寄存器即TOMD與TCON控制,TOMD用于設(shè)置定時(shí)器的工作方式,TCON用于控制定時(shí)器的啟動(dòng)與中斷申請(qǐng)。同學(xué)們要熟悉這兩個(gè)特殊功能寄存器相應(yīng)位的功能及設(shè)置,這是學(xué)習(xí)中的一個(gè)難點(diǎn);另一個(gè)難點(diǎn)是定時(shí)器裝入初值的計(jì)算,要將十進(jìn)制換算成十六進(jìn)制,分成高8位和低8位,當(dāng)設(shè)置定時(shí)時(shí)間后,定時(shí)器開(kāi)始計(jì)時(shí),主程序繼續(xù)執(zhí)行,不用管定時(shí)器,當(dāng)定時(shí)時(shí)間到,定時(shí)器就會(huì)申請(qǐng)中斷,單片機(jī)就響應(yīng)中斷,處理定時(shí)子程序需要完成的工作,完成后返回到主程序繼續(xù)主程序的執(zhí)行。具體實(shí)現(xiàn)就是計(jì)數(shù)到65535再加一的話,定時(shí)器就會(huì)溢出,如果開(kāi)了中斷的話,就會(huì)進(jìn)入中斷服務(wù)程序。
例三:用定時(shí)器做1S延時(shí)的匯編語(yǔ)言程序
MOV? TOMD,#01H
MOV? ?R1,#00H
MAIN:
MOV? ?TH0,#3CH
MOV? ?TL0,#0B0H
SETB? ?TR0
JNB? ? TF0,$
CLR? ? TF0
INC? ? ?R1
MOV? ?A,R1
CJNE? ?A,#20,MAIN
上面程序延時(shí)時(shí)間為T(mén)=(65536-15536)×1×20=106us=1s
定時(shí)器/計(jì)數(shù)器初值的計(jì)算T0初值=216 -(T/時(shí)鐘周期×12)。
總之延時(shí)程序的編寫(xiě)是單片機(jī)應(yīng)用的一個(gè)重要而又基礎(chǔ)的任務(wù),可能需要多次修改才能滿足要求。掌握好延時(shí)程序的編寫(xiě)對(duì)今后從事項(xiàng)目開(kāi)發(fā)有著重要意義。
參考文獻(xiàn)
[1]姜治臻等.單片機(jī)技術(shù)及應(yīng)用【M】,高等教育出版社.
[2]徐新艷.單片機(jī)及工程應(yīng)用【M】,高等教育出版社.
[3]51開(kāi)發(fā)板學(xué)習(xí).單片機(jī)教程網(wǎng)【DB/OL】.