找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4666|回復(fù): 5
收起左側(cè)

8086電子時(shí)鐘折騰小記

[復(fù)制鏈接]
ID:825513 發(fā)表于 2021-8-12 08:50 | 顯示全部樓層 |閱讀模式
大二第二學(xué)期的微機(jī)原理實(shí)驗(yàn)課的期末考核項(xiàng)目之一是做一個(gè)以Intel 8086為主控、實(shí)現(xiàn)走時(shí)和時(shí)間(時(shí)、分、秒)調(diào)節(jié)的電子時(shí)鐘仿真。在前幾天就折騰好了,今天來做個(gè)記錄|・ω・`)。


方案設(shè)計(jì)

在我的方案中,使用8253的計(jì)數(shù)通道0作為計(jì)時(shí)部分,每隔0.8秒,8253發(fā)出中斷請(qǐng)求信號(hào),中斷服務(wù)程序執(zhí)行秒的自增,由于CPU(時(shí)鐘頻率設(shè)定為1MHz)的指令執(zhí)行時(shí)間不可忽略,因此實(shí)際顯示效果中秒的自增約為每秒一次,從而實(shí)現(xiàn)24小時(shí)制的走時(shí)。

顯示部分則使用3個(gè)兩位共陰數(shù)碼管來分別顯示時(shí)、分、秒,3個(gè)數(shù)碼管的段碼控制端均接在8255的PA端,片選端則通過74LS138接入8255;當(dāng)CPU輸出一個(gè)數(shù)碼管段碼時(shí),所有(6位)數(shù)碼管均收到該段碼,但只有被片選選中的數(shù)碼管才會(huì)顯示該段碼對(duì)應(yīng)的數(shù)值,CPU每隔一段時(shí)間輸出一個(gè)段碼,只要間隔時(shí)間足夠短,由于視覺暫留現(xiàn)象,就可以看到6位數(shù)碼管同時(shí)顯示。

控制部分由走時(shí)/暫停開關(guān)、'時(shí)'設(shè)置按鍵、'分'設(shè)置按鍵、'秒'設(shè)置按鍵組成,分別接入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     ;數(shù)碼管段碼
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

;設(shè)置中斷向量,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,每秒觸發(fā)一次中斷
MOV AL,36H
OUT AD8253CON,AL        ;將方式控制字寫入控制端口
MOV AX,40000        ;計(jì)數(shù)初值40000,輸入頻率50k,定時(shí)時(shí)長0.8秒
OUT AD82530,AL      ;將計(jì)數(shù)初值的低字節(jié)寫入計(jì)數(shù)通道0
MOV AL,AH
OUT AD82530,AL      ;將計(jì)數(shù)初值的高字節(jié)寫入計(jì)數(shù)通道0

L:
CALL    TIME_CHANGE     ;更改時(shí)間
CALL    DISPLAY_TIME        ;顯示時(shí)間
JMP L

TIME_CHANGE:
PUSH    AX
IN  AL,AD8255PC     ;讀取8255的PC端口數(shù)據(jù)
AND AL,0FH      ;高四位清零
CMP AL,06H      ;按下按鍵“秒”
JE  ADD_SECOND
CMP AL,0AH      ;按下按鍵“分”
JE  ADD_MINUTE
CMP AL,0CH      ;按下按鍵“時(shí)”
JE  ADD_HOUR
JMP ADD_NULL

ADD_SECOND:
CALL    INC_SECOND      ;增加“秒”
CALL    DELAY_KEY       ;按鍵延時(shí)消抖
JMP ADD_NULL

ADD_MINUTE:
CALL    INC_MINUTE      ;增加“分”
CALL    DELAY_KEY       ;按鍵延時(shí)消抖
JMP ADD_NULL

ADD_HOUR:
CALL    INC_HOUR        ;增加“時(shí)”
CALL    DELAY_KEY       ;按鍵延時(shí)消抖

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:     ;寫數(shù)碼管的某一位
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:     ;寫“時(shí)”、“分”、“秒”
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
;顯示“時(shí)”
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:       ;中斷處理函數(shù)
CALL    INC_SECOND
IRET

CODE    ENDS
END START

方案原理如下:


原理概況

原理概況

CPU部分

CPU部分

定時(shí)器部分

定時(shí)器部分

8253激勵(lì)源

8253激勵(lì)源

顯示&控制部分

顯示&控制部分

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2021-8-12 17:01 | 顯示全部樓層
好東東,能分享一下仿真代碼工程文件嗎?
回復(fù)

使用道具 舉報(bào)

ID:825513 發(fā)表于 2021-8-13 01:34 | 顯示全部樓層
51hei團(tuán)團(tuán) 發(fā)表于 2021-8-12 17:01
好東東,能分享一下仿真代碼工程文件嗎?

里面有原理仿真和源碼,不過剛才忘了放入.exe,你用源碼編譯鏈接出.exe再導(dǎo)入到仿真就可以了

仿真代碼.zip

22.63 KB, 下載次數(shù): 44, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:884042 發(fā)表于 2021-8-16 18:55 | 顯示全部樓層
請(qǐng)問樓主,8086是什么單片機(jī)啊?沒聽說過
回復(fù)

使用道具 舉報(bào)

ID:825513 發(fā)表于 2021-8-20 23:17 | 顯示全部樓層
xjx51 發(fā)表于 2021-8-16 18:55
請(qǐng)問樓主,8086是什么單片機(jī)��?沒聽說過

8086不是單片機(jī),它是比較純粹的CPU,x86架構(gòu)的開始。國內(nèi)的微機(jī)原理課程大多是以這款CPU為切入點(diǎn)來講解的
回復(fù)

使用道具 舉報(bào)

ID:1105049 發(fā)表于 2023-12-19 19:15 | 顯示全部樓層
請(qǐng)問為什莫代碼運(yùn)行的時(shí)候,我的6個(gè)數(shù)碼管,最后一個(gè)和第一個(gè)變化一樣,第一個(gè)數(shù)碼管顯示的是原本自身的值和最后一個(gè)管的值的重疊
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表