实验内容

电路图

计数初值

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

8086 8253 proteus仿真实验的更多相关文章

  1. 8086 8255A proteus仿真实验

    目录 实验内容 电路图 电路分析 代码 实验内容 数码管循环显示0123456789abcdef- 电路图 电路分析 端口地址和控制字地址主要看电路图,片选信号由译码器的\(\overline{IO1 ...

  2. Proteus 仿真运算放大器出现 GMIN 问题

    Proteus 仿真运算放大器出现 GMIN 问题 为了仿真一个反相运算放大器,在仿真时出现 GMIN 问题,将 后面的 4.7UF 去掉就可以正常仿真. 初步检查是因为输入频率太低,输入时我用的是 ...

  3. proteus仿真 引脚显示电平变化但不能显示波形

    proteus仿真 引脚显示电平变化但不能显示波形 原来是没有选择通道问题,proteus默认优先使用A通道才会显示波形,如果优先使用B,C,D通道,需要选择...

  4. MATLAB基本使用及SIMULINK建模仿真实验

    MATLAB基本使用及SIMULINK建模仿真实验 这是我总结的操作方法: 1 )  M脚本文件的编写 1.新建M-file: 2.输入指令: 3.保存(注意:保存路径需要与工作路径一致) 2 )在S ...

  5. Proteus仿真_01、 8086 IO译码仿真

    最近在学习一些微机原理与接口技术方面的知识. 参考书籍<微机原理与接口技术---基于8086Proteus仿真> 顾晖 梁惺彦 编著 实验一.利用8086 芯片来实现对I/O设备的读取和控 ...

  6. 共享式以太网与交换式以太网的性能比较(OPNET网络仿真实验)

      一.实验目的 比较共享式以太网和交换式以太网在不同网络规模下的性能. 二.实验方法 使用opnet来创建和模拟网络拓扑,并运行分析其性能. 三.实验内容 3.1   实验设置(网络拓扑.参数设置. ...

  7. 【iCore1S 双核心板_FPGA】例程十一:Modelsim仿真实验

    实验现象: 通过仿真波形,分析输入与输出的关系,可以清晰的看到所添加信号波形的变化与程序所写的一致. 核心代码: module modelsim( input CLK_12M, output FPGA ...

  8. Multisim-74LS08\74LS02\74LS86逻辑功能仿真实验

    一. 实验目的 了解TTL门电路的外观封装.引脚分布和使用方法. 掌握数字电路试验台.万用表和示波器的使用方法. 掌握TTL与门.或非门和异或门的逻辑功能. 认识门电路对信号的控制作用. 二.实验内容 ...

  9. 【iCore3 双核心板_FPGA】例程十二:Modelsim仿真实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1bnQEldl iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

随机推荐

  1. XSS跨站脚本攻击学习笔记(pikachu)

    颓废了几天,该好好努力了. XSS概述 XSS漏洞是web漏洞中危害较大的漏洞,是一种发生在web前端的漏洞,所以危害的对象也主要是前端用户,XSS可以用来进行钓鱼攻击,前端js挖矿,获取用户cook ...

  2. C++ Windows - How to get process path from its PID

    出处 https://stackoverflow.com/questions/1933113/c-windows-how-to-get-process-path-from-its-pid 注意质疑(我 ...

  3. Window+Protobuf使用说明

    Window+Protobuf使用说明 C++WindowCmakeProtocbuf 介绍 起因 由于项目中要用到二进制存储数据,之前使用的方式是按照字节数依次将数据写入字节流中, 但是这样做起来做 ...

  4. Scala教程之:可扩展的scala

    文章目录 隐式类 限制条件 字符串插值 s 字符串插值器 f 插值器 raw 插值器 自定义插值器 Scala是扩展的,Scala提供了一种独特的语言机制来实现这种功能: 隐式类: 允许给已有的类型添 ...

  5. (转)ATOM介绍和使用

    一,Atom介绍 Atom 是 Github 开源的文本编辑器,这个编辑器完全是使用Web技术构建的(基于Node-Webkit).启动速度快,提供很多常用功能的插件和主题,可以说Atom已经足以胜任 ...

  6. 【Linux常见命令】paste命令

    paste - merge lines of files paste 命令用于合并文件的列. paste 指令会把每个文件以列对列的方式,一列列地加以合并. 语法: paste [OPTION]... ...

  7. stl的stack在开发中的应用

    栈有后进先出特点,我们可以用它来暂时保存数据,在画板开发中,我用到了栈来保存用户的每一步操作,当用户点击撤销时可以把图像从栈里面取出,然后恢复.浏览器的前进和后退也是这个原理,只是它保存的是网页罢了. ...

  8. AWS访问慢的原因分析及解决方案

    中国区的用户在访问海外AWS服务器的时候会遇到访问很慢的情况,那如何快速访问海外AWS服务器,今天和大家一起聊一下这个话题. 首先,为什么中国的用户访问海外AWS会变慢? 我总结来下大概有以下几方面的 ...

  9. C++编程入门--No.6

    题目:用*号输出字母C的图案. 程序分析:可先用'*'号在纸上写出字母C,再分行输出. #include <bits/stdc++.h> using namespace std; int ...

  10. USACO Training Section 1.2 挤牛奶Milking Cows

    题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...