微机基本原理与接口技术音乐演奏程序设计.doc_第1页
微机基本原理与接口技术音乐演奏程序设计.doc_第2页
微机基本原理与接口技术音乐演奏程序设计.doc_第3页
微机基本原理与接口技术音乐演奏程序设计.doc_第4页
微机基本原理与接口技术音乐演奏程序设计.doc_第5页
免费预览已结束,剩余9页可下载查看

下载本文档

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

文档简介

微机基本原理与接口技术 音乐演奏程序设计 目 录一 概述2二 设计过程3三 程序设计8四 运行结果13五 课设总结13 参考文献14一、概述 汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。借助于汇编程序,计算机本身可以自动地把 汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。1.1课程设计的目的掌握一些程序设计的基本方法,要指导主程序,子程序以及推栈段的使用,.了解通用发声程序了解与掌握定时.计数.音乐.频率.时间之间的关系,学会用发声程序的设计方法,学会用汇编语言编辑音乐程序1.2课程设计的要求1.2.1 基本原理基于8253定时计数接口芯片的工作原理,本次课设实现了音乐演奏系统程序设计。当运行程序时,扬声器便发出优美的音乐,当唱完一首歌曲时,程序运行自动结束。首先要解决发声并发出相应音符声音的问题,由8253计数器2在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。对8255芯片pc0和pc6口的置0和1来控制扬声器的开关。其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把BX是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。1.2.2 要求(1)熟悉电路,理解各个元件之间的控制流程,了解PC机扬声系统的电路结构,学习扬声系统发声的编程方法。(2)熟悉MFID平台的运行环境,利用MFID实验平台和音乐发生器模块进行硬件连接,理解乐谱知识,熟悉音频转换表和节拍的延长时间,使PC机扬声系统按节拍演奏连续的音乐。(3)熟练掌握汇编语言,调用中断子程序和端口函数对端口进行读写数据的操作,写出设计分析过程。1.2.3 任务(1)曲谱转换(2)分析电路图(3)画出程序流程图(4)编写代码(5)程序分析与调试1.2.4 运行环境(1)WINDOWS2000/XP系统(2)MFDI实验平台(3)VC编译环境二、设计过程2.1、硬件连线微机50芯扩展总线PC0PC6OUTGATECLKGND 20芯片定时器并行接口插座&喇 叭图1 硬件连接图2、主程序流程图: 开始 输入字符 判断是否为Q Y N 判断是否为A 结束 Y N 判断是否为B调用宏ADDRESS Y N 判断是否为CMusic子程序调用宏ADDRESS Y N Music子程序Clear子程序调用宏ADDRESS Music子程序图2 主程序流程图3、控制音符的演奏时间控制音符的演奏时间,是设计音乐程序的关键问题。最直观的方法是按照按照乐谱为每一个音符规定一个演奏时间,但是利用这种方法是调试程序特别困难。特别是在遇到一首不熟悉的歌曲时,初期很难确定每一个音符的演唱时间,而调试程序的时候费时费力,效果很差,下面,我么么向读者推荐一个记号的方法,即没一个音符规定一个“单位时间”。 单位时间*N=音符的演唱时间其中N为调试参数,一首歌只有一个调试参数。设计程序时用EQU伪指令定义调试参数,初值先行估计,调试时再修改它。如何确定每个音符的演奏时间呢?我们知道,音符的节奏分为一拍、半拍、1/4拍、1/8拍等等。如果在一首歌曲中,音符演奏的时间最短为1/8拍,我们就规定一拍音符的单位时间为8,半拍音符的单位时间为4,1/4拍音符的单位时间为2,1/8拍音符的单位时间为1。以“友谊地久天长”这首歌为例,最短音符为1/8拍,我们就定义一个单位时间为8。所示,途中第一行是一段曲谱,第3行是相应音符的单位时间,编程时,首先将一个音符的频率转化成计数初值写入2号计数器,然后将音符的单位时间乘以调试参数N,在调用延时子程序,就可以控制音符的演奏时间了,调试时,只需改变调试参数N即可。4、音符频率表音符频率表如下表所示: 音符音调 A B C D E F G221 248 278 294 330 371 416248 278 312 330 371 416 467131 147 165 175 196 221 248147 165 185 196 221 248 278165 185 208 221 248 278 312175 196 221 234 262 294 330196 221 248 262 294 330 371(a) 音符音调 1 2 3 4 5 6 7 A B C D E F G 441 495 556 589 661 742 833 495 556 624 661 742 833 935 262 294 330 350 393 441 495 294 330 371 393 441 495 556 330 371 416 441 495 556 624 350 393 441 467 525 589 661 393 441 495 525 589 661 742(b) 音符音调 A B C D E F G 882 990 1112 1178 1322 1484 1665 990 1112 1248 1322 1484 1665 1869 525 589 661 700 786 882 990 589 661 742 833 882 990 1112 661 742 833 882 990 1112 1248 700 786 882 935 1049 1178 1322 789 882 990 1049 1178 1322 1484 (c)编程产生各种音符的频率可参照此表。具体实现时由于各计算器的速度不同,乐曲演奏的速度存在差异,所以可以适当的调整延迟子程序的时间参数。5、Music子程序流程图: DI= -1返回DOS界面并重新输入字符GENSOUND子程序取下一频率值和下一时间值开始结束图3 Music子程序流程图这次课程设计的设计思想是在熟练掌握汇编程序的设计方法的基础上,利用通用发生程序编写音乐程序组成音乐的每个音符的频率值和持续时间是音乐程序发声所需要的两个数据,根据音调与频率和时间之间的关系,把要编辑的音乐的每个音符的频率和持续时间定义成两个数据表,进而把它们写入通用发声程序,音乐程序就完成。6、该程序主要分成1系统的主要功能:给用户提供三首已经写好的短曲,根据用户的选择演奏乐曲,演奏完一首乐曲后跳回起始状态,如此循环,直到用户输入结束的信息为止。2发声原理图:图4 发声原理图三、程序设计本程序通过Intel汇编语言来实现一个简单的奏乐。程序中提供一个音乐菜单,用键盘数字键选择相应的音乐后,便开始播放原先编制好的音乐。程序将帮助你进一步的了解Intel汇编语言编程的一些原理。代码如下:DATA SEGMENT PARA DATAINFO1 DB 0DH,0AH,WELCOME YOU TO COME HERE!$INFO2 DB 0DH,0AH,this is a music program!$INFO3 DB 0DH,0AH,please select!$INFO4 DB 0DH,0AH,INPUT ERROR!$INFO5 DB 0DH,0AH,PLEASE INPUT AGAIN!$MUSLIST DB 0DH,0AH,A MUSIC1 DB 0DH,0AH,B MUSIC2 DB 0DH,0AH,C MUSIC3 DB 0DH,0AH,Q EXIT db 0dh,0ah,$MUS_FREG1 DW 330,294,262,294,3 DUP (330) ;音乐1的频率表1,2小节 DW 3 DUP (294),330,392,392 ;3,4小节 DW 330,294,262,294,4 DUP (330) ;5,6小节 DW 294,294,330,294,262,-1 ;7,8小节MUS_TIME1 DW 6 DUP (25*8),50*8 ;音乐1的时间节拍表1,2小节 DW 2 DUP (25*8,25*8,50*8) ;3,4小节 DW 12 DUP (25*8),100*8 ;58小节MUS_FREG2 DW 330,392,330,294,330,392,330,294,330 DW 330,392,330,294,262,294,330,392,294 DW 262,262,220,196,196,220,262,294,332,262,-1MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100 DW 2 DUP(50,50,25,25),100 DW 3 DUP(50,25,25),100MUS_FREG3 DW 262,262,294,262,349 DW 330,262,262,294,262 DW 392,349,262,262,523 DW 440,349,262,262,466 DW 466,440,262,392,349,-1 MUS_TIME3 DW 50,50,100,100,100 DW 100,100,50,50,100,100 DW 100,100,100,50,50,100 DW 100,100,100,100,100,50 DW 50,100,100,100,100,100DATA ENDSSTACK SEGMENT PARA STACK STACK DB 200 DUP (STACK) ;初始化堆栈STACK ENDSCODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODEMAIN PROC FAR MOV AX,DATA ;数据段装入段寄存器DS MOV DS,AX MOV aH, 0 ;BIOS功能调用,设置显示方式 MOV AL,4 INT 10H MOV AH,0BH MOV BH,0 MOV BL,4 INT 10H MOV AH,0BH MOV BH,01H MOV BL,00 INT 10HSHOW MACRO b ;定义一个宏 LEA DX,b MOV AH,9 INT 21H ENDM show INFO1 show INFO2 show INFO3 show MUSLISTINPUT: MOV AH,01H ;键盘输入并回显 INT 21H CMP AL,Q JZ retu ;退出 CMP AL,A JNZ B0 CALL MUSIC1 JMP EXIT1B0: CMP AL,B JNZ C0 CALL MUSIC2 JMP EXIT1C0: CMP AL,C JNZ exit CALL MUSIC3EXIT1: show INFO5 ;宏调用 JMP INPUT EXIT: call clear show INFO4 show INFO5 show INFO1 show INFO2 show INFO3 show MUSLIST jmp inputRETU: MOV AH,4CH ;带返回码终止 INT 21HMAIN ENDP MUSIC1 PROC NEAR PUSH DS SUB AX,AX ;AX清零 PUSH AX LEA SI,MUS_FREG1 LEA BP,DS:MUS_TIME1FREG1: MOV DI,SI CMP DI,-1 ;音符的频率是否结束 JE END_MUS1 ;若是则返回 MOV DX,DS:BP ;取出音符的持续时间放入BX MOV BX,1400 CALL GENSOUND ;调用GENSOUND子程序发出音调 ADD SI,2 ADD BP,2 JMP FREG1END_MUS1: RETMUSIC1 ENDPGENSOUND PROC NEAR PUSH AX ;保存将要用到的寄存器 PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H ;向8253-5/8254-2计数器写入控制字 OUT 43H,AL ;方式3、双字节写和二进制计数方式写到控制口 MOV DX,12H ;设置被除数 MOV AX,533H*896 DIV DI ;其商(AX)为预置值 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,8FF0H ;在80486/DX2/66中取DELAY1: LOOP DELAY1 DEC BX JNZ WAIT1 MOV AL,AH ;写回61H口原值,关闭扬声 OUT 61H,AL POP DI ;恢复寄存器 POP DX POP CX POP BX POP AX RET ;子程序结束返回GENSOUND ENDPMUSIC2 PROC NEAR PUSH DS SUB AX,AX PUSH AX LEA SI,MUS_FREG2 LEA BP,DS:MUS_TIME2FREG2: MOV DI,SI CMP DI,-1 JE END_MUS2 MOV DX,DS:BP MOV BX,1400 CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREG1END_MUS2: RETMUSIC2 ENDPMUSIC3 PROC NEAR PUSH DS SUB AX,AX PUSH AX LEA SI,MUS_FREG3 LEA BP,DS:MUS_TIME3FREG3: MOV DI,SI CMP DI,-1 JE END_MUS3 MOV DX,DS:BP MOV BX,1400 CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREG1END_MUS3: RETMUSIC3 ENDPclear proc near ;清屏子程序 push ax push bx push cx push dx mov ah,6 ;屏幕初始化或上卷 mov al,0 mov ch,0 ;左上角行号为0 mov cl,0 ;左上角列号为0 mov dh,24 ;右下角行号为24mov dl,79 ;右下角列号为79 mov bh,7 ;卷入行属性为7 int 10h ;调用显示BIOS pop dx pop cx pop bx pop ax retclear endpCODE ENDS END MAIN四、运行结果按大写字母“A”,唱乐曲“玛丽有只小羔羊”;按大写字母“B”,唱乐曲“太湖船”按大写字母“C”,唱乐曲“祝福歌”按Q鍵,退出五、课设总结5.1、设计中遇到的问题:在此次课程设计的过程中,我遇到了很多的问题,主要有以下一些:(1) 在编程初期首先遇到的是结构化程序的结构很重要,刚开编的时候没有写流程图和算法,结果程序可读性很差,也很难查错,从中了解到写程序需要一步步来,不能操之过急。(2) 在编程中时常出现逻辑错误。因为这个错误在编译中不会被发现,所以很难找出,要对程序一步一步的检查才行,可以用对子程序稍加修改后单独运行来查错。这体现我经历的程序不够多,需要在这方面加把劲。(3)在编写音乐的时候,不懂的节拍的把握。后来上网查资料和老师的帮助,才对音乐的节拍有所了解,最后终于解决了这问题。5.2、问题的解决方法:此次课程设计中遇到了很多问题,在指导老师的帮助下,加上我自己的努力及同学朋友的全力帮助下,我的这些问题都已得到完满的解决。如节拍的问题,我通过和同学讨论、网上查资料,最终解决了这个问题。5.3、设计后的感想和收获:我们这次的设计任务是利用MFID实验平台和音乐发声器,通过编程使音乐发生器演奏音乐。本次课程设计已经顺利的结束了,在史老师悉心指导以及我们第一组全体成员的共同努力下,圆满完成了本次课程设计的任务,并且达到了预期的效果

温馨提示

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

评论

0/150

提交评论