微机原理课程设计秒表.docx
- 文档编号:27621736
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:21
- 大小:165.56KB
微机原理课程设计秒表.docx
《微机原理课程设计秒表.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计秒表.docx(21页珍藏版)》请在冰豆网上搜索。
微机原理课程设计秒表
微机原理课程设计
报
告
书
设计项目:
数字秒表
班级:
10级通信
姓名:
学号:
指导教师:
目录
一、设计任务-------------------------------------------------------------3
二、相关功能的介绍----------------------------------------------------3
三、设计原理-------------------------------------------------------------3
1.原理概述
2.延时程序
3.光标定位子程序原理
4.清屏原理
5.字符及字符串显示原理
6.压缩BCD转为ASCII码原理
7.动态扫描键盘原理
四、程序流程图----------------------------------------------------------4
1.主程序流程图
2.各子程序流程图
五、程序代码-------------------------------------------------------------5
六、程序运行结果------------------------------------------------------14
七、程序调试中的问题及解决方法---------------------------------15
八、心得收获------------------------------------------------------------15
九、参考资料------------------------------------------------------------16
一、设计任务
设计可以显示1~60秒的无存储功能的秒表,最小单位为毫秒。
2、相关功能的介绍
该秒表计数功能的实现是通过调用延时程序实现的(为纯软件实现,不能达到准确计数)。
具有启、停、继续、复位、同时多组计数等功能。
该秒表软件界面友好,即使对汇编语言一无所知的人也能轻松运行EXE程序,通过软件的提示输入S、E、C、R、M来实现秒表计数,易于操作。
通过DOS系统9号功能的调用,实现字符串的输出,展现出一个比较漂亮的秒表计数界面。
通过程序开辟专门的记忆区,实现了同时多组计数的功能,在实际应用中比较方便。
三、设计原理
1.原理概述
通过调用DOS系统的8号功能实现控制字符的输入,通过调用延时程序实现十分之一秒的定时,通过调用DOS系统的2号功能实现光标定位,调用DOS系统的2号功能实现字符的输出,通过调用DOS系统的9号功能实现字符串的输出。
2.延时程序
本设计利用软件实现延时(不是很精确),调用TIME实现延时。
其原理:
通过可控制的循环来占用CPU的时间来实现延时,分为内外两层循环,外循环由AX中的数值来控制,内循环有CX中的值来控制。
3.光标定位子程序原理
设置光标,可调用BIOS系统,用汇编语句调用中断INT10H。
入口信息为
(AH)=2要设置光标;
(BH)=0页号;
(DH,DL)=光标的行号、列号
4.清屏原理
开始执行程序时为保证有一个洁净的屏幕,可使显示屏做上滚动作,使屏幕留下一片空白。
要使屏幕上滚,可用汇编语句INT10H,入口信息为
(AH)=6使屏幕上滚
(AL)=00上滚行数
(CH,CL)=滚动区域左上角的行、列号
(DH,DL)=滚动区域右下角的行、列号
(BG)=00颜色的设置
5.字符及字符串显示原理
通过调用DOS系统模块2只能是DL中的一个字符的显示。
为了实现字符串的显示,调用其9号模块功能,其入口信息为
(AH)=9显示字符串的功能模块
(DS:
DX)指向字符串的首地址,要求字符串以字符‘$’结尾。
6.压缩BCD转为ASCII码原理
(1)两位的:
先将压缩BCD码的高4位取出,右移四位后,与30H相或,存到相应内存单元;然后将低4位取出,与30H相或,存到下一内存单元。
(2)一位的:
原数字加30H
7.动态扫描键盘原理
运用INT21H的8号功能来实现动态扫描键盘。
如果有键按下,则相应的键值的ASCII码被存到AL中。
判断AL中的数值,若不是控制字符,则继续循环,从而实现动态扫描键盘。
四、程序流程图
1.主程序流程图
图1主程序流程图
2.子程序流程图
图2子程序流程图一
图3子程序流程图二
五、程序代码
DATSEGMENT;设置数据段
BUFDB'Inputstart(S)ormemory(M)orend(E)orcontinue(C)orrestart(R)$';设置功能说明
MESSDB'NewYeariscoming!
',0ah,0dh
DB'^~*',0ah,0dh
DB'^/~*',0ah,0dh
DB'^/~*',0ah,0dh
DB'^/~*',0ah,0dh
DB'^/~*',0ah,0dh
DB'^*',0ah,0dh
DB'^(&)(&)*',0ah,0dh
DB'^*',0ah,0dh
DB'^O*',0ah,0dh
DB'^*',0ah,0dh
DB'^(&&&&)',0ah,0dh
DB'&&&&',0ah,0dh
DB'**',0ah,0dh
DB'***********************************',0ah,0dh
DB'*****',0ah,0dh
DB'***************',0ah,0dh
DB'***',0ah,0dh
DB'*******************************',0ah,0dh
DB'***',0ah,0dh
DB'***',0ah,0dh
DB'*****',0ah,0dh
DB'*********************',0ah,0dh
DB'DesignedbyWangYuCopyright@2012--2013','$'
TIPDB'MEMORY$';定义记忆提示
BUFFERDB20DUP(?
);定义缓存区
NUMDB1
LODEQU0144H;记忆显示区光标的位置
DATENDS
;--------------------代码段----主程序单元------------------
CODSEGMENT;定义代码段
STARTPROCFAR
ASSUMECS:
COD,DS:
DAT
MOVAX,DAT
MOVDS,AX
CALLCLR;图形区清屏并设置颜色
CALLCLRDAT;秒表数字区清屏并设置颜色
CALLCLRMER;记忆区清屏并设置颜色
MOVDX,OFFSETBUF;输出功能说明
MOVAH,09H;输出字符串
INT21H
MOVDX,OFFSETMESS;输出功能说明
MOVAH,09H
INT21H
CALLDISMER;"MEMORY"的光标位置
MOVDX,OFFSETTIP;输出"MEMORY"
MOVAH,09H
INT21H
CALLGO;设置初值
LOAD:
CALLIOSET;光标定位
CALLHALT;等待输入
MOVDX,0
MOVCH,0
AGAIN:
CALLTIME;调用延时程序
MOVAL,DL;十分之一秒加一
ADDAL,1
DAA
CMPAL,10H
JENEXT1;满十进位
MOVDL,AL
JMPDISPY;不满十显示
NEXT1:
MOVDL,0
MOVAL,DH;秒位加一
ADDAL,1
DAA
MOVDH,AL
CMPAL,60H
JNEDISPY
MOVDH,0
MOVAL,CH;分位加一
ADDAL,1
DAA
MOVCH,AL
CMPAL,60H
JNEDISPY;满60清零
MOVCH,0
DISPY:
;显示电子秒表
MOVBX,OFFSETBUFFER;取缓冲区地址
MOVAL,CH
CALLTRAN;将分位转变为ASCII码并送缓冲区
INCBX
INCBX
MOVAL,DH;将秒位转变为ASCII码并送缓冲区
CALLTRAN
INCBX
INCBX
MOVAL,DL;将十分之一秒位转变为ASCII码并送缓冲区
CALLTRAN2
PUSHBX
PUSHCX
PUSHDX
CALLIOSET;光标置位
MOVDX,OFFSETBUFFER;输出缓冲区字符串
MOVAH,09H
INT21H
POPDX
POPCX
POPBX
MOVAH,0BH;等待键盘输入
INT21H
ANDAL,AL
JZAGAIN
MOVAH,08H
INT21H
CMPAL,'M'
JNZR1
CALLMEMORY
JMPAGAIN
R1:
CMPAL,'R';判断输入是否为R
JNENEXT2;不是则判断是否为E
CALLMEMORY;若是则调用记忆功能保存当前值
MOVCH,0;初值清零重新计数
MOVDL,0
MOVDH,0
JMPAGAIN
NEXT2:
CMPAL,'E';判断是否为E
JNEAGAIN;不是则继续计数
NEXT3:
;若是则暂停计数
MOVAH,08H
INT21H
CMPAL,'C';判断是否输入C
JEAGAIN;若是则继续计数
CMPAL,'R';判断是否输入R
JNENEXT3;若不是则继续等待输入
CALLMEMORY;若是则调用记忆功能
CALLGO;重新设置初值等待重新启动
CALLIOSET
MOVDX,OFFSETBUFFER
MOVAH,09H
INT21H
JMPLOAD
RET
STARTENDP
;-------------------子程序单元------------设置初值子程序-----------
GOPROC
MOVBX,OFFSETBUFFER
MOVAL,'0'
MOV[BX],AL
INCBX
MOVAL,'0'
MOV[BX],AL
INCBX
MOVAL,':
'
MOV[BX],AL
INCBX
MOVAL,'0'
MOV[BX],AL
INCBX
MOVAL,'0'
MOV[BX],AL
INCBX
MOVAL,'.'
MOV[BX],AL
INCBX
MOVAL,'0'
MOV[BX],AL
INCBX
MOVAL,'$'
MOV[BX],AL
RET
GOENDP
;--------------------光标定位子程序----------------------
IOSETPROC
MOVDX,121DH;光标定位在18行39列
MOVBH,00;页号
MOVAH,02H;要设置光标
INT10H
RET
IOSETENDP
HALTPROC
MOVAH,08H
INT21H
CMPAL,'S'
JNEHALT
RET
HALTENDP
;----------------------BCD转ASCII码子程序1-----------
TRANPROC
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
RET
TRANENDP
;----------------------BCD转ASCII码子程序2-----------
TRAN2PROC
ADDAL,30H
MOV[BX],AL
RET
TRAN2ENDP
;------------------延时子程序-----------------
TIMEPROC
PUSHCX
PUSHAX
MOVAX,06EEH;通过改变AX的初值来校准秒表
MOVCX,0FFFFH
A1:
DECAX
JNZA2
JMPA3
A2:
DECCX
JNZA2
JMPA1
A3:
POPAX
POPCX
RET
TIMEENDP
;-----------------记忆功能子程序-----------
MEMORYPROC
PUSHDX
PUSHBX
PUSHAX
CMPNUM,20
JEX2
ADDNUM,1
X1:
MOVDX,LOD
ADDDH,NUM
MOVBH,00
MOVAH,02H
INT10H
MOVDX,OFFSETBUFFER
MOVAH,09H
INT21H
POPAX
POPBX
POPDX
RET
X2:
CALLCLRMER
MOVNUM,1
JMPX1
MEMORYENDP
;----------------------图形区清屏并设置颜色子程序----
CLRPROC
MOVAH,06H;使屏幕上滚
MOVAL,18H;上滚行数
MOVCX,0000H;滚动区域左上角的行号列号
MOVDX,1840H;滚动区域右下角的行号列号
MOVBH,2CH;空白行属性
INT10H
RET
CLRENDP
;----------------数据区清屏并设置颜色子程序------------
CLRDATPROC
MOVAH,6
MOVAL,1
MOVCX,121DH
MOVDX,0E23H
MOVBH,6EH
INT10H
RET
CLRDATENDP
;------------------------记忆区清屏并设置颜色子程序---------
CLRMERPROC
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAH,6
MOVAL,18H
MOVCX,0141H
MOVDX,184FH
MOVBH,5EH
INT10H
POPDX
POPCX
POPBX
POPAX
RET
CLRMERENDP
;------------------------记忆提示光标定位---------------
DISMERPROC
MOVAH,02H
MOVBH,00
MOVDX,0043H
INT10H
RET
DISMERENDP
CODENDS;结束代码段
ENDSTART;结束源程序
六、程序运行结果
图4运行结果图
七、程序调试中的问题及解决方法
1.主程序的调试
主程序使用压缩BCD码做的加法,再用DAA进行调整,这时要注意DAA只能对AL中的结果进行调整,因此只能用AL做加法,再将数据传送过去。
2.BCD码调整为ASCII码子程序调试
BCD码调整为ASCII码时,分、秒同0.1秒不能调用同一个子程序,否则屏幕显示时,0.1秒位的显示的也是两个数。
应该分开调用,分秒位调用时用TRAN,0.1秒调用时用TRAN2。
3.延时子程序的调试
延时程序的时间并没有经过精确计算,因此只能用试探法逐渐增加或减小AX值。
最终选定AX=0BFFH。
4.图形显示程序的调试
本设计图形的显示用了字符串输出。
刚开始编程时由于图形太大超过了25行,图形不能正确的显示,经过多次反复修改,最终图形得以正确显示。
在使用字符串输出时一定注意在最后加上‘$’字符,还应该注意“0ah,0dh”的正确使用。
5.清屏子程序调试
书中没有具体指明颜色代号,只能通过从01H开始依次尝试。
经过多次调试最终确定图形使用0CH绿色,字幕使用0EH黄色,记忆区使用0DH紫色。
八、心得体会
“纸上得来终觉浅,绝知此事要躬行”,这是本次课程设计我最大的体会。
刚开始时,看着老师给的题目,心里想“这个课程设计不是很难的事情嘛,把这几个子程序堆一块不就完了”,可是真正做起来时,才发现事情远非想的那么简单。
从上机程序的编写,到课程设计报告的最终完成,我们经历了很多曲折,也收获了很多,下面具体阐述一下。
1.图案的设计
为了能得到一个比较漂亮的界面显示,我们在图案设计上花了不少功夫。
很多次设计的图案很漂亮,可是搬到程序里面运行时却是一堆乱码,让我们很沮丧...还有要把秒表的显示正好调到图案正中央,我们也经过了多次调试。
在这个过程中,我们学会了耐心,去除浮躁,平心静气的把程序一遍遍的修改、调试,臻于完美。
2.程序调试
程序调试前,我们检查了好几遍。
可是调试时还是错误百出。
尤其是“;”的使用,一定要区分英文输入的分号和中文分号的区别,还有字符串结束时一定要加‘$’,否则会出现乱码。
这些都是调试中发现的问题,只有注意细节,细心,才能顺利完成任务。
通过本次课程设计,我加深了对课汇编语言的理解,同时熟练掌握了汇编语言的编辑、调试软件。
在以后的学习生活中还要继续保持严谨认真的科学态度,保持不断尝试和探索的耐心,保持勇于解决问题的决心。
不断地向老师、同学们学习、交流,分享吸取他们的经验,更好的提高自己。
九、参考书目
1.《微型计算机原理》张荣祥中国电力出版社
2.《微型计算机技术及应用》(第四版)戴梅萼、史嘉权清华大学出版社
3.《电子技术基础》康华光高等教育出版社
4.《电子系统设计》何小艇浙江大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程设计 秒表