《單片機應(yīng)用實訓(xùn)教程》課件第1章_第1頁
《單片機應(yīng)用實訓(xùn)教程》課件第1章_第2頁
《單片機應(yīng)用實訓(xùn)教程》課件第1章_第3頁
《單片機應(yīng)用實訓(xùn)教程》課件第1章_第4頁
《單片機應(yīng)用實訓(xùn)教程》課件第1章_第5頁
已閱讀5頁,還剩338頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第1章MCS-51單片機基礎(chǔ)應(yīng)用實訓(xùn)實訓(xùn)1.1單片機開發(fā)系統(tǒng)及使用實訓(xùn)1.2數(shù)字鐘應(yīng)用電路 實訓(xùn)1.3LCD顯示器電路實訓(xùn)1.4中斷與定時/計數(shù)器的應(yīng)用實訓(xùn)1.5A/D轉(zhuǎn)換接口實訓(xùn)1.6串行通信接口實訓(xùn)1.7語音電路的應(yīng)用實訓(xùn)1.8實時時鐘/日歷芯片的應(yīng)用

實訓(xùn)1.1單片機開發(fā)系統(tǒng)及使用1.實訓(xùn)目的

(1)了解單片機開發(fā)系統(tǒng)的基本功能,掌握單片機開發(fā)系統(tǒng)的使用方法。

(2)通過對典型程序的調(diào)試操作訓(xùn)練,掌握運用開發(fā)系統(tǒng)快速有效地進(jìn)行調(diào)試的基本方法。

2.實訓(xùn)設(shè)備與器件實訓(xùn)設(shè)備:單片機集成開發(fā)環(huán)境、綜合實訓(xùn)板(綜合實訓(xùn)板電路圖參見書末附圖)。

3.實訓(xùn)步驟及要求

(1)熟悉單片機仿真開發(fā)系統(tǒng)的使用方法,掌握其基本功能與操作過程。

(2)用匯編語言編輯和輸入源程序。

(3)對源程序進(jìn)行匯編和糾錯。

(4)調(diào)試程序。4.實訓(xùn)內(nèi)容1)開發(fā)環(huán)境使用步驟

(1)將開發(fā)系統(tǒng)和目標(biāo)板連接好,并接上電源。

(2)啟動MedWin中文版,初次啟動出現(xiàn)圖1.1.1(a)所示窗口,再次啟動出現(xiàn)圖1.1.1(b)所示窗口。單擊圖1.1.1(b)中的“取消”或“模擬仿真”進(jìn)入MedWin集成開發(fā)環(huán)境,出現(xiàn)圖1.1.2所示界面。

(3)設(shè)置匯編(或編譯)環(huán)境。圖1.1.1進(jìn)入窗口(a)(b)圖1.1.2集成開發(fā)環(huán)境界面圖1.1.3設(shè)置菜單項圖1.1.4編譯、匯編、連接配置窗口(a)(b)(4)新建NEW(或打開Open)文件。圖1.1.5文件處理菜單項圖1.1.6新建文件界面(5)對源程序進(jìn)行匯編(或編譯)。圖1.1.7項目管理菜單(6)排除錯誤。(7)產(chǎn)生代碼并裝入仿真器。(8)調(diào)試程序。(9)輸出代碼文件。圖1.1.8程序調(diào)試菜單2)常用調(diào)試方法單步運行調(diào)試(F8)。(2)跟蹤運行調(diào)試(F7)。(3)全速運行至光標(biāo)處調(diào)試(F4)。(4)全速連續(xù)運行調(diào)試(F9)。(5)設(shè)置斷點調(diào)試(F2)。(6)自動單步運行調(diào)試。(7)設(shè)置程序計數(shù)器PC的內(nèi)容(Ctrl+N)。圖1.1.9單步運行圖1.1.10執(zhí)行至光標(biāo)處(a)(b)圖1.1.10執(zhí)行至光標(biāo)處圖1.1.11全速連續(xù)運行圖1.1.12斷點運行(a)(b)圖1.1.13自動單步運行3)程序調(diào)試實例1:查表顯示程序的分析與調(diào)試(1)源程序。

ORG0000H ;匯編完成后,PC的初始值=() LJMP DISP0 ORG0800HDISP0: MOV DPTR,#4400H ;程序運行到該條指令時PC=() MOV A,#43H ;在該處觀察DPH的內(nèi)容=() MOVX @DPTR,A ;DPL的內(nèi)容=() MOV R2,#08H MOV R3,#7FH MOV R0,#30H ;該指令執(zhí)行完成后,觀察R0=()、

MOV A,@R0 ;R2=()、R3=()DISP1:MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#4402H ;第一次運行到該處時A=(),第二

MOVX @DPTR,A ;次運行到該處時A=()MOV A,R3 MOV DPTR,#4401H MOVX @DPTR,A ;運行到此處SP=()LCALLT10msRR A ;運行到此處SP=()MOV R3,AINC R0 ;第一次運行到此處R3=(),第二

MOV A,@R0 ;次運行到此處R3=()DJNZ R2,DISP1SJMP DISP0TAB: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FHT10ms:MOV R4,#0FDH ;程序運行到此處SP=()TM0: MOV R5,#0AHTM1: NOP NOP DJNZ R5,TM1 ;程序循環(huán)運行3次后,R5=() DJNZ R4,TM0 RET ;程序運行到此處SP=()

;程序連續(xù)運行后,可觀察的實驗現(xiàn)象是()(2)調(diào)試步驟。①為程序加注釋。在調(diào)試程序前,必須首先讀懂源程序,弄清每條指令執(zhí)行的結(jié)果及每段程序執(zhí)行的結(jié)果與功能,分析并完成程序中的填空內(nèi)容。②錄入實訓(xùn)程序,設(shè)文件名為PROGRAM01.ASM。③對源程序進(jìn)行匯編。④根據(jù)提示進(jìn)行糾錯。⑤產(chǎn)生代碼并裝入仿真器。⑥確定程序調(diào)試前的初始參數(shù),將顯示單元30H~37H中的內(nèi)容修改為01H~08H。⑦通過調(diào)試確定填空內(nèi)容的正確性。(3)調(diào)試過程。調(diào)試程序時,應(yīng)先讀懂源程序,確定出能反映程序正確與否的觀測點及用什么調(diào)試方法和步驟能快速地檢驗觀測點的參數(shù)及路徑的變化,制定出具體的調(diào)試步驟;通過操作來驗證已完成填空內(nèi)容的正確性。在調(diào)試上述程序時可從以下幾方面入手:首先修改RAM單元中的內(nèi)容。根據(jù)題目要求,先將30H~37H單元中的初始值設(shè)置為01H~08H;再運行程序檢查結(jié)果。如先用連續(xù)運行方式(F9)運行程序,觀察程序運行的結(jié)果是否能顯示設(shè)定單元的內(nèi)容。在實際調(diào)試程序時,由于各種原因,程序運行的結(jié)果往往不一定能做到一次就達(dá)到設(shè)計者的要求,可能存在各種未知的原因而產(chǎn)生錯誤。因此,必須靈活運用各種調(diào)試手段,快速有效地找出故障點,分析出產(chǎn)生故障的原因并排除所有錯誤,直到滿足設(shè)計要求為止。調(diào)試手段一般包括:①檢查程序運行的路徑是否正確??刹捎脝尾?F8)運行的調(diào)試方法,邊運行邊觀察程序運行的路徑與預(yù)先設(shè)計的運行路徑是否一致。若不一致,可根據(jù)運行過程中地址的變化找出故障點,分析產(chǎn)生故障的原因。②檢查程序運行到某處的執(zhí)行結(jié)果。如檢查程序執(zhí)行到某處后,相關(guān)單元(內(nèi)部或外部)、工作寄存器、特殊功能寄存器中內(nèi)容的變化。由此可判斷程序運行到某處時是否正確。為提高調(diào)試速度,可將光標(biāo)停留在預(yù)觀察點,再用F4鍵快速將程序運行至光標(biāo)處。通過對運行結(jié)果的觀察與分析,可判斷結(jié)果是否正確。若出現(xiàn)錯誤,應(yīng)及時分析產(chǎn)生錯誤的原因并加以修正。③檢查子程序調(diào)用的運行過程。先用單步運行(F8)的方法運行調(diào)用子程序指令,然后觀察程序能否運行到該調(diào)用指令的下一條指令處,若能,則說明子程序調(diào)用的運行過程是正確的;再檢查子程序的出口內(nèi)容是否正確,若兩者都正確,則調(diào)試完畢。若執(zhí)行了調(diào)用指令后,程序不能返回到該調(diào)用指令的下一條指令處,出現(xiàn)系統(tǒng)提示忙或子程序出口結(jié)果不正確時,則應(yīng)重新用跟蹤運行(F7)的調(diào)試方法運行調(diào)用指令,以便跟蹤運行到子程序的內(nèi)部,再通過單步或跟蹤運行等方法逐條運行,直至找到產(chǎn)生錯誤的原因并加以修正為止。④檢查循環(huán)程序的運行過程。若程序中有循環(huán)結(jié)構(gòu),可先將光標(biāo)或斷點預(yù)置在循環(huán)程序的最后一條指令處,然后用全速運行到光標(biāo)處(F4)或連續(xù)運行(F9)到斷點處的方法運行程序。若提示系統(tǒng)忙,可能出現(xiàn)了死循環(huán)等錯誤,此時,應(yīng)考慮用單步運行的方法檢查程序循環(huán)運行的路徑變化是否正確。為縮短調(diào)試時間,可在調(diào)試循環(huán)程序前,將循環(huán)初始值中的循環(huán)次數(shù)改小些,通過觀察運行路徑和指令運行的結(jié)果,找出循環(huán)程序內(nèi)部出現(xiàn)的故障并加以修正。在上述調(diào)試過程中,主要是針對順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)的調(diào)試,究竟采用什么樣的調(diào)試方法更適宜,應(yīng)根據(jù)被調(diào)試程序的結(jié)構(gòu)特點和程序運行結(jié)果的觀測點來合理選擇。4)程序調(diào)試實例2:中斷顯示程序分析與調(diào)試(1)源程序。

ORG 0000H START: LJMP MAIN ORG0003H LJMP GINTO ;程序運行至此處(SP)=() ORG000BH LJMPGT0 ORG0030HMAIN:MOV P1,#0FFH ;程序運行至此處,指示燈的狀態(tài)為() MOV SP,#30H ;在執(zhí)行該指令前,(SP)=() MOV 20H,#10H MOV TMOD,#02H ;定時器T0設(shè)定為()方式

MOV TL0,#00H MOV TH0,#00H MOV IP,#01H ;中斷優(yōu)先級的排列順序為() MOV IE,#83H ;()中斷源被允許中斷

MOV TCON,#101H ;邊沿觸發(fā)方式

SETB TROHELT: NOP NOP ;程序運行到此處(SP)=() SJMP HELTGINT0:CPL P1.0 ;程序運行到此處(31H)=(),(32H)=() ACALL DELAY CPL P1.0 ACALL DELAY CPL P1.0 ACALL DELAY CPL P1.0 RETI GT0: DJNZ 20H,BACK MOV 20H,#10H XRL P1,#80H;程序運行到此處時對應(yīng)指示燈狀態(tài)為() ACALL DELAY BACK:RETIDELAY:MOV R3,#200 ;200msDEL2: MOV R4,#250DEL1: NOP NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET ;程序運行到此處(31H)=(),(32H)=() END(2)調(diào)試步驟。①閱讀源程序,說明每條指令執(zhí)行的結(jié)果及每段程序執(zhí)行的結(jié)果與功能,描述程序運行路徑的變化過程;完成填空內(nèi)容。②錄入實訓(xùn)程序2,設(shè)文件名為PROGAM02.ASM。③對源程序進(jìn)行匯編。④根據(jù)提示進(jìn)行糾錯。⑤產(chǎn)生代碼并裝入仿真器。⑥確定調(diào)試方法。(3)調(diào)試過程。①檢查程序運行結(jié)果。先用連續(xù)運行方式(F9)運行程序,觀察指示燈變化規(guī)律是否符合設(shè)計要求;將8031單片機的P3.2(INT0)管腳置低電平,觀察指示燈變化規(guī)律。②排查錯誤。當(dāng)程序運行的結(jié)果不正確時,根據(jù)程序運行中出現(xiàn)的現(xiàn)象來分析和判斷產(chǎn)生錯誤的原因,確定出具體的調(diào)試方法與步驟。例如:檢查定時器中斷響應(yīng)的過程時,由于程序中使用了定時器T0,可根據(jù)顯示的結(jié)果判斷定時器的中斷是否被響應(yīng),若指示燈按設(shè)計的要求變化,可斷定該中斷程序的運行是正確的,若顯示結(jié)果不正確,則通過調(diào)試手段排查錯誤。

調(diào)試中斷程序結(jié)構(gòu)時,可采用快速運行到光標(biāo)處(F4)或設(shè)置斷點(F2)的方法進(jìn)行調(diào)試。先將光標(biāo)(或斷點)設(shè)置在中斷服務(wù)程序的入口地址(000BH)處,然后用F4(或F9)運行程序,觀察程序是否運行至光標(biāo)(或斷點)處,若能,則說明該中斷源的中斷請求已被CPU接受,然后再用單步運行方式繼續(xù)運行中斷程序。當(dāng)執(zhí)行到中斷返回指令RETI時,注意觀察程序返回到何處。由此可檢查中斷服務(wù)程序被響應(yīng)的整個運行過程。檢查外部中斷響應(yīng)過程時,同樣先將光標(biāo)(或斷點)設(shè)置在外部中斷服務(wù)程序的入口地址(0003H)處,然后用F4(或F9)運行程序。根據(jù)調(diào)試過程中各條指令的執(zhí)行結(jié)果及運行路徑的變化可找出故障點,然后進(jìn)行分析和排除。5)程序設(shè)計與調(diào)試實例3:數(shù)碼顯示34H~36H單元內(nèi)容子程序DISPLAY的設(shè)計與調(diào)試(1)設(shè)計步驟。①根據(jù)題目的功能要求安排程序結(jié)構(gòu)。②確定該子程序的入口和出口。③畫出流程圖。④編寫源程序。⑤程序調(diào)試。(2)設(shè)計過程。①確定程序結(jié)構(gòu)。根據(jù)題目要求,采用動態(tài)顯示原理設(shè)計一個能通過LED數(shù)碼管顯示34H~36H單元內(nèi)容(壓縮BCD碼)的通用子程序,選擇循環(huán)程序結(jié)構(gòu),逐位循環(huán)顯示各位數(shù)碼。通過查表法獲取與被顯示數(shù)碼相對應(yīng)的顯示字符。②明確子程序的入口和出口。該顯示程序的入口為B寄存器,其內(nèi)容是顯示緩沖區(qū)單元的首地址,只要在調(diào)用該顯示子程序之前先將顯示緩沖區(qū)34H~36H單元的首地址34H送入B寄存器中,再調(diào)用該顯示子程序就能將顯示緩沖區(qū)單元中的內(nèi)容逐一顯示出來。若無明確出口,則直接用LED顯示緩沖區(qū)內(nèi)容。③畫程序流程框圖。如圖1.1.14所示,將設(shè)計思想用流程圖的形式描述出來。通用子程序應(yīng)包括保護現(xiàn)場和恢復(fù)現(xiàn)場,究竟哪些參數(shù)需要保護,應(yīng)根據(jù)子程序所占用資源的內(nèi)容是否會對其他程序資源內(nèi)容造成影響而定。④編程與調(diào)試。按編程框圖所表達(dá)的意圖,選用相應(yīng)的指令予以實現(xiàn),特別是要弄清MOVX類指令中DPTR內(nèi)容的作用及該指令的操作過程。在調(diào)試程序時,為觀察程序運行結(jié)果,先將34H~36H單元中高4位和低4位內(nèi)容設(shè)置為8421BCD碼;然后將該程序的最后一條子程序返回指令(RET)改為轉(zhuǎn)移指令LJMPDISPLAY或SJMP$,Y,也可將斷點或光標(biāo)設(shè)在該指令處;連續(xù)運行程序,觀察顯示內(nèi)容。若不正確,則根據(jù)運行現(xiàn)象分析產(chǎn)生故障的原因,并設(shè)置必要的觀測點。

如圖1.1.14所示,將觀測點設(shè)在①點可判斷取第1位被顯示數(shù)據(jù)的運行結(jié)果是否正確,設(shè)在②點可判斷通過查表得到的顯示字符是否正確,設(shè)在③點可判斷調(diào)用延時子程序過程是否正確,設(shè)在④點可判斷取第2位顯示字符是否正確,設(shè)在⑤點可判斷下一步運行路徑是否正確。通過各觀測點的運行結(jié)果可分段排查引起故障的大概部位,然后再進(jìn)一步找到產(chǎn)生故障的原因。圖1.1.14顯示子程序DISPLAY流程框圖(3)參考程序。;功能:通過LED數(shù)碼管動態(tài)顯示緩沖區(qū)內(nèi)容;入口:B存放顯示緩沖區(qū)單元首地址;出口:無DISPLAY:PUSH PSW ;保護現(xiàn)場

PUSH ACC SETB RS0 CLR RS1 MOV R5,#00H ;延時初值

MOV DPTR,#PORTA MOV A,#0FFH MOVX @DPTR,A ;關(guān)顯示

MOV R0,B ;顯示單元首地址送R0 MOV R3,#03H ;循環(huán)顯示次數(shù)初值

MOV R4,#0DFH ;顯示位置初值DIS0: MOV A,@R0 ;取顯示單元內(nèi)容DIS1: ANL A,#0FH ;取顯示內(nèi)容個位

MOV DPTR,#TAB MOVC A,@A+DPTR ;查表,取顯示字符

MOV DPTR,#PORTB MOVX @DPTR,A ;顯示字符送B口

MOV DPTR,#PORTA MOV A,R4 MOVX @DPTR,A ;顯示位送A口,顯示數(shù)據(jù)個位HERE0:DJNZ R5,HERE0 ;顯示延時

RR A ;顯示位右移

MOV R4,A MOV A,@R0 SWAP A ANL A,#0FH ;取顯示內(nèi)容十位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#PORTB MOVX @DPTR,A MOV DPTR,#PORTA MOV A,R4 MOVX @DPTR,A ;顯示數(shù)據(jù)十位

RR A ;顯示位右移

MOV R4,AHERE1:DJNZ R5,HERE1 ;顯示延時

INC R0 ;顯示單元地址加1 DJNZ R3,DIS0 ;循環(huán)顯示時、分、秒

POP ACC ;恢復(fù)現(xiàn)場

POP PSW RETTAB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;共陰極字型碼表

DB7FH,6FH,77H,7CH,39H,5EH,79H,71H6)程序設(shè)計與調(diào)試實例4:鍵盤掃描子程序SERCH的設(shè)計與調(diào)試(1)設(shè)計步驟。①根據(jù)題目的功能要求安排程序結(jié)構(gòu)。②確定該子程序的入口和出口。③畫出流程圖。④編寫源程序。⑤程序調(diào)試。(2)設(shè)計過程。①確定程序結(jié)構(gòu)。針對矩陣式鍵盤的分布規(guī)律,如圖1.1.15所示,計算鍵號的數(shù)學(xué)模型為“鍵號=列號+行首號”。采用逐列、逐行循環(huán)掃描方式,即從0列開始逐列將列線置低電平,然后逐行查詢各行的邏輯電平,若查詢到某行為低電平,則將該行的行首號與被設(shè)置為低電平的列號相加獲得鍵號。根據(jù)掃描原理應(yīng)選擇循環(huán)程序結(jié)構(gòu),在掃描過程中,應(yīng)設(shè)法記錄每次循環(huán)掃描時的列號和行首號,以便一旦掃到有鍵輸入時計算出鍵號。②明確子程序的入口和出口。設(shè)程序無確定入口,運行該子程序后,只要有按鍵輸入就能計算出按下的鍵號值;出口為累加器A,用來存放計算出的鍵號值。圖1.1.15矩陣式鍵盤結(jié)構(gòu)圖③畫流程框圖。如圖1.1.16所示。圖1.1.16鍵盤掃描子程序SERCH流程框圖④編程與調(diào)試。為消除抖動,程序中需加去抖功能。調(diào)試程序時,預(yù)先選擇觀測點,如圖1.1.16所示,設(shè)在①點可判斷是否有鍵輸入,觀察列號和行首號,設(shè)在②點可觀察計算的鍵值與輸入鍵號是否相同,設(shè)在③點可觀察按鍵是否釋放及出口結(jié)果,調(diào)試方法同上。(3)參考程序。;功能:掃描并確定鍵號;入口:無;出口:累加器A,存放計算出的鍵號值SERCH:MOV R2,#0FEH ;首列掃描字送R2 MOV R3,#00H ;首列號送R3LINE0:MOV DPTR,#PORTA ;DPTR指針指向8155的A口

MOV A,R2 MOVX @DPTR,A ;列掃描字送8155的A口

MOV DPTR,#PORTC ;DPTR指針指向8155的C口

MOVX A,@DPTR ;讀入C口的行狀態(tài)

JB ACC.0,LINE1 ;若第0行無鍵按下,轉(zhuǎn)判第1行

MOV A,#00H ;第0行行首號送A AJMP TRYK ;求鍵號LINE1:JB ACC.1, LINE2 ;若第1行無鍵按下,轉(zhuǎn)判第2行

MOV A,#04H ;第1行行首號送A AJMP TRYK ;求鍵號LINE2:JB ACC.2, LINE3 ;若第2行無鍵按下,轉(zhuǎn)判第3行

MOV A,#08H ;第2行行首號送A AJMP TRYK ;求鍵號LINE3:JB ACC.3, LINE4 ;若第3行也無鍵按下,轉(zhuǎn)掃描下一列

MOV A,#0CH ;第3行行首號送A AJMP TRYK ;求鍵號LINE4: INC R3 ;掃描列號加1 MOV A,R2 ;列掃描字送A RL A ;掃描下一列

JNB ACC.4,BACK4 ;若4列掃描完,則返回

MOV R2,A ;掃描字送R2 AJMP LINE0 ;轉(zhuǎn)掃描下一列TRYK: ADD A,R3 ;將行首號與列號相加,求鍵號

MOV 22H,A ;保護鍵號BACK2: ACALL KEYTEST ;判按鍵釋放否

JZ BACK3 LCALL DISPLAY ;按鍵未釋放,繼續(xù)等待

SJMP BACK2BACK3: MOV A,22H ;按鍵釋放,將鍵號送ABACK4: RET ;鍵盤掃描結(jié)束,返回5.實訓(xùn)分析與總結(jié)

(1)運用仿真系統(tǒng)調(diào)試簡單程序結(jié)構(gòu)、分支程序結(jié)構(gòu)、循環(huán)程序結(jié)構(gòu)、子程序結(jié)構(gòu)和中斷結(jié)構(gòu)的關(guān)鍵在于,如何將對程序的分析理解和開發(fā)系統(tǒng)提供的基本功能有機地結(jié)合起來,其前提條件是必須對源程序的作用、結(jié)構(gòu)特點、運行過程與結(jié)果有較全面的認(rèn)識,并能根據(jù)程序運行過程中出現(xiàn)的現(xiàn)象和結(jié)果分析并判斷產(chǎn)生各種故障現(xiàn)象的原因,再運用排除法逐一檢驗各種判斷是否準(zhǔn)確。

(2)在掌握程序結(jié)構(gòu)特點的基礎(chǔ)上,合理選擇觀測點,通過觀察在觀測點處參數(shù)及路徑的變化檢驗程序運行的結(jié)果。(3)為提高調(diào)試程序的效率,應(yīng)對單片機開發(fā)系統(tǒng)所提供的幾種程序運行調(diào)試方式有足夠的了解并能熟練地運用。例如,在調(diào)試過程中,若要觀察最終結(jié)果,則可選擇全速運行調(diào)試;若要觀察相關(guān)指令的運行結(jié)果或運行路徑的變化過程,則可選擇單步運行;若要檢查子程序的運行過程,則可選擇跟蹤運行調(diào)試;若要檢查循環(huán)程序或中斷服務(wù)程序,則可選擇斷點運行調(diào)試;若要定點檢查程序運行到某處的結(jié)果時,則可選擇快速運行到光標(biāo)處調(diào)試。但實際中究竟選用哪種方法更適宜或哪幾種方法結(jié)合使用更快捷,將隨著分析能力與操作的熟練程度逐步提高。(4)檢驗程序運行結(jié)果是否正確時,應(yīng)運用單片機開發(fā)系統(tǒng)所提供的交互界面,將程序運行過程中程序計數(shù)器PC(地址)的變化、各單元(內(nèi)部RAM和外部RAM)內(nèi)容的變化、特殊功能寄存器內(nèi)容的變化、堆棧指針SP內(nèi)容的變化與程序的理論分析結(jié)果相對照。

(5)編制程序和調(diào)試程序時,需要多次反復(fù)的過程,并非一次就能排除全部故障,特別是單片機應(yīng)用系統(tǒng)的硬件電路和匯編程序相結(jié)合的綜合調(diào)試就更加復(fù)雜,因此,必須通過反復(fù)調(diào)試,不斷修改硬件和軟件,直到最終符合設(shè)計要求為止。如果在調(diào)試中能夠根據(jù)實驗現(xiàn)象預(yù)先對產(chǎn)生故障的原因加以判斷和分析,并制定出相應(yīng)的調(diào)試方法和步驟,可縮小排除故障的范圍,提高調(diào)試效率。

6.思考題

(1)調(diào)試程序的目的是什么?

(2)在主程序的開始為何通常要加轉(zhuǎn)移命令?

(3)堆棧指針的初始值是多少?在什么情況下需用指令重新設(shè)置該指針?

(4)試?yán)L出實訓(xùn)程序1和程序2的流程框圖。

(5)通過操作觀察在調(diào)用子程序和中斷過程中堆棧指針如何變化?

(6)什么是中斷嵌套?如何判斷中斷是否被響應(yīng)?在實訓(xùn)程序2中,當(dāng)定時器T0中斷被響應(yīng)后,外部中斷INT0能否再被響應(yīng)?實訓(xùn)1.2數(shù)字鐘應(yīng)用電路

1.實訓(xùn)目的

(1)掌握LED顯示、鍵盤、定時/計數(shù)器綜合應(yīng)用程序的設(shè)計與分析方法。

(2)掌握運用開發(fā)系統(tǒng)調(diào)試LED顯示、鍵盤及定時/計數(shù)應(yīng)用程序的基本方法。

2.實訓(xùn)設(shè)備與器件實訓(xùn)設(shè)備:單片機集成開發(fā)環(huán)境、綜合實訓(xùn)板。3.項目設(shè)計要求用單片機實現(xiàn)由LED數(shù)碼管顯示時、分、秒的數(shù)字鐘,并具有用按鍵修改時鐘參數(shù)和鬧鐘參數(shù)的功能;鬧鐘啟動后能保持一段時間再自動停止。4.實訓(xùn)內(nèi)容

1)硬件設(shè)計硬件電路的設(shè)計應(yīng)從兩個方面予以考慮。一是根據(jù)應(yīng)用系統(tǒng)總體設(shè)計的參數(shù)范圍、測控速度與精度等技術(shù)指標(biāo)要求選擇單片機。不同系列單片機或同一系列不同型號單片機芯片內(nèi)部提供的資源狀況各不相同,如ROM、RAM容量,定時/計數(shù)器、I/O接口、中斷系統(tǒng)等硬件配置,應(yīng)選擇性價比最適合的單片機型。二是在已選定單片機型號的基礎(chǔ)上,根據(jù)應(yīng)用系統(tǒng)的功能要求擴展單片機外部設(shè)備的配置,如鍵盤、打印機、A/D、D/A、報警電路、驅(qū)動電路及通用/專用I/O接口等。

硬件電路的設(shè)計原則如下:

(1)在性價比滿足應(yīng)用系統(tǒng)要求的基礎(chǔ)上,選擇更可靠、更熟悉的單片機,縮短研制周期。

(2)盡可能選擇較成熟的典型應(yīng)用電路,以提高系統(tǒng)的可靠性。

(3)單片機內(nèi)部的資源與外部擴展資源應(yīng)在滿足應(yīng)用系統(tǒng)設(shè)計要求的基礎(chǔ)上留有余地,為進(jìn)一步升級和擴展其功能提供方便。

(4)應(yīng)充分結(jié)合軟件方案統(tǒng)籌考慮硬件結(jié)構(gòu),通常硬件功能較完善,其相應(yīng)的軟件就簡單,但硬件成本較高;而硬件功能略低,其相應(yīng)的軟件就復(fù)雜。實際中應(yīng)盡量以軟件替代硬件來降低成本。(5)整個系統(tǒng)的相關(guān)器件應(yīng)盡可能做到性能匹配,如電平、速度的匹配等。

(6)充分考慮整個系統(tǒng)的抗干擾設(shè)計,如選擇具有抗干擾設(shè)計的單片機并充分篩選芯片與器件,在電路中采取隔離和屏蔽措施等。根據(jù)以上設(shè)計原則,選擇較熟悉的MCS-51系列單片機中具有內(nèi)部程序存儲器的89C51單片機;為實現(xiàn)LED數(shù)碼顯示和鍵盤控制,擴展一片8155(或8255)通用可編程I/O接口;用蜂鳴器實現(xiàn)鬧鐘。用0#、1#、2#號鍵作為時鐘、鬧鐘參數(shù)修改功能選擇鍵與加1功能鍵。其中:

0#鍵為時鐘參數(shù)修改功能選擇鍵。按一次修改秒,按二次修改分,按三次修改小時,按四次確認(rèn)修改完畢。1#鍵為鬧鐘時間參數(shù)設(shè)置功能選擇鍵。按一次設(shè)置分,按二次設(shè)置小時,按三次確認(rèn)設(shè)置完畢。

2#鍵為加1功能鍵,每按一次將根據(jù)0#、1#鍵的選擇結(jié)果將相應(yīng)單元內(nèi)容加1。修改“時”時,加到23后“清0”,再加1;修改“分”時,加到59后“清0”,再加1。圖1.2.1數(shù)字鐘硬件接線原理圖2)軟件設(shè)計待硬件電路接線完成后,通??上染帉懞唵蔚臏y試程序?qū)τ布娐愤M(jìn)行測試,排除硬件電路設(shè)計中存在的錯誤。然后根據(jù)設(shè)計任務(wù)的要求確定系統(tǒng)程序的整體結(jié)構(gòu),盡可能采用模塊化程序設(shè)計的方法,將任務(wù)劃分為相對獨立的功能模塊,明確各模塊的功能、時間順序和相互關(guān)系,如系統(tǒng)管理、數(shù)據(jù)與信息采集、報警處理、誤差處理、標(biāo)度變換、數(shù)據(jù)處理、輸出控制等;列出詳細(xì)的資源劃分表,確定各模塊的出口和入口狀態(tài);建立必要的數(shù)學(xué)模型,正確描述出系統(tǒng)中輸入和輸出間的數(shù)學(xué)關(guān)系;畫出各程序模塊的詳細(xì)流程圖;根據(jù)流程圖逐一編寫程序;最后將各個模塊連接成完整的程序。(1)軟件設(shè)計的基本原則。①程序整體結(jié)構(gòu)清晰、簡潔、流程合理,主程序盡可能簡單明了。②各種功能的實現(xiàn)應(yīng)采用模塊化、子程序化,以便于編制、閱讀、連接、移植、修改和調(diào)試。③對各子程序的入口、出口條件,占用的資源要明確,以便于分析、調(diào)試和共享。④程序存儲區(qū)、數(shù)據(jù)存儲區(qū)、寄存器區(qū)、位尋址區(qū)、堆棧區(qū)應(yīng)規(guī)劃合理,做到既節(jié)約資源又不會發(fā)生相互間的沖突。⑤運行狀態(tài)標(biāo)志化管理,對各功能程序的運行結(jié)果、操作狀態(tài)應(yīng)設(shè)置狀態(tài)標(biāo)志,以便查詢和實現(xiàn)運行控制。⑥運用軟件或軟硬件相結(jié)合等方法抑制干擾,提高系統(tǒng)的抗干擾能力。⑦必要時可結(jié)合硬件采取加密措施。(2)模塊化程序結(jié)構(gòu)。①主程序MAIN:完成系統(tǒng)初始化,包括時鐘、鬧鐘初始參數(shù)及初始標(biāo)識的設(shè)定;I/O口、定時/計數(shù)器初始狀態(tài)的設(shè)定;鍵盤、鬧鐘和時鐘顯示的監(jiān)控管理。②時鐘參數(shù)修改子程序FTION0:關(guān)定時器,禁止鬧鐘時間參數(shù)修改,清鬧鐘修改標(biāo)識,清鬧鐘修改位置記錄;時鐘修改位置記錄值加1,根據(jù)記錄值將對應(yīng)的時鐘時、分、秒修改標(biāo)識置1。③鬧鐘參數(shù)修改子程序FTION1:禁止時鐘時間參數(shù)修改,清時鐘修改標(biāo)識,清時鐘修改位置記錄;按一次鬧鐘設(shè)置功能鍵,鬧鐘設(shè)置記錄值加1,按3次鬧鐘設(shè)置功能鍵,鬧鐘設(shè)置有效標(biāo)志位置1,表示鬧鐘已設(shè)置。④加1鍵修改子程序CUM:根據(jù)修改(或設(shè)置)標(biāo)識將時鐘(或鬧鐘)相應(yīng)單元內(nèi)容加1。⑤鬧鐘控制子程序ALARM:判斷鬧鐘啟動時間到否。若時間到,則啟動鬧鐘,延時10s后自動關(guān)鬧鐘并清除鬧鐘設(shè)置標(biāo)識。⑥鍵盤測試子程序KEYTEST:判斷是否有鍵按下。⑦查鍵號子程序SERCH:若有鍵按下,則確定鍵號。⑧顯示子程序DISPLAY:根據(jù)顯示單元首地址顯示時鐘(或鬧鐘)時間。⑨定時修正時鐘參數(shù)中斷服務(wù)子程序CLOCK:定時修改時鐘參數(shù)。(3)資源分配:選用定時/計數(shù)器T0,定時方式2工作,每隔50ms溢出中斷一次。接口地址: PORT(8155控制寄存器)8000HPORTA(8155A口地址)8001HPORTB(8155B口地址)8002HPORTC(8155C口地址)8003H

以本書配備實驗板調(diào)試程序時,可用發(fā)光二極管替代蜂鳴器,并將接口地址改為:PORT(8155控制寄存器)4400HPORTA(8155A口地址)4401HPORTB(8155B口地址)4402HPORTC(8155C口地址)4403H表1.2.1單片機內(nèi)部RAM部分資源分配表表1.2.1單片機內(nèi)部RAM部分資源分配表(4)軟件流程框圖。圖1.2.2主程序MAIN流程框圖圖1.2.3時鐘修改功能子程序FTION0流程框圖圖1.2.4鬧鐘修改功能子程序FTION1流程框圖圖1.2.5加1鍵修改子程序CUM流程框圖圖1.2.6時鐘修正中斷服務(wù)子程序CLOCK流程框圖(5)源程序。**************主程序MAIN****************ORG 0000HAJM MAINORG000BHLJMP CLOCK ;轉(zhuǎn)時鐘程序ORG0100HPORT EQU 4400H ;定義8155控制寄存器、A、B、C端口符號地址PORTA EQU 4401HPORTB EQU 4402HPORTC EQU 4403HSECBITEQU 08H ;定義各標(biāo)識位符號地址MINBIT EQU 09HHOURBITEQU 0AHRMINBIT EQU 0BHRHOURBIT EQU 0CHRTIMBIT EQU 0DHARMBIT EQU 0EHTIMDATA EQU 30H ;定義各單元符號地址RTIMDATA EQU 31HMSEC1 EQU 32HMSEC2 EQU 33HSEC EQU 34HMIN EQU 35HHOUR EQU 36HRSEC EQU 37HRMIN EQU 38HRHOUR EQU 39HCOUNT EQU 3AHMAIN:MOV SP,#60H MOV DPTR,#PORT MOV A,#03H ;設(shè)8155A、B口輸出,C口輸入

MOVX @DPTR,A MOV 21H,#00H ;清零鬧鐘標(biāo)識位

MOV RHOUR,#00H ;設(shè)置鬧鐘單元初值

MOV RMIN,#00H MOV RSEC,#00H MOV HOUR,#00H ;設(shè)置時鐘單元初值

MOV MIN,#00H MOV MSEC1,#00H MOV MSEC2,#00H MOV TIMDATA,#00H ;時鐘修改記憶單元清零

MOV RTIMDATA,#00H ;鬧鐘修改記憶單元清零

MOV COUNT,#00H ;鬧鐘保持10s計時單元清零 MOV TMOD,#02H ;定時器T0方式2 MOV TL0,#06H ;定時250μs初始值

MOV TH0,#06H SETB EA ;中斷允許

SETB ET0 SETB TR0 ;啟動定時器

MOV B,#SEC ;時鐘秒單元首地址送BBEGIN:LCALLKEYTEST ;調(diào)用判別鍵入測試程序

JNZ RETEST ;有鍵輸入則轉(zhuǎn)去抖程序

LCALL DISPLAY ;無鍵輸入調(diào)用顯示程序

JNB ARMBIT,BEGIN ;判別鬧鐘設(shè)定標(biāo)識位,未設(shè)定則返回

LCALL ALARM ;調(diào)鬧鐘程序

AJMP BEGIN ;返回RETEST:LCALLDISPLAY ;調(diào)用顯示子程序延時去抖

LCALLKEYTEST JNZ KEDATA ;若無抖動,則查鍵號,否則返回

LJMP BEGINKEDATA:LCALLSERCH ;調(diào)鍵號測試程序

CJNEA,#00H,NEXT1 ;判別是否時鐘修改功能鍵

LCALLFTION0 ;是時鐘參數(shù)修改功能鍵則調(diào)用時 鐘修改程序

SJMPNEXT3NEXT1:CJNEA,#01H,NEXT2 ;判別是否鬧鐘修改功能鍵

LCALLFTION1 ;是鬧鐘參數(shù)修改功能鍵則調(diào)用鬧 鐘設(shè)定程序

SJMPNEXT3NEXT2:CJNE A,#02H,NEXT3 ;判別是否加1功能鍵

LCALL CUM ;是加1功能鍵則調(diào)用加1修改程序NEXT3:SJMP BEGIN ;循環(huán)返回**************時鐘參數(shù)修改子程序FTION0****************;功能:根據(jù)時鐘修改功能鍵按下的次數(shù),分別將時鐘修改標(biāo)識位SECBIT、MINBIT、HOURBIT置“1”;入口:TIMDAT,時鐘修改功能鍵按下次數(shù),每按一次時鐘修改功能鍵,該單元內(nèi)容加1;出口:TIMDAT、SECBIT、MINBIT、HOURBIT,根據(jù)當(dāng)前TIMDAT的次數(shù),分別將對應(yīng)時鐘修改標(biāo)識位置1FTION0:CLR TR0 ;關(guān)定時器

CLR RMINBIT;禁止鬧鐘參數(shù)修改,清鬧鐘分修改標(biāo)識位0BH CLR RHOURBIT;清鬧鐘小時修改標(biāo)識位0CH MOV B,#SEC ;將時鐘秒單元設(shè)為顯示首地址 MOV RTIMDATA,#00H;清鬧鐘修改位置標(biāo)識記錄

INC TIMDATA ;將時鐘修改記錄值加1 MOV A,TIMDATA CJNE A,#01H,TW0 ;若記錄值為1,則將時鐘秒修改標(biāo)識置1 SETB SECBIT ;時鐘秒標(biāo)識位08H置1 LJMP BAC0 TW0: CJNE A,#02H,THREE0 ;若記錄值為2,則將時鐘分修改標(biāo)識置1 CLR SECBIT ;時鐘秒標(biāo)識位08H清零

SETB MINBIT ;時鐘分標(biāo)識位09H置1 LJMP BAC0THREE0:CJNE A,#03H,BACK ;若記錄值為3,則將時鐘小時修改標(biāo)識置1 CLR MINBIT ;時鐘分標(biāo)識位09H清零

SETB HOURBIT ;時鐘小時標(biāo)識位0AH置1 LJMP BAC0BACK:MOV TIMDATA,#00H ;若按4次,則清時鐘單元修改位置記錄

CLR HOURBIT ;時鐘小時標(biāo)識位0AH清零

SETB TR0 ;定時器重新啟動BAC0:RET**************鬧鐘參數(shù)修改功能鍵設(shè)定子程序FTION1****************;功能:根據(jù)鬧鐘修改功能鍵按下的次數(shù),分別將鬧鐘修改標(biāo)識位RMINBIT、RHOURBIT置“1”;入口:RTIMDAT,鬧鐘修改功能鍵按下次數(shù),每按一次鬧鐘修改功能鍵,該單元內(nèi)容加1;出口:RTIMDAT、ARMBIT、B、RMINBIT、RHOURBIT,根據(jù)當(dāng)前RTIMDAT的次數(shù),分別將對應(yīng)鬧鐘修改標(biāo)識位置1,并設(shè)置鬧鐘參數(shù)顯示單元首地址和鬧鐘啟動標(biāo)志FTION1:CLR SECBIT ;08H清零,禁止時鐘時間修改

CLR MINBIT ;時鐘秒標(biāo)識位09H清零

CLR HOURBIT ;時鐘小時標(biāo)識位0AH清零

MOV B,#RSEC ;將鬧鐘單元地址設(shè)為顯示首地址

MOV TIMDATA,#00H INC RTIMDATA ;將鬧鐘修改記錄值加1 MOV A,RTIMDATA CJNE A,#01H,TOW1 SETB RMINBIT;若記錄值為1,則將鬧鐘分單元修改標(biāo)識位0BH LJMP BAC1 ;置1TOW1:CJNE A,#02H,THREE1 CLR RMINBIT;若記錄值為2,則將鬧鐘分單元修改標(biāo)識位0BH SETB RHOURBIT;清零,將鬧鐘小時單元修改標(biāo)識位0CH置1 LJMP BAC1THREE1:CLR RHOURBIT ;將鬧鐘小時單元修改標(biāo)識位0CH清零

SETB ARMBIT ;F0標(biāo)識位為1表示鬧鐘已設(shè)定

MOV B,#SEC ;恢復(fù)時鐘顯示單元首地址

MOV RTIMDATA,#00H;將鬧鐘修改記錄值清零BAC1: RET**************加1鍵修改子程序CUM****************;功能:根據(jù)時鐘和鬧鐘修改標(biāo)識位的狀態(tài),將時鐘或鬧鐘對應(yīng)顯示單元內(nèi)容加1;入口:SECBIT、MINBIT、HOURBIT、RSECBIT、RMINBIT、RHOURBIT,若其中某標(biāo)識位已被置“1”,將對應(yīng)的時鐘或鬧鐘顯示單元內(nèi)容加1;出口:34H~39H,時鐘或鬧鐘顯示單元CUM: JNB SECBIT,CUM0 ;若時鐘秒修改標(biāo)識位08H為1,則秒單元內(nèi)容加1 MOV A,SEC ADD A,#01H DA A MOV SEC,A CJNE A,#60H,CUMEND MOV SEC,#00H LJMP CUMENDCUM0:JNB MINBIT,CUM1 ;若時鐘分修改標(biāo)識位09H為1,則分單元 內(nèi)容加1 MOV A,MIN ADD A,#01H DA A MOV MIN,A CJNE A,#60H,CUMEND MOV MIN,#00H LJMP CUMENDCUM1:JNB HOURBIT,CUM2 ;若時鐘小時修改標(biāo)識位0AH為1, 則小時單元內(nèi)容加1 MOV A,HOUR ADD A,#01H DA A MOV HOUR,A CJNE A,#24H,CUMEND MOV HOUR,#00H LJMP CUMENDCUM2:JNB RMINBIT,CUM3 ;若鬧鐘分修改標(biāo)識位0BH為1, 則分單元內(nèi)容加1 MOV A,RMIN ADD A,#01H DA A MOV RMIN,A CJNE A,#60H,CUMEND MOV RMIN,#00H LJMP CUMENDCUM3:JNB RHOURBIT,CUMEND ;若鬧鐘小時修改標(biāo)識位0CH為1, 則小時單元內(nèi)容加1 MOV A,RHOUR ADD A,#01H DA A MOV RHOUR,A CJNE A,#24H,CUMEND MOV RHOUR,#00HCUMEND:RET**************鬧鐘判斷與啟動子程序ALARM************;功能:比較鬧鐘設(shè)定時間到否,控制鬧鐘的啟、停;入口:MIN、RMIN,HOUR、RHOUR,時鐘和鬧鐘當(dāng)前的時間;出口:P1.0、ARMBIT、RTIMBIT,鬧鐘啟??刂菩盘枴Ⅳ[鐘設(shè)置標(biāo)識和鬧鐘保持時間計時標(biāo)識ALARM:MOVA,RMIN CJNE A,MIN,DONT0 ;比較分單元內(nèi)容,若相同則繼續(xù)比較小 時單元內(nèi)容,

MOV A,RHOUR ;否則返回

CJNE A,HOUR,DONT0 CLR P1.0 ;啟動鬧鐘

SETBRTIMBIT;設(shè)置鬧鐘計時標(biāo)時0DH,時鐘開始10s計時DONT0:MOV A,COUNT;取鬧鐘保持計時時間

CJNE A,#10,DONT ;判斷鬧鐘保持10s時間到否

MOV COUNT,#00H ;清除鬧鐘保持10s計時

SETB P1.0 ;清除鬧鐘

CLR ARMBIT ;清鬧鐘標(biāo)識,取消鬧鐘設(shè)置

CLR RTIMBIT ;清鬧鐘計時標(biāo)識DONT: RET*********測鍵入子程序KEYTEST***********;功能:判斷是否有鍵輸入;入口:無;出口:累加器A,A的內(nèi)容為0表示無鍵輸入,A的內(nèi)容不為0表示有鍵輸入KEYTEST:MOV DPTR,#PORTA ;DPTR指針指向8155的A口

MOV A,#00H MOVX @DPTR,A ;掃描字00H送8155的A口

MOV DPTR,#PORTC ;DPTR指針指向8155的C口

MOVX A,@DPTR ;讀入C口行狀態(tài)

CPL A ;A取反

ANL A,#0FH ;屏蔽高4位

RET**************時鐘修正中斷服務(wù)子程序CLOCK****************

;功能:通過定時器中斷,自動修改時鐘參數(shù);入口:MSEC1、MSEC2、、SEC、MIN、HOUR,時鐘毫秒、秒、分、時單元,存放原時鐘參數(shù);出口:MSEC1、MSEC2、、SEC、MIN、HOUR,時鐘毫秒、秒、分、時單元,存放修改后的時鐘參數(shù)

CLOCK: CLR EA ;關(guān)中斷

PUSH PSW ;保護現(xiàn)場

PUSH ACC SETB RS1 INC MSEC1 MOV A,MSEC1 CJNE A,#28H,BACK1 ;到10ms否

MOV MSEC1,#00H INC MSEC2 MOV A,MSEC2 CJNE A,#64H,BACK1 ;到1s否

MOV MSEC2,#00H JNB RTIMBIT,BACK0 ;由標(biāo)識位0DH判別鬧鐘啟動否

INC COUNTBACK0:MOV A,SEC ADD A,#01H ;時鐘秒單元內(nèi)容加1 DA A MOV SEC,A CJNE A,#60H,BACK1 ;到1min否

MOV SEC,#00H MOV A,MIN ADD A,#01H ;分單元內(nèi)容加1 DA A MOV MIN,A CJNE A,#60H,BACK1 ;到1h否

MOV MIN,#00H MOV A,HOUR ADD A,#01H ;小時單元內(nèi)容加1 DA A MOV HOUR,A CJNE A,#24H,BACK1 ;到24h否

MOV HOUR,#00HBACK1:POP ACC ;恢復(fù)現(xiàn)場

POP PSW SETB EA ;開中斷

RETI ;中斷返回

END

5.調(diào)試方法與步驟

1)輸入源程序輸入源程序時,應(yīng)以西文方式輸入字母和符號,且中文注釋前要加分號。

2)對源程序進(jìn)行匯編和糾錯根據(jù)自動匯編提供的錯誤信息逐條糾正錯誤,直至匯編信息提示“錯誤(0)”、“匯編結(jié)束”。3)確定調(diào)試方案在調(diào)試程序前一定要認(rèn)真分析源程序,明確各功能程序運行的預(yù)期結(jié)果。然后結(jié)合源程序應(yīng)達(dá)到的結(jié)果,確定出如何通過某些關(guān)鍵參數(shù)和實驗現(xiàn)象檢驗程序運行結(jié)果正確與否。例如:程序運行過程中路徑的變化、累加器A內(nèi)容的變化、其他特殊寄存器內(nèi)容的變化等。并針對具體的分析和觀察對象選擇較合適的調(diào)試方法。如單步運行、跟蹤運行、連續(xù)運行、快速運行至光標(biāo)處、設(shè)置斷點等調(diào)試方法。4)調(diào)試程序

(1)調(diào)試主程序。主程序運行后,在無任何按鍵輸入時觀察有無顯示,時鐘是否工作,其時、分、秒顯示的變化過程是否正確。若運行結(jié)果不正確,首先應(yīng)根據(jù)程序運行的實際現(xiàn)象分析判斷哪些因素可引起相關(guān)故障,再通過調(diào)試方法逐一認(rèn)證和排除。例如:若定時/計數(shù)器的初始化出錯,則時鐘將不能工作;若顯示程序出錯,則將不能正確顯示時鐘單元內(nèi)容;若定時/計數(shù)器中斷服務(wù)子程序出錯,則其顯示數(shù)據(jù)的變化規(guī)律將不正常。(2)調(diào)試子程序。在調(diào)試主程序時,必然要調(diào)用相關(guān)的功能子程序。因此,首先應(yīng)明確子程序的具體功能,通過對子程序的分析,確定子程序的入口、出口參數(shù)及相關(guān)標(biāo)識位的狀態(tài),然后在滿足入口條件的狀態(tài)下,設(shè)法檢查從主程序進(jìn)入子程序,再由子程序返回到主程序的運行過程??刹捎酶欉\行或運行至光標(biāo)處的方法,檢查從主程序進(jìn)入子程序內(nèi)部的運行過程,再通過單步運行等方法檢查子程序內(nèi)部的運行情況和返回主程序的過程。通過反復(fù)調(diào)試,發(fā)現(xiàn)并排除軟件與硬件存在的各類問題,以滿足系統(tǒng)設(shè)計的預(yù)期目的。5)脫機運行將調(diào)試已通過的程序?qū)懭雴纹瑱C內(nèi)部(或外部)程序存儲器中,再將寫好程序的單片機(或存儲器)插入已設(shè)計好的單片機用戶板上,把仿真系統(tǒng)與用戶板脫離開來,最后將所設(shè)計的單片機應(yīng)用系統(tǒng)獨立通電運行。6.實訓(xùn)分析與總結(jié)

(1)實訓(xùn)1.2是以數(shù)字鐘為例,引入單片機應(yīng)用系統(tǒng)設(shè)計、分析與調(diào)試的一般方法。一個單片機應(yīng)用系統(tǒng)的設(shè)計與制作,一般要經(jīng)過對被控對象的需求進(jìn)行調(diào)研、根據(jù)系統(tǒng)的功能和技術(shù)指標(biāo)選擇控制方案、提出系統(tǒng)的總體構(gòu)思、硬件設(shè)計、印制板制作、元器件安裝、軟件設(shè)計、軟硬件仿真調(diào)試、固化程序、脫機運行、整機調(diào)試等幾個階段,如圖1.2.7所示。圖1.2.7應(yīng)用系統(tǒng)開發(fā)流程框圖(2)在上述過程中,難點是如何構(gòu)建出程序設(shè)計的整體框架,包括主程序流程框圖和子程序流程框圖的構(gòu)建、各功能模塊之間的組合關(guān)系。前面提供的各功能模塊流程框圖和參考程序只是針對完成實訓(xùn)項目基本要求而提出的一種設(shè)計方案。

(3)主程序是負(fù)責(zé)應(yīng)用系統(tǒng)整體的管理與協(xié)調(diào),包括單片機資源的調(diào)配、初始參數(shù)與標(biāo)識位的設(shè)定、可編程部件的初始化及系統(tǒng)各主要部分(如鍵盤、顯示)初始狀態(tài)的管理等。構(gòu)建主程序時應(yīng)做到簡單明了,對各種操作功能實現(xiàn)模塊化管理,即盡可能多的采用子程序結(jié)構(gòu),方便分析與調(diào)試。(4)采用模塊化、子程序化的優(yōu)點是便于連接和移植,特別是重復(fù)使用時尤為方便。但使用者必須預(yù)先明確各子程序的入口參數(shù)、出口參數(shù)和所占用的資源,合理利用堆棧,避免主程序與子程序之間、子程序與子程序之間所占用的資源發(fā)生沖突。

(5)運行狀態(tài)采用標(biāo)志化管理可使程序結(jié)構(gòu)更加簡化。在上述程序中,對各按鍵的操作過程和狀態(tài)都采用標(biāo)識位來描述,如鬧鐘設(shè)定與否、時鐘參數(shù)(時、分、秒)修改哪一位、鬧鐘參數(shù)(時、分)設(shè)定哪一位,鬧鐘保持時間到否等。(6)在調(diào)試程序前,一定要預(yù)先將源程序分析透徹,在此基礎(chǔ)上訓(xùn)練如何通過實驗現(xiàn)象分析和判斷產(chǎn)生故障的原因及故障可能存在的大致范圍;靈活運用開發(fā)系統(tǒng)所提供的各種調(diào)試方法,快速有效地排查和縮小故障范圍。通過反復(fù)調(diào)試,不斷地分析和排除故障,調(diào)試軟件和硬件的能力及速度。

(7)調(diào)試程序時,要結(jié)合能反映故障存在與否的參數(shù)變化、運行路徑變化、顯示內(nèi)容變化等,選擇合適的觀測點和觀測對象,再運用適當(dāng)?shù)恼{(diào)試方法,快速地檢驗調(diào)試結(jié)果,由此分析和判斷故障點。

(8)上面采用的硬件電路和教材所附實訓(xùn)板電路,都是為訓(xùn)練應(yīng)用能力而提供的典型教學(xué)實驗電路,在實際設(shè)計中應(yīng)從性能技術(shù)指標(biāo)和價格等方面合理選擇整體方案。

7.思考題

(1)在進(jìn)行軟件開發(fā)時,大體需要哪幾個過程?

(2)寫出中斷服務(wù)子程序CLOCK、時鐘修改功能子程序FTION0的出口參數(shù)是什么?

(3)調(diào)試子程序過程時一般采用什么方法?

(4)在本節(jié)實訓(xùn)程序中,增加-1修改功能,試編寫相關(guān)程序。

(5)在本節(jié)實訓(xùn)程序中,增加聲音報警功能,試編寫相關(guān)程序。

(6)在本節(jié)實訓(xùn)程序中,增加鬧鐘停止控制功能鍵,試編寫相關(guān)程序。實訓(xùn)1.3LCD顯示器電路1.實訓(xùn)目的(1)掌握LCD顯示基本原理和LCD控制方法。(2)掌握LCD顯示與單片機的接口電路,軟件設(shè)計方法。

2.實訓(xùn)設(shè)備與器件實訓(xùn)設(shè)備:單片機集成開發(fā)環(huán)境、綜合實訓(xùn)板、1602液晶顯示模塊、導(dǎo)線一組。

3.項目設(shè)計要求設(shè)計單片機與液晶模塊的連接電路,設(shè)計液晶顯示模塊的初始化程序,在液晶顯示模塊上顯示字符消息。

4.實訓(xùn)內(nèi)容

1)硬件設(shè)計液晶顯示器常用于電子設(shè)備產(chǎn)品中,最常見的有如計算器、電子表、數(shù)字萬用表、電子游戲機等,顯示的主要是數(shù)字、專用符號和固定圖形,因為是屬段式顯示,顯示內(nèi)容就無法多變。隨著大量電子儀器、設(shè)備的多功能化、智能化,并且普遍地采用人機交互方式,需要能夠顯示更為豐富的信息和通用性較強的顯示器。而點陣式LCD顯示器能夠滿足這些要求,同時用大規(guī)模專用集成電路作為點陣LCD控制驅(qū)動,使用者僅僅直接送入數(shù)據(jù)和指令就可實現(xiàn)所需的顯示。這種由LCD板、PCB板、控制驅(qū)動電路組成的單元叫做點陣液晶顯示模塊(DotMatrixLCDModule)。(1)液晶模塊工作原理。液晶模塊的基本組成框圖如圖1.3.1所示。圖1.3.1液晶模塊組成(2)液晶模塊管腳定義。表1.3.1管腳排列與功能表表1.3.2寄存器選擇表(3)液晶模塊與微控制器的典型連接。根據(jù)液晶模塊管腳定義,模塊和微控制器相連如圖1.3.2所示。圖1.3.2液晶與微控制器連接圖(4)指令系統(tǒng)。格式:RSR/WDB7DB6DB5DB4DB3DB2DB1DB0。共有11種指令,如表1.33所示。表1.3.3HD447800指令表(5)顯示位和標(biāo)準(zhǔn)字符庫。從液晶模塊顯示原理知道,液晶上顯示的內(nèi)容對應(yīng)在DDRAM相應(yīng)的地址中,顯示位與DDRAM地址的對應(yīng)關(guān)系如表1.3.4所示。表1.3.4顯示位與DDRAM地址對應(yīng)關(guān)系表表1.3.5標(biāo)準(zhǔn)字庫(6)單片機連接控制圖。圖1.3.3LCD接線原理圖在圖1.3.3所示電路中,產(chǎn)生操作字符型液晶顯示模塊的各驅(qū)動子程序如下:COM EQU 20H ;指令寄存器DAT EQU 21H ;數(shù)據(jù)寄存器CW_Add EQU 0000H ;指令口寫地址CR_Add EQU 0002H ;指令口讀地址DW_Add EQU 0001H ;數(shù)據(jù)口寫地址DR_Add EQU 0003H ;數(shù)據(jù)口讀地址注意,不同的硬件連接產(chǎn)生不同的硬件地址。2)軟件設(shè)計基于圖1.3.3的硬件連接,可以實現(xiàn)液晶的任意字符的顯示,本實訓(xùn)基本要求實現(xiàn)在LCD上從字符“0”到“F”的順序顯示。程序設(shè)計采用自上而下的軟件設(shè)計方法,并采用模塊化程序方式。具體設(shè)計如下:

(1)子程序功能介紹。主程序:完成初始化顯示緩沖區(qū),調(diào)用各子程序?qū)崿F(xiàn)液晶顯示器初始化、設(shè)置液晶控制字、顯示字符內(nèi)容等。初始化子程序:用軟件復(fù)位的方法設(shè)置液晶顯示輸入方式、光標(biāo)移位方向、顯示位置、字符顯示點陣大小等內(nèi)容。寫指令代碼子程序:完成向液晶指令寄存器中寫入一個控制命令。寫顯示數(shù)據(jù)子程序:完成向液晶數(shù)據(jù)顯示區(qū)中寫入顯示字符。圖1.3.4主程序流程圖(2)主程序流程圖如圖1.3.4所示。(3)源程序。①程序如下:;預(yù)定義工作變量COM EQU 20H ;指令寄存器DAT EQU 21H ;數(shù)據(jù)寄存器CW_Add EQU 0000H ;指令口寫地址CR_Add EQU 0002H ;指令口讀地址DW_Add EQU 0001H ;數(shù)據(jù)口寫地址DR_Add EQU 0003H ;數(shù)據(jù)口讀地址 ORG 0000H AJMP MAIN ORG 0020HMAIN: MOV SP,#06H ANL P3,#07H LCALLINT ;調(diào)用初始化子程序

MOV COM,#06H ;設(shè)置輸入方式

LCALLPR1 MOV DPTR,#TAB MOV COM,#80H ;設(shè)置DDRAM地址

LCALLPR1 MOV R2,#15 ;設(shè)置循環(huán)變量初值

MOV R3,#00HWRIN: MOV A,R3 MOV A,@A+DPTR MOV DAT,A LCALL PR2 ;寫數(shù)據(jù)到液晶中

LCALLDELAY ;調(diào)延時子程序

INCR3 DJNZ R2,WRIN SJMP $TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H END②寫指令代碼子程序如下:PR1: PUSH DPH PUSH DPL PUSH ACC MOV DPTR,#CR_Add ;設(shè)置指令口讀地址PRll: MOVX A,@DPTR ;讀BF和AC值

JB ACC.7,PRll ;判斷是否BF=0。是,繼續(xù)

MOV A,COM ;取指令代碼

MOV DPTR,#CW_Add ;設(shè)置指令口寫地址

溫馨提示

  • 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

提交評論