譚久剛 《單片機應(yīng)用技術(shù)》1-2_第1頁
譚久剛 《單片機應(yīng)用技術(shù)》1-2_第2頁
譚久剛 《單片機應(yīng)用技術(shù)》1-2_第3頁
譚久剛 《單片機應(yīng)用技術(shù)》1-2_第4頁
譚久剛 《單片機應(yīng)用技術(shù)》1-2_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

子情境1-2:軟件延時流水燈控制任務(wù)1-2-2任務(wù)1-2-1軟件延時實現(xiàn)燈的閃爍及流動1s軟件延時程序的設(shè)計及調(diào)試任務(wù)1-2-1:1s軟件延時程序的設(shè)計及調(diào)試任務(wù)要求:設(shè)計延時1s的軟件延時程序多重循環(huán)軟件延時1s程序設(shè)計單循環(huán)軟件延時1ms程序設(shè)計

認(rèn)識單片機時序Step1Step2Step3任務(wù)實施步驟知識點小結(jié)如何實現(xiàn)燈的流動及顯示燈的閃爍即燈亮?xí)獪鐣倭痢贉纭砸獙崿F(xiàn)燈的閃爍,首先應(yīng)能控制燈的亮滅,上一章的學(xué)習(xí)可以知道,P1.0引腳置‘0’燈亮,置‘1’燈滅。其次,閃爍的快慢可以通過控制亮滅的間隔時間實現(xiàn),便涉及時間控制的問題。燈的流動顯示先假設(shè)一只燈向左流動顯示,即燈亮的順序為D1——D2……——D7——D1——D2……,其實現(xiàn)方法是先將P1.0置‘0’,其它口置‘1’,點亮D1,間隔時間到后,將P1.1置‘0’,其它口置‘1’,點亮D2……依次循環(huán)下去。因此,不管是閃爍還是流動控制,都需要延時,首先學(xué)習(xí)延時程序的設(shè)計。1.如何進行時間控制軟件延時利用單片機的空操作指令(即NOP指令,CPU執(zhí)行該指令時,單片機不做任何事,僅僅占用CPU時間。)來實現(xiàn),當(dāng)點亮某只燈后就讓CPU執(zhí)行該指令,控制該指令的執(zhí)行次數(shù)便可以控制延時時間。定時器延時利用單片機內(nèi)部定時器實現(xiàn)硬件定時。返回Step1認(rèn)識單片機時序軟件延時的前提是單片機CPU執(zhí)行指令要花時間,而NOP指令更是專門為軟件延時設(shè)計的指令之一,要控制延時時間,首先應(yīng)弄清楚執(zhí)行一次該指令要花多長時間。

時鐘周期

時鐘電路所提供給單片機的時鐘信號的周期,單片機內(nèi)部所有電路的工作時鐘都來自于此,當(dāng)時鐘電路晶振頻率為l2MHz,它的時鐘周期就是。機器周期

單片機訪問一次存儲器的時間,稱之為一個機器周期。一個機器周期包括12個時鐘周期,如果一個單片機選擇的時鐘頻率為l2MHz,機器周期則為。指令周期所謂指令周期就是CPU指執(zhí)行一條指令所花的時間。51單片機的所有指令中,按執(zhí)行時間可分為單機器周期、雙機器周期和4機器周期指令。

NOP指令屬單機器周期指令,即,當(dāng)時鐘頻率為l2MHz時,CPU執(zhí)行一次NOP指令,將耗時。Step1認(rèn)識單片機時序2.單片機的時序

Step2單循環(huán)軟件延時1ms程序設(shè)計根據(jù)上面的分析知道,執(zhí)行一次NOP指令耗時,假設(shè)延時1s(即),則需要執(zhí)行NOP指令次,我們不可能在程序中寫條NOP指令,利用循環(huán)結(jié)構(gòu)可以很好的解決這個問題。循環(huán)程序是一種常用的程序結(jié)構(gòu),其流程圖如圖,可知:

循環(huán)程序包括設(shè)置循環(huán)次數(shù)、設(shè)置循環(huán)初值、循環(huán)體、次數(shù)修改及循環(huán)條件判斷等,其中,循環(huán)體為需要多次重復(fù)執(zhí)行的程序塊。執(zhí)行整個循環(huán)程序的耗時為:1.匯編循環(huán)程序結(jié)構(gòu)及執(zhí)行時間Step2單循環(huán)軟件延時1ms程序設(shè)計32.1ms延時程序設(shè)計程序功能分析單片機采用12Mhz晶振,機器周期為1us,要實現(xiàn)1ms軟件延時,即需單片機執(zhí)行1000個機器周期。算法確定采用循環(huán)程序,循環(huán)執(zhí)行指令1000個機器周期。程序流程圖

假設(shè)循環(huán)次數(shù)為200次,則循環(huán)程序執(zhí)行時間包括:(1)循環(huán)體+循環(huán)次數(shù)修改判斷兩部分程序要執(zhí)行200次的耗時;(2)賦循環(huán)初值、循環(huán)次數(shù)等指令耗時

用R0寄存器存放循環(huán)次數(shù),賦值200,循環(huán)次數(shù)修改判斷指令DJNZ執(zhí)行1次耗時

2us,則循環(huán)體應(yīng)安排三個NOP指令,執(zhí)行一次循環(huán)耗時3us,則每次循環(huán)耗時2+3=5us,5×200=1000us,實現(xiàn)了1ms的延時。匯編語言源程序DELAY1ms:MOV R0,#200 ;設(shè)置循環(huán)次數(shù)及初值(1us)

LP1:NOP ;循環(huán)體,執(zhí)行三次NOP(3us)

NOPNOPDJNZR0,LP1 ;循環(huán)次數(shù)減1,不為0循環(huán),為0退出循環(huán)2us循環(huán)體執(zhí)行200次循環(huán)次數(shù)修改及判斷,執(zhí)行200次耗時1ms關(guān)鍵指令說明

DJNZ R0,LP1

該指令為一條件跳轉(zhuǎn)指令,雙機器周期指令,執(zhí)行時間為2us,CPU執(zhí)行該指令將完成以下操作:(1)R0=R0-1,即將R0的內(nèi)容減1(2)減1后判斷R0是否為0,不為0則跳到標(biāo)號LP1處執(zhí)行循環(huán)程序,否則執(zhí)行DJNZ下一條指令(退出循環(huán))。

從而我們看出,利用這一條指令便實現(xiàn)了循環(huán)次數(shù)修改、條件判斷的功能,以后的循環(huán)程序中會經(jīng)常使用這條指令。各指令的執(zhí)行時間可查閱指令表。寄存器尋址將操作數(shù)存放在寄存器中,寄存器包括R0~R7、A、B等。立即數(shù)尋址十進制數(shù)200送入R0直接尋址

LP1代表ROM的單元地址R0不為0精確執(zhí)行時間為多少?Step2單循環(huán)軟件延時1ms程序設(shè)計Step2單循環(huán)軟件延時1ms程序設(shè)計33.程序調(diào)試仿真(1)單步調(diào)試?yán)胟eil軟件建立項目,編譯后進入調(diào)試界面,單步執(zhí)行程序,可以觀察R0和sec的變化情況。演示鏈接(2)斷點調(diào)試

使用單步調(diào)試工具可以逐條執(zhí)行程序語句并觀察運行結(jié)果,而利用斷點調(diào)試工具可以調(diào)試某個程序塊。按下列步驟調(diào)試:演示鏈接

a.斷點設(shè)置,雙擊‘LJMP$’語句前的程序執(zhí)行箭頭處,顯示一紅色圓點即表示在該語句處設(shè)置了一個斷點,再雙擊則取消斷點;

b.運行程序,斷點設(shè)好后,點擊全速運行按鈕,程序?qū)⒈粓?zhí)行到斷點處,并在個窗口顯示相關(guān)信息;

c.查看運行結(jié)果,sec顯示為0.00100100s,表示該程序段執(zhí)行了0.00100100秒(即1001us)滿足延時要求。否則修改源程序,直到調(diào)試通過。Step3多重循環(huán)軟件延時1s程序設(shè)計1.算法確定及流程圖

前面的程序中使用了寄存器R0存放循環(huán)次數(shù),賦值200,延時1ms,以此類推,如果給R0賦值200000就可以實現(xiàn)1s的延時。但由于AT89S51為8位單片機,除PC和DPTR外,其余都是8位存儲器單元,最大存儲數(shù)據(jù)為255,因此,要實現(xiàn)更長時間的軟件延遲,考慮采用多重循環(huán)。延時1s需循環(huán)執(zhí)行1ms軟件延時1000次,由于寄存器位數(shù)受限,將1000拆分為100×10,即先設(shè)計10ms延時程序,再循環(huán)調(diào)用10ms延時程序100次即可,分別采用R0~R2存放循環(huán)次數(shù),流程圖如圖所示。2.匯編語言源程序DELAY1s: MOV R2,#100 ;1usDELAY10ms: MOV R1,#10 ;1usDELAY1ms: MOV R0,#200 ;1usLP1: NOP ;1us

NOP ;1us

NOP ;1us

DJNZ R0,LP1 ;2us

DJNZ R1,DELAY1ms;2us

DJNZ R2,DELAY10ms;2us

SJMP $ ;死循環(huán),防止程序跑飛

END

;程序結(jié)束1ms內(nèi)循環(huán)10ms二重循環(huán)1s外循環(huán)Step3多重循環(huán)軟件延時1s程序設(shè)計3.軟件仿真調(diào)試1s程序仿真結(jié)果保存源文件,建立項目,添加源文件,編譯后進入仿真調(diào)試狀態(tài),設(shè)置斷點并運行,顯示結(jié)果如圖3-5所示,結(jié)果符合設(shè)計預(yù)期。演示鏈接。返回Step3多重循環(huán)軟件延時1s程序設(shè)計任務(wù)1-2-2:軟件延時實現(xiàn)燈的閃爍及流動任務(wù)要求:利用1s軟件延時程序?qū)崿F(xiàn)燈的閃爍及流動顯示延時子程序?qū)崿F(xiàn)燈的流動帶參數(shù)延時子程序?qū)崿F(xiàn)閃爍速度控制延時子程序?qū)崿F(xiàn)燈的閃爍

軟件延時實現(xiàn)LED閃爍

Step1Step2Step3任務(wù)實施步驟知識點小結(jié)Step4Step1軟件延時實現(xiàn)燈的閃爍1.系統(tǒng)功能分析及流程圖此系統(tǒng)的主要功能是利用軟件延時實現(xiàn)燈的閃爍,即控制某只燈亮——延時——燈滅——延時——再亮——延時——再滅——延時……。因此,主程序?qū)嶋H是一個循環(huán)程序,流程圖如圖。2.匯編語言源程序

ORG 0000H LJMP START

ORG 0030HSTART:

CLR P1.0

;P1.0=0,燈亮;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延時1s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DELAY1s: MOV R2,#100DELAY10ms: MOV R1,#10 DELAY1ms: MOV R0,#200 LP1: NOP NOP NOP DJNZ R0,LP1 DJNZ R1,DELAY1ms DJNZ R2,DELAY10ms

SETB P1.0

;P1.0=1,燈滅

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延時1s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DELAY1s1: MOV R2,#100DELAY10ms1: MOV R1,#10 DELAY1ms1: MOV R0,#200 LP11: NOP NOP NOP DJNZ R0,LP11 DJNZ R1,DELAY1ms1 DJNZ R2,DELAY10ms1 LJMP START ;跳轉(zhuǎn)到START處,燈亮

END

CLR(位置‘0’)指令格式:CLRbit,(bit表某個位尋址單元,如P1.0)指令功能:將某位置‘0’,‘CLRP1.0’將P1.0引腳置‘0’,燈亮。SETB(位置‘1’)指令格式:SETBbit,(bit表某個位尋址單元,如P1.0)指令功能:將某位置‘1’,‘SETBP1.0’將P1.0引腳置‘1’,燈滅。位尋址

僅對某位進行操作,如程序中的CLRP1.0指令,僅將P1寄存器中的P1.0位清‘0’,其它位不變。3.仿真調(diào)試建立項目并編譯完成后,進入調(diào)試狀態(tài),調(diào)出P1窗口,全速執(zhí)行程序,可以發(fā)現(xiàn)P1.0的內(nèi)容在不停地變化。如果利用Proteus軟件仿真也可以看到D1閃爍的效果。達到設(shè)計要求。演示鏈接Step1軟件延時實現(xiàn)燈的閃爍Step2延時子程序?qū)崿F(xiàn)燈的閃爍1.子程序概念在解決實際問題時,經(jīng)常會遇到一個程序中多次使用同一個程序段,為了節(jié)約內(nèi)存,我們把這種具有一定功能的獨立程序段編成子程序,例如上面的延時子程序。當(dāng)需要時,可以去調(diào)用這些獨立的子程序,調(diào)用程序稱為主程序。如圖為燈閃爍控制程序,由主程序和延時子程序兩部分構(gòu)成,主程序需要延時時才轉(zhuǎn)去執(zhí)行延時子程序,但,為完成系統(tǒng)功能,延時子程序執(zhí)行完后還得返回主程序控制燈的亮滅。2.子程序調(diào)用及返回CPU執(zhí)行哪段程序取決于指令指針寄存器PC的值,如圖所示,延時子程序定位在ROM的0100H單元,當(dāng)PC=0100H時,CPU將執(zhí)行延時子程序。再以1次調(diào)用為例,延時子程序執(zhí)行完后,使PC=0035H,CPU將執(zhí)行

‘SETBP1.0’語句,使燈滅。LCALL為子程序調(diào)用指令,可完成PC=0100H的功能,同時進行斷點地址保護;RET為子程序返回指令,可將之前保護的斷點地址送給PC(即PC=0035H)。斷點地址即LCALL指令下一條指令所在ROM地址,斷點地址保護在堆棧中。堆棧,存放臨時數(shù)據(jù)(如斷點地址)的內(nèi)存區(qū)域(RAM中)。LCALL(子程序調(diào)用指令)指令格式:LCALL標(biāo)號,標(biāo)號即子程序入口地址(如DELAY1s)指令功能:CPU執(zhí)行LCALL指令時,依次完成以下操作:a.PC自動加1,使PC指向SETBP1.0所在地址單元(即PC=0035H),注意,LCALL為三字節(jié)指令;b.保護PC中的斷點地址0035H到堆棧(RAM中);c.將子程序DELAY1s的入口地址0100H賦給PC(即PC=0100H);d.CPU轉(zhuǎn)向DELAY1Sz子程序運行。RET(子程序返回指令)子程序必須以RET指令結(jié)尾,CPU執(zhí)行RET指令將順序完成以下操作:a.取出先前保護在堆棧中的斷點地址0035H賦給PC;b.CPU轉(zhuǎn)向斷點處繼續(xù)執(zhí)行后續(xù)程序。如何調(diào)用又如何返回?首先明確Step2延時子程序?qū)崿F(xiàn)燈的閃爍3.延時子程序?qū)崿F(xiàn)燈的閃爍程序設(shè)計演示鏈接

;;;;;;;;;;;;;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 0000H LJMP START

ORG 0030H

;定位主程序起始地址為0030HSTART: CLR P1.0 ;燈亮

LCALL DELAY1s

;調(diào)用1s延時子程序

SETB P1.0 ;燈滅

LCALL DELAY1s

;調(diào)用1s延時子程序

LJMP START ;跳到START處,燈亮;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延時1s子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 0100H

;定位延時子程序起始地址為0100HDELAY1s: MOV R2,#100DELAY10ms: MOV R1,#10 DELAY1ms: MOV R0,#200LP1: NOP NOP NOP DJNZ R0,LP1 DJNZ R1,DELAY1ms DJNZ R2,DELAY10ms

RET

;子程序返回

END子程序調(diào)用子程序返回如何靈活調(diào)整閃爍時間?Step3帶參數(shù)延時子程序?qū)崿F(xiàn)閃爍速度的控制帶參數(shù)延時子程序?qū)崿F(xiàn)閃爍速度的控制程序設(shè)計演示鏈接

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;帶參數(shù)延時子程序,可靈活改變演示時間,便于控制閃爍速度;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 0000H LJMP START

ORG 0030H

;定位主程序起始地址為0030HSTART: CLR P1.0 ;燈亮

MOV R2,#200 ;給入口參數(shù)賦值,延時2s

LCALL DELAY10ms ;調(diào)用延時子程序

SETB P1.0 ;燈滅

MOV R2,#50 ;給入口參數(shù)賦值,延時0.5s

LCALL DELAY10ms ;調(diào)用延時子程序

LJMP START ;跳到START處,燈亮;;;;;;;;;;;;;;;;;;;;;;;;;;;;;帶參數(shù)延時子程序,入口參數(shù)為R2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 0100H

;定位延時子程序起始地址為0100HDELAY10ms: MOV R1,#10 DELAY1ms: MOV R0,#200LP1: NOP NOP NOP DJNZ R0,LP1 DJNZ R1,DELAY1ms

DJNZ R2,DELAY10ms;修改循環(huán)次數(shù)并進行循環(huán)條件判斷

RET

;子程序返回

END利用R2傳遞參數(shù),

主程序中賦值,表示10ms延時程序循環(huán)次數(shù)利用R2傳遞參數(shù),

子程序中訪問R2,并作為循環(huán)次數(shù)使用Step3燈的閃爍及流動程序設(shè)計5.延時子程序?qū)崿F(xiàn)燈的流動顯示——功能分析先假設(shè)一只燈向左流動顯示,即燈亮的順序為D1——D2……——D7——D1——D2……,其實現(xiàn)方法是先將P1.0置‘0’,其它口置‘1’,點亮D1,間隔時間到后,將P1.1置‘0’,其它口置‘1’,點亮D2……依次循環(huán)下去。由此,只要依次給P1口送11111110B—11111101B—11111011B—11110111B—11101111B—11011111B—10111111B—01111111B—11111110B……,就可以實現(xiàn)燈的向左移動顯示,控制間隔時間就可以控制移動的速度。5.延時子程序?qū)崿F(xiàn)燈的流動顯示——循環(huán)移位指令RL(循環(huán)左移,)指令格式:RLA,該指令只能以累加器A作為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論