版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学 号: 32课 程 设 计题 目乐曲程序的设计与实现学 院计算机科学与技术专 业计算机科学与技术班 级计算机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设计目的汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够用计算机所有硬件特性并能直接控制硬件的唯一语言。通过这次实验要求我们:1)了解通用发声程序
4、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编译器运行环境:Windows,Linux全
6、系列平台开发语言: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或其他的特殊值来代替。314调
7、用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或1两位来控制扬声器的驱
8、动方式。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频率的声音 PUSH
9、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 DELAY1: DEC
10、 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端口为61H)的第一位,
11、使该位按所需的频率进行1和0的交替变化,从而控制开关电路产生遗传脉冲波形,这些脉冲经放大后驱动扬声器发出声音。如果控制这一脉冲波形的脉宽和长度就可以产生不同频率和不同音长的声音。扬声器发声通用子程序:IN AL,61HMOVE AH,ALAND AL,B ;关断定时器通道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端口4 . 2 演奏乐曲程序两只老虎简谱5
12、调试结果与运行情况分析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(B)该控制字对定时器2进行初始化,使定时器2准备接受计数初值;2)在8253/54中的42H端口转入一个16位的计数
16、值,以建立将要产生的声音频率;3)把输出端口61H的0,1两位置1,发出声音。BEEP是一个很好的发生程序,可以利用并修改BEEP,使其产生任一频率的声音。为此做了两点修改,首先,BEEP程序只能产生896HZ的声音,通用发声程序应能产生任一频率的声音。其次,BEEP产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数。通过看书我知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为:533H896给定频率=H给定频率再根据编写乐曲的四个步骤编写两只老虎的程序。在编写的过程中,首先要根据两只老
17、虎的乐谱写出其频率和延迟时间,但是由于对几分之几拍不是很了解,所以在| 56 54 3 1 | 56 54 3 1|上费了很大的功夫,唱出的歌总是感觉慢了半拍,跟不上节奏,后来经过同学指点才知道自己错在哪了。还有就是界面的设置,因为刚写的时候就是照着书本上写的,所以出现的DOS界面就是全屏的,开始以为在汇编中的DOS界面就是这样的,但看到其他同学的全是黑色的小方框,才知道是自己程序自己设置的,这个让我了解到了怎样用汇编语言设置背景和字体,拓展了自己的知识。以前学跳转指令的时候就感觉很难,这次写程序也一样,跟那个开始的时候,对于按Y键跳转的那条指令,总是没法跳过去,总是会有多余的语句,后来发现是
18、自己没有设置结束符,要不就是结束符的地方设置的不正确,同时还和代码的顺序有很大的关系,比如刚开始的时候我把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 music program! * db 0dh,0ah, db
21、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,0ah, thank you for your listenin
22、g! 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 db 0dh,0ah, db 0dh,0ah,* db 0dh,0a
23、h, 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 dup(50) dw 2 dup(50,50,100) data en
24、dsstack 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 int 21h endmshow helloinput: mov a
25、h,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 axfreq: mov di,si cmp di,-1 je mu
26、s1 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,4000 call waitf delay1: dec bx jnz
27、 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 maintgKQcWA3PtGZ7R4I30kA1DkaGhn3XtKknBYCUDxqA7FHYi2CHhI92tgKQcWA3PtGshLs50cLmTWN60eo8Wgqv7XAv2OHUm32WGeaUwYDIAWGMeR4I30kA1DkaGhn3Xt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB11∕T 473-2022 旅游景区服务质量要求
- 儿童护眼灯课课程设计
- 航模多彩课程设计模板
- 2024监理工程师《合同管理》模拟习题
- python消消乐课课程设计
- 手术室护士手足外科游离皮瓣术护理配合常规
- 2024房屋居室装修合同范本
- 2024房屋装修合同范本4
- 古装拍照技巧课程设计
- 水彩插画系统课程设计
- 叶芝《当你老了》赏析课件上课讲义
- 历史(中职)PPT全套教学课件
- Unit 8 Chinese New Year第一课时 (教学设计)-2022-2023学年英语六年级上册
- 混凝土搅拌站安全风险分级管控资料
- 心律失常病人的护理查房
- 2023版思想道德与法治专题四继承优良传统课件
- 电缆防火封堵施工标准【实用文档】doc
- 电大信息技术应用终结性作业
- 2022年电视广播播控技术电视广播播控技术考试卷模拟考试题
- GB/T 30059-2013热交换器用耐蚀合金无缝管
- GB/T 25748-2010压铸镁合金
评论
0/150
提交评论