8086 8253 proteus仿真实验
阅读原文时间:2023年07月13日阅读:1

目录

实验内容

电路图

计数初值

已知\(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