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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

2.實(shí)訓(xùn)設(shè)備與器件實(shí)訓(xùn)設(shè)備:?jiǎn)纹瑱C(jī)集成開(kāi)發(fā)環(huán)境、綜合實(shí)訓(xùn)板(綜合實(shí)訓(xùn)板電路圖參見(jiàn)書(shū)末附圖)。

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

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

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

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

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

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

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

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

ORG0000H ;匯編完成后,PC的初始值=() LJMP DISP0 ORG0800HDISP0: MOV DPTR,#4400H ;程序運(yùn)行到該條指令時(shí)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 ;第一次運(yùn)行到該處時(shí)A=(),第二

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

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

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

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

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

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

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

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

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

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

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)容個(gè)位

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ù)個(gè)位HERE0:DJNZ R5,HERE0 ;顯示延時(shí)

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 ;顯示延時(shí)

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

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

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

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

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

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

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

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

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

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

MOV 22H,A ;保護(hù)鍵號(hào)BACK2: ACALL KEYTEST ;判按鍵釋放否

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

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

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

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

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

6.思考題

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

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

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

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

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

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

1.實(shí)訓(xùn)目的

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

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

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

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

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

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

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

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

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

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

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

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

以本書(shū)配備實(shí)驗(yàn)板調(diào)試程序時(shí),可用發(fā)光二極管替代蜂鳴器,并將接口地址改為:PORT(8155控制寄存器)4400HPORTA(8155A口地址)4401HPORTB(8155B口地址)4402HPORTC(8155C口地址)4403H表1.2.1單片機(jī)內(nèi)部RAM部分資源分配表表1.2.1單片機(jī)內(nèi)部RAM部分資源分配表(4)軟件流程框圖。圖1.2.2主程序MAIN流程框圖圖1.2.3時(shí)鐘修改功能子程序FTION0流程框圖圖1.2.4鬧鐘修改功能子程序FTION1流程框圖圖1.2.5加1鍵修改子程序CUM流程框圖圖1.2.6時(shí)鐘修正中斷服務(wù)子程序CLOCK流程框圖(5)源程序。**************主程序MAIN****************ORG 0000HAJM MAINORG000BHLJMP CLOCK ;轉(zhuǎn)時(shí)鐘程序ORG0100HPORT EQU 4400H ;定義8155控制寄存器、A、B、C端口符號(hào)地址PORTA EQU 4401HPORTB EQU 4402HPORTC EQU 4403HSECBITEQU 08H ;定義各標(biāo)識(shí)位符號(hào)地址MINBIT EQU 09HHOURBITEQU 0AHRMINBIT EQU 0BHRHOURBIT EQU 0CHRTIMBIT EQU 0DHARMBIT EQU 0EHTIMDATA EQU 30H ;定義各單元符號(hào)地址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)識(shí)位

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

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

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

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

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

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

SETB ET0 SETB TR0 ;啟動(dòng)定時(shí)器

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

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

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

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

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

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

LCALLKEYTEST JNZ KEDATA ;若無(wú)抖動(dòng),則查鍵號(hào),否則返回

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

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

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

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í)鐘參數(shù)修改子程序FTION0****************;功能:根據(jù)時(shí)鐘修改功能鍵按下的次數(shù),分別將時(shí)鐘修改標(biāo)識(shí)位SECBIT、MINBIT、HOURBIT置“1”;入口:TIMDAT,時(shí)鐘修改功能鍵按下次數(shù),每按一次時(shí)鐘修改功能鍵,該單元內(nèi)容加1;出口:TIMDAT、SECBIT、MINBIT、HOURBIT,根據(jù)當(dāng)前TIMDAT的次數(shù),分別將對(duì)應(yīng)時(shí)鐘修改標(biāo)識(shí)位置1FTION0:CLR TR0 ;關(guān)定時(shí)器

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

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

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

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

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

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

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

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

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

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

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

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

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

MOV A,RHOUR ;否則返回

CJNE A,HOUR,DONT0 CLR P1.0 ;啟動(dòng)鬧鐘

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

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

MOV COUNT,#00H ;清除鬧鐘保持10s計(jì)時(shí)

SETB P1.0 ;清除鬧鐘

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

CLR RTIMBIT ;清鬧鐘計(jì)時(shí)標(biāo)識(shí)DONT: RET*********測(cè)鍵入子程序KEYTEST***********;功能:判斷是否有鍵輸入;入口:無(wú);出口:累加器A,A的內(nèi)容為0表示無(wú)鍵輸入,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**************時(shí)鐘修正中斷服務(wù)子程序CLOCK****************

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

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

PUSH PSW ;保護(hù)現(xiàn)場(chǎng)

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)識(shí)位0DH判別鬧鐘啟動(dòng)否

INC COUNTBACK0:MOV A,SEC ADD A,#01H ;時(shí)鐘秒單元內(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 ;小時(shí)單元內(nèi)容加1 DA A MOV HOUR,A CJNE A,#24H,BACK1 ;到24h否

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

POP PSW SETB EA ;開(kāi)中斷

RETI ;中斷返回

END

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

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

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

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

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

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

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

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

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

7.思考題

(1)在進(jìn)行軟件開(kāi)發(fā)時(shí),大體需要哪幾個(gè)過(guò)程?

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

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

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

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

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

2.實(shí)訓(xùn)設(shè)備與器件實(shí)訓(xùn)設(shè)備:?jiǎn)纹瑱C(jī)集成開(kāi)發(fā)環(huán)境、綜合實(shí)訓(xùn)板、1602液晶顯示模塊、導(dǎo)線一組。

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

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

1)硬件設(shè)計(jì)液晶顯示器常用于電子設(shè)備產(chǎn)品中,最常見(jiàn)的有如計(jì)算器、電子表、數(shù)字萬(wàn)用表、電子游戲機(jī)等,顯示的主要是數(shù)字、專用符號(hào)和固定圖形,因?yàn)槭菍俣问斤@示,顯示內(nèi)容就無(wú)法多變。隨著大量電子儀器、設(shè)備的多功能化、智能化,并且普遍地采用人機(jī)交互方式,需要能夠顯示更為豐富的信息和通用性較強(qiáng)的顯示器。而點(diǎn)陣式LCD顯示器能夠滿足這些要求,同時(shí)用大規(guī)模專用集成電路作為點(diǎn)陣LCD控制驅(qū)動(dòng),使用者僅僅直接送入數(shù)據(jù)和指令就可實(shí)現(xiàn)所需的顯示。這種由LCD板、PCB板、控制驅(qū)動(dòng)電路組成的單元叫做點(diǎn)陣液晶顯示模塊(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)字符庫(kù)。從液晶模塊顯示原理知道,液晶上顯示的內(nèi)容對(duì)應(yīng)在DDRAM相應(yīng)的地址中,顯示位與DDRAM地址的對(duì)應(yīng)關(guān)系如表1.3.4所示。表1.3.4顯示位與DDRAM地址對(duì)應(yīng)關(guān)系表表1.3.5標(biāo)準(zhǔn)字庫(kù)(6)單片機(jī)連接控制圖。圖1.3.3LCD接線原理圖在圖1.3.3所示電路中,產(chǎn)生操作字符型液晶顯示模塊的各驅(qū)動(dòng)子程序如下:COM EQU 20H ;指令寄存器DAT EQU 21H ;數(shù)據(jù)寄存器CW_Add EQU 0000H ;指令口寫(xiě)地址CR_Add EQU 0002H ;指令口讀地址DW_Add EQU 0001H ;數(shù)據(jù)口寫(xiě)地址DR_Add EQU 0003H ;數(shù)據(jù)口讀地址注意,不同的硬件連接產(chǎn)生不同的硬件地址。2)軟件設(shè)計(jì)基于圖1.3.3的硬件連接,可以實(shí)現(xiàn)液晶的任意字符的顯示,本實(shí)訓(xùn)基本要求實(shí)現(xiàn)在LCD上從字符“0”到“F”的順序顯示。程序設(shè)計(jì)采用自上而下的軟件設(shè)計(jì)方法,并采用模塊化程序方式。具體設(shè)計(jì)如下:

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

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

INCR3 DJNZ R2,WRIN SJMP $TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H END②寫(xiě)指令代碼子程序如下: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è)置指令口寫(xiě)地址

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論