2秒表.docx

上传人:b****7 文档编号:9222644 上传时间:2023-02-03 格式:DOCX 页数:21 大小:135.02KB
下载 相关 举报
2秒表.docx_第1页
第1页 / 共21页
2秒表.docx_第2页
第2页 / 共21页
2秒表.docx_第3页
第3页 / 共21页
2秒表.docx_第4页
第4页 / 共21页
2秒表.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

2秒表.docx

《2秒表.docx》由会员分享,可在线阅读,更多相关《2秒表.docx(21页珍藏版)》请在冰豆网上搜索。

2秒表.docx

2秒表

目录

摘要------------------------------------------------------------3

一、设计内容与要求----------------------------------------------3

二、设计原理---------------------------------------------------3

2.1原理概述-------------------------------------------------3

2.2延时原理-------------------------------------------------3

2.3显示字符及字符串原理-------------------------------------3

2.4压缩BCD转为ASCII原理-----------------------------------4

2.5动态扫描键盘原理-----------------------------------------4

三、程序流程图-------------------------------------------------4

3.1主程序流程图---------------------------------------------4

3.2压缩BCD转ASCII码子程序流程图---------------------------6

3.3延时子程序流程图-----------------------------------------7

四、程序代码及效果图-------------------------------------------8

4.1程序代码------------------------------------------------8

4.2效果图--------------------------------------------------13

4.3效果说明------------------------------------------------13

五、程序调试--------------------------------------------------14

5.1取键值部分程序调试--------------------------------------14

5.2延时程序调试--------------------------------------------14

5.3效果图形调试--------------------------------------------14

5.4加颜色调试-----------------------------------------------14

5.5总体调试-------------------------------------------------14

六、设计心得--------------------------------------------------14

七、参考资料----------------------------------------------------15

摘要

本设计用软件实现了电子秒表的功能。

在运用汇编语言这个工具下在PC机上实现的,并且在实现基本功能的基础上我们为秒表加框,做了修饰,并在其下方动态显示“STOPWATCH!

”字样。

启动停止等按键数字采用彩色字,两侧边框着色,这样使得秒表显得美观。

关键词:

电子秒表(stopwatch),8086,汇编语言

一、设计内容与要求

设计要求:

1.具有秒和百分之一秒计时,并显示在屏幕中央

2.秒表具有启/停

3.秒表具有复位功能

在此基础上,我们为秒表加框,加色,动态显示“STOPWATCH!

”,

二、设计原理

2.1原理概述

在main程序控制的前提下,我们用INT16H的1号功能和0号功能实现键值的输入,通过调用延时程序实现百分之一秒的定时,通过INT10H的2号功能实现光标定位,通过INT21H的2号功能实现字符的输出,通过调用INT21H的9号功能实现字符串的输出。

2.2延时原理

计算机在执行指令时,各种操作都按照指令执行,但在想顺序控制器那样由计算机发出指令控制外部设备时,由于外部设备所具有的机械惯性或其他原因,需要在计算机发出命令后有规律的延迟或等待一段时间。

这类延迟可以用硬件演示完成,但在本次设计中,没有硬件定时器的支持,只能靠软件实现延时,即通过可控制的循环来占用CPU的时间来实现延时,这种延时方法不够精确,且会占用大量的CPU资源,使CPU的效率降低,因此,编制延时程序应尽量采用较少的指令,节约存储器。

我们发现运行秒表程序后,PC机的速度明显变慢。

本设计的技术参数不可能与实际的秒表相比,延时函数名为TIME,是长延时程序。

运用内外两层循环,外循环由AX中的数值来控制,内循环用CX中的数值来控制。

实现不同延时的控制,AX和CX值需要通过反复比较调试确定,我们确定AX的值为0093H,CX的值为0FFFCH。

2.3显示字符及字符串原理

我们显示字符和字符串的子程序没有使用课本上的函数,而是运用老师刚讲的宏定义来实现,由于我们还要显示图形,所以这样的做法显得必要而且更恰当。

我们的设计中的显示均先定位光标后显示完成的。

定位光标用INT10H的2号功能,DH中存的中行号,DL中存的是列号,BH中存页号。

整个屏幕有24行79列,对应的16进制为:

左上角为(0,0),右下角为(18,4F)。

显示彩色字符用INT10H的9号功能,AL中存放要显示字符的ASCII码。

显示字符串用INT21H的9号功能,DX中存要显示的字符串的偏移地址。

由于要显示的字符和字符串较多和出于程序的精简考虑,我们把显示字符定义为DISCHAR宏,显示字符串定义为DISSTRING宏。

2.4压缩BCD转为ASCII原理

本段程序是参考教材的。

先将压缩BCD码的高4位取出,右移四位后,与30H相或,存到相应的内在单元。

然后将低4位取出,与30H相或,存到下一内存单元。

2.5显示字符及字符串原理

由于INT16H的1号功能只能读键盘缓冲区从而判断有无键值输入,无自动清缓冲区功能,我们运用INT16H的1号和0号功能来实现动态扫描键盘。

由1号功能判断有无键按下,如果有键按下,则ZF=0,跳转到相应的位置调用0号功能来读键值,相应键值的ASCII码被存的AL中。

如果没有键按下,刚继续循环。

从而实现动态扫描键盘。

三、程序流程图

3.1主程序流程图

主程序流程图如下:

3.2压缩BCD转ASCII码子程序流程图

压缩BCD转ASCII码子程序流程图如下:

3.3延时子程序流程图

延时子程序流程图如下:

四、程序代码及效果图

4.1程序代码

DATASEGMENT;数据段

DIS_BUFDB'?

','?

',':

','?

','?

','.','?

','?

','?

','?

','?

',?

;显示缓冲区,最后一字节用来存‘$’

SOPDB1;运行标志位(STARTORPAUSE)

;0为运行,1为停止

FUN1DB':

START/PAUSE$'

FUN2DB':

RESET$'

FUN3DB':

EXIT$'

NUM1DB'1'

NUM2DB'0'

NUM3DB'2'

DESIDB'Designby:

$'

CHYDB'Ocean&GuanShihu$'

DATDB'Date:

22th,Dec,2008$'

WORDSDB'Stopwatch!

$'

SPACEDB'$'

LINERDB'-----------------------$'

 

DATAENDS

STASEGMENTPARASTACK'STACK'

STAPNDB100DUP(?

TOPEQULENGTHSTAPN

STAENDS

CODESEGMENT

MAINPROCFAR

ASSUMECS:

CODE,DS:

DATA,SS:

STA

MOVAX,DATA

MOVDS,AX

MOVAX,STA

MOVSS,AX

MOVAX,TOP

MOVSP,AX

XORCL,CL;CL中存放分清零

XORDH,DH;DH中存放秒清零

XORDL,DL;DL中存放百分之一秒清零

DISCHARMACROX,Y;显示彩色字符用的宏,X的位置,Y是ASCII

MOVAH,02;中断10H的2号置光标位功能

MOVBH,0

MOVDX,X;定位,DH是行,DL是列

INT10H

MOVAH,9;10H的9号功能

MOVAL,Y

MOVBH,0

MOVBL,0CAH;颜色

MOVCX,1

INT10H

ENDM

DISSTRINGMACROX,Y;显示字符串的宏

MOVAH,02

XORBH,BH

MOVDX,X;定位,DH是行,DL是列

INT10H

MOVDX,OFFSETY;显示字符串

MOVAH,09H

INT21H

ENDM

PUSHAX

PUSHDX

DISSTRING111EH,WORDS

DISSTRING091BH,LINER;显示边框

DISSTRING0F1BH,LINER

DISCHAR0A1BH,'-'

DISCHAR0B1AH,'-'

DISCHAR0C19H,'-'

DISCHAR0D1AH,'-'

DISCHAR0E1BH,'-'

DISCHAR0A33H,'-'

DISCHAR0B34H,'-'

DISCHAR0C35H,'-'

DISCHAR0D34H,'-'

DISCHAR0E33H,'-';显示边框结束

POPDX

POPAX

GET_CHAR:

MOVAH,1;扫描键盘,检测是否有键按下

INT16H

JNZNEXT;有则跳到NEXT

MOVAL,[SOP];没有键按下,则判断[SOP]

CMPAL,1

JNESTART;[SOP]中的内容是0就开始,1就暂停

JMPPAUSE

NEXT:

MOVAH,0

INT16H

CMPAL,'1'

JNERESET_TEST

MOVAL,[SOP];取到的是1,01与SOP的内容异或存放

XORAL,01H

MOV[SOP],AL

CMPAL,1;AL中的内容是0就开始,1就暂停

JNESTART

JMPPAUSE

RESET_TEST:

CMPAL,'0';判断是按下的是否是0

JNEEXIT_TEST

RESET:

XORCX,CX;复位

XORDX,DX

CMP[SOP],0;判断此时状态:

运行还是暂停

JNENEXT1

MOV[SOP],1

NEXT1:

JMPDISPY

EXIT_TEST:

CMPAL,'2';检测是否是2

JNEDISPY

EXIT:

MOVAH,4CH;退出

INT21H

PAUSE:

JMPDISPY;暂停

START:

CALLTIME;运行

MOVAL,DL;百分之一秒加一

ADDAL,1

DAA;压缩BCD调整

MOVDL,AL;判断是否到一秒

JNCDISPY

PUSHAX

PUSHDX

TESTDH,01H

JEWOR

DISSTRING111EH,SPACE

DISSTRING0F1BH,LINER

JMPDISSPACE

WOR:

DISSTRING111EH,WORDS;显示字符串STOPWATCH

DISSTRING0F1BH,SPACE

DISSPACE:

POPDX

POPAX

MOVDL,0

MOVAL,DH

ADDAL,01H

DAA

MOVDH,AL

CMPAL,59H;判断是否到一分

JNADISPY

MOVDH,0

MOVAL,CL

ADDAL,01H

DAA

MOVCL,AL

CMPAL,59H;判断是否到一小时

JNADISPY

MOVCL,0

DISPY:

;显示,将各位数据转换为ASCII

PUSHAX

PUSHBX

PUSHCX

LEABX,DIS_BUF;取显示缓冲区偏移地址

MOVAL,CL

CALLTRAN2

INCBX

INCBX

MOVAL,DH

CALLTRAN2

INCBX

INCBX

MOVAL,DL

CALLTRAN2

INCBX

MOVAL,'$';结束符

MOV[BX],AL;定位光标至屏幕中央

PUSHDX

DISSTRING0305H,FUN1;显示字符串:

START/PAUSE

DISSTRING0323H,FUN2;显示字符串:

reset

DISSTRING0343H,FUN3;显示字符串:

quit

DISSTRING143AH,DESI;显示字符串:

Designby

DISSTRING153AH,CHY;显示字符串:

chy

DISSTRING163AH,DAT;显示字符串:

date

DISCHAR0304H,NUM1;显示数字

DISCHAR0322H,NUM2

DISCHAR0342H,NUM3

DISSTRING0C23H,DIS_BUF;显示字符串,计时时间

POPDX

POPCX

POPBX

POPAX

JMPGET_CHAR

MAINENDP;主函数结束

TRAN2PROC;压缩BCD转为ASCII子程序

PUSHCX

MOVCL,AL

SHRAL,1

SHRAL,1

SHRAL,1

SHRAL,1

ORAL,30H

MOV[BX],AL

INCBX

MOVAL,CL

ANDAL,0FH

ORAL,30H

MOV[BX],AL

POPCX

RET

TRAN2ENDP

TIMEPROC;延时子程序

PUSHCX

PUSHAX

MOVAX,00FFH;使用循环嵌套,AX控制外循环,CX控制内循环

INDELAY:

MOVCX,0FFFFH;实现精确定时

OUTDELAY:

DECCX

JNZOUTDELAY

DECAX

JNZINDELAY

POPAX

POPCX

RET

TIMEENDP

CODEENDS;代码段结束

ENDMAIN

4.2效果图

程序的实际效果图如下:

4.3效果说明

◆屏幕上边是相关的使用说明,其中:

1键实现开始/暂停功能,

0键实现复位功能,

2键实现退出功能。

◆秒表现是在框中央。

◆右下角是设计成员信息及设计日期。

◆中央下边是计时过程中随秒显示的秒表名称,启动前显示,启动后每隔一秒显示一次。

◆下边边框同样启动时显示,启动后每个一秒显示一次,而且和秒表名称不同时显示。

◆数字0,1,2和两侧边框彩色效果,生动立体。

五、程序调试

我们是使用emue8086这个软件来做的调试,这个软件是可视化的调试工具,比DEBUG的功能强大得多,而且是可视化界面,使用非常方便。

5.1取键值部分程序调试

这部分可以说是整个工程的关键,开始时,使INT21H的有关功能但不能实现动态扫描。

光标不动。

通过上网查资料,参考有关的实验课教程,才尝试使用INT16H的有关功能,我们试验了很多次才成功用到0号和1号功能配合完成这一功能。

5.2延时程序调试

延时程序由于不同的CPU的时钟频率不同而需要对相应的AX和CX作修改。

我们通过修改延时程序中AX和CX的值,与秒表时间相对比,不断改正,尽量减少误差。

这一部分工作比较简单,但比较机械,需要耐心。

经过耐心的调试,最终我们秒表的误差被控制在0.1秒之内。

5.3效果图形调试

效果图的其实是很伟大的工程,开始想了很多复杂的图案,后来发现实现很困难。

我们知道屏幕是有每个点坐标组成,所以我们想到了用坐标纸描点就坐标的方法。

先在坐标纸上画出图形,然后把每个点要显示的符号和坐标提取出来。

在程序中用宏定义了的函数实现,例如,显示上边框,由于是字符串所以使用DISSTRING实现,具体:

DISSTRING091BH,LINER。

5.4加颜色调试

起初我们是没有打算用宏定义的,因为当时老师还没有讲到,更改颜色总是光标不扫描,或者计时部分显示会有错误,后来发现必要的现场保护很重要,而且如果用了宏,就不用每次显示字符都先写一遍一样的程序段,很方便。

在我们程序中除了用宏来显示字符外,还用它来显示字符串。

5.5总体调试

总体调试可是花不少工夫,需要耐心细致的检查,调试,当程序编译链接都通过时,显示时却分和1/100秒同时跳动,有经过相当长的时间,终于发现是cx没有保护,这让我也深刻体会大保护的重要性。

这一点很重要。

六、设计体会

在拿到课程设计任务后,首先有种无从下手的感觉,但经过查阅资料后,才发现原来不像想象种的那么难,关键是将整个程序模块化。

延时模块,计时模块,

转换模块,然后就是画流程图,我们大约用了两天的时间来研究流程图。

再下来就是编写修改程序了。

写程序时,我认为关键是认真和大局意识,知道自己在做哪部,需要那些子程序,需要怎样编写等等。

我们首先编写的是计时模块,这个模块中逻辑复杂,

设计过程中,不时翻阅课本,也为我们在实践中能更好的熟悉课本,学以致用。

程序中的延时,ASCII转换等都是参照现成的程序,但是显示是运用了宏定义,编制程序花费了一定的时间,尤其是构思上。

而后经过几天的努力,程序编出来了。

调试的过程更是比编写的时候更需要花时间,需要更大的耐心。

特别是显色部分,我们从图书馆借的书上有关这方面的内容,但是仅仅是INT10的功能号和入口参数,把这个加到实际程序困难也是不小,这让我认识到从理论到实践还是有很大的距离的,需要更多的努力。

经过几个昼夜的奋战,程序终于可以准确的运行了,那一刻的喜悦真是谁有谁知道啊。

经过这次课程设计,让我有一次深刻体会到了集体的力量大。

我们小组两成员相互合作,相互配合终于做出了这个设计,学到了很多东西。

对子程序的调用也有了更深刻的理解,他会使程序看起来更有模块的感觉。

再者就是应用了宏定义来显示字符和字符串,使程序变得更简洁。

设计过程中要注意分工,不能一个人独干,负责事倍功半。

在设计中同组者陈海洋同学主要负责延时模块和转换模块,调试时我们一起完成。

他高效的按时完成工作是我们成功的重要保证。

当然这次设计还有一些遗憾,本打算将闪动的内容着色,但INT10的功能只有单个字符着色,我们尝试用循环来完成字符串的着色,但最终没有成功。

课下,我们会再好好琢磨一下的。

总之,这次设计报告,让我受益匪浅!

七、参考资料

《Intel8086/8088系列微型计算机原理及接口技术》,杨志坚主编,中国电力出版社,2003年9月

《微型计算机原理》,张荣祥,山东工业大学出版社

《汇编语言程序设计》,齐志儒,高福祥主编,东北大学出版社

另外也参考了有关网站的资料,不再一一列举。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1