乐曲程序的设计与实现毕业设计(论文)word格式.doc

上传人:laozhun 文档编号:4019961 上传时间:2023-04-01 格式:DOC 页数:20 大小:177KB
返回 下载 相关 举报
乐曲程序的设计与实现毕业设计(论文)word格式.doc_第1页
第1页 / 共20页
乐曲程序的设计与实现毕业设计(论文)word格式.doc_第2页
第2页 / 共20页
乐曲程序的设计与实现毕业设计(论文)word格式.doc_第3页
第3页 / 共20页
乐曲程序的设计与实现毕业设计(论文)word格式.doc_第4页
第4页 / 共20页
乐曲程序的设计与实现毕业设计(论文)word格式.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《乐曲程序的设计与实现毕业设计(论文)word格式.doc》由会员分享,可在线阅读,更多相关《乐曲程序的设计与实现毕业设计(论文)word格式.doc(20页珍藏版)》请在三一办公上搜索。

1、学 号: 0120610340832课 程 设 计题 目乐曲程序的设计与实现学 院计算机科学与技术专 业计算机科学与技术班 级计算机0608班姓 名李 琼指导教师周德仿2009年1月16日课程设计任务书学生姓名: 李 琼 专业班级: 计算机0608班 指导教师: 周德仿 工作单位:计算机科学与技术学院 题目: 乐曲程序的设计与实现初始条件:理论:完成了汇编语言程序设计课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。实践:完成了汇编语言程序设计的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。要求完成的主要任务: (包括课程

2、设计工作量及其技术要求,以及说明书撰写等具体要求)进一步理解和掌握程序直接控制I/O方式,掌握计算机发声程序的设计。具体的设计任务及要求:1采用位触发方式编写程序,使计算机发出音响并奏出两只老虎的乐曲。1) 通过查阅相关资料,进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。2) 一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,给出乐曲的频率表;设二分音符持续时间为0.5秒(50*10ms),50作为2拍的计数值,给出乐曲的节拍时间表;3) 编写程序并调试通过。2进一步学习利用定时器产生声音的方法,使计算机奏出乐曲

3、(例如两只老虎等)。在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。阅读资料:1)IBMPC汇编语言程序设计实验教程3.1节2)IBMPC汇编语言程序设计(第2版)10.4节,10.5节时间安排:设计安排一周:周1、周2:完成系统分析及设计。周3、周4:完成程序调试,和验收。周5:撰写课程设计报告。指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日乐曲程序的设计与实现1 实验设计目的以及功能1.1设计目的汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够用计算机所有硬件特性并能直接控制硬件的唯一语言。通过这次实验要求我们:

4、1)了解通用发声程序 2)了解与掌握定时.计数.音乐.频率.时间之间的关系 3)学会用发声程序的设计方法 4) 学会用汇编语言编辑音乐程序 通过音乐程序设计熟悉并掌握用汇编语言编程的方法和特点,借此来比较高级语言低级语言的优缺点,以便更好运用各种语言来开发应用软件通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。能用汇编语言熟练地运用三大结构,进一步掌握各个指令的功能,特别是转向指令,能掌握子程序的定义及调用,包括段间及段内调用,以及正确地运用DEBUG指令,进一步理解和掌握程序直接控制I/O方式。1.2 设计功能在本次实验中,

5、编写源程序,并要求实现以下功能:1采用位触发方式编写程序,使计算机发出音响并奏出两只老虎的乐曲。1) 通过查阅相关资料,进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。2) 一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,给出乐曲的频率表;设二分音符持续时间为0.5秒(50*10ms),50作为2拍的计数值,给出乐曲的节拍时间表;3) 编写程序并调试通过。2进一步学习利用定时器产生声音的方法,使计算机奏出乐曲(例如两只老虎等)。2开发平台开发环境:Windows平台Visual C+ 6.0编译器运行环境:Win

6、dows,Linux全系列平台开发语言:C+3 概要设计 31 设计思路编写这个乐曲程序可分为四个步骤:311 定义频率表和时间表根据音阶表和简谱为演奏的乐曲定义一个频率表freq和一个节拍时间表time。频率表中的数据可以从书本查到,节拍时间表中的数据是延迟时间10ms的倍数。312 将两个表的偏移地址放入SI和DILEA SI,MUS_FREQLEA BP,DS:MUS_TIME313 取频率和时间从表中取出音符的频率放入DI,取出音符的持续时间(实际上是10ms的倍数)放入BX。MOV DI,SI MOV BX,DS:BP频率表中最后一个数据OFFFFH作为乐曲的结束符,也可用0或其他的

7、特殊值来代替。314调用SOUND子程序发出音调调用通用发声子程序GENSOUND发出音调。这个程序比较简单,如果想演奏另一个乐曲,只需把freq和time两个表中的数据换成另一个乐曲的频率和节拍时间就可以了。3.2 程序流程图开始结束是否继续N是否为A唱歌YNN是否为QYY请输入一个字符4详细设计41 发声程序411 扬声器驱动方式PC机上的大多数都是由主板上的8255(或8255A)可编程序外围 接口芯片(PPI)管理的。PPI包括三个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。由PPI输出寄存器的0或

8、1两位来控制扬声器的驱动方式。411 .2 采用定时器方式:它是利用8253/54定时器来驱动扬声器。连接到扬声器上的是2.从扬声器的驱动系统图中可以知道,GATE2与端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模板3下工作。定时器2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连。当PB1=1时,语序OUT2的输出信号到达扬声器电路。当通道2用于发声时,一般采用模式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。下面是利用定时器产生指定频率声音的程序段:SOUND PROC NEAR ;定时器发出6614

9、频率的声音 PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H ;向8253-5/8254-2计数器2写控制字 OUT 43H,AL ;方式3、双字节写和二进制计数方式写到控制口 MOV DX,12H ;设置被除数 MOV AX,348CH DIV DI OUT 42H,AL ;先送LSB MOV AL,AH OUT 42H,AL ;后送MSB IN AL,61H ;读8255端口B(61H)原值 MOV AH,AL ;保存端口原值 OR AL,3 OUT 61H,AL ;接通扬声器WAIT1: MOV CX,4000 CALL WAITF

10、DELAY1: DEC BX JNZ WAIT1 MOV AL,AH ;写回61H口原值,关闭扬声 OUT 61H,AL POP DI POP DX POP CX POP BX POP AX RET ;子程序结束返回SOUND ENDP WAITF PROC NEAR ;获得0.05s时间延迟 PUSH AX WAITF1: IN AL,61H AND AL,10H CMP AL,AH JE WAITF1 MOV AH,AL LOOP WAITF1 POP AX RET WAITF ENDP411.2 采用位触发方式程序直接控制PPI(8255A可编程序外围接口芯片)的输出控制寄存器(I/O端

11、口为61H)的第一位,使该位按所需的频率进行1和0的交替变化,从而控制开关电路产生遗传脉冲波形,这些脉冲经放大后驱动扬声器发出声音。如果控制这一脉冲波形的脉宽和长度就可以产生不同频率和不同音长的声音。扬声器发声通用子程序:IN AL,61HMOVE AH,ALAND AL,11111100B ;关断定时器通道2的门控SOUND: XOR AL,2 ;出发61H端口第一位 OUT 61H,ALMOV CX,DX ;(DX)=控制脉宽的计数值WAIT: LOOP WAIT ;延迟循环DEC BX ;(BX)=脉冲持续的时间JNZ SOUNDMOV AL,AHOUT 61H,AL ; 回复61H端口

12、4 . 2 演奏乐曲程序两只老虎简谱5调试结果与运行情况分析5.1调试结果5.1.1DOS环境的初始界面5.1.2输入错误后的界面5.1.3继续选择输入后的界面5.1.4唱完歌后的界面5.1.5退出时的界面5.2运行情况分析5.2.1 伪操作格式错误5.2.1.1 错误格式HELLO ; DB 0DH,0AH, ;DB0DH,0AH, DB 0DH,0AH,* DB 0DH,0AH, 5.2.1.2 错误现象Error A2008 syntax error HELLOError A2006 undefined symbol HELLO5.2.1.3 错误原因数据定义及存储器分配伪指令的格式是:

13、变量 助记符 操作数, ,操作数 ;注释即一行由四部份组成,各部份的顺序不能搞错,但可以根据需要缺省其中的一部份或几部份,甚至全部省去,即空白行。标号后面不可以有有:,而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用,分开,注释前必须用;,也即;后面的语句将不参与汇编,不生成代码,所以必须在同一行写才可以。5.2.1.4 修正方法HELLO DB0DH,0AH,* DB 0DH,0AH, 5.2.2 思维不缜密5.2.2.1 缺少如下代码MOV AH,4CH ;带返回码终止,AL=返回码 INT 21H5.2.2.2 错误现象按A的时候会唱歌,但是按Q退出的时候也

14、会唱歌,唱完后又会返回到进入时的菜单,一直循环,而出现无法退出的情况。5.2.2.3 错误原因因为这段代码的作用是带返回码终止,AL=返回码。所以,如果没有此段代码,程序就不会终止,就会进入死循环,导致一直循环下去。5.2.2.4 修正方法加上如上的代码。5.2.3 常识错误5.2.3.1 代码如下INFO1 DB 0DH,0AH, DB 0DH,0AH,* INPUTERROR! *5.2.3.2 错误现象在输出的时候下面的代码INFO2也会一起输出。5.2.3.3 错误原因$结束语标志,如果INFO1没有结束语标志,那么它将连同下面的代码也一起输出。5.2.3.4修正方法加上结束语标志。6

15、课程设计总结我很喜欢汇编语言这门课,所以对这门课程设计也有些许的期待,但是当我刚拿到题目的时候,看到居然是用汇编语言编写程序,使计算机弹奏音乐,确实吓了我一大跳,因为从小到大我唱歌就不好听,我是一点音乐细胞都没有的,对于什么乐谱啊什么的都一窍不通。但是我相信其他同学做的好的我也一定可以的,所以还是下定决心来做,才发现没有想象中的困难。我首先把书本上关于通用发生程序看了一下,了解到了扬声器的驱动方式,发生原理,并且对所给出的发生程序也做了仔细的研究,它包括三个步骤:1)在8253/54中的43端口送一个控制字0B6H(10110110B)该控制字对定时器2进行初始化,使定时器2准备接受计数初值;

16、2)在8253/54中的42H端口转入一个16位的计数值,以建立将要产生的声音频率;3)把输出端口61H的0,1两位置1,发出声音。BEEP是一个很好的发生程序,可以利用并修改BEEP,使其产生任一频率的声音。为此做了两点修改,首先,BEEP程序只能产生896HZ的声音,通用发声程序应能产生任一频率的声音。其次,BEEP产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数。通过看书我知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为:533H896给定频率=123280H给定频率再根据编写

17、乐曲的四个步骤编写两只老虎的程序。在编写的过程中,首先要根据两只老虎的乐谱写出其频率和延迟时间,但是由于对几分之几拍不是很了解,所以在| 56 54 3 1 | 56 54 3 1|上费了很大的功夫,唱出的歌总是感觉慢了半拍,跟不上节奏,后来经过同学指点才知道自己错在哪了。还有就是界面的设置,因为刚写的时候就是照着书本上写的,所以出现的DOS界面就是全屏的,开始以为在汇编中的DOS界面就是这样的,但看到其他同学的全是黑色的小方框,才知道是自己程序自己设置的,这个让我了解到了怎样用汇编语言设置背景和字体,拓展了自己的知识。以前学跳转指令的时候就感觉很难,这次写程序也一样,跟那个开始的时候,对于按

18、Y键跳转的那条指令,总是没法跳过去,总是会有多余的语句,后来发现是自己没有设置结束符,要不就是结束符的地方设置的不正确,同时还和代码的顺序有很大的关系,比如刚开始的时候我把B0 写在了YES之后,程序总是出现错误,还有就是唱歌的问题,总是会持续的发痴吱吱吱的响声,而不是两只老虎的声音,或者程序按什么键都不动,不发出任何声音,后来发现是调用程序出错了,还有就是延时的那个代码写错地方了,导致节奏掌握的不是很准确,这些就是我在编写程序中遇到的问题。通过这次课程设计我觉得上机操作实践很重要,它有助于书本知识的系统化,现实化,更有利于自己的查漏补缺。书本上的知识是死的,能够在现实中运用的知识才是活的。在

19、平时的课本知识学习过程中,由于受很多其他因素的影响,学的是一塌糊涂,情况很不乐观。通过上机操作完成一项完整的程序设计后,加深了我对这一门课的认识,理解了汇编语言这门课的本质的东西,进而系统的完善了自己的知识体系,并从中找到自己得缺陷与不足, 另外,课本上应该记住的东西一定要记住。总的来说,在实验设计、编写及调试过程中我学会了很多。我需要学会的就是要对自己有信心,如果开始就一定要脚踏实地,持之以恒,要相信自己可以的,不要畏首畏尾的,遇到点困难难就觉得自己不行,很差劲,我觉得我的优点就是坚持下来了,而且也完成了,感觉很有成就感,同时,我也养成了一些好习惯。比如说,我们在设计程序时,必须先确定程序的

20、整体框架,架构好程序的主要模块;在编写程序过程中,要善于标注;在调试过程中,如果有错误,也要即时注释。另外,要注重细节,做到严谨、缜密。这种种好习惯都能受益终生。7参考文献1IBMPC汇编语言程序设计实验教程沈美明、温冬蝉编,清华大学出版社。2IBMPC汇编语言程序设计(第2版)沈美明、温冬蝉编,清华大学出版社。附件:data segment para datahello db 0dh,0ah, db 0dh,0ah,* db 0dh,0ah, db 0dh,0ah,* welcome you to come here! * db 0dh,0ah, db 0dh,0ah,* this is a

21、 music program! * db 0dh,0ah, db 0dh,0ah,* the name is two tigers! * db 0dh,0ah, db 0dh,0ah,* please select! * db 0dh,0ah, db 0dh,0ah,* a music * db 0dh,0ah, db 0dh,0ah,* q exit * db 0dh,0ah, db 0dh,0ah, $ bye db 0dh,0ah, db 0dh,0ah, db 0dh,0ah, db 0dh,0ah, db 0dh,0ah, db 0dh,0ah, db 0dh,0ah, db 0dh

22、,0ah, thank you for your listening! db 0dh,0ah, db 0dh,0ah, db 0dh,0ah, hoping for your next coming! db 0dh,0ah, db 0dh,0ah, db 0dh,0ah, $ try db 0dh,0ah, db 0dh,0ah,* do you want to try again? * db 0dh,0ah, db 0dh,0ah,* y yes * db 0dh,0ah, db 0dh,0ah,* other exit * db 0dh,0ah, db 0dh,0ah, $ info1 d

23、b 0dh,0ah, db 0dh,0ah,* db 0dh,0ah, db 0dh,0ah, input error!$ info2 db 0dh,0ah, db 0dh,0ah,* please input a lettle: $ *mus_freq dw 2 dup(262,294,330,262) dw 2 dup(330,349,392) dw 2 dup(392,440,392,349,330,262) dw 2 dup(294,196,262),-1 mus_time dw 8 dup(50) dw 2 dup(50,50,100) dw 2 dup(4 dup(25),2 du

24、p(50) dw 2 dup(50,50,100) data endsstack segment para stack stack db 200 dup (stack)stack endscode segmen assume ds:data,cs:codemain proc far mov ax,data mov ds,ax mov ah, 0 mov al,4 int 10h mov ah,0bh mov bh,0 mov bl,05 int 10h mov ah,0bh mov bh,01h mov bl,03 int 10hshow macro b lea dx,b mov ah,9 i

25、nt 21h endmshow helloinput: mov ah,01h int 21h cmp al,q jz retu cmp al,a jnz b0 lea si,mus_freq lea bp,mus_time call musicb0: show info1 show tryyes: mov ah,01h int 21h cmp al,y jnz retu show info2 jmp inputretu: call clear show bye mov ah,4ch int 21h main endpmusic proc near push ds sub ax,ax push

26、axfreq: mov di,si cmp di,-1 je mus1 mov bx,bp call sound add si,2 add bp,2 jmp freq mus1: retmusic endp sound proc near push ax push bx push cx push dx push di mov al,0b6h out 43h,al mov dx,12h mov ax,348ch div di out 42h,al mov al,ah out 42h,al in al,61h mov ah,al or al,3 out 61h,al wait1: mov cx,4

27、000 call waitf delay1: dec bx jnz wait1 mov al,ah out 61h,al pop di pop dx pop cx pop bx pop ax ret sound endp waitf proc near push ax waitf1: in al,61h and al,10h cmp al,ah je waitf1 mov ah,al loop waitf1 pop ax ret waitf endpclear proc near push ax push bx push cx push dx mov ah,6 mov al,0 mov ch,0 mov cl,0 mov dh,24 mov dl,79 mov bh,7 int 10h pop dx pop cx pop bx pop ax retclear endpcode ends end main

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号