汇编语言 emu8086 电子时钟 课程设计

发的第二篇文章,尽管技术不牛,但还是希望给大家一些帮助。
大致讲一下内容,就是微机原理结课的一个课程设计,使用8086模拟器做一个数字时钟。也没有使用什么比较牛的技术,就是不停的用DOS中断(系统函数)去获取系统时钟,然后对获取的数据转换为对应的ACSII值,然后显示。(这里有初始化一个简单的提示信息)
代码如下:
datas segment
STR DB ‘2021/’
STR1 DB ‘present time: ′ S T R 2 D B ′ e x i t : p l e a s e e s c ! ' STR2 DB 'exit:please esc! STR2DBexit:pleaseesc!
datas ends
stacks segment;此处输入堆栈段代码
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks
start:mov ax,datas
mov ds,ax

ready1:mov dh,00h;行数
mov dl,0 ;列数
mov bh,0 ;页数
mov ah,2
int 10h ;确定光标位置,使其居中
mov cx,2000h
mov ah,01h
int 10h ;设置光标类型,隐藏光标

;显示日期2021/    
mov ax,datas
mov ds,ax
LEA bx, str
mov cx,5

llp:mov ah,02h
mov dl,[bx]
inc bx
int 21h
loop llp

;显示月份、日
ready2:
mov ah,2ah
int 21h
mov ax,dx
push ax
pop cx
push cx
xor ax,ax
mov al,ch
mov bl,10
div bl
mov bx,ax
mov dl,bl
add dl,30h
mov ah,02h
int 21h
mov dl,bh
add dl,30h;
int 21h
mov dl,’/’
int 21h

pop cx 
xor ax,ax
mov al,cl
xor bx,bx
mov bl,10
div bl
mov bx,ax
mov dl,bl
add dl,30h
mov ah,02h
int 21h
mov dl,bh
add dl,30h
int 21h

;显示提示词
ready3:
mov dh,08h;行数
mov dl,35 ;列数
mov bh,0 ;页数
mov ah,2
int 10h ;确定光标位置,使其居中
mov cx,2000h
mov ah,01h
int 10h ;设置光标类型,隐藏光标
mov ah,9
LEA dx,STR1
int 21h

mov dh,0ch;行数
mov dl,35 ;列数
mov bh,0  ;页数
mov ah,2
int 10h   ;确定光标位置,使其居中
mov cx,2000h 
mov ah,01h 
int 10h   ;设置光标类型,隐藏光标
mov ah,9    
LEA dx,STR2
int 21h 

ready4:
;打印小时
mov dh,0ah;行数
mov dl,35 ;列数
mov bh,0 ;页数
mov ah,2
int 10h ;确定光标位置,使其居中
mov cx,2000h
mov ah,01h
int 10h ;设置光标类型,隐藏光标
mov ah,2ch
int 21h
;push dx
push cx

;xor dl,dl
pop cx
;push cx
xor ax,ax
;mov ax,ch
mov al,ch    
mov bl,10
div bl
;mov bx,ax
mov dx,ax
;mov dl,bl
add dl,30h
mov ah,02h
int 21h
mov dl,dh
add dl,30h
int 21h
mov dl,':'
int 21h

go:

mov dh,0ah;行数
mov dl,38 ;列数
mov bh,0  ;页数
mov ah,2
int 10h   ;确定光标位置,使其居中
mov cx,2000h 
mov ah,01h 
int 10h   ;设置光标类型,隐藏光标

mov ah,2ch
int 21h
push dx
push cx



;打印分
pop cx
xor ah,ah
mov al,cl
mov bl,10
div bl
;mov bx,ax
mov dx,ax
;mov dl,bl
add dl,30h
mov ah,02h
int 21h
mov dl,dh
add dl,30h
int 21h
mov dl,':'
int 21h

;打印秒
;xor dx,dx
pop cx
xor ax,ax
mov al,ch
mov bl,10
div bl
mov dx,ax
add dl,30h
mov ah,02h
int 21h
mov dl,dh
add dl,30h
int 21h

a1: mov ah,0bh ;调用dos功能0bh检测键盘是否有输入
int 21h
cmp al,00h
jne a2 ;如果有输入,则跳转到a2
jmp go ;如果没有输入,则跳转到go
a2: mov ah, 08h
int 21h ;调用dos功能08h判断键盘输入的字母
cmp al,1bh ;判断键盘是否输入esc
je exit ;如果输入esc跳转到exit
jmp go ;重新跳回开头
exit:mov ah, 4ch
int 21h
codes ends
end start
运行结果如下:
在这里插入图片描述如果在emu8086模拟器上运行时有跳秒的现象请看一下心得。(最后答辩的时候老师解释是模拟器上就这样,用DOSBox就好很多)
一,理论不等于实践。以我们起初的想法,利用cpu的高速性不停的读取系统时钟然后转换,显示时钟理论上我们认为cpu的速度足够快,只要读取系统时钟的时间间隔足够小就可以很准确的显示时钟,可是事实并不如我们猜想的那样。最开始的代码我们希望能够对年,月份,日期,小时,分钟,秒都进行实时显示,可是我们在实现的时候发现循环体内的代码量很大,读取系统时间的时间间隔太长,最后的结果就是年份,月份,日期,小时都能正常显示,因为这些属性的时间跨度大,但是对分钟的显示就没有那么准确了,秒数的显示更是离谱,跳秒的现象严重。后来我们分析原因,尽可能的减小读取系统时钟的时间间隔,可是效果并不明显,后来我们妥协了,我们选择对非重要信息作一次性初始化显示,对重要信息作实时性显示,我们显示时钟的准确度大大提高。
二,如何阅读他人的代码。和很多人一样,我们最开始也是希望能够通过网络参考一些别人的代码,甚至有现成的更好,但是当我们去尝试阅读别人的代码时,就发现读不懂,一方面是自己的知识掌握不牢阅读起来吃力,另一方面是难以静下心来,内心浮躁。最好的是要在内心上接受这段代码,先跟着作者的思路尝试理解作者的代码,不懂得地方可以网上检索一些信息,然后去论证自己思路的可行性。
三,检索信息。网上的信息多而繁,如何快速筛选有用信息就显得很重要了,这个需要自己通过大量的实践总结自己的索引方式,比如收藏一些优质的网站,优秀的博主。四,对开发环境的学习,在实践的过程中我们不仅需要学习编程更要熟悉你所使用的编程软件,因为这有可能让你事半功倍,这点我深有体味,这里不再赘述。以上就是我们小组对这次课程设计的总结和体会吧,我们也确实学习到了很多东西。

  • 8
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
课 程 设 计 任 务 书 "专 业 "自动化 "班 级 " "姓 名 " " "设 计 起 止 日 期 "2013.12.16~2013.12.20 " "设计题目:基于8086CPU的数字时钟设计 " "设计任务(主要技术参数): " "1、利用实验系统上提供的8253和LED数码显示等电路,设计一个电子时钟;" "2、格式如下:6个数码由左向右分别显示为:时、分、秒。 " " " "指导教师评语: " " " " " " " " " " " " " "成绩: 签字: " "年 月 日 " 课程设计说明书 NO.1 "1 引言 " "随着在现代技术进步,电子产品越来越多的在生活中出现,服务于人们的生活,从" "简单的电子手表,到人人必备的手机,我们都可以看到电子时钟的身影。 " "本系统就是基于8086系统,配合8255和8253芯片开发的一个数字电子时钟,有显示" "时分秒的功能。 " "2 设计方案论证 " "2.1一秒定时方案的选择 " "运用8253产生周期为2秒的方波,通过8255芯片的A、B、C口读取电平高低,判断电" "平变化,进而判断1秒延时是否已经到达,这种方法可以写成子程序,执行返回就 " "近似于1秒延时。 " "2.2时钟时分秒的处理方式选择 " "时钟的时分秒的处理方法实际上时数学逻辑问题。在编辑过程中我想到两种解决方" "案。 " "方案一:将时分秒当做三个数据进行处理,设置三个数据空间,作为是分秒的数据" "缓存区,再将缓存区的内容转换成显示数据。每次延时之后判断"秒"是否应该向" " "分"进位,"分"是否应该向"时"进位,"时"是否已经超过24.这个过程理论上可以实" "现,但是逻辑判断较为繁琐。 " "方案二;将时分秒分成六位,放在显示数据缓存区里,每次一秒延时之后判断是否" "向高位进一,若还不进一,则跳回最低位,再次进行一秒延时;由于秒和分都是60" "进制,处理方法一样,而"时"是24进制,应该进行额外处理。 " "2.3八段数码管动态显示 " "对于8279八段数码管的显示需要入码位和段码,因此采用74LS373作为位码输出端 " "口,8255的A、B、C口作为段码输出口。通过CPU输出数据进行位码选择,经74LS37" "3 " 沈 阳 大 学 课程设计说明书 NO.2 " " "输出到位码输入口;设置到六位数据缓存区,经过换码可以取得相应的段码输出到" "段码 " "输入口,并简单延时,就可以显示了。 " "2.4系统原理 " "通过并行接口芯片8255和8086计算机的硬件相连,以及通过8253一秒延时的方法," "来实现适中的计时功能。 " "8086工作在最小模式,5255芯片片选端接到CPU的片选段CS0,A口组委输出口,B口" "作为输入口,B口的第一位用于检测电平;8253片选端接到CPU的片选段CS2,用于 " "锁存位码。一秒计时和功能有软件控制进行。 " "3 系统硬件设计 " "3.1 8086简介 " "Intel8086是16位的微处理器(其内部总线为16位,外部总线为8位,故称为准16位" "微处理器),它采用HMOS工艺40条引脚封装。8086工作时使用5V电源,时钟频率5M" "Hz(8086-1为10MHz,8086-2为8MHz)它有20根地址线,故可寻址的内存空间为1MB" "【2】。 " "(1)8086的主要特性 " "Intel8086/8088CPU是Intel公司推出的高性能的微处理器,具体如下主要特性: " "(a)8086CPU数据总线为16位,8088CUP数据总线为8位。 " "(b)地址总线都是20位,低16位用于数据总线复用,可直接寻址为1MB的存储空间。" "(c)有16位的端口地址,可以寻址64KB的I/O端口。 " "(d)有99条基本指令,指令功能强大。 " "(e)有9种基本寻址方式。 " "(f)可以处理内部和外部中断,外部中断源多达256个。 " "(g)兼容性好,8086、8085在源程序一级兼容。 " 沈 阳 大 学 课程设计说明书 NO.3 " " "(h)8086/8088标准主频为5MHz,8086/8088-2主频为8MH【3】。 " "(i)支持单处理器或多处理器系统工作。 " "(2)8086CPU寄存器结构 " "8086CPU中有14个16位的寄存器,其中有4个16位的通用寄存器,2个16位指针寄存器," "2个16位变址寄存器,1个16位指令指针及1个16位标志寄存器【8】。 " "通用寄存器包括累加器AX,基址寄存器BX,计数寄存器CX,数据寄存器DX四个寄存" "器,位于CPU的EU中,每个数据寄存器可存放16位操作数, 也可拆成两个8位寄存 " "器,用来存放8位操作数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值