微机原理课程设计电子钟.docx

上传人:b****6 文档编号:4334150 上传时间:2022-11-29 格式:DOCX 页数:27 大小:96.95KB
下载 相关 举报
微机原理课程设计电子钟.docx_第1页
第1页 / 共27页
微机原理课程设计电子钟.docx_第2页
第2页 / 共27页
微机原理课程设计电子钟.docx_第3页
第3页 / 共27页
微机原理课程设计电子钟.docx_第4页
第4页 / 共27页
微机原理课程设计电子钟.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

微机原理课程设计电子钟.docx

《微机原理课程设计电子钟.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计电子钟.docx(27页珍藏版)》请在冰豆网上搜索。

微机原理课程设计电子钟.docx

微机原理课程设计电子钟

摘要

汇编语言是面向机器的程序设计语言。

在汇编语言中,用助记符代替操作码,用地址符号或标号代替地址码。

这样用符号代替机器语言的二进制代码,就把机器语言变成了汇编语言。

汇编语言能够最大限度的发挥硬件的性能。

本次课程设计我做的是计算机时钟模拟显示程序的设计,要求有1.显示位置:

屏幕中央;2.日期显示格式"时:

分:

秒";3.12/24时制可调;4.在显示屏上显示提示语“CURRENTTIMEIS:

”和当前时间。

在这次课程设计中我加入了整点和半点报时功能。

使得程序更加完善。

关键字:

汇编语言电子钟DOS系统

目录

1设计思路1

1.1设计任务及要求1

1.2设计原理1

1.3程序流程图2

2软件设计4

2.112/24时制程序设计4

2.2时钟起始时间的设置5

2.3延时程序设计6

2.4时间显示程序设计7

2.5半点、整点报时9

3调试过程和运行结果分析10

3.1调试过程10

3.2运行结果显示10

3.3所遇到的问题与解决14

3.4结果分析17

4.心得体会18

参考文献19

附录源程序:

20

电子钟

1设计思路

1.1设计任务及要求

(1)使用汇编语言设计一个运行于计算机的时钟模拟显示软件,软件应实现模拟显示时钟。

(2)根据任务书的要求,可知需要设计的计算机时钟模拟显示程序是基于汇编语言的WINDOWS应用程序设计,程序运行成功后,页面出现数字式的时钟。

具体过程如下首先界面中间出现“TIMESYSTEMIS:

”提示输入12/24时制。

输入以后会出现“CURRENTTIMEIS:

”提示输入初值时间其格式为:

时(XX):

分(XX):

秒(XX)。

接着就会在界面出现所设的初值开始计时其输出格式为XX:

XX:

XX。

并且到半点或整点会报时。

此模拟时钟外观简洁明了,功能和实际运用到的时钟的基本功能一样,用起来非常方便、快捷。

1.2设计原理

1.12/24时制的设置

调用DOS操作系统模块1,输入12/24时制的第一位即高位,再调用DOS操作系统模块1输入12/24时制的第二位即低位。

然后将输入的两个ASCII码值转换为压缩BCD码存入定义的变量X中,用于与12H比较并跳转到相应进制显示的程序中。

2.时钟起始时间的设置

先调用设置光标子程序和清除屏幕子程序,调用DOS操作系统模块9,在显示屏上显示提示符“CURRENTTIMEIS:

”,再调用DOS操作系统模块10,提示要输入时钟的起始时间,输入时间的格式是“时(XX):

分(XX):

秒(XX)”。

输入的时间以字符串形式放在已定义的存储器缓冲区,继而调用TRAN1和MUL10子程序,将存放在存储器缓冲区的ASCII字符转换成压缩BCD码,并将时、分、秒的值放置在寄存器CH、DH、DL中。

3.延时程序

调用TIME延时1S子程序(并未精确计算),累加到存放秒值的寄存器DL中,并进行十进制调整。

在累加的过程中,不断地对时、分、秒进行比较,秒不能等于60,分不能等于60,时不能等于12或24.秒等于限值时,则使秒值为0并且分值加1;时等于限值时,先置零然后就转显示屏输出。

4.时间显示

调用DOS操作系统模块9,可用来显示存储器内字符串。

由于显示的字符串必须为ASCII编码,因为要调用TRAN2转换子程序将寄存器CH、DH、DL内压缩BCD码字符串转换成ASCII码字符串,字符串最后以字符“$”结束,并按时、分、秒的顺序送存储器缓冲区内。

调用DOS操作系统模块9时,(DS:

DX)应指向字符串首址。

程序一旦进入运行,就将不间断地在显示屏显示时间,要想使程序停止运行,可同时在键盘按下Ctrl和Break二键。

5.半点、整点报时

当分达到30时,转到报时程序;当分到0时,转到报时程序;其余的情况都不用跳到报时程序而是正常执行输出。

1.3程序流程图

根据以上程序流程相应的说明,在程序编写前,我们应先画出程序流程图本程序的流程图如图1所示。

 

图1程序流程图

2软件设计

2.112/24时制程序设计

很明显要想实现此功能必须使用分支结构程序,调用DOS操作系统模块1,输入12/24时制的第一位即高位,再调用DOS操作系统模块1输入12/24时制的第二位即低位。

然后将输入的两个ASCII码值转换为压缩BCD码存入定义的变量X中,用于与12H比较并跳转到相应进制显示的程序中。

其程序片段如下:

……

MOVAH,1   ;DOS功能模块,从键盘输入字符

 INT21H

MOVBL,AL;将输入的数据12,24转换为压缩BCD码存放在变量S中

ANDBL,0FH

SHLBL,1

SHLBL,1

SHLBL,1

SHLBL,1

MOVAH,1

INT21H

MOVCL,AL

ANDCL,0FH

ORCL,BL

MOVS,CL

MOVAH,1;输入最后一个回车字符

INT21H

……

CMPS,12H

JNZAGAIN1;24进制则跳转到AGAIN1执行24进制显示的程序

……

2.2时钟起始时间的设置

先调用设置光标子程序和清除屏幕子程序,调用DOS操作系统模块9,在显示屏上显示提示符“CURRENTTIMEIS:

”,再调用DOS操作系统模块10,提示要输入时钟的起始时间,输入时间的格式是“时(XX):

分(XX):

秒(XX)”。

输入的时间以字符串形式放在已定义的存储器缓冲区,继而调用TRAN1和MUL10子程序,将存放在存储器缓冲区的ASCII字符转换成压缩BCD码,并将时、分、秒的值放置在寄存器CH、DH、DL中。

其程序片段如下:

……

MOVDX,OFFSETCT   ;DOS功能模块,显示字符串,提示从键盘输入

  MOVAH,9

  INT21H         

  MOVDX,OFFSETBUFFER

  MOVAH,10   ;DOS功能模块,从键盘输入字符串到缓冲区

  INT21H

MOVBX,OFFSETBUFFER+2

CALLTRAN1;时转换为BCD数

INCBX

INCBX

CALLTRAN1;分转换为BCD数

INCBX

INCBX

CALLTRAN1;秒转换为BCD数

MOVBX,OFFSETBUFFER+2;原输入缓冲区的BCD数转换压缩BCD

MOVAL,[BX];数的同时将输入缓冲区的数据传给

CALLMUL10;时-CH,分-DH,秒-DL

MOVCH,AL

INCBX

INCBX

MOVAL,[BX]

CALLMUL10

MOVDH,AL

INCBX

INCBX

MOVAL,[BX]

CALLMUL10

MOVDL,AL

……

2.3延时程序设计

调用TIME延时1S子程序(并未精确计算,因机器的主频不同会有差异),累加到存放秒值的寄存器DL中,并进行十进制调整。

在累加的过程中,不断地对时、分、秒进行比较,秒不能等于60,分不能等于60,时不能等于12或24.秒等于限值时,则使秒值为0并且分值加1;时等于限值时,先置零然后就转显示屏输出。

其程序片段如下:

……

TIMEPROC

PUSHCX

PUSHAX

MOVAX,25000;嵌套循环AX为外循环,CX为内循环

WAITED:

MOVCX,24000

GOON:

LOOPGOON

DECAX

JNZWAITED

POPAX

POPCX

RET

TIMEENDP

……

2.4时间显示程序设计

调用DOS操作系统模块9,可用来显示存储器内字符串。

由于显示的字符串必须为ASCII编码,因为要调用TRAN2转换子程序将寄存器CH、DH、DL内压缩BCD码字符串转换成ASCII码字符串,字符串最后以字符“$”结束,并按时、分、秒的顺序送存储器缓冲区内。

调用DOS操作系统模块9时,(DS:

DX)应指向字符串首址。

其程序片段如下:

……

DISPLAY:

MOVBX,OFFSETBUFFER

INCBX

INCBX

CALLIOCLR

CALLIOSET

MOVAL,CH;将小时的压缩BCD数转化为ASCII码在存储器中进行修改

CALLTRAN2

INCBX

MOVAL,':

';在中间添加一个‘:

MOV[BX],AL

INCBX

MOVAL,DH

CALLTRAN2

INCBX

MOVAL,':

'

MOV[BX],AL

INCBX

MOVAL,DL

CALLTRAN2

CMPDH,30H;到了30分钟不跳转,其余都跳到NEXT2

JNZNEXT2

NEXT1:

CMPDL,0;秒为0不跳其余跳到NEXT3

JNZNEXT3

INCBX

MOVAL,'*'

MOV[BX],AL

INCBX

MOVAL,':

'

MOV[BX],AL

INCBX

MOVAL,')'

MOV[BX],AL

INCBX

MOVAL,07H

MOV[BX],AL

JMPNEXT3

NEXT2:

CMPDH,0

JNZNEXT3

JMPNEXT1

NEXT3:

INCBX

MOVAL,'$';结束字符

MOV[BX],AL

PUSHBX

PUSHCX

PUSHDX

MOVDX,OFFSETBUFFER

MOVAH,9

INT21H

POPDX

POPCX

POPBX

JMPAGAIN

……

2.5半点、整点报时

当分达到30时,转到报时程序;当分到0时,转到报时程序;其余的情况都不用跳到报时程序而是正常执行输出。

报时时会在时间后面接着显示“*:

)”并发出嘀的一声。

其半点、整点报时程序片段如下:

……

INCBX

MOVAL,'*';在输入缓冲区后面增加字符“*:

)”用于显示

MOV[BX],AL

INCBX

MOVAL,':

'

MOV[BX],AL

INCBX

MOVAL,')'

MOV[BX],AL

INCBX

MOVAL,07H;在输入缓冲区后面加入07H=bel,报时

MOV[BX],AL

JMPNEXT3

……

3调试过程和运行结果分析

3.1调试过程

(1)编写源程序,并命名为dianzizhong.asm,并保存于默认文件夹中。

(2)打开文件dianzizhong.asm,编译使之生成目标文件,检查源程序中的错误改正,直到编译无错误出现为止。

(3)点击菜单栏中运行里的连接,再点击运行,输入相应的字符就会显示相应的结果。

(4)首先屏幕上显示提示语“TIMESYSTEMIS:

”用户输入12或者24即可实现12或24进制的转换。

(5)屏幕上显示“CURRENTTIMEIS:

”提示语,用户输入当前时间其输入格式为时(XX):

分(XX):

秒(XX)。

(6)屏幕上显示从我们设定的时间开始计时。

3.2运行结果显示

(1)当进入显示界面是屏幕上会出现提示语“TIMESYSTEMIS:

”,在此窗口我们输入12或者24进制。

其显示结果如图2所示。

图212/24进制选择界面

(2)当我们输入12或24进制时的窗口界面如图3和图4所示。

图3输入12进制界面

图4输入24进制的界面

 

(3)当输入进制信息以后,现在的提示语为“CURRENTTIMEIS:

”,现在再输入时间,其窗口界面如图5所示。

图5提示输入时间的界面

(4)当输入了时间后的显示结果如图6所示。

图6完成输入时间的界面

(5)最后,会显示设置的初始时间并开始计时。

其结果如图7所示。

图7计时的界面

(6)到了半点或整点时报时的显示结果如图8和图9所示。

图8半点报时

图9整点报时

3.3所遇到的问题与解决

1、对延时时间的设置:

当计算机执行命令时,虽然快,但还是需要一定的时间。

此时间与计算机的主频有关系,我们采用循环的方式来进行延时。

但我们所使用的计算机的CPU主频比8086高,故需要内外两个循环来实现,内循环为24000,外循环为25000,这样延时约为1S。

程序如下:

TIMEPROC

PUSHCX

PUSHAX

MOVAX,25000;嵌套循环AX为外循环,CX为内循环

WAITED:

MOVCX,24000

GOON:

LOOPGOON

DECAX

JNZWAITED

POPAX

POPCX

RET

TIMEENDP

2、开始光标不在屏幕中央,原因是IOSET子程序中的光标设计的位置不对,重新改变DX后,光标到达屏幕中央。

IOSET子程序如下:

IOSETPROC;设置光标位置

PUSHAX

PUSHBX

PUSHDX

MOVDX,0C20H;DH=光标所在行号,DL=光标所在列号MOVBH,00;BH=光标所在页号

MOVAH,02

INT10H

POPDX

POPBX

POPAX

RET

IOSETENDP

3、检查错误过程中,系统提示“outofmemory”

1)、原因:

在某些程序段存在只有现场保护没有现场恢复

2)、解决办法:

通过系统运行,发现错误的行数,找到相应的位置,添加现场恢复语句。

4、刚开始选择进制的功能的时候,只设置了两次DOS字符输入功能的调用因此只能输入两个字符,而当输入第二个字符以后提示语立即不见,根本看不到。

因此为了在输入进制的两个字符以后,添加一个回车以完成输入则必须设置三次DOS字符输入功能调用。

其程序如下:

……

MOVAH,1   ;DOS功能模块,从键盘输入字符

   INT21H;第一次调用

MOVBL,AL;将输入的数据12,24转换为压缩BCD码存放在变量S中

ANDBL,0FH

SHLBL,1

SHLBL,1

SHLBL,1

SHLBL,1

MOVAH,1

INT21H;第二次调用

MOVCL,AL

ANDCL,0FH

ORCL,BL

MOVS,CL

MOVAH,1;输入最后一个回车字符

INT21H;第三次调用

……

5.在输入了进制信息以后并没有调用函数IOCLR因此在显示窗口中显示了多个信息,并不美观,后来我在输入了进制信息以后加了CALLIOCLR、CALLIOSET的调用程序。

对屏幕进行清屏,并且设置光标位置。

程序片段如下:

……

MOVAH,1;输入最后一个回车字符

INT21H

CALLIOCLR

CALLIOSET

   MOVDX,OFFSETCT   ;DOS功能模块,显示字符串,提示从键盘输入

   MOVAH,9

   INT21H 

……

3.4结果分析

经验证,在第一个提示窗口“TIMESYSTEMIS:

”中输入进制为12或则24,会实现12/24进制的转换。

在第二提示窗口“CURRENTTIMEIS:

”中输入初始时间能正确的设置初试时间。

并且我们在窗口中显示了“CURRENTTIMEIS:

”,满足任务的要求。

设置的时间程序能够正常的运行,达到了设计目的。

并且时间在屏幕的正中央显示。

在半点以及整点的时候在时间末尾处显示“*:

)”的提示符号,并且发出报警声。

实现了半点,整点报时的功能。

总的来说,此程序基本上完成了设计要求。

4.心得体会

经过以上步骤,课程设计所要求设计的电子钟显示设计软件便成功完成了,它能显示数字式的时钟,并且能设置初值和时钟进制。

整个页面简洁清晰,方便用户读取,且操作简捷,符合课程设计中的各项要求。

通过这次课程设计,我们对日常生活中司空见惯的时钟的工作原理有了一个比较深入的了解,将书本中的知识更好地与实际生活中的应用结合在了一起。

通过这次微机原理课程设计学到了很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

而且我第一次感受到在写一个程序的时候,一定要事先把程序原理方框图画出来的重要性。

在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。

因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。

本次课程设计的过程中遇到了很多问题,比如时间走得太快、光标的位置无法定位等等。

对每个问题的解决都是一种对知识的重新整理和考察。

我更加感到愉悦的,此次的课程设计锻炼了我的编程能力。

到此为止,我们接近两周的课程设计也告一段落。

通过这次课程设计,使我认识到理论与实际相结合的重要性,对课本上的只是在实际生活中的运用也有了进一步的了解,同时基本上能够掌握汇编语言编程中编程的步骤,可以说是从中受益匪浅。

通过本次课设我也学到很多课堂上学不到的调试知识。

很感谢学校给我们提供了这么好的学习机会,感谢老师的指导,从老师的身上学到了对知识真正严谨细致的态度,让我受益匪浅。

 

参考文献

[1]周佩玲,彭虎傅,忠谦.微机原理与接口技术.电子工业出版社.2007

[2]朱金均,麻新旗.微机原理及应用技术(第二版).机械工业出版社.2005

[3]王爽.汇编语言(第2版).清华大学出版社.2008

[4]沈美明,温冬婵.IBM-PC汇编语言程序设计.清华大学出版社.1993

[5]丁辉.汇编语言程序设计(第3版).电子工业出版社.2009

[6]邵玉祥.汇编语言程序设计.科学出版社.2005

[7]阳平.汇编语言与微机原理.中国水利水电出版社.2006

[8]胡蔷.微机原理及应用.机械工业出版社.2006

[9]钱晓捷 .新版汇编语言程序设计.电子工业出版社.2007

[10]杨记文.汇编语言程序设计教程.清华大学出版社

[11]姚君遗.汇编语言程序设计.南京大学出版社

[12](美)埃尔温.Assemblylanguageforintel-boardcomputers.清华大学出版社

[13](美)布鲁姆.ProfessionalAssemblyLanguage机械工业出版社

 

附录源程序:

DATSEGMENT

BUFFERDB20

DB?

DB20DUP(?

TS  DB'TIMESYSTEMIS:

$'

CT DB'CURRENTTIMEIS:

$'

SDB?

DATENDS

STASEGMENTPARASTACK‘STACK’

STAPNDB100DUP(?

TOPEQULENGTHSTAPN

STAENDS

CODSEGMENT

STARTPROCFAR

ASSUMECS:

COD,DS:

DAT,SS:

STA

MOVAX,DAT

MOVDS,AX

MOVAX,STA

MOVSS,AX

MOVAX,TOP

MOVSP,AX

CALLIOCLR

CALLIOSET

MOVDX,OFFSETTS  ;DOS功能模块,显示字符串’TIMESYSTEMIS:

   MOVAH,9

   INT21H

   MOVAH,1   ;DOS功能模块,从键盘输入字符

   INT21H

MOVBL,AL;将输入的数据12,24转换为压缩BCD码存放在变量S中

ANDBL,0FH

SHLBL,1

SHLBL,1

SHLBL,1

SHLBL,1

MOVAH,1

INT21H

MOVCL,AL

ANDCL,0FH

ORCL,BL

MOVS,CL

MOVAH,1;输入最后一个回车字符

INT21H

CALLIOCLR

CALLIOSET

   MOVDX,OFFSETCT   ;DOS功能模块,显示字符串,提示从键盘输入

   MOVAH,9

   INT21H         

   MOVDX,OFFSETBUFFER

   MOVAH,10   ;DOS功能模块,从键盘输入字符串到缓冲区

   INT21H

MOVBX,OFFSETBUFFER+2

CALLTRAN1;转换小时为BCD数

INCBX

INCBX

CALLTRAN1;转换分钟BCD数

INCBX

INCBX

CALLTRAN1;转换秒BCD数

MOVBX,OFFSETBUFFER+2;原输入缓冲区的BCD数转换压缩BCD

MOVAL,[BX];数的同时将输入缓冲区的数据传给

CALLMUL10;CH,DH,DL

MOVCH,AL

INCBX

INCBX

MOVAL,[BX]

CALLMUL10

MOVDH,AL

INCBX

INCBX

MOVAL,[BX]

CALLMUL10

MOVDL,AL

AGAIN:

CALLTIME

CMPS,12H

JNZAGAIN1;24进制跳转到AGAIN1

MOVAL,DL

ADDAL,1

DAA

MOVDL,AL

CMPAL,60H

JNEDISPLAY

MOVDL,0

MOVAL,DH

ADDAL,1

DAA

MOVDH,AL

CMPAL,60H

JNEDISPLAY

MOVDH,0

MOVAL,CH

ADDAL,1

DAA

MOVCH,AL

CMPAL,12H

JNEDISPLAY

MOVCH,0

JMPDISPLAY

AGAIN1:

MOVAL,DL

ADDAL,1

DAA

MOVDL,AL

CMPAL,60H

JNEDISPLAY

MOVDL,0

MOVAL,DH

ADDAL,1

DAA

MOVDH,AL

CMPAL,60H

JNEDISPLAY

MOVDH,0

MOVAL,CH

ADDAL,1

DAA

MOVCH,AL

CMPAL,24H

JNEDISPLAY

MOVCH,0

DISPLAY:

MOVBX,OFFSETBUFFER

INCBX

INCBX

CALLIOCLR

CALLIOSET

MOVAL,CH;将小时的压缩BCD数转化为

CALLTRAN2;ASCII码在存储器中进行修改

INCBX

MOVAL,':

';在中间加一个字符‘:

MOV[BX],AL

INCBX

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

当前位置:首页 > 高中教育 > 初中教育

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

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