微机原理课程设计报告-8_第1页
微机原理课程设计报告-8_第2页
微机原理课程设计报告-8_第3页
微机原理课程设计报告-8_第4页
微机原理课程设计报告-8_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉理工大学《微机原理与接口技术》课程设计说明书PAGEPAGE111设计任务及要求1.1设计任务采用汇编语言设计一个运行于计算机的小鸟动画程序。在屏幕上显示一只小鸟,当按下按键S时,小鸟开始飞行;当按下按键B时,小鸟开始发声;当按下按键P时,小鸟暂停飞行和鸣叫;而按下按键C时,小鸟继续飞行并且鸣叫;按下Q键时,退出程序。1.2设计要求设计任务及要求分析方案比较及认证说明系统原理阐述软件设计课题需要说明:软件思想,流程图,源程序及程序注释调试记录及结果分析总结参考资料附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图2方案比较及论证2.1方案比较在小鸟动画程序设计中主要分为两个部分:一个部分是小鸟图像形成与移动部分,另一个部分是小鸟发声鸣叫部分,只要相应地设计出这两个部分之后,将二者结合起来,就可以完成任务要求。首先讨论小鸟图像形成及移动部分的方案。通过查阅资料,形成小鸟图像有两种方法:一种是字符形成小鸟图像(即文本方式);另一种是像素点形成小鸟图像(即图形方式)。方案一:用字符形成小鸟图像,主要是利用BIOS中的INT10H中断,即显示器中断,INT10H中的09H号功能是在光标制定位置处写字符和属性。程序结构图大致如下:MOVAH,09H;置光标MOVAL,‘字符’;字符ASCII码MOVBL,7;字符属性MOVBH,0;第0页MOVCX,数量值;字符重复个数INT10H方案二:用图形方式形成小鸟图像,是利用像素来产生彩色图案,它也是利用BIOS中的INT10H的功能00H来设置图形方式。程序结构大致如下面所示:MOVAH,00H;请求设置方式MOVAL,0CH;彩色图形INT10H;调用中断服务以上是关于小鸟图像显示的两个方案。小鸟发声程序也是一个比较重要的环节,中间涉及到扬声器发声部分。而在关于扬声器发声时,主要有两种方式,分别是以位触发和定时器控制。下面就这两种不同的方式确定两个不同的设计方案。方案一:发声采用位触发方式。程序直接控制PPI(8255可编程序外围接口芯片)的输出控制寄存器(I/O端口为61H)的第一位,使该位按所需的频率进行1和0的交替变化,从而产生一串脉冲控制波形,这些脉冲经过放大后驱动扬声器发出声音。可以利用软件延时来控制所产生的脉冲波形的长度和脉宽,就可以实现产生不同频率和不同音长的声音。软件实现的程序如下:

INAL,61H

MOVAH,AL

ANDAL,0FCH;关断定时器通道2的门控

SOUND:XORAL,2;触发61H端口第1位

OUT61H,AL

MOVCX,DX;(DX)=控制脉冲的计数值

WAIT:LOOPWAIT;延时循环

DECBX;(BX)=脉冲持续的时间

JNZSOUND

MOVAL,AH

OUT61H,AL;恢复61H端口

在本方案中,通过程序的方法来控制PB1,使其在1和0之间按一定的频率变,从而产生一串脉冲。控制脉冲宽度的计数值的算法如下:

计数值=2801*100/音频

如果音频为f,则脉冲周期1/f一个半波的时间为1/2f秒,而1/2f秒的延时可简单地通过LOOP指令的循环来取得,由于2801次LOOP指令循环执行所需时间是10MS,所以一秒钟时间约执行2801*100次LOOP指令。控制脉冲宽度的计数值的实现程序如下:MOVBX,100

WAIT:MOVCX,2801

DELAY:LOOPDELAYDECBXJNZWAIT算出了脉冲宽度,再通过高低电平的不断变换,就可实现不同频率的脉冲方波。把此方波经滤波放大即可驱动扬声器发声了。方案二:利用定时器发声。这里是通过硬件即8253定时器产生声音。CPU通过对定时器的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率的计数值就可由下式计算:计数值=533H×896÷f=1234DCH÷f

在送出频率计数值之前,还要给方式寄存器送一个方式值,该数决定对哪一个通道编程,采用什么模式,送入通道的计数值是一字节还是两字节,是二进制码还是BCD码。其位组合的格式如下:

当通道2用于发声时,采用的是模式3,在模式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。

产生指定频率声音的程序段如下:PUSHAX ;保存ax的值 MOVAL,0B6H;给2号定时器的43端口送入一个特定的数0B6HOUT43H,ALMOVAX,34DCHDIVBXOUT42H,AL;给42H端口装入一个16位的计时常数(533H*896/频率)MOVAL,AHOUT42H,ALIN AL,61H ;获取61h端口的当前值OR AL,03H ;把61h端口低二位置1,即打开蜂鸣器OUT 61H,AL ;输出数据到61h端口POP AX ;恢复ax的值2.2方案论证选择在显示小鸟图像的两个方案中,方案一具有数据量少,操作简单的特点,但显示的图形与实际物体有偏差;方案二中显示的图像形象逼真,但它的数据量极其大,操作起来有点困难。鉴于以上的比较,在小鸟显示图像这个环节决定采用方案一,以减小操作量。而对于小鸟发声区别在于以不同的方式来驱动扬声器发声。经对比可知,两种方案都各有优缺点。在方案1中,其优点是电路简单,所用的器件芯片少,主要芯片只有需一片8255,产生方波是通过软件来实现的,易于修改和维护。然而它也存在一定的缺点,就是系统不断地通过软件来产生方波,系统资源被占用,无法再做其它事。与方案1相比,方案2增加了一个8253芯片和一个与门,虽然电路比方案1复杂,但通过定时器产生方波,实现起来比较简单,而且也不会出现系统资源被全部占用的情况。所以经过分析,小鸟发声程序选择方案二进行设计。3系统原理阐述3.1工作原理在小鸟动画程序中,所要完成的任务是小鸟能够在屏幕上显示并且能够移动,另一个任务是小鸟能够发出声音,这两个问题涉及到不到的硬件配置。下面将依次介绍其工作原理。小鸟在屏幕上显示与移动的原理:通过查阅书籍了解到DOS中的一些关于显示器的中断,首先是如何在屏幕中显示出小鸟图像。上一节已将阐述了采用字符图形方式来显示小鸟图像。具体程序如下:MOVAH,09H;在当前光标位置处写字符和属性MOVAL,01H;字符的ASCII码值LEABX,SHULIANGMOVDX,FLAGADDBX,DXMOVCL,[BX];CX为写入的字符数MOVCH,0MOVBH,0;写入的页数MOVBL,16H;字符属性INT10H实现小鸟移动的原理是:小鸟向左移动,首先将前一帧小鸟图像进行清屏,并且将形成小鸟图像的每个字符的列号减一,这样就实现了小鸟的移动。但是为了保证小鸟在移动中能够在人眼的视觉效应中,需要进行延时,这样就可以能够连续观察到小鸟的飞行过程。小鸟的移动程序如下:MOVYANSHI,5CALLDelay;进行延时MOVAH,02HMOVDX,0MOVBH,0INT10HMOVAH,09H;清除前一帧图像MOVAL,''MOVCX,1700MOVBL,07HINT10H在任务要求中,要按下按键‘P’暂停,按下按键‘C’继续,按下按键‘Q’时退出,这些功能只需要调用BIOS中的INT16H的键盘中断,来检查键盘的输入,并且根据条件进行无条件跳转。程序如下:MOVAH,0H;读取一个字符INT16HCMPAL,'Q'JZTUICHUCMPAL,'C'JNZDENGDAI实现小鸟发声程序的原理:利用8253定时器来驱动扬声器,PC机中有三种不同的定时器。0号定时器用来作为日常通用的时钟,它每秒约发出18次中断一修正时间;1号定时器用于DMA(直接存储器存取)传送数据,连接到扬声器上的是2号定时器,它实际上是一个振荡电路,此电路向扬声器发送指定频率的脉冲,当输出端口61H控制扬声器为接通状态时,就发出了一定频率的声音。利用8253定时器发出声音大概包括以下三个步骤:1.在2号定时器中的43H端口送一个特定的书0B6H(10110110B),此数对定时器的方式寄存器进行初始化,使定时器2准备接收计时常数。2.在2号定时器的42H端口装入一个16位的计时常数(533H*896/频率),以建立将要产生的声音频率。3.把输出端口61H的0,1两位置1,发出声音。其发声程序如下:MOVAL,0B6HOUT43H,ALMOVAX,34DCHMOVDX,12HDIVBXOUT42H,ALMOVAL,AHOUT42H,ALINAL,61HORAL,03HOUT61H,AL3.2系统组成框图在小鸟成像这一环节中主要是利用PC内部的DOS和BIOS中断,所以对其电路图很难描绘出来。但在小鸟发声程序中,主要利用8255和定时器8253来驱动扬声器发声,因此,可以将其电路图表示出来,扬声器驱动图如下。CLK2CLK2OUT2GATE2PB0PB1&驱动扬声器1.19MHZ8253+5V8255口地址:PA口=60HPB口=61HPC口=62H控制口=63H8253口地址:计数器0=40H计数器1=41H计数器2=42H控制寄存器=43H600HZ的声音,对应的8253初值为:1.19MHZ/600=19833-1PC机上扬声器驱动电路原理图分析:PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的。PPI包括3个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。由PPI输出寄存器中的0、1两位来选择扬声器的驱动方式。连接到扬声器上的是定时器2,GATE与端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模式3(方波)下工作。定时器2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连。当PB1=1时,允许OUT2的输出信号到达扬声器电路。因此,只有PB0和PB1同时为“1”时,才能驱动扬声器发声。就整个电路而言,接好电路后,通过软件编程不断地采集从8255口中输入的信号,而按键都接在8255的A口上,只要有按键按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给8253的通道2,8253的通道2工作的方式3下,这样就可以产生满足频率要求的发声方波。这个方波经驱动放大就可以使扬声器发出相应的声音。所以8255在这里完成两个任务,它不仅从A口中采集到数据,而且B口的PB1和PB0两个位要控制发声。8253的主要任务就是产生所要求发声的不同频率的方波。以上就是关于小鸟动画程序的原理解析。4软件思想与流程图4.1程序功能描述程序开始,显示出小鸟的图像,并且显示提示信息,对缓冲区初始化。按键扫描,将按键值送入到AL中,当按下S键时,小鸟飞行;按下B键时,小鸟鸣叫;按下P键时,小鸟停止飞行并且停止鸣叫;而按下Q键时,退出程序。4.2程序流程图:主程序:主程序的流程图如下图所示。从主程序的流程图中可以得出其工作流程。首先,显示小鸟图像和缓冲区的提示,并且判定是否有按键输入和按键是否是‘S’键,如果是,小鸟飞行;如果不是,则继续停止在初始化的位置处。判定键盘输入是否是‘B’,如果是,则小鸟继续飞行而且鸣叫,如果不是,则小鸟只是继续飞行。当为按键‘B’时之后,再来判定键盘输入是否为‘P’,如果是,则小鸟停止飞行而且还停止鸣叫;当按键不是‘P’时,小鸟则继续飞行和鸣叫。以后再来判定键盘是否为‘C’或‘Q’,当为‘C’时,小鸟则恢复飞行和鸣叫;如果不是,小鸟则继续暂停;当为‘Q’时,则退出程序。NYNYYYYNNNYN开始显示小鸟图像按下S键?小鸟飞行按下B键?小鸟鸣叫并且飞行按下P键?小鸟停止鸣叫和飞行按下Q键?退出程序按下C键?N子程序流程图:读取8253计数初值8253置初值读取8253计数初值8253置初值开启与门和8253GATE延时关闭与门和8253GATE返回4-2子程序流程图5调试记录及结果分析5.1电路连接一般无须连接电路,如果想要听到笑鸟鸣叫声大一点,可以把电脑里面的蜂鸣器接口用导线引出来,外接一个大的扬声器,效果可能好一点。5.2调试步骤1)运行MF2KP汇编软件,在里面编辑源程序,编辑完成之后,生成.ASM文件,保存该该文件;2)接着仍用上面的软件进行编译,连接,运行生成.EXE文件;3)运行所生成的EXE文件即可产生所需要的结果。程序正常运行截图如下面的几幅图像所示。当点击开.EXE文件之后,形成下面的小鸟静止图像。图5-1初始化图像当按下按键S时,小鸟飞行图像如下图所示。图5-2小鸟飞行图像因为在小鸟发声程序结果不好显示,故省略这一步骤。当键盘输入为P时,小鸟暂停图像如下面所示。图5-3小鸟暂停图像当键盘输入按键为C时,小鸟继续飞行,其演示结果如下图所示。图5-4小鸟继续飞行图像当键盘输入为Q时,退出程序。5.3调试中出现的问题、原因及排除方法在编程调试的过程中,遇到了很多麻烦,总结起来有以下几点:问题1:寄存器不够用怎么办?原因:使用了太多的寄存器,AX、BX、CX、DX。解决办法:使用外部变量定义,定义外部变量的方法为: 变量名 数据类型?问题2:寄存器的值变幻无常,怎么办?原因:程序结构过于复杂,使用寄存器比较频繁,以及使用了BIOS中断程序,这样会导致其它与之相关寄存器的值的改变。解决办法: 堆栈是保护环境的主要工具,一旦用错,后过将很严重,比如我们在调试程序的过程中,遇到过这样的问题:在一个函数的开始,我先用PUSH把所有寄存器入栈了,在函数的执行中,我又把一个寄存器PUSH到栈中保存,却忘记了在执行POP指令之前把它恢复出来!这样就造成了所有的寄存器的值都的生了变化,包括数据和代码段寄存器,这样不出问题才怪呢?!所以,要记住,PUSH了一个变量之后在新的PUSH来临之前如果又有POP别的变量的语句,一定会出问题!解决的办法只有一个,把PUSH和POP对上号。问题3:要显示的字符串过多,但又不想重复写代码,既要美观,又要易读,怎么办?原因:过于频繁的调用中断显示字符串,导致程序过于庞大和复杂,可读性差。解决办法: 解决这种问题的最好方法是直接把显示部分写成子过程,但是子过程在传递参数的时候不方便,所以就用宏定义,宏定义可以很方便的传递参数,不仅使得程序美观好看,而且可读性好,程序代码紧凑。问题4:跳转,转移指令跳出的范围太大,编译出现错误怎么办?原因:程序结构过于复杂,庞大。解决办法:使用过程,也就是子程序设计,直接把一个要频繁要用到的函数打包成一个子过程,然后用CALL调用子过程就可以了,这样就可以避免使用跳转和转移指令了。比如开启扬声器子过程:;开启扬声器spk_onproc near push ax ;保存ax的值 in al,61h ;获取61h端口的当前值 or al,03h ;把61h端口低二位置1,即打开蜂鸣器 out 61h,al ;输出数据到61h端口 pop ax ;恢复ax的值 retspk_onendp调用子过程如下:call spk_on ;关闭蜂鸣器问题5:汇编里面怎样进行查表处理?原因:还不够牢固的掌握汇编编程解决办法: 汇编里面进行查表处理的我只掌握了一种简单的设计,直接用下标例如:在查表中,首先要记住两点,一是表的首个偏移地址送入寄存器BX中,另一个是需要查找的字符一定要送入寄存器AL中。只有这样,才能正确的查找到所需要的数据。心得与体会由于之前在实验室时曾经用单片机做过一个电子相册,所以对视频成像还是有一些了解,再就是在课堂上认真听讲,理论知识学习的比较好,因此很快就能用汇编语言将小鸟的图像在屏幕上显示出来。但是,当我做到小鸟发声这个子程序时,查阅了大量资料,调试了大量的程序,还是不能够在个人PC上实现正确的发声。由于中间还有一堂自动控制原理的考试,因此感到很焦急。最后只有向石老师和研究生学长请教之后,才勉勉强强完成了任务。虽然画出的小鸟不是很像,并且比别人多花了许多时间才完成任务,但是当可以在自己的电脑上敲击按键实现小鸟的飞行,暂停,鸣叫的功能时,,内心的喜悦之情还是油然而生。通过将近一个半星期的摸索和编程,查资料,终于把程序完成了。可以毫不夸张的说我的汇编编程技术有一个质的飞跃,因为课堂上仅仅学习的是理论知识,很少去应用,不能够真正的检验出我的汇编语言编程能力。在这次《微机原理与接口技术》的课程设计中,我的体会就是:要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行。每一个程序员都是在失败、尝试、失败、尝试与收获中成长起来的。而课程设计给了我一个很好的机会,将理论和实践很好的结合起来了,使我的知识更加结构化和系统化,而且还可以学到一些课堂上不讲或是一语带过的知识,增加我的课外理论知识。同时我也可以从中获取很多的乐趣,原来汇编语言的功能是如此的强大,感觉很好玩,很有意思。还有很重要的一点就是在调试程序时要讲究心平气和,而我恰恰是比较急躁的一个人,这次的课程设计程序调试过程中,很好的磨砺了我那急躁的性格,教会我学会冷静地去处理问题,相反,越毛躁越容易出问题,恶性循环,问题也就难以去顺利地解决。总之,通过这次课程设计,自己的课堂上的理论知识得到了巩固,而且也增长了不少,各方面的能力都得到了一定的提高。有人曾对我说过“对一件事情感兴趣是即使在没有任何外界压力下也依然孜孜不倦的去学习它,运用它”,我想我还会继续和汇编语言打交道,更深一步去挖掘它。最后,感谢石老师的帮助和指导。通过您的答疑,我少走了很多弯路,很好地完成了任务。谢谢您!参考文献[1]朱定华著.微机原理、汇编与接口技术[M].北京:清华大学出版社.2007年[2]马春燕.微机原理接口技术实验与学习辅导[M].北京:电子工业出版社.2007年[3]周佩玲、彭虎、傅忠谦编著.微机原理与接口技术[M].北京:电子工业出版社.2007年[4]沈美明、温冬婵著.IBM-PC汇编语言程序设计[M].北京:电子科技大学出版社.2006年[5]张雪兰、谭毓安、李元章著.汇编语言程序设计——从DOS到WINDOWS[M].北京:清华大学出版社.2006年[6]余朝琨著.IBM-PC机汇编语言程序设计[M].厦门:厦门大学出版社.2001年附录:1.DOS/BIOS功能调用,文件列表清单1、扫描键盘按键功能号:0用途:扫描键盘按键键值参数:AH=0调用:INT16H返回:AL=按键的ASCII码2、退出系统,返回DOS功能号:4CH用途:读取时钟计数值参数:AH=4CH调用:INT21H返回:无3、在当前光标位置写字符和属性功能号:09H用途:在当前光标位置写字符和属性参数:AH=9,BH=页号,AL=字符的ASCII码,BL=字符属性,CX=写入字符数调用:INT10H返回:无4、清除屏幕功能号:06H用途:清除当前屏幕中的内容参数:AL=‘’,CX=起始点横纵坐标,DX=终止点横纵坐标,BH=空白行的属性调用:INT10H返回:无5、设置光标到指定位置功能号:02H用途:将光标显示在指定位置参数:DL=列号,DH=行号,BH=页号调用:INT10H返回:无6、字符串输出功能号:09H用途:将一串以‘$’结尾的字符串输出参数:DS:DX=字符串的首地址,定义要显示的字符串,字符串以‘$’结尾调用:INT21H返回:无2.程序源代码及注释DATASEGMENTZONGZUOBIAODB13,13,11,10,10,9,20,6,9,5,3,2,1,9,19,9,10,11,11,11,12,13,14HENGZUOBIAODB1,2,3,4,5,6,6,7,7,8,9,10,11,12,12,13,14,15,16,17,18,19,20SHULIANGDB2,4,6,7,7,8,3,1,14,18,20,20,23,7,4,6,5,4,4,4,3,2,1FLAGDW0YIDONGDB0YANSHIdw0TISHIdb'pressStostart,Btobound,Ptopause,Ctocontinue,Qtoquit','$'DATAENDSSTACKSEGMENTDW200dup(0)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAH,0;0号功能MOVAL,03H;设置80×25的彩色文本方式INT10HMOVAH,02H;显示提示信息MOVDH,24MOVDL,10MOVBH,0INT10HLEADX,TISHIMOVAH,09HINT21HMOVFLAG,0MOVYIDONG,40;描绘小鸟图像LOOP4:MOVAH,02H;设置光标位置LEABX,HENGZUOBIAOMOVCX,FLAGADDBX,CXMOVDH,[BX];DH代表行号LEABX,ZONGZUOBIAOADDBX,CXMOVDL,[BX];DL代表列号ADDDL,YIDONGMOVBH,0;表示页号INT10HMOVAH,09H;在当前光标位置处写字符和属性MOVAL,01H;设置字符ASCII码LEABX,SHULIANGMOVDX,FLAGADDBX,DXMOVCL,[BX];CX代表写入字符数MOVCH,0MOVBH,0MOVBL,16H;字符属性INT10HINCFLAGCMPFLAG,22;表示要写23次JNALOOP4;判断操作步骤LOOP5:MOVAH,01HINT16HCMPAL,'Q'JZTUICHUCMPAL,'S'JNZLOOP5MOVYIDONG,40LOOP3:MOVFLAG,0;小鸟飞行程序LOOP2:MOVAH,02H;置光标位置LEABX,HENGZUOBIAOMOVCX,FLAGADDBX,CXMOVDH,[BX]LEABX,ZONGZUOBIAOADDBX,CXMOVDL,[BX]ADDDL,YIDONG;纵坐标(相当于列)加上40MOVBH,0;选择在第0页INT10HMOVAH,09H;在当前光标位置处写字符和属性MOVAL,01H;字符的ASCII码值LEABX,SHULIANGMOVDX,FLAGADDBX,DXMOVCL,[BX];cx为写入的字符数MOVCH,0MOVBH,0;写入的页数MOVBL,16H;字符属性INT10HINCFLAGCMPFLAG,22JNALOOP2MOVAH,01H;检验有没有字符输入INT16HJZJIXU;表示没有键

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论