《《微机原理与接口技术》课程设计说明书音乐演奏程序设计.doc》由会员分享,可在线阅读,更多相关《《微机原理与接口技术》课程设计说明书音乐演奏程序设计.doc(29页珍藏版)》请在三一办公上搜索。
1、课程设计任务书学生姓名: 专业班级: 自动化0801班 指导教师: 工作单位: 自动化学院 题 目: 音乐演奏程序设计要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1使用汇编语言设计一个在计算机上运行的音乐演奏程序;2屏幕显示钢琴图像;3按大写字母“A”,唱乐曲1;按大写字母“B”,唱乐曲2;按大写字母“C”,唱乐曲3,依次类推;4按Q鍵,退出;5撰写课程设计说明书。内容包括:摘要、目录、正文、参考文献、附录(程序清单)。正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心
2、得体会。时间安排: 1月5日-1月7日 查阅资料及方案设计1月8日-元月11日 编程1月12日-1月13日 调试程序1月14日-1月16日 撰写课程设计报告指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目录摘要- 1 -一 设计任务及要求- 2 -1.1 设计目的- 2 -1.2 设计要求- 2 -二 软件设计说明- 3 -2.1 设计思路- 3 -2.2 设计流程图- 4 -2.3 程序模块- 5 -2.3.1 主程序- 5 -2.3.2 主菜单界面- 6 -2.3.3 音乐代码段- 7 -2.3.4 歌曲演奏子程序- 8 -2.3.5 通用发声子程序- 9 -2.3.6
3、钢琴界面画图程序- 10 -2.4 扩展功能- 12 -三 调试说明及结果分析-13 -四 课程设计收获及心得体会- 17 -参考文献- 18 -附录- 19 -摘要本文主要对利用微机原理与接口技术来编写简易电子钢琴进行分析,并介绍了基于8255A,8254芯片电子钢琴系统的设计结构与体系。将简谱音阶转换成汇编代码,通过通用发声程序发出对应的声音。通过IBM-PC/XT机内的定时/计数器接口芯片8254,8255,可以实现声音的接口。本文通过汇编语言编程,由系统内的8255A并行I/O接口的PB端口最低位来控制喇叭驱动系统,PB0控制8253-5定时/计数器的定时计数;PB1来控制喇叭接通和断
4、开,以此来发声。对乐谱的频率和节拍进行编程,转化为对8254-5定时/计数器和8255A并行接口的控制命令,从而实现音乐演奏。另外,为了方便实现人机交互,必须在显示器上显示相应的提示语句,这个可以通过调用BIOS中断10H号功能语句来实现。程序运行时,人工输入相关参数,程序检测输入参数并执行相关的指令,从而实现音乐播放功能。本程序主要完成的功能有完成三首歌曲的选择与播放,还附加一个模拟钢琴演奏部分。相应的辅助功能有显示提示信息,操作员通过键盘输入相应的字符命令,然后程序进行检测,播放相应的歌曲或者退出程序,可以重复操作。关键词:汇编 接口 音乐 演奏 音乐演奏程序设计一 设计任务及要求1.1
5、设计目的1) 巩固和加深已经学习的微机原理与接口技术知识,并在设计的过程中学习新的汇编语言;2) 熟练掌握汇编语言中各中段语句的使用;3) 了解并掌握通用发声程序的编写方法以及发声原理;4) 熟练掌握8254,8255芯片的功能和使用方法;5)通过设计一款音乐演奏软件来培养对这门学科的兴趣。1.2 设计要求要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1使用汇编语言设计一个在计算机上运行的音乐演奏程序;2屏幕显示钢琴图像;3按大写字母“A”,唱乐曲1;按大写字母“B”,唱乐曲2;按大写字母“C”,唱乐曲3,依次类推;4按Q鍵,退出;5撰写课程设计说明书。二
6、软件设计说明2.1 设计思路首先,设计一个主界面,用数据段语句定义,在程序执行的开始所有定义的提示都应显示出来,但它们不参与程序内部的计算和转换,而所定义的音乐频率表和节拍时间,将随通用发生程序执行播放歌曲。课程设计中使用的数据全部定义在名称为DSEG数据段中。音乐频率表和节拍时间则均使用字(DW)的存储方式来实现在主菜单显示和子菜单显示数据段均使用字节(DB)的存储方式来实现在此程序中主要运用主程序调用子程序方法实现该程序的功能。用到的芯片还包括8255,8254。该程序包括: 主程序主菜单界面模块,音乐代码等数据段模块,歌曲演奏子程序模块,通用发声子程序模块钢琴界面画图程序模块共七大模块。
7、主程序模块的功能主要是调用主菜单显示模块,将主菜单显示在屏幕上,并对用户输入的菜单项目值进行判断进而通过跳转语句调用相应的子程序。2.2 设计流程图开始初始化提示输入语句并输入是O?是A?是B?是C?是Q?进入我的钢琴播放:龙的传人播放:爱的就是你播放:祝你生日快乐结束YYYYNNNNN图2.1 总流程图2.3 程序模块2.3.1 主程序初始化之后显示主界面,输入字符后,将其分别与O、A、B、C、Q、比较,是O则进入我的钢琴界面可以进行演奏,是A则播放歌曲1,是B则播放歌曲2,是C则播放歌曲3,是Q则退出,都不是则再次输入。START: MOV AX,DATAS MOV DS,AX LEA D
8、X,STRING MOV AH,09H INT 21H;提示选择信息 MOV AH,09H MOV DX,OFFSET CHOSE INT 21H;-INPUT: MOV AH,01HINT 21H CMP AL,OJZ CTONE CMP AL,oJZ CTONE CMP AL,AJZ MUSICA CMP AL,aJZ MUSICACMP AL,BJZ MUSICB CMP AL,bJZ MUSICB CMP AL,CJZ MUSICC CMP AL,cJZ MUSICCCMP AL,QJZ EXITCMP AL,qJZ EXIT JMP INPUT2.3.2 主菜单界面以下为主界面的代码
9、段,执行主程序是直接调用显示。STRING DB ,10,13 DB # ,10,13 DB # O _ # ,10,13 DB # /_. _| Piano | # ,10,13 DB # | |_| # ,10,13DB # # _ _| # # ,10,13DB # _ # ,10,13DB # # ,10,13DB # O My piano # ,10,13DB # A Long de chuan ren # ,10,13DB # B Ai de jiu shi ni # ,10,13DB # C Happy Birthday # ,10,13DB # Q exit # ,10,13D
10、B # # ,10,13DB # ,10,13DB O O ,10,13DB O | O O | O ,10,13 DB _|/_ _|/_ ,10,13DB / / ,10,13DB / / ,10,13 DB % ,10,13,$运行程序后显示界面如图2.2: 图2.2 主菜单界面2.3.3音乐代码段歌曲1至3的音乐频率表和节拍时间在程序执行的开始所有定义的提示都应显示出来,但它们不参与程序内部的计算和转换,而所定义的音乐频率表和节拍时间,将随通用发生程序执行播放歌曲。音乐频率表和节拍时间则均使用字(DW)的存储方式来实现,在主菜单显示和子菜单显示数据段均使用字节(DB)的存储方式来实现。
11、1) 音阶简谱向汇编语言转换原理PC机上大多数I/O都是由主板上的8255(或8255A)可编程外围接口芯片(PPI)管理的。PPI包括三个8位寄存器:两个输入寄存器,端口地址分别是60H、62H;一个输出寄存器,端口地址为61H。由PPI输出寄存器中的,也就是61H端口的D0、D1位来控制扬声器的驱动方式。BIOS中的BEEP子程序:1、只能发出896Hz的声音;2、产生的音长只能是0.5s的倍数。3、编写通用发声程序应该能发出任意频率的声音,可由 1193100给定频率12348C给定频率 (21)计算出来。声音的持续时间更易于调整。利用CPU来产生延迟时间是最常用的一种方法。组成乐曲的每
12、个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。 以下列出歌曲1的数据段:;1 long de chuan ren MUS_FREQA DW 330,371,393,441,495,441,393,393,371,330 DW 330,371,393,441,495,441,393,391,393,441,495 DW 330,371,393,441,495,441,393,393,371,330 DW 371,371,371,393,371,330,330,294,330 DW 495,495,495,441,393,441,441,495,441 DW 393,393,393,44
13、1,393,371,371,393,371 DW 495,495,495,441,393,441,441,495,441 DW 393,393,371,393,371,330,330,294,330,-1 MUS_TIMEA DW 1600,1600,1600,3200,1600,1600,3200,1600,1600,4800 DW 3200,1600,1600,3200,1600,1600,1600,1600,1600,1600,4800 DW 3200,1600,1600,3200,1600,1600,3200,1600,1600,4800 DW 3200,3200,1600,3200,
14、1600,3200,1600,1600,4800 DW 3200,3200,3200,1600,1600,3200,1600,1600,4800 DW 3200,3200,3200,1600,1600,3200,1600,1600,4800 DW 3200,3200,3200,1600,1600,3200,1600,1600,4800 DW 3200,3200,3200,1600,1600,3200,1600,1600,32002.3.4 歌曲演奏子程序以第一首歌的播放程序为例,程序演示图见图2.3。MUSICA PROC NEAR;显示提示信息MOV DX,OFFSET MUSIA MOV
15、AH,09H INT 21H CALL HUAGANGQIN PUSH DSMUS_TIMEA首地址指针SIBP取出SI中的频率值取出BP中对应的持续时间DIBX是-1?通用发声程序发出该频率声音SI+2BP+2回主菜单NY图2.3 音乐演奏演示图MUS_FRERA偏移首地址 SUB AX,AX PUSH AX LEA SI,MUS_FREQA LEA BP,DS:MUS_TIMEA MOV CX,0FREQA: LEA BX,MUS_JIEZOUA ADD BX,CX MOV DI,BX MOV BUFFER,DI MOV DI,SI CMP DI,-1 JE END_MUSA MOV DX
16、,DS:BP MOV BX,DX CALL PAINTKEY CALL GENSOUND ADD SI,2 ADD BP,2 ADD CX,2 JMP FREQAEND_MUSA:CALL INITCALL OPEN JMP STARTMUSICA ENDP2.3.5通用发声子程序直接调用该程序可发出对应频率的声音。GENSOUND PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H OUT 43H,AL MOV DX,12H MOV AX,533H*896 DIV DI OUT 42H,AL MOV AL,AH OUT
17、42H,AL IN AL,61H MOV AH,AL OR AL,3 OUT 61H,ALWAIT1: MOV CX,0FFFFHDELAY1: LOOP DELAY1 DEC BX JNZ WAIT1 MOV AL,AH OUT 61H,AL POP DI POP DX POP CX POP BX POP AX RETGENSOUND ENDP2.3.6钢琴界面画图程序调用汇编的画图的相关指令,此处用到划线与写像素点语句。先勾勒出钢琴按键的总框图,程序中给定划线起始坐标点,再通过写像素点画阴影,不同的阴影给定不同颜色。特别注意的是钢琴白按键写白色,黑键写黑色。 PAINTSIDE24:DRA
18、WOBILQUE 405,SI,360,WHITEINC SICMP SI,150JC PAINTSIDE24 MOV SI,140PAINTSIDE34:DRAWOBILQUE 455,SI,410,WHITEINC SICMP SI,150JC PAINTSIDE34 MOV SI,140PAINTSIDE44:DRAWOBILQUE 505,SI,460,WHITEINC SICMP SI,150JC PAINTSIDE44 ;画分割线 MOV SI,240REDRAW04: MOV DI,SI SUB DI,90 DRAWOBILQUE SI,140,DI,BLACK ADD SI,5
19、0 CMP SI,540 JC REDRAW04 MOV SI,150HUAGANGQIN PROCCALL INITCALL OPEN MOV SI,190 ;SI=START_X MOV DI,140 ;DI=START_Y MOV BP,540 ;BP=END_XDRAWW4: DRAWLINE0 SI,DI,BP,WHITE DEC SI DEC BP INC DI CMP DI,230 JC DRAWW4;画阴影 DRAW 100,230,450,250,GRAY;侧面阴影MOV SI,140PAINTSIDE4:DRAWOBILQUE 540,SI,450,GRAYINC SICM
20、P SI,160JC PAINTSIDE4;黑键阴影MOV SI,140PAINTSIDE04:DRAWOBILQUE 255,SI,210,WHITEINC SICMP SI,150JC PAINTSIDE04 MOV SI,140PAINTSIDE14:DRAWOBILQUE 305,SI,260,WHITEINC SICMP SI,150JC PAINTSIDE14 MOV SI,140 PAINTB4:MOV SI,OFFSET BLACKLMOV DI,OFFSET BLACKRMOV SI,SI+BXMOV BP,DI+BX MOV DI,140 DRAWB4: DRAWLINE0
21、 SI,DI,BP,BLACK DEC SI DEC BP INC DICMP DI,185 JC DRAWB4 ADD BX,2 CMP BX,9 JC PAINTB4;黑键底下阴影MOV BX,0PAINTBB4:MOV SI,OFFSET BBLMOV DI,OFFSET BBRMOV SI,SI+BXMOV BP,DI+BXDRAW SI,185,BP,195,BLACKADD BX,2 CMP BX,9 JC PAINTBB4HUAGANGQIN ENDPREDRAW14: DRAWLINE1 SI,230,250,BLACK ADD SI,50 CMP SI,440 JC REDR
22、AW14;画黑键盘MOV BX,0 PAINTSIDE24:DRAWOBILQUE 405,SI,360,WHITEINC SICMP SI,150JC PAINTSIDE24 MOV SI,140PAINTSIDE34:DRAWOBILQUE 455,SI,410,WHITEINC SICMP SI,150JC PAINTSIDE34 MOV SI,140PAINTSIDE44:DRAWOBILQUE 505,SI,460,WHITEINC SICMP SI,150JC PAINTSIDE44 ;画分割线 MOV SI,240REDRAW04: MOV DI,SI SUB DI,90 DRA
23、WOBILQUE SI,140,DI,BLACK ADD SI,50 CMP SI,540 JC REDRAW04 MOV SI,150REDRAW14: DRAWLINE1 SI,230,250,BLACK ADD SI,50 CMP SI,440 JC REDRAW14;画黑键盘MOV BX,0 2.4 扩展功能除了课设要求实现的功能外,我们加入了一个模拟钢琴演奏模块,即可以通过按电脑键盘模拟按钢琴的键,自己谱曲演奏。功能的实现:首先,定义好do,re,mi,fa,so,la,si各个音节的频率数据段,当选择字符O进入My piano后,程序提示可以按键演奏,并扫描,获取所按键的ASCII
24、码;然后,将其转换为按键上对应的字符,此程序为1,2,3,4,5,6,7正好是数字,分别表示do,re,mi,fa,so,la,si,同时每个数字对应音节的频率数据段中各个频率;再次,调用通用发声程序发出所按键对应的频率声音。程序段如下:CTONE:CALL HUAGANGQIN;获取弹奏的音符SCAN:MOV AH,00HINT 16HCMP AL,4FHJZ END_MUSACMP AL,6FHJZ END_MUSA CMP AL,37H ;ASCII37H,退出 JA ERROR CMP AL,31H ;ASCII31H,退出 JC ERROR AND AX,000FH ;将ASCII码
25、转换成数字 MOV BUFFER,AX ;将数字存储在内存空间BUFFER中 JMP PLAYERROR:CMP AL,1BHJZ EXITJMP SCANPLAY:MOV DI,TONEFDEC AXADD AX,AX ;TABFx为双字表,需要将获得的ASCII符*2ADD DI,AXMOV BX,DI ;根据按键获取的ASCII码得到相应的频率值MOV DX,12HMOV AX,34DEH ;1.193182MHZ/BXDIV BXOUT 42H,ALMOV AL,AH OUT 42H,ALCALL PAINTKEYCALL DELAY ;扬声器延时MOV AX,12H ;往扬声器送高频
26、,模拟关闭OUT 42H,ALMOV AL,AH OUT 42H,AL JMP SCANEXIT: MOV AH,4CH INT 21H三 调试说明及结果分析确定设计思路和流程图后,通过查阅相关资料和即时学习,最后写出了最初版的程序,调试过程中也遇到各种各样的问题,下面将主要问题即解决方案归纳如下:a) 运行主程序,只正常显示一部分界面,其他地方出现大量乱码。解决方法:在主菜单的数据段定于语句中字符串后面加了$,问题得到解决。b) 播放音乐时音乐有踩上节奏,即每个音符发声时间一样长,没有节奏感。解决方法:经过检查程序,发现音乐的节拍时间的数据没有正常送入发生程序,经过修改后得到解决。c) 主菜
27、单中要按两次Q键才能退出运行。解决方法:检查程序,再退出处多插入了一条读取字符的命令,删除后问题得到解决。d) 小组成员将在各自电脑上调试好的音乐代码段插入总的程序后,唱歌速度变快,失真。解决方法:这是由于自己写的发生程序中时间的延迟程序延时长短不同,调成一致后问题得到解决。调试好后无误的程序运行结果图:把编好的源程序命名保存为YINYUE.asm,在asm集成环境中进行调试,如果编译成功,就选择运行选项中的生成exe文件,这样就产生了一个可运行程序,然后点击运行,就会看到与题目要求相符的界面。主菜单图见图3.1图3.1 主菜单界面进入My piano 界面后见图3.2图3.2 My pian
28、o播放 Long de chuan ren(龙的传人)界面见图3.3图3.3 Long de chuan ren播放Ai de jiu shi ni(爱的就是你)界面见图3.4图3.4 Ai de jiu shi ni播放Happy birthday(祝你生日快乐)界面见图3.5图3.5 Happy birthday四 课程设计收获及心得体会在课程设计开始阶段,我感到无从下手,毕竟上课时学到都只是汇编基本知识,用来做课程设计是远远不够的。后来,经过上网查阅相关资料和翻阅书籍,并学习汇编语言的新知识,心中才有了一个基本的思路。之后便和小组成员一起投入到了为期近两周的微机课设中去。本次课程设计的主
29、要任务是用汇编语言编写音乐演奏程序播放自己选定的歌曲,这其中涉及到8255A,8254芯片的利用,这让我加深了对这些芯片的认识。而这其中用到了端口地址及工作方式这些接口技术,从而我领悟到微机原理与接口技术是相互关联相互渗透的。经过小组成员的共同努力,第一周我们的设计思路及流程图已近定下,得到老师的认可后,我们开始着手编写和调试程序,这期间遇到了各种各样的问题,但问题并不可怕,小组成员齐心协力,总能化解一个一个难题,每解决一个难题,大伙都特别兴奋,而且信心也倍增,我们享受着其中的喜怒哀乐,觉得一切都很充实。短短的两周课程设计却困难重重的,但是我们,一起克服困难,努力去完成课程设计。我们在解决困难
30、的过程中有很多自己的感受,我想很多同学都会和我有一样的感受,那就是感觉汇编语言真的是很神奇,很有意思。我们从开始的担心和害怕渐渐变成了享受,享受着汇编带给我们的快乐。看着自己做出来的东西,心里面的感觉真的很好。虽然我们做的东西都还很简单,但是毕竟是我们自己设计出来的,很有成就感。而且我们也学会了很多知识。总的来说,这次课程设计实习让我收获颇多,不但巩固了我微机原理与接口技术这门课上学到的知识,而且丰富了我的汇编知识,因为通过微机课设我学到了以前没接触过的汇编语言。这次课设培养了我的兴趣,增强了我独立的去分析问题和解决问题的能力,感谢学校提供的这次机会,也感谢老师的栽培和指导!参考文献1 周佩玲
31、.微型计算机原理及接口技术.电子工业出版社,20052 谭浩强.微型计算机原理及应用.清华大学出版社,20013 戴梅萼,史嘉权.微型计算机技术及应用.清华大学出版社,20034 沈美明.IBM PC机汇编语言程序设计.清华大学出版社,19915 宋杰,汪志宏,江敏.微机原理与接口技术课程设计.机械工业出版社,2005附录:总程序;画横线;- DRAWLINE0 MACRO START_X,START_Y,END_X,COLORLOCAL PAINTPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,0CHMOV AL,COLORMOV BX,0MOV CX,START_XM
32、OV DX,START_YPAINT:INT 10HINC CXCMP CX,END_XJC PAINTPOP DXPOP CXPOP BXPOP AXENDM;画竖线 ;- DRAWLINE1 MACRO START_X,START_Y,END_Y,COLORLOCAL PAINTPUSH AXPUSH BXPUSH CXPUSH DXMOV AH,0CHMOV AL,COLORMOV BX,0MOV CX,START_XMOV DX,START_YPAINT:INT 10HINC DXCMP DX,END_YJC PAINTPOP DXPOP CXPOP BXPOP AXENDM ;画斜线
33、 向右倾斜 ;- DRAWOBILQUE MACRO START_X,START_Y,END_X,COLORLOCAL PAINT2PUSH AXPUSH BXPUSH CXPUSH DXMOV AH,0CHMOV AL,COLORMOV BX,0MOV DX,START_YMOV CX,START_XPAINT2:INT 10HDEC CXINC DXCMP CX,END_XJA PAINT2POP DXPOP CXPOP BXPOP AXENDM ;画填充矩形;- DRAW MACRO START_X,START_Y,END_X,END_Y,COLORLOCAL DRAW_NEXT PUS
34、H AX PUSH BX PUSH CX PUSH DXMOV AH,0CH ;写像素点MOV AL,COLOR ;设置颜色 MOV BH,0 ;选用页号0 MOV CX,START_X ;列起始点 MOV DX,START_Y ;行起始点DRAW_NEXT: INT 10H ;画点 INC CX ;画横线 CMP CX,END_X ;比较行是否画完 JNE DRAW_NEXT ;画另一行 MOV CX, START_X ;另一行的起始点 INC DX CMP DX,END_Y ;比较列是否画完 JNE DRAW_NEXT;未完继续画 POP DX POP CX POP BX POP AX ENDMDATAS SEGMENT;1 long de chuan ren MUS_FREQA DW 330,371,393,441,495,441,393,393,371,330 DW 330,371,393,441,495,441,393,391,393,441,495 DW 330,371,393,441,495,441,3