刁一峰,楊培剛,劉麗萍,劉興旺
(湖南生物機(jī)電職業(yè)技術(shù)學(xué)院車輛工程學(xué)院,湖南長沙410126)
單片機(jī)軟件延時程序是一種循環(huán)程序,即中央處理器通過執(zhí)行占用固定時間的循環(huán)體來完成延時。在進(jìn)行單片機(jī)應(yīng)用系統(tǒng)設(shè)計的過程中,有時會發(fā)現(xiàn)實際結(jié)果和預(yù)期目標(biāo)不符。以跳馬燈設(shè)計為例進(jìn)行說明,具體Proteus仿真系統(tǒng)如圖1所示。
要求P1口連接8個LED燈,從D1開始,依次點(diǎn)亮。但是把表1所示的跳馬燈程序下載到AT89S51單片機(jī)上后,發(fā)現(xiàn)8個LED燈一直亮,和預(yù)期要求不符。
圖1 跳馬燈仿真系統(tǒng)
通過分析,發(fā)現(xiàn)沒有延時程序?qū)γ恳粋€燈亮的狀態(tài)進(jìn)行延時[1]。因此,延時程序?qū)τ谙到y(tǒng)程序來說是至關(guān)重要的。
軟件延時程序就是單片機(jī)程序的每條指令被CPU執(zhí)行時都要占用一定的機(jī)器周期,并且通過多次循環(huán)來實現(xiàn)延時的目的。因此,只要知道了執(zhí)行每條指令所占用的機(jī)器周期以及循環(huán)控制變量,就能算出延時的時間長度。
振蕩周期(TC):也叫時鐘周期,一個振蕩周期等于晶振頻率的倒數(shù),即
TC=1/fosc
表1 跳馬燈程序與功能
機(jī)器周期(T):1個機(jī)器周期等于12個時鐘周期,即
T=12TC
指令周期:指CPU執(zhí)行一條指令所需要的時間,指令周期以機(jī)器周期為單位,分為單周期指令、雙周期指令和四周期指令3種,如表2所示。
表2 指令周期與機(jī)器周期的關(guān)系
單片機(jī)AT89S51匯編延時程序中經(jīng)常用到的指令有以下幾種:
1)數(shù)據(jù)傳送指令MOV Rn,#X
把立即數(shù)X傳送到通用寄存器Rn中去,雙周期指令。
2)循環(huán)轉(zhuǎn)移指令DJNZ Rn,L1
將通用寄存器Rn中的內(nèi)容減1后判斷是否為0,如果為0順序執(zhí)行,不為0轉(zhuǎn)移到L1處,雙周期指令。
3)返回指令RET
返回主程序,雙周期指令。
4)空操作指令NOP
不進(jìn)行任何操作,單周期指令。
1)單層循環(huán)延時程序
DEL:MOV R0,#X;1周期
L1:DJNZ R0,L1;2周期
RET;2周期
程序延時時間t=T+2XT+2T=(2X+3)T。
因為0≤X≤255(其中X=1時,延時時間最短),所以整個程序的延時時間范圍為5T≤t≤515T,具體延時時間與X的關(guān)系如表3所示。
2)雙層循環(huán)延時程序
DEL:MOV R1,#Y;1周期
L2:MOV R0,#X;1 周期
L1:DJNZ R0,L1;2周期
DJNZ R1,L2;2周期
RET;2周期
延時時間t=T+YT+2XYT+2YT+2T=[(2X+3)Y+3]T,整個程序的延時時間范圍為8T≤t≤131843T,具體延時時間與X的關(guān)系如表3所示。
3)三層循環(huán)延時程序
DEL:MOV R2,#Z;1 周期
L3:MOV R1,#Y;1 周期
L2:MOV R0,#X;1 周期
L1:DJNZ R0,L1;2周期
DJNZ R1,L2;2周期
DJNZ R2,L3;2周期
RET;2周期
延時時間t=T+ZT+YZT+2XYZT+2YZT+2ZT+2T={[(2X+3)Y+3]Z+3)}T,整個程序的的延時時間范圍為11T≤t≤33751811T,具體延時時間與X的關(guān)系如表3所示。
通過上面分析可以總結(jié)出N層循環(huán)程序的延時時間長度的計算公式為
其中,Xi是裝入通用寄存器Ri的立即數(shù),T是機(jī)器周期。
要設(shè)計精確的延時程序只有 MOV、DJNZ、RET這些功能指令是不行的,還要在循環(huán)程序段中增加啞指令(如NOP等)對延時時間進(jìn)行調(diào)整,豐富延時程序的選擇項,實現(xiàn)延時程序的精確設(shè)計。
DEL:MOV R2,#Z;1周期 1
NOP;1周期1
L3:MOV R1,#Y;1周期 Z
NOP;1周期 Z
L2:MOV R0,#X;1周期 YZ
NOP;1周期 YZ
L1:DJNZ R0,L1;2周期 2XYZ
DJNZ R1,L2;2周期 2YZ
DJNZ R2,L3;2周期 2Z
RET;2周期2
在數(shù)據(jù)傳送MOV指令后增加空操作指令NOP,則延時時間變?yōu)?/p>
表3 不同層數(shù)延時時間簡表
t=T+T+ZT+ZT+YZT+YZT+2XYZT+2YZT+2ZT+2T=(2XYZ+4YZ+4Z+4)T。
延時時間長度的計算公式變?yōu)?/p>
以晶振頻率focs為12 MHz的單片機(jī)為例,設(shè)計1個100 ms延時時間的延時程序。已知機(jī)器周期T=1 μs,100 ms=100 000 μs,根據(jù)延時時間計算公式可選擇雙層或多層循環(huán)。假如選擇雙層延時,Y取值200,X 取值249,延時時間為 100.203 ms,和預(yù)設(shè)值相差較大。若進(jìn)行調(diào)整,Y取值200,X取值248,在指令MOV R1,#X后加NOP指令,延時時間變?yōu)?00.003 ms,也不夠精確。
若選擇六層延時,加調(diào)整可得延時程序如下:
DEL:MOV R5,#5
NOP
NOP
L6:MOV R4,#5
NOP
L5:MOV R3,#5
NOP
L4:MOV R2,#5
NOP
L3:MOV R1,#4
L2:MOV R0,#198
L1:DJNZ R0,L1
DJNZ R1,L2
DJNZ R2,L3
DJNZ R3,L4
DJNZ R4,L5
DJNZ R5,L6
RET;
延時時間為t=(((((2*198+3)*4+3)*5+4)*5+4)*5+4)*5+5=100 000 μs=100 ms。
通過100 ms精確延時程序設(shè)計發(fā)現(xiàn),延時程序占用了大量的通用寄存器資源,然而真正進(jìn)行精確延時程序設(shè)計時,還應(yīng)該考慮實際的晶振頻率、主程序運(yùn)行指令和調(diào)用指令A(yù)CALL、LCALL等諸多因素,實現(xiàn)起來相當(dāng)困難。另外,軟件延時程序是通過犧牲CPU的時間來實現(xiàn)時間延時,中斷服務(wù)程序的執(zhí)行不能出現(xiàn)在延時程序的執(zhí)行過程中,以免延時時間受到影響,引起主程序整體功能的錯亂,使主程序的正常運(yùn)行受到影響。所以,單片機(jī)在進(jìn)行實時性、多任務(wù)的工作時,要安排好延時程序的時序,否則會影響任務(wù)調(diào)度,造成程序不能正常運(yùn)行。
實際上延時參數(shù)數(shù)值的設(shè)定只能根據(jù)具體的時間長度和晶振頻率的參數(shù)計算,依據(jù)模塊化延時程序所總結(jié)出的方法和技巧是十分不便的。
因為設(shè)計者都有不同的設(shè)計習(xí)慣,面對不同的實際影響因素,公式會有所差異,然而分析和解決問題的方法和技巧是相似的。通過對單片機(jī)不同的延時程序模式的分析,總結(jié)出了延時時間的計算公式和辦法,設(shè)計了精確的延時程序,在教學(xué)和程序開發(fā)上具有良好的應(yīng)用效果。
[1]張迎新.單片機(jī)原理及應(yīng)用[M].第2版.北京:電子工業(yè)出版社,2009:86-87.
[2]吳挺運(yùn),林成何.Keil C51精確延時程序設(shè)計[J].電子科技,2012(12):103-106.
[3]張德芳,雷國亮,張曉冰.LPC21xx C程序的精確延時方法[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2010(10):73-75.
[4]趙月靜,張永弟,翟衛(wèi)賀.Proteus和Keil C在開發(fā)單片機(jī)控制系統(tǒng)中的應(yīng)用[J].實驗科學(xué)與技術(shù),2013(2):31-34.
[5]郭兆正,尹作友.單片機(jī)系統(tǒng)模塊化設(shè)計方法教學(xué)研究[J].沈陽師范大學(xué)學(xué)報(自然科學(xué)版),2013(1):112-114.
[6]向繼文.以應(yīng)用為目標(biāo)的單片機(jī)原理教學(xué)[J].計算機(jī)教育,2013(22):49-54.