1. 綜合運用學過的相關軟、硬件知識,利用偉福LAB6000實驗設備,設計具有實用功能的電子鐘,實現電子時鐘的準確運行、校時等功能。 2. 熟悉偉福LAB6000的功能,掌握數碼管設計和鍵盤設計的要領及相關技術,能夠利用實驗設備實現電子鐘系統的設計。 3.提高自己的硬件設計分析能力,同時培養軟硬結合的系統設計思維,從而提高設計系統的可行性和準確性。 - 設計題目:8086數字電子鐘的設計:
- 設計并完成LED七段數碼管數字鐘電路。
- 數字鐘顯示格式為:HH:MM:SS。
- 具有通過鍵盤能夠調整時、分、秒及設置鬧鈴的功能。
- 具有暫停時間及復位功能。
- 設計方案
本設計采用LAB6000偉福仿真實驗箱,利用4MHz脈沖信號源和多級分頻電路產生脈沖信號,4MHz脈沖信號經過F/64分頻后得到62.5KHz脈沖信號,將脈沖信號傳遞給8253定時器,定時器每0.000016秒中斷一次,在中斷服務程序中對中斷次數進行計數,0.000016秒計數62500次就是1秒,然后在中斷服務程序中對秒計數得到分和小時值并判斷鬧鈴是否到時。編寫鍵盤掃描和LED顯示程序完成設置時間、定鬧鈴及數碼管顯示功能。 
圖1.1七段數碼管 圖1.2偉福實驗臺六位LED的電路圖及尋址空間 實驗箱提供了6位八段數碼LED顯示電路,只要按地址輸出相應數據,就可以實現對顯示器的控制。將KEY/LED CS接到CS0上,則實驗箱中八位段碼輸出地址為08004H,位碼輸出地址為08002H。 實驗箱提供了一個6×4的小鍵盤,將KEY/LED CS信號接到CS0上,則列掃描地址為08002H,行碼地址為08001H。向列掃描碼地址逐列輸入低電平,然后從行碼地址讀回。如果有鍵按下,則相應行的值應為低,如果無鍵按下,由于上拉的作用,行碼為高。這樣就可以通過輸出的列碼和讀取的行碼來判斷按下的是什么鍵。在判斷有鍵按下后,要有一定的時延,防止鍵盤抖動。 
圖2.1偉福實驗臺內部總線連接 8253用定時器/計數器1,8253片選接CS1,地址為09000H,8253時鐘源CLK1接分頻電路的F/64輸出,頻器的Fin接4MHz時鐘,8253的GATE1接VCC;8259中斷INT0接8253的OUT1,片選接CS2,地址為0A000H。顯示電路的KEY/LED CS 接CS0,地址為08000H。如下圖: 
源程序如下:
- CONTROL EQU 09003H
- COUNT1 EQU 09001H
- IN_KEY EQU 08001H ; 鍵盤讀入口
- OUTBIT EQU 08002H ; 位控制口
- OUTSEG EQU 08004H ; 段控制口
- ICW1 EQU 00010011B ; 單片8259, 上升沿中斷, 要寫ICW4
- ICW2 EQU 00100000B ; 中斷號為20H
- ICW4 EQU 00000001B ; 工作在8086/88 方式
- OCW1 EQU 11111110B ; 只響應INT0 中斷
- CS8259A EQU 0A000H ; 8259地址
- CS8259B EQU 0A001H
- DATA SEGMENT
- CNT DB 0;鬧鈴顯示
- RHOUR DB 1
- RMINUTE DB 0
- HOUR DB 0
- MINUTE DB 0
- SECOND DB 0
- NUM DB 0;判斷鬧鈴
- LEDBUF DB 6 DUP(?) ; 顯示緩沖
- RINGBUF DB 6 DUP(?)
- SETBUF DB 6 DUP(?)
- LEDMAP: ; 八段管顯示碼
- DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
- DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
- KEYTABLE: ; 鍵碼定義
- DB 16H, 15H, 14H, 0FFH
- DB 13H, 12H, 11H, 10H
- DB 0DH, 0CH, 0BH, 0AH
- DB 0EH, 03H, 06H, 09H
- DB 0FH, 02H, 05H, 08H
- DB 00H, 01H, 04H, 07H
- SET: DB 6DH, 79H, 07H, 01H, 00H, 00H;字符顯示SET
- BELL: DB 7FH, 79H, 38H, 38H, 00H, 00H;字符顯示BELL
- DATA ENDS
-
- CODE SEGMENT
- ASSUME CS:CODE, DS:DATA
- DELAY PROC NEAR
- PUSH AX ; 延時子程序
- PUSH CX
- MOV AL, 0
- MOV CX,AX
- LOOP $
- POP CX
- POP AX
- RET
- DELAY ENDP
-
- DISPLAYLED PROC NEAR
- MOV CL, 6 ; 共6個八段管
- MOV AH, 00100000B ; 從左邊開始顯示
- DLOOP:
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX,AL ; 關所有八段管
- MOV AL, [BX]
- MOV DX, OUTSEG
- OUT DX,AL
- MOV DX, OUTBIT
- MOV AL, AH
- OUT DX, AL ; 顯示一位八段管
- PUSH AX
- MOV AH, 01H
- CALL DELAY
- POP AX
- SHR AH, 1
- INC BX
- DEC CL
- JNZ DLOOP
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX,AL ; 關所有八段管
- RET
- DISPLAYLED ENDP
-
- TESTKEY PROC NEAR
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX, AL ; 輸出線置為0
- MOV DX, IN_KEY
- IN AL, DX ; 讀入鍵狀態
- NOT AL
- AND AL, 0FH ; 高四位不用
- RET
- TESTKEY ENDP
-
- GETKEY PROC NEAR
- MOV CH, 00100000B
- MOV CL, 6
- KLOOP:
- MOV DX, OUTBIT
- MOV AL, CH ; 找出鍵所在列
- NOT AL
- OUT DX, AL
- SHR CH, 1
- MOV DX, IN_KEY
- IN AL, DX
- NOT AL
- AND AL, 0FH
- JNE GOON_ ; 該列有鍵入
- DEC CL
- JNZ KLOOP
- MOV CL, 0FFH ; 沒有鍵按下, 返回 0FFH
- JMP EXIT1
- GOON_:
- DEC CL
- SHL CL, 2 ; 鍵值 = 列 * 4 +行
- MOV CH, 4
- LOOPC:
- TEST AL, 1
- JNZ EXIT1
- SHR AL, 1
- INC CL
- DEC CH
- JNZ LOOPC
- EXIT1:
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX, AL
- MOV CH, 0
- MOV BX, OFFSET KEYTABLE
- ADD BX, CX
- MOV AL, [BX] ; 取出鍵碼
- MOV BL, AL
- WAITRELEASE:
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX, AL ; 等鍵釋放
- MOV AH, 10
- CALL DELAY
- CALL TESTKEY
- JNE WAITRELEASE
- MOV AL, BL
- RET
- GETKEY ENDP
-
- IENTER PROC NEAR
- PUSH AX
- PUSH DX
- MOV NUM,0
- INC SECOND
- MOV AL, SECOND
- CMP AL, 60
- JNE J0
- MOV SECOND, 0
- INC MINUTE
- MOV AL, MINUTE
- CMP AL, 60
- JNE J0
- MOV MINUTE, 0
- INC HOUR
- MOV AL, HOUR
- CMP AL, 24
- JNE J0
- MOV HOUR, 0
- J0: ;判斷鬧鈴
- MOV AL,HOUR
- CMP AL, RHOUR
- JNE J1
- INC NUM
- J1:
- MOV AL,MINUTE
- CMP AL, RMINUTE
- JNE J2
- INC NUM
- J2:
- CMP NUM, 2
- JNE EXIT
- MOV CNT, 0EH
- L33:
- ;MOV DX,0D000H
- ;OUT DX,AL
- MOV BX, OFFSET BELL
- CALL DISPLAYLED
- DEC CNT
- JNE L33
- EXIT:
- MOV DX, CS8259A
- MOV AL, 20H ; 中斷服務程序結束指令
- OUT DX, AL
- POP DX
- POP AX
- IRET
- IENTER ENDP
-
- IINIT PROC
- MOV DX, CS8259A
- MOV AL, ICW1
- OUT DX, AL
- MOV DX, CS8259B
- MOV AL, ICW2
- OUT DX, AL
- MOV AL, ICW4
- OUT DX, AL
- MOV AL, OCW1
- OUT DX, AL
- RET
- IINIT ENDP
-
- START PROC NEAR
- MOV AX, DATA
- MOV DS, AX
- MOV NUM, 0
- MOV LEDBUF, 03FH ; 顯示 00.00.00
- MOV LEDBUF+1, 03FH
- MOV LEDBUF+2, 03FH
- MOV LEDBUF+3, 03FH
- MOV LEDBUF+4, 03FH
- MOV LEDBUF+5, 03FH
- MOV HOUR, 0
- MOV MINUTE, 0
- MOV SECOND, 0
- CLI ;關中斷
- MOV AX, 0
- MOV DS, AX
- MOV AL, 76H; 01110110B ; 計數器1,16位,方式3,二進制
- MOV DX, CONTROL
- OUT DX, AL
- MOV AX, 65500
- MOV DX, COUNT1
- OUT DX, AL ; 計數器低字節
- MOV AL, AH
- OUT DX, AL ; 計數器高字節
- MOV BX, 4*ICW2 ; 中斷號
- MOV AX, CODE
- SHL AX, 4 ; *16
- ADD AX, OFFSET IENTER ;中斷入口地址(段地址為0)
- MOV [BX], AX
- MOV AX, 0
- INC BX
- INC BX
- MOV [BX], AX ; 代碼段地址為0
- CALL IINIT
- MOV AX, DATA
- MOV DS, AX
- STI ;開中斷
- LOOP2:
- MOV AL, HOUR
- MOV AH, 0
- MOV CL, 10
- DIV CL
- MOV CH, AH
- MOV AH, 0
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF, AL
- MOV BX, OFFSET LEDMAP
- MOV AL, CH
- MOV AH, 0
- ADD BX, AX
- MOV AL, [BX]
- OR AL, 80H
- MOV LEDBUF+1, AL
- MOV AL, MINUTE
- MOV AH, 0
- MOV CL, 10
- DIV CL
- MOV CH, AH
- MOV AH, 0
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+2, AL
- MOV BX, OFFSET LEDMAP
- MOV AL, CH
- MOV AH, 0
- ADD BX, AX
- MOV AL, [BX]
- OR AL, 80H
- MOV LEDBUF+3, AL
- JMP L3
- LOOP1:
- JMP LOOP2
- L3:
- MOV AL, SECOND
- MOV AH, 0
- MOV CL, 10
- DIV CL
- MOV CH, AH
- MOV AH, 0
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+4, AL
- MOV BX, OFFSET LEDMAP
- MOV AL, CH
- MOV AH, 0
- ADD BX, AX
- MOV AL, [BX]
- OR AL, 80H
- MOV LEDBUF+5, AL
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- D0:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED ; 顯示
- CALL TESTKEY ; 有鍵入?
- JE LOOP1 ; 無鍵入, 繼續顯示
- CALL GETKEY ; 讀入鍵碼
- AND AL, 0FH ; 顯示鍵碼
- MOV AH,0
-
- CMP AL,0AH
- JE SET0
- CMP AL,0BH
- JE BELL01
- CMP AL,0CH
- JE STOP1
- CMP AL,0DH
- JE CLEAR1
- JMP D0
- STOP1:
- CLI
- STOP2:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE STOP2
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- CMP AL, 0CH
- JNE STOP2
- STI
- JMP D0
- CLEAR1:
- MOV HOUR,0
- MOV MINUTE,0
- MOV SECOND,0
- JMP D0
- SET0:
- MOV BX, OFFSET SET
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET0
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- MOV SETBUF[0],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF, AL
-
- SET1:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET1
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- MOV SETBUF[1],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+1, AL
- JMP SET2
- BELL01:
- JMP BELL02
- SET2:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET2
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- MOV SETBUF[2],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+2, AL
-
- SET3:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET3
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- MOV SETBUF[3],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+3, AL
-
- JMP SET6
- BELL02:
- JMP BELL03
- SET6:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET6
- CALL GETKEY
- AND AL, 0FH
- CMP AL,0AH
- JE TIMESET
- JMP D0
- TIMESET:
-
- MOV AL , SETBUF[0]
- MOV CL,10D
- MUL CL
- MOV BL,SETBUF[1]
- ADD AL,BL
- MOV HOUR,AL
- CMP HOUR,24
- JL LP1
- MOV HOUR ,0
- LP1:
- MOV AL ,SETBUF[2]
- MOV CL,10D
- MUL CL
- MOV BL ,SETBUF[3]
- ADD AL,BL
- MOV MINUTE ,AL
- CMP MINUTE ,60
- JL LP2
- MOV MINUTE ,0
- LP2:
- MOV SECOND, 0
-
- JMP D0
-
-
- BELL03:
- MOV BX, OFFSET BELL
- CALL DISPLAYLED ; 顯示
- CALL TESTKEY ; 有鍵入?
- JE BELL03 ; 無鍵入, 繼續顯示
- CALL GETKEY ; 讀入鍵碼
- AND AL, 0FH ; 顯示鍵碼
- MOV AH, 0
- MOV RINGBUF[0],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF, AL
-
- BELL1:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED ; 顯示
- CALL TESTKEY ; 有鍵入?
- JE BELL1 ; 無鍵入, 繼續顯示
- CALL GETKEY ; 讀入鍵碼
- AND AL, 0FH ; 顯示鍵碼
- MOV AH, 0
- MOV RINGBUF[1],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+1, AL
-
- BELL2:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED ; 顯示
- CALL TESTKEY ; 有鍵入?
- JE BELL2 ; 無鍵入, 繼續顯示
- CALL GETKEY ; 讀入鍵碼
- AND AL, 0FH ; 顯示鍵碼
- MOV AH, 0
- MOV RINGBUF[2],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+2, AL
-
- BELL3:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED ; 顯示
- CALL TESTKEY ; 有鍵入?
- JE BELL3 ; 無鍵入, 繼續顯示
- CALL GETKEY ; 讀入鍵碼
- AND AL, 0FH ; 顯示鍵碼
- MOV AH, 0
- MOV RINGBUF[3],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+3, AL
-
- BELL4:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE BELL4
- CALL GETKEY
- AND AL, 0FH
- CMP AL,0BH
- JE BELLSET
- JMP D0
-
- BELLSET:
- MOV NUM,0
- MOV AL , RINGBUF[0]
- MOV CL,10D
- MUL CL
- MOV BL,RINGBUF[1]
- ADD AL,BL
- MOV RHOUR,AL
- CMP RHOUR,24
- JL LP3
- MOV RHOUR ,0
- LP3:
- MOV AL ,RINGBUF[2]
- MOV CL,10D
- MUL CL
- MOV BL ,RINGBUF[3]
- ADD AL,BL
- MOV RMINUTE ,AL
- CMP RMINUTE ,60
- JL LP4
- MOV RMINUTE ,0
- LP4:
-
- JMP D0
- START ENDP
- CODE ENDS
- END START
復制代碼
完整的Word格式文檔51黑下載地址:
8086數字電子鐘的設計-附程序代碼.rar
(630.7 KB, 下載次數: 15)
2019-6-16 10:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|