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