8086 8253 proteus仿真實驗


實驗內容

電路圖

計數初值

已知\(f_{clk0}=100khz\),所以\(T_{clk0}=\frac{1}{f_{clk0}}=\frac{1}{100khz}=10^{-5}s\)
因為通道0的\(out0\)和通道2的\(clk2\)連在一起,所以可得\(T_{out0}=T_{clk2}\)
在8253中,有\(T_{out}=N*T_{clk}(N為計數初值)\)式子成立
然后題目要求\(T_{out2}=1s\),根據上面式子可得
\(T_{out2}=T_{clk2}*N_2=T_{out0}*N_2=T_{clk0}*N_0*N_2=10^{-5}*N_0*N_2=1s\)
\(N_0*N_2=10^5\)
隨便取值使得式子成立,例如
\(\begin{cases} N_0=200\\ N_2=500 \end{cases}\) \(\begin{cases} N_0=250\\ N_2=400 \end{cases}\)
最后要注意匯編語言數值最大就16位,所以別取什么100000和1的組合

關於8523的地址


根據電路圖可知道\(\overline{IO2}\)與8253相連


然后查看74HC154的真值表,可以得出
\(\overline{IO2}:A_{12}A_{11}A_{10}A_{9}=0010\)


8523的\(A_0和A_1\),看電路圖可以發現,地址線\(A_2\)接在8523的\(A_1\),地址線\(A_1\)接在8523的\(A_0\),根據上面的表格,可得
計數器0地址:\(A_{2}A_{1}=00\)
計數器1地址:\(A_{2}A_{1}=01\)
計數器2地址:\(A_{2}A_{1}=10\)
控制端口地址:\(A_{2}A_{1}=11\)

因此,關於8253的地址,為討論方便,設其他地址線都為0,畢竟對輸出沒什么影響
計數器0端口地址:\(A_{19}-A_{0}=0000\ 0000\ 0100\ 0000\ 0000B=400H\)
計數器1端口地址:\(A_{19}-A_{0}=0000\ 0000\ 0100\ 0000\ 0010B=402H\)
計數器2端口地址:\(A_{19}-A_{0}=0000\ 0000\ 0100\ 0000\ 0100B=404H\)
控制端口地址:\(A_{19}-A_{0}=0000\ 0000\ 0100\ 0000\ 0110B=406H\)

關於燈的地址

看電路圖可以發現\(\overline{IO1}\)與燈的相關電路連接
查看74HC154的真值表,得到
\(\overline{IO1}:A_{12}A_{11}A_{10}A_{9}=0001\)
然后和燈的地址相關的只有地址線\(A_0\),因為連接的是或非門,只有當輸入全為0時輸出為1,所以取地址線\(A_0=0\),同樣的,可以設其他地址線都為0
因此,燈的地址:\(A_{19}-A_{0}=0000\ 0000\ 0010\ 0000\ 0000B=200H\)

代碼內容

在上面的步驟計算完后,就可以開始寫代碼

DATA SEGMENT
    ;燈的地址及初始狀態
    LIGHT_ADD EQU 200H;燈的地址
    LIGHT_STATUS DB 11111110B;共有8個燈,1表示關,0表示開,通過循環左移ROL實現燈的狀態變換
    ;8253的地址
    PORT0 EQU 400H;計數器0端口地址
    PORT2 EQU 404H;計數器2端口地址
    PORT3 EQU 406H;控制端口地址
    ;控制方式字
    CONTROL0 EQU 00010110B;計數器0 只讀寫低字節 方式3 二進制
    CONTROL2 EQU 10110000B;計數器2 先讀寫低字節后讀寫高字節 方式0 二進制
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
BEGIN:
    MOV AX,DATA
    MOV DS,AX
    
;設置2號中斷向量
NMI_INIT:
    PUSH ES
    XOR AX,AX
    MOV ES,AX         
    MOV AL,02H
    XOR AH,AH
    SHL AX,1
    SHL AX,1
    MOV SI,AX
    MOV AX,OFFSET NMI_SERVICE
    MOV ES:[SI],AX
    INC SI
    INC SI
    MOV BX,CS
    MOV ES:[SI],BX
    POP ES
    
    ;8253通道0初始化
    ;寫入方式控制字
    MOV DX,PORT3
    MOV AL,CONTROL0
    OUT DX,AL
    ;計數器0寫入計數初值
    MOV DX,PORT0
    MOV AL,11001000B;十進制200
    OUT DX,AL

    ;8253通道2初始化
    ;寫入方式控制字
    MOV DX,PORT3
    MOV AL,CONTROL2
    OUT DX,AL
    ;計數器2寫入計數初值
    MOV DX,PORT2
    MOV AX,0000000111110100B;十進制500
    OUT DX,AL;寫入低字節計數初值
    MOV AL,AH;將高字節的數字賦值給低字節
    OUT DX,AL;寫入高字節計數初值

    ;點亮第一個LED燈
    MOV DX,LIGHT_ADD
    MOV AL,LIGHT_STATUS
    OUT DX,AL
    
    ;等待中斷
    JMP $

    ;程序退出
    MOV AH,4CH
    INT 21H

;中斷服務程序
NMI_SERVICE PROC FAR
    ;點亮下一個led燈
     MOV DX,LIGHT_ADD
     MOV AL,LIGHT_STATUS
     ROL AL,1;循環左移
     OUT DX,AL
     MOV LIGHT_STATUS,AL;更新LIGHT_STATUS的值
     
     ;通道2送計數初值,再次啟動計數
     ;8253通道2初始化
     ;寫入方式控制字
     MOV DX,PORT3
     MOV AL,CONTROL2
     OUT DX,AL
    
     MOV DX,PORT2
     MOV AX,0000000111110100B;十進制500
     OUT DX,AL;寫入低字節計數初值
     MOV AL,AH
     OUT DX,AL;寫入高字節計數初值
     
     IRET;中斷返回
NMI_SERVICE ENDP
    
CODE ENDS
END BEGIN


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM