實(shí)驗(yàn)?zāi)康?/P>
2、了解中斷子程序的執(zhí)行過(guò)程,掌握其編程設(shè)計(jì)和調(diào)試方法。
3、加深對(duì)51系列單片機(jī)內(nèi)部結(jié)構(gòu)和使用方法的理解。
4、初步理解基于8031的微機(jī)化儀表的整體設(shè)計(jì)。
實(shí)驗(yàn)內(nèi)容和原理:
利用實(shí)驗(yàn)板設(shè)計(jì)電腦時(shí)鐘,既能顯示時(shí)間,又能調(diào)整時(shí)間。
顯示格式如圖5-1。相應(yīng)地,在片內(nèi)RAM開(kāi)辟顯示緩沖區(qū)2A∽2FH,每一個(gè)顯示緩沖單元對(duì)應(yīng)一個(gè)數(shù)碼管,為便于顯示,采用非壓縮BCD碼。另外,還開(kāi)辟時(shí)、分、秒、0.1秒四個(gè)計(jì)時(shí)單元,地址為40-43H,為便于計(jì)算,采用16進(jìn)制數(shù)。
為產(chǎn)生時(shí)間基準(zhǔn),用定時(shí)器0,工作方式1,溢出周期0.1S。即每隔0.1s產(chǎn)生一次中斷請(qǐng)求,0.1s單元加1。中斷10次即1秒,秒單元加1。秒單元計(jì)數(shù)到60時(shí),分單元加1。分單元計(jì)數(shù)到60時(shí),時(shí)單元加1。顯然,只要把時(shí)、分、秒計(jì)時(shí)單元中的值轉(zhuǎn)送至顯示緩沖單元(需16進(jìn)制轉(zhuǎn)換為10進(jìn)制),那么,就能實(shí)現(xiàn)時(shí)間顯示。
為實(shí)現(xiàn)時(shí)間調(diào)整,鍵盤布置如圖5-2所示。鍵號(hào)為9、A、B的三只鍵分別用作秒、分、時(shí)選擇鍵;鍵號(hào)為4、5的二只鍵分別用作減少和增加鍵。例如,需要“分”調(diào)整,則先按“分”鍵,再按“↓”或“↑”鍵。
整個(gè)程序,由主程序,定時(shí)中斷程序,時(shí)間設(shè)置程序等部分組成。
圖5-3 主程序框圖
主程序(流程框圖見(jiàn)圖5-3):
ORG 0000H |
||
LJMP MAIN |
||
ORG 000BH |
||
LJMP CLOCK |
;定時(shí)中斷入口 | |
MAIN: |
MOV SP, #60H |
;設(shè)置堆棧 |
MOV DPTR, #0B000H |
;8155命令字 | |
MOV A, #03H |
;A、B口輸出,C口輸入 | |
MOVX @DPTR, A |
||
MOV TMOD, #01H |
;定時(shí)器T0,方式1 | |
MOV TH0, #3CH |
;定時(shí)間100ms | |
MOV TL0, #B0H |
||
MOV IE, #82H |
;開(kāi)T0中斷 | |
SETB TR0 |
;啟動(dòng)T0 | |
MOV 40H, #00H |
;計(jì)時(shí)單元清零 | |
MOV 41H, #00H |
||
MOV 42H, #00H |
||
MOV 43H, #00H |
||
MOV R0, #2AH |
;顯示緩沖2A~2F清零 | |
CLR A |
||
MP0: |
MOV @ R0, A |
|
INC R0 |
||
CJNE R0, #30H, MP0 |
||
DIS: |
LCALL DISP |
;調(diào)顯示子程序 |
LCALL SETUP |
;調(diào)設(shè)置子程序 | |
SJMP DIS |
定時(shí)中斷服務(wù)子程序(流程框圖見(jiàn)圖5-4)
ORG 0500H |
||
CLOCK: |
PUSH PSW |
;壓棧保護(hù) |
PUSH A |
||
MOV TH0, #3CH |
;重裝初值 | |
MOV TL0, #0BCH |
||
INC 43H |
;0.1s單元加1 | |
|
MOV A, 43H |
|
CJNE A, #0AH, RET0 |
;1s不到,轉(zhuǎn)RET0 | |
MOV 43H, #00H |
;1s到,0.1s單元清零 | |
INC 42H |
;秒單元加1 | |
MOV A, 42H |
||
CJNE A, #3CH, RET0 |
;1分不到,轉(zhuǎn)RET0 | |
MOV 42H , #00H |
;1分到,秒單元清零 | |
INC 41H |
;分單元加1 | |
MOV A, 41H |
||
CJNE A, #3CH, RET0 |
;1小時(shí)不到,轉(zhuǎn)RET0 | |
MOV 41H, #00H |
;1小時(shí)到,分單元清零 | |
INC 40H |
;時(shí)單元加1 | |
MOV A, 40H |
||
CJNE A, #81H, RET0 |
;24小時(shí)到否? | |
MOV 40H, #00H |
;到,則時(shí)清零 | |
RET0: |
MOV A, 40H |
;將計(jì)時(shí)單元中16進(jìn)制轉(zhuǎn)換 |
MOV B, #0AH |
;為十進(jìn)制后,送顯示緩沖 | |
DIV AB |
||
MOV 2AH, A |
;“時(shí)”送顯示 | |
MOV 2BH, B |
||
MOV A, 41H |
||
MOV B, #0AH |
||
DIV AB |
||
MOV 2CH, A |
;“分”送顯示 | |
MOV 2DH, B |
||
MOV A, 42H |
||
MOV B, #0AH |
||
|
DIV AB |
|
MOV 2EH, A |
;“秒”送顯示 | |
MOV 2FH, B |
||
POP A |
;出棧 | |
POP PSW |
||
RETI |
時(shí)間設(shè)置子程序(流程框圖見(jiàn)圖5-5)
ORG 0450H |
||
SETUP: |
LCALL KS1 |
;判別有無(wú)鍵按下? |
JZ ST9 |
;無(wú)鍵按下,退出 | |
CLR EA |
;關(guān)中斷 | |
LCALL KEYA |
;求鍵號(hào)→A | |
CJNE A, #0BH, ST1 |
;“時(shí)”鍵? | |
MOV 20H, #01 H |
;是,置時(shí)標(biāo)志 | |
SJMP ST9 |
||
ST1: |
CJNE A, #0AH, ST2 |
;“分”鍵? |
MOV 20H, #02H |
;是,置分標(biāo)志 | |
SJMP ST9 |
||
ST2: |
CJNE A, #09H, ST3 |
;“秒”鍵? |
MOV 20H, #04H |
;是,置秒標(biāo)志 | |
|
SJMP ST9 |
|
ST3: |
CJNE A, #05H, ST6 |
;“增加”鍵? |
MOV A, 20H |
;是,則判時(shí)分秒標(biāo)志 | |
CJNE A, #01H, ST4 |
||
|
INC 40H |
;“時(shí)”+1 |
SJMP ST9 |
||
ST4: |
CJNE A, #02H, ST5 |
|
INC 41H |
;“分”+1 | |
SJMP ST9 |
||
ST5: |
CJNE A, #04H, ST9 |
|
INC 42H |
;“秒”+1 | |
SJMP ST9 |
||
ST6: |
CJNE A, #04H, ST10 |
;“減少”鍵? |
MOV A, 20H |
;是,判時(shí)分秒標(biāo)志 | |
CJNE A, #01H, ST7 |
||
DEC 40H |
;“時(shí)”-1 | |
SJMP ST9 |
||
ST7: |
CJNE A, #02H, ST8 |
|
DEC 41H |
;“分”-1 | |
SJMP ST9 |
||
ST8: |
CJNE A, #04H, ST9 |
|
DEC 42H |
;“秒”-1 | |
ST9: |
SETB EA |
;開(kāi)中斷 |
RET |
||
ST10: |
MOV 20H, #00H |
|
RET |
實(shí)驗(yàn)步驟:
1、輸入程序。
2、連續(xù)運(yùn)行程序,檢查顯示能否正常計(jì)時(shí),按鍵能否實(shí)現(xiàn)調(diào)整。如發(fā)現(xiàn)不正常,可采用斷點(diǎn)、單步等方法進(jìn)行分段調(diào)試。
思考題:
1、如何調(diào)整時(shí)鐘精度?
2、如何判斷CPU是否響應(yīng)定時(shí)中斷?
3、主程序最后一句能否改為NOP或SJMP$?
評(píng)論
查看更多