|
大二第二學期的微機原理實驗課的期末考核項目之一是做一個以Intel 8086為主控、實現走時和時間(時、分、秒)調節的電子時鐘仿真。在前幾天就折騰好了,今天來做個記錄|・ω・`)。
方案設計
在我的方案中,使用8253的計數通道0作為計時部分,每隔0.8秒,8253發出中斷請求信號,中斷服務程序執行秒的自增,由于CPU(時鐘頻率設定為1MHz)的指令執行時間不可忽略,因此實際顯示效果中秒的自增約為每秒一次,從而實現24小時制的走時。
顯示部分則使用3個兩位共陰數碼管來分別顯示時、分、秒,3個數碼管的段碼控制端均接在8255的PA端,片選端則通過74LS138接入8255;當CPU輸出一個數碼管段碼時,所有(6位)數碼管均收到該段碼,但只有被片選選中的數碼管才會顯示該段碼對應的數值,CPU每隔一段時間輸出一個段碼,只要間隔時間足夠短,由于視覺暫留現象,就可以看到6位數碼管同時顯示。
控制部分由走時/暫停開關、'時'設置按鍵、'分'設置按鍵、'秒'設置按鍵組成,分別接入8255的PC0、PC1、PC2、PC3。
方案源碼
;8255的端口地址
AD8255PA EQU 08H
AD8255PB EQU 0AH
AD8255PC EQU 0CH
AD8255CON EQU 0EH
;8253的端口地址
AD82530 EQU 10H
AD8253CON EQU 16H
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
DATA SEGMENT
LEDS DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;數碼管段碼
HOUR DB 0
MINUTE DB 0
SECOND DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
MOV AX,DATA
MOV DS,AX
;設置中斷向量,8253非屏蔽中斷初始化
CLI
MOV AX,0
MOV ES,AX
MOV SI,08H
MOV AX,OFFSET TIME_INT
MOV ES:[SI],AX
MOV AX,CS
MOV ES:[SI+2],AX
;初始化8255,端口A和端口B輸出,端口C的低四位輸入
MOV AL,81H
OUT AD8255CON,AL
;初始化8253,每秒觸發一次中斷
MOV AL,36H
OUT AD8253CON,AL ;將方式控制字寫入控制端口
MOV AX,40000 ;計數初值40000,輸入頻率50k,定時時長0.8秒
OUT AD82530,AL ;將計數初值的低字節寫入計數通道0
MOV AL,AH
OUT AD82530,AL ;將計數初值的高字節寫入計數通道0
L:
CALL TIME_CHANGE ;更改時間
CALL DISPLAY_TIME ;顯示時間
JMP L
TIME_CHANGE:
PUSH AX
IN AL,AD8255PC ;讀取8255的PC端口數據
AND AL,0FH ;高四位清零
CMP AL,06H ;按下按鍵“秒”
JE ADD_SECOND
CMP AL,0AH ;按下按鍵“分”
JE ADD_MINUTE
CMP AL,0CH ;按下按鍵“時”
JE ADD_HOUR
JMP ADD_NULL
ADD_SECOND:
CALL INC_SECOND ;增加“秒”
CALL DELAY_KEY ;按鍵延時消抖
JMP ADD_NULL
ADD_MINUTE:
CALL INC_MINUTE ;增加“分”
CALL DELAY_KEY ;按鍵延時消抖
JMP ADD_NULL
ADD_HOUR:
CALL INC_HOUR ;增加“時”
CALL DELAY_KEY ;按鍵延時消抖
ADD_NULL:
POP AX
RET
INC_SECOND:
PUSH AX
INC SECOND
MOV AL,SECOND
CMP AL,60 ;判斷是否等于60
JNE END0
MOV AL,0
MOV SECOND,AL
CALL INC_MINUTE
END0:
POP AX
RET
INC_MINUTE:
PUSH AX
INC MINUTE
MOV AL,MINUTE
CMP AL,60 ;判斷是否等于60
JNE END1
MOV AL,0
MOV MINUTE,AL
CALL INC_HOUR
END1:
POP AX
RET
INC_HOUR:
PUSH AX
INC HOUR
MOV AL,HOUR
CMP AL,24 ;判斷是否等于24
JNE END2
MOV AL,0
MOV HOUR,AL
END2:
POP AX
RET
WRITE_LEDS: ;寫數碼管的某一位
MOV BP,SP
PUSH AX
PUSH DX
MOV AX,[BP+4]
OUT AD8255PB,AL
MOV BX,[BP+2]
LEA SI,LEDS
MOV AL,[BX+SI]
OUT AD8255PA,AL
POP DX
POP AX
RET 4
WRITE_TIME: ;寫“時”、“分”、“秒”
MOV BP,SP
PUSH AX
PUSH CX
PUSH DX
MOV AX,[BP+2]
MOV DL,10
DIV DL
MOV CL,AH
MOV DX,[BP+4]
PUSH DX
XOR AH,AH
PUSH AX
CALL WRITE_LEDS
CALL DELAY
INC DX
PUSH DX
XOR CH,CH
PUSH CX
CALL WRITE_LEDS
POP DX
POP CX
POP AX
RET 4
DISPLAY_TIME:
PUSH AX
;顯示“時”
MOV AX,0
PUSH AX
MOV AL,HOUR
XOR AH,AH
PUSH AX
CALL WRITE_TIME
CALL DELAY
;顯示“分”
MOV AX,2
PUSH AX
MOV AL,MINUTE
XOR AH,AH
PUSH AX
CALL WRITE_TIME
CALL DELAY
;顯示“秒”
MOV AX,4
PUSH AX
MOV AL,SECOND
XOR AH,AH
PUSH AX
CALL WRITE_TIME
CALL DELAY
POP AX
RET
DELAY:
PUSH BX
PUSH CX
MOV BX,2
DEL0:
MOV CX,100
DEL1:
DEC CX
CMP CX,0
JNE DEL1
DEC BX
CMP BX,0
JNE DEL0
POP CX
POP BX
RET
DELAY_KEY:
PUSH BX
PUSH CX
MOV BX,50
DEL_K0:
MOV CX,300
DEL_K1:
DEC CX
CMP CX,0
JNE DEL_K1
DEC BX
CMP BX,0
JNE DEL_K0
POP CX
POP BX
RET
TIME_INT: ;中斷處理函數
CALL INC_SECOND
IRET
CODE ENDS
END START
方案原理如下:
|
-
電路.png
(88.16 KB, 下載次數: 166)
下載附件
2021-8-12 08:47 上傳
原理概況
-
8086.png
(46.78 KB, 下載次數: 152)
下載附件
2021-8-12 08:48 上傳
CPU部分
-
8253.png
(36.32 KB, 下載次數: 159)
下載附件
2021-8-12 08:48 上傳
定時器部分
-
U3.png
(25.66 KB, 下載次數: 150)
下載附件
2021-8-12 08:48 上傳
8253激勵源
-
8255.png
(43.04 KB, 下載次數: 157)
下載附件
2021-8-12 08:49 上傳
顯示&控制部分
評分
-
查看全部評分
|