【Proteus/8086】swjtu西南交大微机与接口技术实验:计时器

实验内容:

计时器基本功能:
1)CPU必须用8086
2)计时器最小计时单位为秒。
3)以00:00格式显示计时,前2位表示分钟,后2位表示秒。

4)计时器是正计时方式
5)有暂停、继续计时功能

6)有复位计时功能
7)每次按下暂停键,能显示计时间隔时间

参考书籍:

微机原理与接口技术——基于8086和Proteus仿真(第3版)(作者:顾晖等),p273,13.1电子秒表。若有补充内容,放在评论区。

具体实现的功能描述:

1)CPU 使用 8086

2)计时器最小计时单位为秒。

3)按下 START 键,以正计时方式开始计时。以 00:00 格式在数 码管 L1 上显示计时,前 2 位表示分钟,后 2 位表示秒。

4) 数码管 L1 显示正常计时时间,数码管 L2 显示两次按下暂停 的时间间隔。在正常计时情况下,按下 PAUSE/RESUME 键,计时 器暂停计时,数码管 L1 显示暂停时刻,数码管 L2 显示从暂停 时刻从 0 开始计时的时间,直到再次按下暂停,计时器从暂停 时刻开始继续计时, L1 显示对应的计时时间,数码管 L2 开始 显示从继续计时时刻从 0 开始计时的时间,直到再次按下暂 停,回到前述的暂停情况。

5) 按下 RESET 键,计时器复位,数码管 L1 显示 0000,然后按 下 START 键,可以重新从 0000 开始计时。

电路图:

 电路图的绘制和项目创建可以参看专栏的其他文章。如:【Proteus】绘制简单的电路图-CSDN博客

1.I/O 地址译码电路: 

2. 8253 计时电路:

注意: 这里clk0设为了1khz,数码管显示比较接近1s

 3.8255A 显示及中断电路:

 

 4.总览和器件列表(图的左边)

汇编代码(部分):

A8255 EQU 0000H                  ;用于显示正常计时时间8255A各端口地址
B8255 EQU 0002H
C8255 EQU 0004H
CTR8255 EQU 0006H
AA8255 EQU 0300H                 ;用于显示暂停时间间隔8255A各端口地址
BB8255 EQU 0302H
CC8255 EQU 0304H
CCTR8255 EQU 0306HCH0 EQU 0200H                    ;8253计数器0的端口地址
CTR8253 EQU 0206H                ;8253 控制端口地址
AD245 EQU 0100H                  ;74LS245地址    CODE SEGMENT 'CODE'ASSUME DS:DATA,CS:CODE,SS:SSEG
START: MOV AX,SSEG                       MOV SP,AXCLI                           ;关中断MOV AX,0                      ;设中段向量       MOV ES,AXMOV BX,2*4                    ;NMI为2号中断MOV AX,OFFSET INTR_KEYMOV WORD PTR ES:[BX],AXMOV AX,SEG INTR_KEYMOV WORD PTR ES:[BX+2],AXSTI                           ;开中断MOV AX,DATA                   ;初始化数据段MOV DS,AXMOV AX,DATAMOV ES,AXMOV AL,10001001B               ;8255A初始化MOV DX,CTR8255OUT DX,ALMOV AL,10001001B               ;8255A初始化MOV DX,CCTR8255OUT DX,AL
RUN:CALL RUNNING                   ;循环等待中断JMP RUN    INTR_KEY PROC                      ;中断服务程序PUSH AX                        ;现场保护PUSH BXPUSHFCALL KEY                       ;读取按钮状态TEST AL,01H                    ;检测启动按钮JZ K1TEST AL,02H                    ;检测暂停按钮JZ K2TEST AL,04H                    ;检测复位按钮JZ K3
K1:MOV KEYST,1                    ;按钮标志位置为1JMP FIN
K2:MOV KEYST,2                    ;按钮标志位置为 2INC PAUSEKEY                   ;记录暂停按钮按下次数JMP FIN
K3:MOV KEYST,3                    ;按钮标志位置为3
FIN:POPF                           ;恢复现场POP BXPOP AXIRET
INTR_KEY ENDP  RUNNING PROC                     ;根据当前的中断触发类型,转入不同的显示
AGAIN: CMP KEYST,1JZ T1CMP KEYST,2JZ T2CMP KEYST,3JZ T3JMP E0
T1:MOV AL,0                       ;正常计时和继续计时,暂停时间清零LEA DI,PAUSEBUFMOV CX,4CLDREP STOSBCALL TIME                      ;转入计时JMP E0
T2:TEST PAUSEKEY,1             ;检测暂停按钮按下次数,转入暂停或继续计时JZ T1  CALL PAUSETIME                 ;调用暂停时间计时子程序MOV AL,0                       ;奇数次,把继续计时时间暂存区清零LEA DI,RESUMEBUFMOV CX,4CLDREP STOSBJMP E0
T3:CALL RESET                     ;系统复位
E0:CALL DISP                      ;调用显示子程序CMP KEYST,3JZ OUT2CMP KEYST,1JZ OUT2TEST PAUSEKEY,1 JZ OUT1CALL PAUSEDISP                ;调用暂停计时时间显示子程序JMP OUT2
OUT1:CALL RESUMEDISP              ;调用继续计时时间显示子程序 
OUT2:RET
RUNNING ENDPTIME PROC                         ;计时子程序,按时间进位规则PUSH AXPUSH BXPUSH SIPUSH DILEA SI,TIMEBUF                ;10毫秒MOV AH, [SI]INC AHCMP AH,100JZ S1MOV [SI],AHJMP S5
S1:MOV AH,0                      ;秒MOV [SI],AHMOV AH,[SI+1]INC AHCMP AH,60JZ S2MOV [SI+1],AHJMP S5
S2:MOV AH,0                       ;分MOV [SI+1],AHMOV AH,[SI+2]INC AHCMP AH,60JZ S3MOV [SI+2],AHJMP S5
S3:MOV AH,0                       ;时MOV [SI+2],AHMOV AH,[SI+3]INC AHCMP AH,24JZ S4MOV [SI+3],AH      JMP S5
S4:MOV AL,0LEA DI,TIMEBUFMOV CX,4CLDREP STOSB
S5:CALL DIGIT                      ;将正常计时时间转换为数位值CALL RESUMETIME                 ;从继续计时时刻开始的计时CALL RESUMEDIGIT                ;将继续计时时间转换为数位值CALL DELAY8253                  ;8253计时POP DIPOP SIPOP BXPOP AXRET
TIME ENDP  DIGIT PROC                          ;将时间转换为数位值PUSH AXPUSH BXPUSH CXPUSH SIPUSH DIMOV BL,4                        ;4个时间单位,依次转换LEA DI,LEDBUFLEA SI,TIMEBUF
NEXT: LODSB                           ;从TIMEBUF中依次取出时间值MOV AH,0MOV CL,10                ;除以10,分离出时间的个位和十位,存入 LEDBUFDIV CLXCHG AH,ALSTOSBMOV AL,AHSTOSBDEC BLJNZ NEXTPOP DIPOP SIPOP CXPOP BXPOP AXRET
DIGIT ENDP DISP PROC                            ;显示 LEDBUF 中的值PUSH AXPUSH BXPUSH CXPUSH DXPUSH SILEA BX,LEDTABLEA SI,LEDBUFMOV CX,8MOV AH,7FH
LOOP1: MOV AL,[SI]XLAT                             ;换码,数位值转换成LED显示段码MOV DX,A8255                     ;段码值送8255A端口AOUT DX,ALCMP AH,7FHJZ DIS1CMP AH,0BFHJZ DIS1   MOV AL,AH                        ;LED位选送 8255A端口 BMOV DX,B8255OUT DX,AL
DIS1:    CALL DELAYROR AH,1INC SICALL CLRLED                      ;LED清屏LOOP LOOP1POP SIPOP DXPOP CXPOP BXPOP AXRET
DISP ENDP    CLRLED PROC                           ;清屏子程序PUSH AXPUSH DXMOV AL,0FFHMOV DX,B8255OUT DX,ALPOP DXPOP AXRET
CLRLED ENDP DELAY8253 PROC                       ;8253延时子程序PUSH AXPUSH DXMOV DX,CTR8253                   ;设置8253控制字,计数器0,方式0MOV AL,00010000BOUT DX,ALMOV DX,CH0MOV AL,06HOUT DX,ALMOV DX,AD245
W1:IN AL,DXTEST AL,01H                ;检测8253计时是否结束,计数器0输出高电平JZ W1POP DXPOP AXRET
DELAY8253 ENDP   DELAY PROC                            ;软延时PUSH CXMOV CX,50
WAIT1: LOOP WAIT1POP CXRET
DELAY ENDP  RESET PROC                            ;计数复位子程序,数据缓冲区全部清0PUSH AXPUSH CXPUSH DIMOV AL,0LEA DI,TIMEBUFMOV CX,13CLDREP STOSBMOV AL,0LEA DI,PAUSEBUFMOV CX,4CLDREP STOSBMOV AL,0LEA DI,RESUMEBUFMOV CX,4CLDREP STOSBPOP DIPOP CXPOP AX
RESET ENDP  KEY PROC                             ;读开关子程序MOV DX,C8255IN AL,DXRET
KEY ENDP      

更多(源文件、报告)请见:

西南交大swjtu微机与接口技术实验:计时器源文件与报告资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 2.5 入门学习记录

Vue 2.5 入门学习记录 1. 基础知识Vue 是什么Vue引入方式Vue特点Vue实例中的数据事件方法Vue中的属性绑定和双向绑定Vue中的v-if、v-show、v-fortoDoList制作局部组件&全局组件 2. vue-cli工程3. 工程案例实践使用vue-cli实现todoList及删除某个元素全局样式与局部样式 4. …

CentOS安装Python解释,CentOS设置python虚拟环境,linux设置python虚拟环境

一、安装python解释器 1、创建解释器安装的目录:/usr/local/python39 cd /usr/local mkdir python39 2、下载依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel xz-devel …

IEEE TASLP | 联合语音识别与口音识别的解耦交互多任务学习网络

尽管联合语音识别(ASR)和口音识别(AR)训练已被证明对处理多口音场景有效,但当前的多任务ASR-AR方法忽视了任务之间的粒度差异。细粒度单元(如音素、声韵母)可用于捕获与发音相关的口音特征&…

Certum的ip数字证书

Certum是欧洲第一个通过WebTrust的CA认证机构,几十年来不断发展,旗下的数字证书产品也日益增多,不仅有各种类型的域名数字证书,还有专为公网IP地址准备的DV基础型IP证书。今天就随SSL盾小编了解Certum旗下的DV基础型IP证书。 1.C…

使用RedisCacheWriter#clean在线异步地批量扫描匹配删除缓存数据-spring-data-redis

1.背景 生产环境,某云的某个业务Redis实例,触发内存使用率,连续 3 次 平均值 > 85 %告警。 运维同学告知,看看需要怎么优化或者升级配置?分享了其实例RDB的内存剖析链接。 通过内存剖析详情发现,存在某…

【深入使用】PHP的PDO 基本使用

前言: PDO:数据库抽象层 简介:PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,PDO解决了数据库连接不统一的问题。是PHP 5新加入的一个重大功能 【为什么要使用PDO】? PDO是PHP5新加入的一个重大功能&a…

ansible在ubuntu下的安装和使用

ansible在ubuntu下的安装和使用 本文目录 ansible在ubuntu下的安装和使用安装和配置虚拟机配置安装和验证 简单使用创建 ansible cfg 和 inventory 文件创建剧本并执行使用 ansible vault 加密 安装和配置 中文文档:http://www.ansible.com.cn/docs/intro_installa…

单词反转(字符串)

题目名字 单词反转 题目链接 题意 输入倒序的字符串,要求输出正序的字符串 思路 用while输入,这样当出现输入是空格时自动划分上一个为一个单词然后再次反输出 while循环的条件是当不再输入的时候,因为是字符串,不用getline输入…

力扣:203. 移除链表元素(Python3)

题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 …

芋道前端框架上线之后发现element-ui的icon图标全部乱码

前言 最近发现线上有人反映图标全部是乱码,登录上去看确实乱码,刷新就好最后一顿搜,发现是sass版本不兼容导致的图标乱码问题 解决办法 1.先把sass升级到1.39.0 2.来到vue.config.js文件配置代码-如果是芋道前端框架不用配置自带 css: {lo…

使用Docker部署Nexus Maven私有仓库并结合Cpolar实现远程访问

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具,用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关,可…

Ruckus Wireless Admin 命令执行漏洞复现(CVE-2023-25717)

0x01 产品简介 Ruckus Wireless Admin是ruckuswireless多个路由、硬件设备的后台管理系统。 0x02 漏洞概述 Ruckus Wireless Admin在10.4 及更早版本存在命令执行漏洞。攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限&#xff0c…

Https接口调用问题

使用场景: 因为项目需要爬点接口数据, 接口是https, 在网上找的笔记整理了一下. 仅供参考 1. 调用Https的Get方法 /*** 只需要url** param url* return*/public static String doGetForHTML(String url) {return doGetForHTML(url, null);}/*** param url 请求地址* para…

关于with torch.no_grad:的一些小问题

with torch.no_grad:是截断梯度记录的,新生成的数据的都不记录梯度,但是今天产生了一点小疑惑,如果存在多层函数嵌入,是不是函数内所有的数据都不记录梯度,验证了一下,确实是的。 import torch x torch.r…

Axure之中继器的使用(交互动作reperter属性Item属性)

目录 一.中继器的基本使用 二.中继器的动作(增删改查) 2.1 新增 2.2 删除 2.3 更新行 2.4 效果展示 2.5 模糊查询 三.reperter属性 在Axure中,中继器(Repeater)是一种功能强大的组件,用于创建重复…

Spring Boot学习随笔- 文件上传和下载(在线打开、附件下载、MultipartFile)

学习视频:【编程不良人】2021年SpringBoot最新最全教程 第十二章、文件上传、下载 文件上传 文件上传是指将文件从客户端计算机传输到服务器的过程。 上传思路 前端的上传页面:提交方式必须为post,enctype属性必须为multipart/form-data开发…

C++函数——内联函数、动态内存管理

内联函数 在函数声明或定义时&#xff0c;将inline关键字加在函数返回类型前面就是内联函数。 #include <iostream> using namespace std;inline int add(int x, int y) {return x y; } int main(int argc, const char *argv[]) {int a 10, b 20;int ret add(a, b)…

html行内元素和块级元素的区别?

HTML中的元素可以分为两种类型&#xff1a;行内元素&#xff08;inline&#xff09;和块级元素&#xff08;block&#xff09; 文章目录 什么是行内元素什么是块级元素元素转换行内元素转块级元素块级元素转行内元素 区别总结 什么是行内元素 HTML的行内元素&#xff08;inli…

java 16 练习题:类与方法

文章目录 实例1&#xff1a;使用 this 关键字实现给饼只加一个蛋练习1&#xff1a;设计加油站类和汽车类&#xff0c;加油站提供一个给车加油的方法&#xff0c;参数为剩余汽油数量。每次执行加油方法&#xff0c;汽车的剩余汽油数量都会加 2。练习2&#xff1a;智能手机的默认…

C++ 指定范围内递增初始化一个vector<int> | Python: list(range(31, 90))

通过lambda表达式 std::iota()实现&#xff1a; template <typename Tp> inline void print_vec(const std::vector<Tp>& vec) {fmt::print("[{}]\n", fmt::join(vec, ", ")); }// 相当于Python的lst list(range(31, 90))const std::ve…