您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 微机原理课程设计报告
微机原理课程设计报告——电子表程序设计-2-(一)设计任务:用汇编语言设计一电子表程序,要求:(1)实现秒、分、时的计时,并显示于屏幕中央(2)能够校时(3)能够半点、整点报时(二)设计原理该程序主要由三部分构成:时间设置、延时程序和时钟显示。(1)时间设置①输入初始时间先调用DOS操作系统模块2,在显示屏上显示‘:’,再调用DOS操作系统模块10,提示输入初始时间。由键盘输入的时间以字符串形式存放在已定义的存储器缓冲区内,继而调用TRAN1转换子程序和MUL10乘10子程序,将存放在存储器缓冲区内的ASCII字符转换为压缩BCD码,并将时、分、秒的值放置在寄存器CH、DH、DL中。②暂停计时按PauseBreak键即可暂停计时,再按下任意键恢复计时③重新输入时间在程序运行时,可按下Esc键重新输入初始时间,此时程序检测到Esc(ASCII码为1BH)被按下,返回①步提示重新输入时间。以上两步可实现校时的功能。④半点、整点报时程序运行时,分钟值每次改变都需要与30、60比较,若相等,则调用DOS操作系统模块7使计算机响铃并在时间后显示‘------’。同时若分、秒值为60则需进位,时为24时进位,保证时钟程序的正确性。-3-(2)延时程序计算机在执行指令时,各种操作都按指令执行,但在像程序控制器那样由计算机发出指令控制外部设备是,由于外部设备所具有的机械惯性或其他原因,需要在计算机发出指令后有规律地延迟或等待一段时间。这类延时,可以用硬件延时来完成,单用软件来实现也是一种方便和常用的方法。计算机执行每一条指令,虽然很快,但还是需要一段时间的。因此从理论上讲,可在程序中加一些与程序无关的指令去完成,要计算指令执行的时间,又不能过多的为了延时而增加编制程序的工作量。因此,编制延时程序,应尽量采用较少的指令,节约存储器,并且不能对主程序造成影响。每条指令执行时间的长短,是以计算机的时钟周期为基本单位的。当CPU采用的时钟频率一定时,时钟周期也为定值。因此可根据时钟周期的多少来计算执行指令所需的时间。完成本设计任务使用的计算机采用IntelPentium4处理器,主频为1.70GHz,时钟周期约为0.59ns。通过时间约1s的长延时累加,并以时、分、秒的形式显示出来,就可以编写出一个时钟程序。(3)时钟显示①设置光标位置子程序IOSET一般的显示屏可显示25行、80列字符,屏幕左上角字符位置为0行0列,右下角字符位置为24行79列,对应于十六进制为:左上角为(0,0),右下角为(18,4F)。设置光标,可调用BIOS系统,用汇编语句调用中断INT10H,其入口信息为(AH)=2要设置光标;(BH)=0页号;(DH,DL)=(0CD,24)置光标于行、列数,本程序要求置光标于屏幕中央,即为12行36列(十进制)。-4-②清除屏幕子程序IOCLR当开始执行程序时,总希望有一个洁净的屏幕,此时可使显示屏幕作上滚动作,使屏幕留下一片空白,也可以清楚屏幕的一部分,是这部分空白留作它用。要使屏幕上滚,可用汇编语句调用中断INT10H,其入口信息为(AH)=6是屏幕上滚;(AL)=00上滚行数,若(AL)=0,则整屏为空白;(CH,CL)=滚动区域的左上角行列号,本程序中(CX)=0;(DH,DL)=滚动区域的右下角行列号,本程序中(DX)=184FH;(BG)=空白行属性,当(BH)=7时,为正规属性(黑白)。③屏幕显示程序DISPY显示屏幕作为常用的输出设备,可用来显示运算的中间结果或最终数据,也可用来显示表示正确完成或检验出的错误信息。为了显示表示正确或显示错误的信息,必须在数据段中以字符串形式将提示信息加以定义,然后由显示器在屏幕上加以显示。DOS系统中的显示功能模块号为2,每次调用仅能显示DL中的一个字符。为显示字符串,可调用DOS系统另一功能,用汇编语句调用中断INT21H,其入口信息为(AH)=9显示字符串的功能模块号;(DS:DX)指向字符串的首地址,要求字符串以字符‘$’结尾。-5-NY检测校时信号输入调用时间延迟子程序开始调用清除屏幕子程序调用设置光标居中子程序从键盘输入字符串到缓冲区BX←BUFFER缓冲区第二单元的偏移地址调用TRAN1子程序将输入的ASCII码转换为BCD码BX←BUFFER缓冲区第二单元的偏移地址调用MUL10子程序将BCD码转换为压缩BCD码实现秒加1秒是否大于60实现分加1分是否大于60实现时加1YYA输入字符串结束码$DOS功能调用,显示字符串分是否为30分是否为60BX←BUFFER缓冲区第二单元的偏移地址A时是否小于24YN小时值归零调用TRAN2子程序将输入的BCD码转换为ASCII码调用清除屏幕子程序调用设置光标位置居中子程序Y输入------和响铃ASCII码NYNNN(三)框图-6-(四)程序清单DATSEGMENTRINGDB'------$'FLAGDB0BUFFERDB10DB?DB10DUP(?)DATENDSSTASEGMENTPARASTACK'STACK'STAPNDB100DUP(?)TOPEQULENGTHSTAPNSTAENDSCODSEGMENTSTARTPROCFARASSUMECS:COD,DS:DAT,SS:STAMOVAX,DATMOVDS,AXMOVAX,STAMOVSS,AXMOVAX,OFFSETTOPMOVSP,AXMAIN:;主程序PUSHBXPUSHCXPUSHDXCALLIOCLR;清除屏幕CALLIOSET;设置光标位置POPDXPOPCXPOPBXMOVDL,':'MOVAH,2;显示字符:,提示输入时间INT21HMOVDX,OFFSETBUFFERMOVAH,10INT21HMOVBX,OFFSETBUFFER+2CALLTRAN1INCBXINCBXCALLTRAN1INCBXINCBXCALLTRAN1MOVBX,OFFSETBUFFER+2-7-MOVAL,[BX]CALLMUL10MOVCH,ALINCBXINCBXMOVAL,[BX]CALLMUL10MOVDH,ALINCBXINCBXMOVAL,[BX]CALLMUL10MOVDL,ALAGAIN:MOVAL,0MOVFLAG,ALMOVAH,01H;判断是否键盘有无输入,若有则重新置初值INT16HCMPAL,1BHJZMAINCALLTIMEMOVAL,DLADDAL,1DAAMOVDL,ALCMPAL,60HJNEDISPYMOVDL,0MOVAL,DHADDAL,1DAAMOVDH,ALCMPAL,30H;与30比较JNENEXTMOVAL,1MOVFLAG,ALJMPDISPYNEXT:CMPAL,60H;与60比较JNEDISPYMOVAL,1MOVFLAG,ALMOVDH,0MOVAL,CHADDAL,1DAAMOVCH,AL-8-CMPAL,24HJNEDISPYMOVCH,0DISPY:MOVBX,OFFSETBUFFERMOVAL,CHCALLTRAN2INCBXMOVAL,':'MOV[BX],ALINCBXMOVAL,DHCALLTRAN2INCBXMOVAL,':'MOV[BX],ALINCBXMOVAL,DLCALLTRAN2INCBXMOVAL,'$'MOV[BX],ALPUSHBXPUSHCXPUSHDXCALLIOCLRCALLIOSETMOVDX,OFFSETBUFFERMOVAH,9INT21HMOVAL,FLAG;若标志位为1,则报时,并显示------CMPAL,1JNENEXT1MOVDX,OFFSETRINGMOVAH,9INT21HMOVAH,02MOVDL,07HINT21HNEXT1:POPDXPOPCXPOPBXJMPAGAINRETSTARTENDP-9-TRAN1PROC;ASCII码转BCD码MOVAL,[BX]ANDAL,0FHMOV[BX],ALINCBXMOVAL,[BX]ANDAL,0FHMOV[BX],ALRETTRAN1ENDPMUL10PROC;BCD码转压缩BCD码ADDAL,ALDAAMOVCL,ALADDAL,ALDAAADDAL,ALDAAADDAL,CLDAAMOVCL,ALINCBXMOVAL,[BX]ADDAL,CLRETMUL10ENDPTRAN2PROC;压缩BCD码转ASCII码MOVCL,ALSHRAL,1SHRAL,1SHRAL,1SHRAL,1ORAL,30HMOV[BX],ALINCBXMOVAL,CLANDAL,0FHORAL,30HMOV[BX],ALRETTRAN2ENDPTIMEPROC;延时子程序PUSHCXPUSHAXMOVAX,04FFFHGOON2:MOVCX,0FFFFH-10-GOON:DECCXJNZGOONGOON1:DECAXCMPAX,0JNEGOON2POPAXPOPCXRETTIMEENDPIOCLRPROC;清除屏幕子程序MOVAX,0600HMOVCX,0000HMOVDX,184FHMOVBH,07INT10HRETIOCLRENDPIOSETPROC;设置光标位置MOVDX,0C24HMOVBH,00MOVAH,02INT10HRETIOSETENDPCODENDSENDSTART(五)程序调试(1)源代码输入后,无法顺利汇编成OBJ文件,首先检查程序,看是否存在字符输入错误或语法错误,并借助EMU8086软件(4.0版)检查,经过反复调试终于顺利汇编、连接成功。(2)程序开始运行后,无法实现清屏幕,正确调用IOCLR清楚屏幕子程序后问题得以解决。(3)走时不准确,由于本程序是利用计算机软件延时来实现计时的,时间快慢与计算机主频有关,计算机主频为1.70GHz,设置了两重循环,根据主频及延时程序大致计算延时的数值,并根据调试结果相应的更改数值大小。(4)校时程序,自己编不出能校时的程序,引用网上查找到的一个中断代码,加入到程序中,可以实现时间调校。(5)报时程序:一开始无从下手,通过分析产生报时的条件及时间,设置了一个FLAG标志字,很好地解决了报时问题。-11-(六)运行结果(截图)(1)一般状态(2)半点报时(3)整点报时-12-(七)体会首先,由于程序较长,寄存器运用时要注意不能重复,调用或中断程序时要注意使用PUSH和POP命令保存当前地址,运用堆栈来完成。在调试过程中,我充分感受到了断点保护的重要性,有时不能想当然,犯经验主义的错误,要切实分析中断程序中是否使用了当前的寄存器,如果有一定要加以保护,否则很可能会出现程序的错误甚至导致系统崩溃。在调试中就曾经出现过乱码现象,刚开始没有意识到是保护问题出现了差错,经过使用DEBUG程序才找到了问题的所在;还多次出现死机现象,大大影响了工作的效率。同时通过这次调试程序,我切实感觉到了注释的重要性,如果一味的写程序,很容易出现混乱,导致事后自己都不知到自己编的代码是什么意思,最好一边写代码一边加注释,这样在调试及查错时效率会比较高。程序一定要有备份,在汇编以前最好备份,以免在汇编是出现死机或其他以外状况,造成源代码的丢失。在调试程序时,应先把最基本的计时功能程序调试成功,然后在此基础上再慢慢加入各种功能,每一次更改程序都存档,每次都在调试成功后在去添加新的功能,否则会出现错误的交叉不便于调试找出错误。这次调试程序,我还认识到我们应该充分利用课本以外的知识,课本上的知识以教学任务为主,但是在实际工程中会遇到其他很多课本上与不到的问题,比如调用键盘中断校时使用的INT16H以及清屏和设置光标程序就是我们在课内没有学到的,我们通过查阅微型计算机上机程序以及通过网络寻找到了一些有用的代码很好的解决了这些问题。在课程设计验收的时候,老师的提问让我发现了该程序的一些缺点。例如在输入非法数据如24:60:65时,程序应该做出相应的判断去屏蔽这些错误,由于时间仓促这些问题没有很好地避免。此外,如果能在程序开始时先提示输入计算机的主频并自动选择合适的延时程序,电子表在不同主频的计算机
本文标题:微机原理课程设计报告
链接地址:https://www.777doc.com/doc-6687291 .html