[工學(xué)]單片機原理與應(yīng)用程序_第1頁
[工學(xué)]單片機原理與應(yīng)用程序_第2頁
[工學(xué)]單片機原理與應(yīng)用程序_第3頁
[工學(xué)]單片機原理與應(yīng)用程序_第4頁
[工學(xué)]單片機原理與應(yīng)用程序_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.單片機原理與應(yīng)用參考程序第3章【例3-49】MOVDPTR,#2000H ;源數(shù)據(jù)區(qū)首址PUSHDPL ;源數(shù)據(jù)區(qū)首址壓棧保護PUSHDPHMOVDPTR,#3000H ;目的數(shù)據(jù)區(qū)首址MOVR6,DPL ;目的數(shù)據(jù)區(qū)首址存入寄存器MOVR7,DPHLP:POPDPH ;取源數(shù)據(jù)區(qū)地址指針POPDPLMOVXA,DPTR ;取源數(shù)據(jù)INCDPTRPUSHDPLPUSHDPH ;更新源數(shù)據(jù)地址,并將該新地址壓棧保護MOVDPL,R6 ;取目的數(shù)據(jù)區(qū)首地址指針MOV DPH,R7MOVX DPTR,A ;將取得的源數(shù)據(jù)存入目的數(shù)據(jù)區(qū)INCDPTRMOVR6,DPL MOVR7,DPH ;更新目標(biāo)

2、數(shù)據(jù)地址,并將該新地址存入到R6和R7中DJNZ30H,LP ;若數(shù)據(jù)塊未移完(即地址30H中的值不為0),則繼續(xù)POPDPHPOPDPLSJMP【例3-65】MOVA,P1 ;將8位輸入信號傳到A中JBA.0,MM ;當(dāng)A的第0位A.0為1時,轉(zhuǎn)去執(zhí)行MM SETBC ;當(dāng)A.0為0時,將C置1 并轉(zhuǎn)去執(zhí)行OUTSJMPOUT ;X0=1,轉(zhuǎn)出口MM:MOVC,A.1 ;C=X1ANLC,/A.2 ;X1X2JCOUT ;X1X2=1,轉(zhuǎn)出口MOVC,A.2 ;C=X2ANLC,/A.1 ;X1X2JCOUT ;X1X2=1,轉(zhuǎn)出口MOVC,A.7 ;C=X7ANLC,/A.4 ;X4X7A

3、NLC,/A.5 ;X4X5X7ANLC,/A.6 ;X4X5X6X7OUT:MOVP3.0,C3.3實例解析CLRA ;結(jié)果單元20H29H清零MOVR0,#10MOVR1,#20HLP:MOVR1,AINCR1DJNZR0,LPMOVR0,#100 ;100個數(shù)的計數(shù)器READ:MOVA,P1 ;讀入P1CHK0:CJNEA,#0,CHK1 ;比較,不為“0”,繼續(xù)比較INC20H ;是“0”,則“0”計數(shù)單元加1SJMPEND0 ;是否全部統(tǒng)計完?CHK1:CJNEA,#1,CHK2INC21H ;是“1”,則“1”計數(shù)單元加1SJMPEND0CHK2:CJNEA,#2,CHK3INC2

4、2H ;是“2”,則“2”計數(shù)單元加1SJMPEND0CHK3:CJNEA,#3,CHK4INC23H ;是“3” ,則“3” 計數(shù)單元加1SJMPEND0CHK4:CJNEA,#4,CHK5INC24H ;是“4”,則“4”計數(shù)單元加1SJMPEND0CHK5:CJNEA,#5,CHK6INC25H ;是“5”,則“5”計數(shù)單元加1SJMPEND0CHK6:CJNEA,#6,CHK7INC26H ;是“6”,則“6”計數(shù)單元加1 SJMPEND0CHK7:CJNEA,#7,CHK8INC27H ;是“7”,則“7”計數(shù)單元加1SJMPEND0CHK8:CJNEA,#8,CHK9INC28H

5、;是“8”,則“8”計數(shù)單元加1SJMPEND0CHK9:CJNEA,#9,ERRINC29H ;是“9”,則“9”計數(shù)單元加1END0:DJNZR0,READ ;判是否全部統(tǒng)計完HERE:SJMPHEREERR: ;非09,出錯第4章【例4-13】START:PUSHACC ;將A中內(nèi)容進棧保護 MOV R0,20H ;將20H地址中的內(nèi)容送R0 MOV R1,22H ;將22H地址的內(nèi)容送R1 MOV A,R0 ;被加數(shù)低字節(jié)內(nèi)容送A ADD A,R1 ;低字節(jié)數(shù)相加 MOV R0,A ;低字節(jié)數(shù)和存20H中 INC R0 ;指向被加數(shù)高位字節(jié) INC R1 ;指向加數(shù)高位字節(jié) MOV A

6、,R0 ;被加數(shù)高位字節(jié)送A ADDC A,R1 ;高字節(jié)數(shù)帶進位相加 MOV R0,A ;高字節(jié)數(shù)和存21H中 CLR A ADDC A, #00H MOV 10H, A ;進位暫存于10H中 POP ACC ;恢復(fù)A原內(nèi)容【例4-14】ORG 0000HAJMP STARTORG 30HSTART: MOV P1,#0FFH ;關(guān)閉所燈MOV TMOD,#00000001B ;定時/計數(shù)器0工作于方式1MOV TH0,#15H MOV TL0,#0A0H ;即數(shù)5536SETB TR0 ;定時/計數(shù)器0開始運行 LOOP:JBC TF0,NEXT ;如果TF0等于1,則清TF0并轉(zhuǎn)NEXT

7、處AJMP LOOP ;否則跳轉(zhuǎn)到LOOP處運行 NEXT: CPL P1.0MOV TH0,#15HMOV TL0,#9FH ;重置定時/計數(shù)器的初值A(chǔ)JMP LOOPEND AJMP LOOP【例4-15】ORG 000BH ;定時器0的中斷向量地址AJMP TIME0 ;跳轉(zhuǎn)到真正的定時器程序處ORG 30HSTART: MOV P1,#0FFH ;關(guān)閉所燈MOV TMOD,#00000001B ;定時/計數(shù)器0工作于方式1MOV TH0,#15H MOV TL0,#0A0H ;即數(shù)5536SETB EA ;開總中斷允許SETB ET0 ;開定時/計數(shù)器0允許SETB TR0 ;定時/計

8、數(shù)器0開始運行 LOOP:AJMP LOOP ;真正工作時,這里可寫任意程序TIME0: PUSH ACC ;定時器0的中斷處理程序PUSH PSW ;將PSW和ACC推入堆棧保護CPL P1.0 MOV TH0,#15HMOV TL0,#0A0H ;重置定時常數(shù)POP PSWPOP ACCRETIEND 【例4-17】ORG0000HSTART:MOVA,#aMOVB,AMULAB ;AB= a2MOVR0,A ;R1R0= a2MOVR1,BMOVA,#bCJNEA,#0AH,MMN ;b10則轉(zhuǎn)移MM:ADD A,R0 ;b10, a2+b=YMOVR0,AMOVA,#00HADDCA,

9、R1MOVR1,AJMPMMNN MMN:JNC MM ;無借位(即b>10)轉(zhuǎn)MMMOV R3,A ;R3bMOV A,R0CLR CSUBBA,R3 ; R1R0a2bMOV R0,AMOVA,R1SUBBA,#00HMOV R1,AMMNN:MOV Y0,R0 ;Y1Y0結(jié)果MOVY1,R1HERE:AJMP HERE【例4-18】CLRCSTART:MOVA,R1SUBBA,#64H ;超過100kg則報警JNCBJMOVA,R1CJNEA,#32H,LOOP1 ;是否為50kgMOVB,#2HMULA B ;50kg總收費SJMP LOOP3LOOP1: JCLOOP2MOVB

10、,#3HSUBBA,#32H ;超過50kg部分的收費MULA BMOVR0,AMOVA,#32HMOVB,#2HMULA BADDA,R0 ;50kg以上總收費SJMPLOOP3LOOP2:MOVB,#2H ;50kg以下總收費 MULA BLOOP3: MOV80H,ASJMPEOFBJ: ;超重報警程序【例4-21】MOVR0,#DATA ;數(shù)據(jù)區(qū)首地址MOVDPTR,#BUFFER ;數(shù)據(jù)區(qū)長度指針LOOP:MOVA,R0CJNEA,#24H ,LOOP2 ;判是否為“$”符(24H)SJMPLOOP1 ;是“$”符,則結(jié)束LOOP2:MOVA,R0 ;不是“$”符,則傳送 MOVX

11、DPTR,AINC R0 INCDPTR DJNZ20H,LOOP ;數(shù)據(jù)串未查完,繼續(xù)LOOP1:RETDATA: ;數(shù)據(jù)串【例4-22】BCDB: PUSHPSW ;現(xiàn)場保護PUSHA PUSH BMOVR3,00HMOVA,R0MOVR4,A ;BCD碼千位送R4 LOOP:MOV A,R4MOVB,10MULABMOVR4,AMOVR5,BMOVB,10 ;(R3)、(R4)×10XCHA,R3MULA,BADD A,R5MOVR3,AXCHA,R4INCR0ADDA,R0XCHA,R3 ;(R3R4)(R0)送R3R4ADDCA,0MOVR4,ADJNZR2,LOOP1 ;

12、循環(huán)n1次POPB ;恢復(fù)現(xiàn)場POPAPOPPSWRET ;返回【例4-23】FILLE:PUSHPSW ;PSW及A保護入棧PUSHAMOVA,20H ;取第一個數(shù)據(jù)CLR CSUBBA,21H ;與第二個數(shù)據(jù)比較JNCLOB1 ;第一個數(shù)據(jù)比第二個數(shù)據(jù)大,轉(zhuǎn)LOB1MOVA,20H ;第一個數(shù)據(jù)比第二個數(shù)據(jù)小,交換二個數(shù)的位置XCHA,21HMOV20H,ALOB1:MOVA,22HCLRCSUBBA,20H ;第三個數(shù)據(jù)與前二個數(shù)據(jù)中的較大數(shù)比較JNCLOB3 ;第三個數(shù)據(jù)大于前二個數(shù)據(jù)中的較大數(shù),轉(zhuǎn)LOB3MOVA,22HCLRCSUBBA,21H ;第三個數(shù)據(jù)與前二個數(shù)據(jù)中的較小數(shù)比

13、較JNCLOB4MOVA,21HMOVR0,A AJMPLOB2LOB3:MOV R0,20HAJMPLOB2LOB4:MOV R0,22HLOB2: POPA ;恢復(fù)A和PSWPOPPSWRET4.7實例解析主程序:ORG0400HASCB:MOVR0,#61H ;R0指向原始數(shù)據(jù)的高位MOV R1,#70H ;存放結(jié)果數(shù)據(jù)ACALLCVERT ;調(diào)用轉(zhuǎn)換程序,結(jié)果放在A中SWAPA ;結(jié)果的高位和低位互換MOVR1,A ;保存高位DECR0 ;R0指向原始數(shù)據(jù)的低位ACALLCVERT ;再次調(diào)用轉(zhuǎn)換程序XCHDA,R1 ;低半字節(jié)與高半字節(jié)交換LOOP: SJMPLOOP子程序:ORG0

14、500HCVERT: MOVA,R0CLRCSUBBA,#30HCJNEA,#0AH,NEQAJMPBIGNEQ: JCCENDBIG:SUBB A,#07H ;大于0AH時再減去07HCEND:RETEND第5章【例5-1】MAIN:MOVSP , #60HLOOP:MOVA , P0ORLA , #10H ;P0.4=1MOVP0 , A ;準(zhǔn)備讀P0口的P0.4ANLA , #10HJC LOOP ;沒有按下返回CALLDELAY ;調(diào)用延時程序, 去鍵盤抖動,再判斷鍵是否按下MOVA , P0ORLA , #10H ;P0.4=1MOVP0 , A ;準(zhǔn)備讀P0口的P0.4MOVA,P

15、0ANLA , #10HJCLOOP ;沒有按下返回MOVA , P0MOVR0 , AMOVA, #0FHSUBBA , R0 ;對P0.0-P0.3 求反ANLA, #0FHMOVP0 , A ;通過P0口輸出使D1D4LED亮或者滅CALLDELAYJMPLOOPDELAY:MOVR7,#00FHN1:MOVR6,#0F0HN2:NOPDJNZR6 , N2DJNZR7 , N1RET【例5-2】主機軟件設(shè)計:初始化程序INIT: MOV TMOD,#20HMOV TH1,#0F9H ;設(shè)置波特率為2400MOV TL1,#0F9HMOV SCON,#0F0H ;串行口為方式3,SM2=

16、1,允許接收SETB TR1 ;啟動定時器RET通信子程序COM:SETBTB8 ;地址標(biāo)志MOV SBUF, #ADDR1 ;發(fā)送要通信的從機地址LOOP:JNB TI, LOOP ;等待地址發(fā)完CLRTICLRTB8 ;數(shù)據(jù)標(biāo)志MOVA, R0 ;取要發(fā)送的數(shù)據(jù)MOVSBUF, A ;發(fā)數(shù)據(jù)LOOP1:JNB TI,LOOP1 ;等待數(shù)據(jù)發(fā)完CLRTIRET從機軟件設(shè)計:初始化程序INIT:MOVTMOD,#20HMOVTH1,#0F9H ;設(shè)置波特率為2400MOVTL1,#0F9HMOVSCON,#0F0H ;設(shè)置串行口為方式3,SM2=1,允許接收ANLPCON,#7FHSETBTR

17、1SETBES ;允許串行口中斷SETBEAWAIT: SJMPWAIT ;聽號串口中斷服務(wù)通信程序當(dāng)接收到地址幀“呼號”且地址幀與本機地址相符時,要置SM2為0以便準(zhǔn)備接收數(shù)據(jù)幀,同時需要將本機地址發(fā)回作為應(yīng)答,建立與主機的聯(lián)絡(luò)。編程如下:SIO:CLRRIPUSHPSW ;現(xiàn)場保護PUSHACCMOVA,SBUF ;接收串行數(shù)據(jù)XRLA,#ADDR ;判斷是否與本機地址相符JNZBACK ;不相符則返回CLRSM2 ;相符則SM2為0且發(fā)回本機地址CLR ES ;關(guān)串口中斷,避免中斷嵌套MOVA, SBUF ;接收數(shù)據(jù)WAIT:JNBRI,WAITCLRRIMOVR0, A ;保存數(shù)據(jù)SE

18、TB SM2 ;恢復(fù)多機通信,SETB ES ;開串口中斷BACK:POPACC ;恢復(fù)現(xiàn)場POPPSWRETI【例5-3】MAIN: MOV SP , #60H ;設(shè)置堆棧為60HMOV TH1 , #0FDH ;設(shè)置波特率為9600MOV TL1 , #0FDHMOV TMOD , #21H ;T1 工作在方式2 MOV PCON , #00H ;SMOD=0MOV SCON , #0D0H ;串行方式3SETBTR1WSIO1: JNB RI , WSIO1CLR RIMOV A , SBUFMOV C , PANL C , /RB8MOV F0 , CMOV C , RB8ANL C

19、, /PORL C , F0 ;完成P與RB8相異或JCERROR; 轉(zhuǎn)到出錯處理MOV C , PMOV TB8, CMOV SBUF , AERROR: JMP WSIO1第6章6.5.2定時器中斷應(yīng)用實例(1)主程序代碼:ORG 1000HMAIN:MOVSP,#60H ;設(shè)置推棧區(qū)MOVTMOD,#01H ;空時125msMOVTL0,#0DCHMOVTH0,#0BHSETBEA ;開總中斷SETBET0 ;允許TO中斷MOVR2,#08H ;計數(shù)8次SETBTR0 ;開始計時LOOP1:JBC20H,DY ;20H清零SJMPLOOP1DY:LCALLDISPLAYSJMPLOOP1

20、(2)中斷子程序:ORG 2000HT0SERVE: MOV TL0,#0DCH ;重置計數(shù)初值MOVTH0,#0BHDJNZR2,LOOP ;8次計數(shù)沒剩則繼續(xù)計時MOV R2,#08H ;R2重置為8SETB 20H ;1s到,置位20HLOOP:RETI(3)一個實現(xiàn)“間隔一秒調(diào)一次顯示”功能的完整程序如下:ORG0000HAJMPMAINORG000BHAJMPINTT0ORG0050HMAIN: MOVSP,#60H MOV R0,#79HMOV R7,#06HMLO:MOV R0,#08HINCR 0DJNZR7,MLOMOVTMOD,#01HMOVTL0,#0DHMOVTH0,#

21、0BHMOVR2,#08HSETBEASETBET0SETBTR0LOOP: JB20H, LOOP1SJMPLOOPLOOP1: LCALLDISPLAYSJMPLOOPINTT0: MOVTL0,#0DCHMOVTH0,#0BHDJNZR2,RETURNMOVR2,#08HCPL20HRETURN: RETI第7章【例7-2】ORG0000HAJMPMAIN ;轉(zhuǎn)到主程序ORG000BH ;T0中斷矢量地址AJMPINQP ;轉(zhuǎn)到中斷服務(wù)程序ORG0050HMAIN:MOVTMOD,#00H ;設(shè)置T0為方式0定時MOVTH0,#1EH ;裝入T0的定時常數(shù)MOVTL0,#0CHSETBT

22、R0 ;啟動T0SETBET0 ;允許T0中斷SETBEA ;CPU開中斷SJMP$ ;等待T0中斷發(fā)生ORG0100H ;中斷服務(wù)程序INQP:MOVTH0,1EH ;重裝定時常數(shù)MOVTL0,0CHCPLP1.0 ;P1.0變反輸出RETI ;中斷返回【例7-3】ORG0000HAJMPMAIN ;轉(zhuǎn)到主程序ORG000BH ;T0的中斷入口AJMPINTS ;轉(zhuǎn)到中斷服務(wù)程序ORG0100H ;主程序入口地址MAIN:MOVSP , #60H ;設(shè)棧指針MOVTMOD,#06H ;設(shè)T0為計數(shù)方式2MOVTL0,#0FFH ;設(shè)TL0初值MOVTH0,#0FFH ;設(shè)TH0初值SETBT

23、R0 ;啟動計數(shù)SETBET0 ;允許T0中斷SETBEA ;中斷開放 SJMP$ ;等待T0中斷發(fā)生;中斷處理程序INTS:PUSHA ;現(xiàn)場保護,把寄存器A中的值壓入堆棧中PUSHDPL ;把數(shù)據(jù)指針的低位DPL中的值壓入堆棧中PUSHDPH ;把數(shù)據(jù)指針的高位DPH中的值壓入堆棧中;現(xiàn)場恢復(fù)POPDPH ;把數(shù)據(jù)指針的高位DPH中的值從堆棧中取出POPDPL ;把數(shù)據(jù)指針的低位DPL中的值從堆棧中取出POPA ;把寄存器A中的值從堆棧中取出RETI7.5實例解析【實例7-1】ORG0000H ;復(fù)位地址LJMPMAIN ;轉(zhuǎn)入主程序ORG000BH ;T0中斷入口地址LJMPIT0 ;轉(zhuǎn)

24、入T0中斷服務(wù)程序ORG0100H ;主程序首地址MAIN:MOVTMOD,#01H ;設(shè)置T0為工作方式1MOVTH0,#3CH ;裝入定時常數(shù)MOVTL0,#0B0HMOVIE,#10000010B ;T0開中斷MOVR7,#0AH ;設(shè)置循環(huán)次數(shù)為10次SETBTR0;T0運行CLRP1.7SJMP$ ;等待中斷;中斷服務(wù)程序:ORG000BHITO:MOVTL0,#0B0H ;重新裝入時間常數(shù)MOVTH0,#3CHDJNZR7,LOOP ;循環(huán)10次CRLP1.7 ;500ms定時到了,P1.7位取反,閃爍效果LOOP:RETI ;中斷返回END ;程序結(jié)束【實例7-2】ORG0000

25、HAJMPMAINORG000BH ;T0的中斷入口AJMPTIME0 ;轉(zhuǎn)入中斷程序ORG001BH ;T1的中斷入口AJMPTIME1 ;轉(zhuǎn)入中斷程序ORG0033HMAIN:MOVSP,#60H ;設(shè)置堆棧指針初值MOVR3,#0 ;清除軟件計數(shù)器SETBP3.2 ;將P3.2,P3.5置1,即為輸入狀態(tài)SETBP3.5MOVTMOD,#59HMOVTH0,#3CH ;裝入定時器初值MOVTL0,#0B0HMOVTH1,#0FFH ;裝入計數(shù)器初值MOVTL1,#0FEHSETBTR0 ;啟動定時器、計數(shù)器SETBTR1MOVIP,#08H ;T1中斷優(yōu)先于T0SETBET1 ;允許T1

26、中斷SETBTF1 ;設(shè)TF0、TF1為中斷標(biāo)志 LOOP:SETBTF0SETBET0 ;允許T0中斷SETBEA ;中斷開放 JBTF0,$ ;判斷TF0是否溢出,并一直等待JBTF1,LOOP ;判斷TF1是否溢出,如果溢出就轉(zhuǎn)到LOOPRETTIME0:MOVTL0,#0B0H ;設(shè)TL0初值MOVTH0,#3CH ;設(shè)TH0初值INCR3 ;計數(shù)器加1CPLTF0 ;TF0取反RETI ;中斷返回TIME1:CLRTF0 ;清除中斷標(biāo)志CLRTF1CLRET0 ;禁止T0、T1中斷CLRET1CLREA ;關(guān)中斷RETI ;中斷返回第8章【例8-2】MAIN:MOVSP ,#60HL

27、OOP:MOVA ,P0ORLA,#0FH ;P0.0P0.3=1MOVP0,A ;準(zhǔn)備讀P0口ANLA, #0FH JNZLOOP ;沒有按下返回CALL DELAY ;調(diào)用延時程序,去鍵盤抖動,再判斷鍵是否按下MOV A,P0ORL A,#0FH ;P0.0P0.3=1MOVP0,A ;準(zhǔn)備讀P0口MOVA,P0ANLA,#01HJZ PP0 ;KEY0按下調(diào)用PP0MOVP0,A ;準(zhǔn)備讀P0口MOVA,P0ANLA,#02HJZPP1 ;KEY1按下調(diào)用PP1MOVP0,A ;準(zhǔn)備讀P0口MOVA,P0ANLA,#04HJZPP2 ;KEY2按下調(diào)用PP2MOVP0,A ;準(zhǔn)備讀P0口

28、MOVA,P0ANL A,#08HJZPP3 ;KEY3按下調(diào)用PP3JMPLOOPDELAY: MOV R7,#0F0HN1: MOV R6, #0F0HN2: NOPDJNZ R6,N2DJNZ R7,N1RET【例8-3】MAIN:MOV SP,#60HLOOP:MOVA, #01HMOVR2, #4OUTPUT:MOVP1, ARLACALLDELAY DJNZR2, OUTPUTLJMPLOOPDELAY:MOVR6, #0MOVR7, #0DELAYLOOP:DJNZ R6, DELAYLOOPDJNZ R7, DELAYLOOPRETEND8.3實例解析程序設(shè)計如下:OUTBIT

29、EQU 0FE02H ;位控制口CLK164 EQU 0FE04H ;段控制口(接164時鐘位)DAT164EQU 0FE06H ;段控制口(接164數(shù)據(jù)位)IN EQU 0FE00H ;鍵盤讀入口 HASRCVEQU20H.0 ; 接收標(biāo)志位LEDBUFEQU40H ;顯示緩沖RCVBUFEQU50H ;接收緩沖指令ORG0000H一般用在一段源程序的前面,用來說明緊隨其后的程序段的起始地址。下面的指令說明指令LJMP START的地址為0000H。ORG0000HLJMPSTART ;執(zhí)行該指令后將轉(zhuǎn)去執(zhí)行以START為標(biāo)號;的程序段,標(biāo)志著程序的開始執(zhí)行串行口中斷子程序,程序的入口地址為

30、0023H,該段程序首先判斷是否有發(fā)送中斷,若沒有發(fā)送中斷標(biāo)志,則轉(zhuǎn)去執(zhí)行S0_R程序段,接受數(shù)據(jù)并保存;若有發(fā)送中斷標(biāo)志,清收發(fā)中斷標(biāo)志TI,轉(zhuǎn)去執(zhí)行S0_RET實現(xiàn)中斷返回。程序設(shè)計如下:ORG0023HJNBTI, S0_RCLRTI NOPSJMPS0_RETS0_R: ; 接收數(shù)據(jù)CLRRIMOVRCVBUF,SBUF ;保存數(shù)據(jù) SETB HASRCV ;提示收到數(shù)據(jù) NOPS0_RET: RETI下面這兩條指令用于定義數(shù)碼管的顯示內(nèi)容,匯編程序?qū)B指令中的內(nèi)容依次存入從標(biāo)號LEDMAP開始的存儲單元中。程序代碼如下:LEDMAP: ;八段數(shù)碼管顯示碼 DB 3FH, 06H,

31、5BH, 4FH, 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H延時子程序,將會在讀取鍵值和顯示數(shù)碼管時用到。程序代碼如下:DELAY: ;延時子程序MOVR7, #0DELAYLOOP:DJNZR7, DELAYLOOPDJNZR6, DELAYLOOPRETLED顯示子程序,將顯示顯示緩沖器中的內(nèi)容。程序代碼如下:DISPLAYLED:MOVR0, #LEDBUF ;入口參數(shù)MOV R1, #6 ;共6個八段管MOVR2, #00100000B ;從左邊開始顯示LOOP:MOVDPTR, #OUTBITMOVA,

32、#0 MOVXDPTR, A ;關(guān)所有八段管MOV A, R0MOV B, #8 ;送164,共8個段DLP:RLCAMOVR3, A MOVACC.0, C MOVDPTR, #DAT164 ;數(shù)據(jù)送往段控制口,顯示其中某一段MOVX DPTR, AMOVDPTR, #CLK164 ;產(chǎn)生一個正脈中沖給CLK164SETBACC.0 MOVXDPTR, ACLRACC.0MOVXDPTR, AMOVA, R3 DJNZB, DLP MOV DPTR, #OUTBIT MOV A, R2 MOVXDPTR, A ;顯示一個八段管MOVR6, #1CALLDELAY MOVA, R2 ;顯示下一

33、個八段管 RRAMOV R2, A INC R0DJNZ R1, LOOP RET檢測鍵盤輸入子程序,用于判斷是否有按鍵按下。程序代碼如下:TESTKEY: MOVDPTR, #OUTBIT MOV A, #0 MOVX DPTR, A ;輸出線置為0MOV DPTR, #INMOVXA, DPTR ;讀入鍵狀態(tài)CPLAANLA, #0FH ;高四位不用RET該指令段定義了按鍵對應(yīng)的鍵碼,讀入的按鍵都要轉(zhuǎn)換成鍵碼。程序代碼如下:KEYTABLE: ;鍵碼定義 DB 16H, 15H, 14H, 0FFHDB 13H, 12H, 11H, 10HDB 0DH, 0CH, 0BH, 0AHDB 0

34、EH, 03H, 06H, 09HDB 0FH, 02H, 05H, 08HDB 00H, 01H, 04H, 07H讀入鍵值,轉(zhuǎn)換為鍵碼,并判斷按鍵是否釋放。程序代碼如下:GETKEY:MOVDPTR, #OUTBITMOVP2, DPH MOVR0, IN MOVR1, #00100000B MOVR2, #6 KLOOP:MOVA, R1 ;找出鍵所在列 CPLA MOVXDPTR, ACPL ARRA MOV R1, A ;下一列MOVXA, R0 ;續(xù)鍵盤 CPLA ;取反ANLA, #0FHJNZGOON1 ;該列有鍵入 DJNZR2, KLOOP MOVR2, #0FFH ;沒有

35、鍵按下, 返回 0FFH SJMP EXITGOON1:MOVR1, A ;鍵值 = 列 X 4 + 行MOVA, R2DECA RLARLAMOV R2, A ;R2 = (R2-1)*4 MOVA, R1 ;R1中為讀入的行值 MOV R1, #4 LOOPC: RRCA ;移位找出所在行JCEXIT INCR2 ;R2 = R2+ 行值DJNZR1, LOOPCEXIT: MOV A, R2 ;取出鍵碼MOV DPTR, #KEYTABLEMOVCA, A+DPTR ;查表MOVR2, A WAITRELEASE:MOVDPTR, #OUTBIT ;等鍵釋放CLR A MOVXDPTR,

36、 AMOVR6, #10 CALLDELAYCALLTESTKEY ;調(diào)檢測鍵盤輸入子程序JNZ WAITRELEASEMOVA, R2 ;出口參數(shù) RET程序從此處開始執(zhí)行,首先設(shè)置定時器和串口的工作方式,波特率, 允許串口中斷,然后進行數(shù)碼管全亮顯示,然后判斷是否有接受數(shù)據(jù), 有則顯示,判斷是否有按鍵輸入。程序代碼如下:START:MOV SP, #60H MOVIE, #0 ;屏蔽所有中斷 MOVTMOD,#020H ;定時器1工作于方式2 (8位重裝)MOVTH1, #0F3H ;波特率*2400bps 6MHZMOVTL1, #0F3HANL PCON,#07FH ;SMOD 位清零

37、 MOVSCON,#050H ;串行口工作方式設(shè)置MOV LEDBUF, #0FFH ;顯示 8.8.8.8. MOV LEDBUF+1, #0FFH MOVLEDBUF+2, #0FFHMOV LEDBUF+3, #0FFHMOV LEDBUF+4, #0MOV LEDBUF+5, #0SETBTR1SETBESSETBEAMLOOP:JB HASRCV, RCVDATA ;收到數(shù)據(jù)?HASRW1則轉(zhuǎn)利RCVDATACALLDISPLAYLED ;沒有收到數(shù)據(jù)則顯示CALLTESTKEY ;有鍵入?JZ MLOOP ;無鍵入, 繼續(xù)顯示 CALLGETKEY ;讀入鍵碼ANLA, #0FH

38、;通訊口輸出鍵碼MOVSBUF,ARCVDATA:CLR HASRCV ;請接收標(biāo)志位 MOV A, RCVBUF ;接收數(shù)據(jù)MOVDPTR, #LEDMAPMOVCA, A+DPTR ;查要顯示的ED值MOV LEDBUF+5, ALJMPMLOOP ;顯示數(shù)據(jù)END第9章9.3單片機應(yīng)用系統(tǒng)設(shè)計實例(1)程序中用到的端口和數(shù)據(jù)的定義DAT EQUP3.5 ;讀寫DS18B20GZDL EQU P1.0 ;工作電流 CHECKPOWER EQU P1.1GZEQUP1.2 ;防盜輸入GZZSEQUP1.3 ;控制指示燈KZEQU21H.7DYEQUP1.4 ;電源ONEQUP1.6 ;P1.

39、6=0 開啟,P1.6=1關(guān)閉GZK EQUP1.5 ;開啟PCOUNT EQU P3.2 ;使用計數(shù)器CLEARDOG EQU P1.7 ;看門狗MAX813復(fù)位信號KEY0 EQU P3.3 ;鍵碼0KEY1 EQU P3.4 ;鍵碼1MAV485RW EQU P3.7 ;MAX485串行輸入/輸出控制位WDLSB EQU30H ;溫度值低位WDMSB EQU31H ;溫度值高位SWCEQU2DH ;開關(guān)計數(shù)HALFTIME EQU 2EH ;半小時延時SWCFBIT 06HDELAYKEY EQU 34H ;0 空閑,1 正在計時,2 延時到COUNT EQU 36H ;開/關(guān)時間計時;恒定溫度常數(shù)WDCSH EQU01H ;24WDCSL EQU 80H;溫度上限WDSXH EQU01H ;28WDSXL EQU0C0H;溫度下限WDXXH EQU01HWDXXL EQU090H ;25SONEQU 37H ;開關(guān)狀態(tài)變量SSCOUNT EQU 38H ;收發(fā)時鐘沒有接收SIOS EQU 39H ;0

溫馨提示

  • 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

提交評論