目录一、设计内容与要求-----------------------------------------21.1设计要求1.2附加功能二、设计原理-----------------------------------------------22.1原理概述2.2延时原理2.3字符及字符串显示原理2.4压缩BCD码转为ASCII原理2.5动态扫描键盘原理2.6整分报时原理2.7记忆功能原理三、程序流程图---------------------------------------------43.1主程序流程图3.2各子程序流程图四、源程序及运行结果-----------------------------------------7五、程序调试-----------------------------------------------7六、心得体会-----------------------------------------------8七、参考资料----------------------------------------------10八、附录(源程序代码)---------------------------------------10微机原理课程设计电子秒表2一、设计内容与要求1.1设计要求1.具有秒和百分之一秒计时并显示于图案中央2.具有启/停、复位功能1.2附加功能1.具有记忆功能,可实现分别记时功能2.具有正分报时功能二、设计原理2.1原理概述通过调用INT21H的8号功能实现控制字符的输入,2号功能实现字符的输出,9号功能实现字符串的输出。通过调用INT10H的2号功能实现光标定位,AH=0H号功能设置显示方式、AH=7H号功能实现向下滚屏、AH=13H号功能实现彩色输出。利用系统执行指令的时钟周期,编写延时程序,通过调用延时程序实现一秒的计时。使用到的中断列表如下:中断号AH=设置功能调用参数返回参数10H00H设置显示方式AL=03H彩色文本方式(80*25)CGA02H置光标位置DH、DL=行(0-24)、列(0-79)BH=显示页06H向上滚屏AL上卷行数CH窗口左上角行号CL窗口左上角列号DH窗口右下角行号DL窗口右下角列号DH窗口显示属性08H键盘写入字符AL=输入字符微机原理课程设计电子秒表321H(无回显)09H显示字符串DS:DX=缓冲区首址2.2延时原理本设计利用软件实现延时,即通过可控制的循环来占用CPU的时间来实现延时。延时函数名为TIME,运用内外两层循环,外循环由AX中的数值来控制,内循环有CX中的值来控制。实现不同延时的控制,通过反复比较调试,确定AX的值为0140H,CX的值为0FFFFH。另外界面显示时的动画设置也是通过延时来完成的,此时参数设置为AX值为0FFFFH,CX值为0FFFFH。2.3字符及字符串显示原理字符及字符串输出采用INT10H。首先,调用中断INT10H中的AH=3号功能,将屏幕显示方式为80*25彩色文本方式。界面、时间、日期均是以字符串的形式输出。字符串的输出思想是:先定位后输出。定位光标用INT10H中AH=2号功能,DH中存的中行号,DL中存的是列号,BH中存页号。整个屏幕有25行80列,对应的16进制为:左上角为(0,0),右下角为(18,4F)。显示字符串用INT21H的AH=13H号功能。BP中存放输出字符串的偏移地址,DX中存放输出区域的起始行列号。由于程序中要多次运用到光标定位和字符串输出,为了让代码更加简洁,把字符串的定位和输出定义为宏DIS2,其中形参分别为定位坐标和字符串首址。2.4压缩BCD码转为ASCII原理时间和日期是以字符串形式输出的,所以要将分、秒、百分之一秒变量的值转化成ASCII码存入字符串中输出。先将压缩BCD码的高4位取出,右移四位后,与30H相或,存到相应内存单元;然后将低4位取出,与30H相或,存到下一内存单元。2.5动态扫描键盘原理运用INT21H的8号功能来实现动态扫描键盘。如果有键按下,则相应的键值的ASCII码被存到AL中。判断AL中的数值,若是控制字符,判断是哪个控制字符,并执行相应语句;若不是控制字符,则继续循环,从而实现动态扫描键盘。2.6整分提示原理每当存放秒的寄存器DH的值为60时,调用提示音程序响提示音。已知ASCII码是07H微机原理课程设计电子秒表4的字符代表响铃,调用中断INT21H中的AH=2号功能输出该字符即可实现。2.7记忆功能原理该功能是在按下R复位键以后将该时刻的计时时间记录并显示在记录区域,记录区域中最多能同时显示10个记录时间,多于10个时利用清屏功能将其覆盖,以便重新记录一组数据。该功能是通过滚屏实现的。INT10H中的AH=06号功能是向下滚屏。滚屏区域由CX和DX决定。CX记录区域左上方点的坐标,DX确定区域右下角点的坐标,AL确定下滚行数,这里设AL=11。2.8动画心形显示通过显示字符串宏调用与延时程序相结合,显示一行字符串调用一下延时程序,从而实现动画心形显示。显示快慢可通过调节延时程序(TIME2)里CX,BX的值来改变。2.9复位、停止等功能的实现通过对输入字符的判断和各种循环的嵌套调用实现。整体上本程序的主要设计原理是先在数据段中定义“INPUTSSTARTRRESETPPAUSECCONTINUEEEXIT”控制字符串,并定义缓冲区。将数据段的段基址送DS,并将“INPUTSSTARTRRESETPPAUSECCONTINUEEEXIT”显示,同时调用GO子程序,将显示结果初始化。同时设置光标,启动计时,启动延时程序,将百分之一秒加1并将其设置为压缩BCB码,当其CF不为1时,送屏幕显示,当其为1时,将其设置为0,并在秒上加1,当秒等于60时,其置0,当其小于60时,送屏幕显示。在计时过程中,如果键入R,则将其复位,并重新开始计时,当键入P时,计时暂停,如果键入E,则退出运行界面,如果键入C,则继续计时,如果键入R,则复位,设置为00:00,当再次键入S时,再次计时开始三、程序流程图3.1主程序流程图微机原理课程设计电子秒表5主程序流程图LOADYNNYAGAINYNNNEXT4YNNEXT3NEXT1YNYYNDISPYNTISHIYYDISPY开始设置图形及字体颜色调用光标置中央程序LOSET设置动画显示效果调用赋值程序GO等待开始信号(键盘输入S)(赋初值(DX←0,CX←0)调用延时程序TIME1/100秒(存于DL)+11/100秒值归零(DL←0)BCD调整秒值(存于CH)+1调用提示铃音程序BCD调整CF=1?AL=’P’?AL=’E’?AL=’R’?键盘有键入?CH=60H?DH=60H?DH←0,分值(存于DH)+1显示时间CH←0调用记忆功能BCD调整退出运行界面调用记忆功能字符输入DX←0,CH←0AL=’C’?AL=’R’?微机原理课程设计电子秒表63.2子程序流程图赋值子程序BX←BUFFER首地址[BX]←’0’,BX←BX+1[BX]←’:’,BX←BX+1[BX]←’0’,BX←BX+1[BX]←’:’,BX←BX+1[BX]←’0’,BX←BX+1[BX]←’0’,BX←BX+1[BX]←’0’,BX←BX+1[BX]←’0’,BX←BX+1[BX]←’$’结束微机原理课程设计电子秒表7四、源程序运行结果图4.1程序执行效果图4.2原程序代码(见附录)五、程序调试由于是第一次用汇编语言编写一个较为复杂的程序以实现具体功能,在编写以及调试过程中我们遇到了很多问题,经过我们的努力,这些问题最终得以顺利解决,下面列举了我们遇到的问题及其解决方法以供参考。1.我们将程序打入电脑进行汇编时,发现汇编程序运行后没有生成相应.OBJ文件,相反却是满页的错误提示,按照提示我们查找问题,发现都是低级错误,只要认真即可避免。2.经过正确的汇编后,可执行文件生成,开始后进入DOS运行界面,屏幕上显示的全是乱码,经过查找,最终我们找到问题症结所在:缓冲区赋初值后没有在其末尾赋入结束标志字符‘$’,经过重新定义,问题解决。3.乱码问题解决后,屏幕显示计数结果,但却并没有显示在屏幕中央,这种问题只能是光标定位程序IOSET调用出现错误,在仔细检查该程序后发现DX赋值错误,将0027H改为0D27H后问题解决。微机原理课程设计电子秒表84.延时子程序的调试延时程序的时间并没有经过精确计算,因此只能用试探法逐渐增加或减小AX值。我们组是每十秒与标准时间比较一次,程序走的比较快因此应逐渐增加AX值,最终选定AX=0140H。当然这样不可能做到十分精准,但是在误差允许范围之内就可以了。并且该参数的确定与电脑的运行速度有关,在不同的PC机上运行起来准确度是不一样的。5.图形显示程序的调试图形显示使用了宏调用,因为它可以方便的传递参数,图形显示需要大量重复性程序语句,使用宏定义既可以节约编程时间,又可以让程序更简洁。调试的主要任务是使图形更美观。可以在.txt文件中摆出图形,编辑成字符串格式,合理使用空格,使其首字符地址列号相同,这样调用宏时只需将光标定位参数的行号依次加一,避免了数行号和列号的繁琐工作。另外应注意定义字符串一定要以$结束,否则会出现乱码。并应用单引号开始和结束,否则在编译时会出现字符串非正常结束的错误。6.清屏子程序调试由教科书《微型计算机原理与接口技术》附录四ROMBIOS中断调用,我们知道可以使用BIOS中断调用中10H号中断的6号功能实现向上滚屏,同时可以设置颜色。但书中没有具体指明颜色代号,我们从网上查找了各颜色的参数值,经过多次调试最终确定图形使用0EH黄色。7.在CLOUR程序段中,定义的是字体或屏幕颜色。开始时只有一半的屏幕显示颜色。我们改变中间变量,发现是字符串长度设置的太少,然后定义字符串长度大一些,问题得以解决六、心得体会经过这次课程设计,我觉得我有了很大的收获:1.正确规划,提高效率编写程序的过程中会遇到各种各样的问题。为了能够正确设计,首先要画流程图,利用流程图的帮助,获得功能实现的思路,并不断完善程序步骤。将流程图中的每部分功能通过子程序来实现,能有效降低程序编写的难度,并有利于分部进行调试。利用流程图可以帮助我们搭建程序的大框架,然后子程序实现每个具体的功能。2.程序模块化很重要整个程序就像一座高楼,要建好这座高楼就必须将其各部分分别规划,设计程序也一样。微机原理课程设计电子秒表9设计流程时,要分模块来设计,一个模块实现一具体功能,最后再将模块连接起来,这就是模块化的思想,这种思想条理性更强,而且也便于在出现问题的时候调试。当程序较长时,模块化思想就显得尤为重要。这时候子程序和宏定义不但使得代码清晰有条理,而且更重要的是不易出错,方便调试。3.有些事情想的容易,真正实现起来却很困难。我本来以为这个课程设计会很简单,一个简单的秒表程序应该很快就会编好,可是当开始编程时我却觉得无从下手。如是又好好研读了老师给的资料,才总算找到一些头绪。这也给我以后的学习一些启示:凡事要动手,不要空想。4.这次课程设计使我对于工科设计的严谨性有了更深地体会。我们本次设计的秒表仅仅是工科设计中非常简单的一个,思想并不是非常复杂,手头也有一定的资料,但是我们在编程,调试过程中还是出现了一些错误。简单的一些程序好检查,但是如果说是以后要设计的一些大型程序,出现故障就不是那么容易检查了。这就要求我们在以后的工程设计当中要更为细致仔细。5.我的专业知识得到了很好的巩固,对于本专业的一些问题有了更深的思考。原来有很多知识只是死学课本,而并没有与实际相结合,而这次课程设计使我的专业知识与实际有了很好的契合。6.通过这次课程设计,我掌握了一些检查与判断错误的经验与方法,在程序调试方面也有了很大提高,尤其是能熟练掌握DEBUG的用法,这对我今后的专业学习与设计有着深刻的影响。7.对专业设计的许多流程、原则、注意事项以及撰写专业报告的有关事项有了一定的了解。学到了书本上没有的知识,掌握了一些程序设计的技巧,对以后进行设计及撰写论