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