电子琴综合实验报告

上传人:lis****211 文档编号:113254251 上传时间:2022-06-24 格式:DOCX 页数:25 大小:50.15KB
返回 下载 相关 举报
电子琴综合实验报告_第1页
第1页 / 共25页
电子琴综合实验报告_第2页
第2页 / 共25页
电子琴综合实验报告_第3页
第3页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
基于分频原理的多功能电子琴+节拍器信息科学技术学院电子学系任伶00548091摘要一,课题及完成情况简介:利用TPC-H实验箱上的8253实现二级分频,同时配合以8255A,与门和DAC0832,通过扬声器放音,实现两个八度音高(包括半音)的电子琴。在软硬件相互配合下,电子琴具有弹奏和播放已存乐曲的功能,音长可控,播放速度可选,拥有美观的图形界面模拟真实琴键,且琴键随弹奏有起伏变化。利用微机内部的8253,8255A和内置扬声器,与TPC-H实验板上的8255A和LED,实现节拍器,可产生长度和速度可控的2/4拍,3/4拍及4/4拍等,LED和内置扬声器同时对节拍进行提示。二,关键词:8253,8255A,DAC0832,弹奏,录音,播放,用户选择目标要求一,基本功能:1. 以微机键盘模拟真实琴键,发出标准C大调音阶和其高八度音阶,包括半音每个音可以任意长短发音,由用户的按键时间决定,模拟真实电子琴的发生效果二,附加功能:1. 通过编写汇编语言,实现可视化界面,便于用户操作;弹奏过程中,琴键随用户按键的按下和弹起有起落变化的效果2. 在弹奏过程中同步录音;播放已经录制的乐曲;播放速度由用户决定,由慢速,中速和快速等选择3. 将电子琴作为节拍器使用,输出各种节拍,有2/4拍,3/4拍及4/4拍等供用户选择,在节拍器输出的同时,有LED和微机内置扬声器作为指示;拥有LED指示是真实节拍器没有而本课题独有的功能节拍器的输出拍数有长短两种,拍速有快慢两种,均由用户选择设计和实施方案一,设计方案选择与论述电子琴的实现方案有多种,例如基于波形叠加原理和基于分频原理等。基于波形叠加原理,其核心在于数模转换过程,其实现的过程和需要的组件较简单;用到的芯片主要为DAC0832,数目太少,很难达到硬件使用能力的锻炼;而基于分频原理的电子琴实现能够给我更多的锻炼机会。基于分频原理,其核心在于对分频计数的控制,多变复杂;用到的芯片包括8253,8255A,DAC0832和与门等,包括了基于波形叠加原理用到的芯片,同时我对8253和8255A的应用更熟练,便于方案可行性估计和软件调试;此方案下,TPC-H实验箱上的连线较多,更是一种对硬件处理能力的挑战。节拍器的实现主要依靠分频和并口数据传输。基于上述理由,我选择基于分频原理的方案来实现电子琴和节拍器的混合体。,所选用方案的框图三,采用的部件(元器件),方法,算法可实现所要求的功能和指标1.电子琴发声部分禾U用TPC-H实验箱上的8253,8255A,DAC0832和与门及相关电路连接(详见后续说明)实现电子琴弹奏和播放录音时的发声(二者算法基本一致),发生的频率和时长主要通过对用户输入(即按键)的判断,调用过程控制硬件完成。用户弹奏时,通过对按键的判断,即可知其音高,在数据列表中找到相应计数初值,赋给8253计数器0和计数器1即可。在这里要说明的是,计数器0执行的一级分频用于确定音高(不同音符的计数初值不同);计数器1执行的二级分频用于控制程序将正弦波形的离散数值写入DAC0832,从而得到模拟正弦波驱动扬声器,其计数初值不因音高变化而变化,这是因为在一个正弦周期内写入的离散数值个数是固定的,而写入频率由计数器0的输出作为GATE1控制;此为使用二级分频的缘故。按键的时长由程序计数得到,在琴键按下时,8255A的PA0口输出为零,无按键时其输出为1,因此8255A的PA0和8253的OUT1相与后作为8255A的PC0输入,在琴键按下时控制程序中正弦波离散数值以其频率向DAC0832的写入,在琴键弹起时禁止此写入。对于播放录音的情况,程序从内存中读出一个音符的音高与时长,同理控制上述过程即可。不同按键与不同音符的对应关系如下(标准C大调音阶及其高八度音阶)按键1234567890-=音符C#CD#DEF#FG#GA#AB按键QWERTYUIOP音符HC#HCHD#HDHEHF#HFHG#HGHA#HAHB通过用户选择,赋予播放速度变量不同的值,从而改变音符的时长,从而改变了乐曲的播放速度。2.电子琴琴键显示部分在电子琴的图形界面设计上,采用像素点画图的方法。实现计算好电子琴静态界面各个部分的位置和大小,确定其颜色存入数据列表中,使用时调用,按照像素点的颜色和数目等信息一次画出整个键盘。在用户弹奏时,需要显示相应琴键按下和弹起的效果。在判断音符时即确定它对应的琴键的图形中需要改动区域的像素的位置,大小和颜色,存入相应寄存器中,再调用KEYDOWN和KEYUP重新在上述区域逐点重画像素。2. 提示信息显示部分所有对用户的提示信息均以字符串的形式在屏幕上显示,用户的输入根据其逻辑关系驱动程序走向(详见后续说明)。3. 节拍器工作部分根据用户的选择,决定输出节拍的种类,长度和速度,并跳转到相应程序段,同时相应变量赋值。其中,长度即输出节拍的个数,速度决定程序延时。LED的L3L0点亮与否由TPC-H实验箱上的8255A的PA4PA1驱动,按一个节拍周期中强弱拍的变化依次点亮。微机内部的8253和8255A驱动内置扬声器发出不同频率的声音,按一个节拍周期中强弱拍的变化规律与LED同时对用户作出节拍提示。四,电路原理图,软件流程图和主要软件模块说明1. 电路原理图2. 软件流程图基于分频原理的多功能电子琴+节拍器任伶005480913.主要软件模块说明(1)采用IBM-PC彩色图形方式,显示电子琴键盘的画面(a)绘制出键盘的静态效果其中,图形界面的数据缓冲区定义如下:色号6708对应颜色橙色白色黑色灰色KEYBOARDDB179DUP(6);电子琴上部的橙色背景;键盘中部DB6DUP(6),8DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),1DUP(0)DB8DUP(7),7DUP(0),5DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),1DUP(0)DB8DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),1DUP(0)DB8DUP(7),7DUP(0),5DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),6DUP(6)DB6DUP(6),8DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),1DUP(0)DB8DUP(7),7DUP(8),5DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),1DUP(0)DB8DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),1DUP(0)DB8DUP(7),7DUP(8),5DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),6DUP(6);键盘下部DB6DUP(6),11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0)DB11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0)DB11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0)DB11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),6DUP(6)DB6DUP(6),11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0)DB11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0)DB11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0)DB11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),6DUP(6)调用DRAW出键盘的静态效果。;DRAW-DRAWPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHSIPUSHDIMOVAX,DATA;段寄存器初始化MOVDS,AXMOVAH,0;设置屏幕显示为320X200MOVAL,0DH;彩色图形(EGA)INT10HMOVSI,0;从第一个像素开始MOVCX,66;列MOVDX,62;行LEABX,KEYBOARD;绘制电子琴上部的橙色背景PART1:MOVDI,BX+SI;取像素值MOVAX,DIMOVAH,0CHINT10HINCDXCMPDX,82;一行画完了吗?JNEPART1;若没有则继续MOVDX,62;画下一行INCSIINCCXCMPCX,245;所有的行都画完了吗?JNZPART1;若没有则继续;绘制电子琴中部黑白键交替的情景MOVCX,66MOVDX,82LEABX,KEYBOARD现在SI=167PART2:MOVDI,BX+SIMOVAX,DIMOVAH,0CHINT10HINCDXCMPDX,101JNEPART2MOVDX,82INCSIINCCXCMPCX,245JNZPART2;绘制电子琴中部灰白交替的情况(此处的灰色部分对应于上处的黑色部分,表示黑键;的立体感)MOVCX,66MOVDX,101LEABX,KEYBOARDPART3:MOVDI,BX+SIMOVAX,DIMOVAH,0CHINT10HINCDXCMPDX,103JNEPART3MOVDX,101INCSIINCCXCMPCX,245JNZPART3;绘制键盘的下部分,白色、中间夹着黑色线条表示不同的白键MOVCX,66MOVDX,103LEABX,KEYBOARDPART4:MOVDI,BX+SIMOVAX,DIMOVAH,0CHINT10HINCDXCMPDX,116JNEPART4MOVDX,103INCSIINCCXCMPCX,245JNZPART4;绘制键盘的下部分,将横坐标方向上对应于上行白色的部分对应成灰色,显示立体感MOVCX,66MOVDX,116LEABX,KEYBOARDPART5:MOVDI,BX+SIMOVAX,DIMOVAH,0CHINT10HINCDXCMPDX,119JNEPART5MOVDX,116INCSIINCCXCMPCX,245JNZPART5POPDIPOPSIPOPDXPOPCXPOPBXPOPAXRETDRAWENDP(b)调用KEYDOWNKEYUP画出琴键按下和弹起的动态效果当白键按下时,对应白色键下面的灰色部分将被涂成白色,等按键弹起时恢复灰色。当黑键按下时,对应黑色键下面的灰色部分将被涂成黑色,等按键弹起时恢复灰色。由于白键和黑键的宽度不一样,在下面相应位置将灰色覆盖的颜色也分别是白色和黑色,并且开始绘制的横纵坐标不一样,因此程序中用CX记录该开始涂的点的横坐标,DX记录纵坐标,COLOR俵示KEYUF中应涂上的颜色,LEN表示涂的纵向长度,WID表示涂的横向宽度。COLOR表示KEYDOWN应涂上的颜色。;KEYDOWNKEYDOWNPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHSIPUSHDIMOVSI,0MOVDI,0MOVAH,0CHMOVAL,COLOR1;确定图样颜色DOWN:INT10HINCDXINCDICMPDI,LEN;长度方向画完了吗?JNEDOWN;没画完则继续SUBDX,LENMOVDI,0INCCXINCSICMPSI,WID;宽度方向画完了吗?JNEDOWN;没画完则继续POPDIPOPSIPOPDXPOPCXPOPBXPOPAXRETKEYDOWNENDP;KEYUPKEYUPPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHSIPUSHDIMOVSI,0MOVDI,0MOVAH,0CHMOVAL,COLOR2;确定图样颜色UP:INT10HINCDXINCDICMPDI,LEN;长度方向画完了吗?JNEUP;没画完则继续SUBDX,LENMOVDI,0INCCXINCSICMPSI,WID;宽度方向画完了吗?JNEUP;没画完则继续POPDIPOPSIPOPDXPOPCXPOPBXPOPAXRETKEYUPENDP(2)用户弹奏,实现不同音高输出和时长控制不同音高对应的初级分频计数初值记录在SCALE中:SCALEDW476,450,424,402,378,356,336,316,300,282,268,252DW238,224,210,200,188,182,170,158,150,140,132,124DAC0832将正弦波的离散数值进行数模转换变为模拟量输出时使用的正弦波离散数值存储于SIN中(这是一个周期中对模拟正弦波进行32次等间隔抽样量化得到的结果):SINDB127,139,152,164,176,187,198,208DB217,225,233,239,244,249,252,253DB254,253,252,249,244,239,233,225DB217,208,198,187,176,164,152,139DB127,115,102,90,78,67,56,46DB37,29,21,15,10,5,2,1DB0,1,2,5,10,15,21,29DB37,46,56,67,78,90,102,115以下程序段在按键已经完成音符判断的基础上实现声音的输出,音高和时长的记录存储(其中,BX存放频率数组指针偏移量):PLAY:CALLKEYDOWN画出键按下的图样PUSHBXPUSHCXPUSHDXMOVDX,288H;发声MOVAL,1OUTDX,ALMOVDI,BX;存储频率(数组偏移量)INCDIINCDIMOVAL,00110110B;8253初始化,计数器0,读写16位MOVDX,283H;工作方式3,二进制计数OUTDX,ALMOVAX,BX+SI;赋初值,即设定频率MOVDX,280HOUTDX,ALMOVAL,AHOUTDX,ALMOVDX,283HMOVAL,01010110B;8253初始化,计数器1,低8位读写OUTDX,AL;工作与方式3,二进制计数MOVDX,281H输出计数器初值,控制向DAC0832写入的频率MOVAL,32OUTDX,ALMOVBX,00H;开始记录按键时长PBEG:PUSHSILEASI,SIN;输出一个周期的正弦波形MOVCX,32L0:WAIT1:MOVDX,2B0HMOVAL,SIOUTDX,AL;取得正弦量化数值,送入DACMOVDX,28AHINAL,DXCMPAL,01H;分频控制信号的正半周期JZWAIT1INCSIWAIT2:MOVDX,2B0HMOVAL,SIOUTDX,AL;取得正弦量化数值,送入DACMOVDX,28AHINAL,DXCMPAL,00H;分频控制信号的负半周期JZWAIT2INCSILOOPL0POPSIINCBX;即输出一个周期的正弦波形,记录时长有一个增量HOLD:INAL,60HTESTAL,80HJZPBEG;如果按键未放开,继续记录MOVDS:DI,BX;存储按键时长INCDIINCDIMOVAX,BUFFER;缓冲区指针后移INCAXINCAXINCAXINCAXMOVBUFFER,AXMOVDX,288H;停止发声MOVAL,0OUTDX,ALMOVDX,2B0H;DAC输入为零,不发声MOVAL,0OUTDX,ALPOPDXPOPCXPOPBXCALLKEYUP;画出键恢复的图样(3)调用LIST进行已存乐曲的播放MOD存放用户选择的播放速度模式(慢速,中速或快速),其值控制每个音的时长,从而达到控制乐曲速度的效果。;LISTLISTPROCNEARLISTMENU:LEADX,LMENU;显示放录音时的菜单MOVAH,09HINT21HLIN:MOVAH,07H;读入播放速度或返回主菜单的要求INT21HCMPAL,MJNZFFFJMPMAINMENU返回主菜单FFF:CMPAL,1JNZMMMMOVMODE,1;快速播放JMPNEXTMMM:CMPAL,2JNZLLLMOVMODE,4;中速播放JMPNEXTLLL:CMPAL,3JNZLIN;按错键了则重新读入MOVMODE,8;慢速播放NEXT:LEADX,LBEG;显示播放录音时的提示语MOVAH,09HINT21HLI:LEADI,BUFFERINCDIINCDILIO:MOVBX,DIINCDIINCDICMPBX,0FFFFHJZLI_END;如果是录音的结尾则结束播放,否则继续MOVDX,288H;使能喇叭,开始播放MOVAL,1OUTDX,ALMOVDX,283HMOVAL,00110110B;8253初始化,计数器0,16位读写OUTDX,AL;工作于方式3,二进制计数MOVDX,280H;输出计数初值,即控制声音的频率MOVAX,BX+SIOUTDX,ALMOVAL,AHOUTDX,ALMOVDX,283HMOVAL,01010110B;8253初始化,计数器1,低8位读写OUTDX,AL;工作与方式3,二进制计数MOVDX,281H输出计数器初值,控制向DAC0832写入的频率MOVAL,32OUTDX,ALMOVBX,DI;取得声音时长MOVAX,BX;加以播放速度的控制MULMODEMOVBX,AXINCDIINCDIDELAY:;延时输出声音PUSHSILEASI,SIN;输出一个周期的正弦波MOVCX,32;频率由计数器0和1的分频结果控制L1:WAIT3:MOVDX,2B0H;在分频输出方波为1时输出正弦波的第2n个值MOVAL,SI;其中n=0,1,2,.,31OUTDX,AL;将正弦波的数值写入DAC由其转化为模拟量输出MOVDX,28AHINAL,DXCMPAL,01HJZWAIT3INCSIWAIT4:MOVDX,2B0H;在分频输出方波为0时输出正弦波的第2n+1个值MOVAL,SIOUTDX,ALMOVDX,28AHINAL,DXCMPAL,00HJZWAIT4INCSILOOPL1POPSIDECBXJNZDELAYMOVDX,288H;停止喇叭输出MOVAL,0OUTDX,ALMOVDX,2B0H;DAC输入为零,不发声MOVAL,0OUTDX,ALJMPLIO;播放下一个音符LI_END:;显示播放结束提示语LEADX,LENDMOVAH,09HINT21HJMPLISTMENU;回到播放主菜单RETLISTENDP调用RETHYMS行节拍种类和长度的选择;RYTHEMRYTHEMPROCNEARRYTHMENU:LEADX,RMENU;输出节拍器菜单MOVAH,09HINT21HRIN:MOVAH,07HINT21HCMPAL,MJNZTEST_BINJMPMAINMENU返回主菜单TEST_BIN:CMPAL,2JNZTEST_TRIJMPBIN;2/4拍TEST_TRI:CMPAL,3JNZTEST_QUAJMPTRI;3/4拍TEST_QUA:CMPAL,4JNZRIN;按错键了则重新读入JMPQUA;4/4拍BIN:LEADX,R4LEN;请用户输入节拍的持续长度MOVAH,09HINT21HMOVAH,07HINT21HCMPAL,SJZBIN_S;想要较短的CMPAL,LJZBIN_L;想要较长的JMPBINBIN_S:MOVRLEN,10;节拍次数赋值CALLR_BINARY;开始产生节拍JMPRYTH_ENDBIN_L:MOVRLEN,20CALLR_BINARYJMPRYTH_ENDTRI:LEADX,R4LENMOVAH,09HINT21HMOVAH,07HINT21HCMPAL,SJZTRI_SCMPAL,LJZTRI_LJMPTRITRI_S:MOVRLEN,10CALLR_TRIPLEXJMPRYTH_ENDTRI_L:MOVRLEN,20CALLR_TRIPLEXJMPRYTH_ENDQUA:LEADX,R4LENMOVAH,09HINT21HMOVAH,07HINT21HCMPAL,SJZQUA_SCMPAL,LJZQUA_LJMPQUAQUA_S:MOVRLEN,10CALLR_QUADRUPLEJMPRYTH_ENDQUA_L:MOVRLEN,20CALLR_QUADRUPLEJMPRYTH_ENDRYTH_END:;显示结束提示语LEADX,RENDMOVAH,09HINT21HJMPRYTHMENU回到节拍器菜单RETRYTHEMENDP(5)调用R_BINARY产生2/4拍;RYTHEMOFBINARYR_BINARYPROCNEARLEADX,R4SPEED;请用户输入想要的速度MOVAH,09HINT21HBIN_SPEED:MOVAH,07HINT21HCMPAL,SJZBIN_SL;慢速CMPAL,FJZBIN_F;快速JMPBIN_SPEEDBIN_SL:MOVRSPEED,10;速度赋值JMPBIN_STARTBIN_F:JNZBIN_SPEEDMOVRSPEED,5BIN_START:LEADX,RBEG;显示开始产生节拍的提示语MOVAH,09HINT21HMOVCX,RLEN;产生节拍次数LBIN:PUSHCXMOVDX,288H;控制LED指示灯MOVAL,0;先清零OUTDX,ALMOVAL,00000100B;强拍,L1亮OUTDX,ALCALLBEEP1;输出强拍提示音MOVAH,86H;延时MOVCX,RSPEEDMOVDX,0INT15HMOVDX,288HMOVAL,00000010B;弱拍,L0亮OUTDX,ALCALLBEEP3;输出弱拍提示音MOVAH,86H;延时MOVCX,RSPEEDMOVDX,0INT15HPOPCXLOOPLBINMOVDX,288H;全部节拍完成后,LED清零MOVAL,00000000BOUTDX,ALRETR_BINARYENDPR_TRIPLEX和R_QUADRUP分别用于产生3/4拍和4/4拍,程序结构与R_BINARY同理,此处不再赘述,具体代码见于完整程序代码。(5)调用BEEP1产生重拍提示音;BEEP1BEEP1PROCNEARS拍提示音,高频PUSHCXPUSHBXMOVAL,10110110B;微机8253计数器2方式3,16位二进制计数OUT43H,AL;微机8253端口地址为40H43HMOVAX,298;计数初值1.19MHz/4KHz=298OUT42H,ALMOVAL,AHOUT42H,ALINAL,61H;读微机8255APB口MOVAH,AL;将微机8255APB口数据暂存ORAL,03H;使微机8255PB口PB1(相与OUT2,PB0(GATE2均为1OUT61H,AL;打开GATE2使OUT2输出至扬声器MOVCX,0MOVBL,40BEEP_DELAY1:;延时出声LOOPBEEP_DELAY1DECBLJNZBEEP_DELAY1MOVAL,AH;恢复微机8255A的PB口原值,停止发声OUT61H,ALPOPBXPOPCXRETBEEP1ENDPBEEP2和BEEP3分别用于产生次强拍和弱拍的提示音,程序结构与BBEP1同理,此处不再赘述,具体代码见于完整程序代码。实施条件一,硬件设备及连线方法:微机一台,TPC-H通用微机接口实验箱一个,扬声器一个。8253连线:CS-280H,CLK0-1MHz,GATE0-+5V,OUT0-CLK1,GATE1-+5V,OUT1-与门输入。8255连线:CS-288H,PA0-与门输入,PC0-与门输出,PA1PA4-LEDL3LO。扬声器连接TPC-H实验箱上的扬声器接口即可。,软件设备:汇编语言编程糸列工具:MASM,LINK,EDIT等,MS-DOS,Windows98操作系统等。功能测试及结果分析一,测量方法和所用仪器:电子琴和节拍器均在用户界面下完成操作,因此测试方法为直接按程序提示进行操作,所需仪器同上所述。二,测试数据及结果分析:测试结果为所属功能均可正常实现,程序运行正常。在此对正弦波的抽样量化点数的选择进行分析说明。最初我没有使用DAC0832进行数模转换,而是直接将扬声器连接到与门输出。电子琴在这种情况下可以正常发声,但鉴于接口处电流电压等参数匹配的考虑,使用DAC0832更科学,连接方法更简单。首先使用DAC0832时,正弦波的抽样量化点数取为32,电子琴的每一个音符均可正常发生,但仔细听就会发现,在持续时间较长的发声中有嘟嘟嘟”这样不连续的声音存在,这种现象在慢速播放已录乐曲时尤为明显;这主要是正弦波在进行DAC时抽样量化点数太少造成的。因此考虑将上述点数取为256,这样能很好地解决声音不连续的问题,但数模转换用时过长,导致程序不能及时相应琴键短促的按下和弹起。经过尝试,将点数定为64,这样既能保证声音的连续输出,又不会在数模转换上延时过多,使程序最优化。三,功能及使用方法说明:功能在之前已有相熟,此处着重说明使用方法。用户运行程序后,出现主菜单,按P键自行弹奏,按L键播放已经录制的乐曲,按R键进入节拍器,按Esc键结束程序,返回DOS进入自行弹奏后,出现电子琴键盘,不同按键与不同音符的对应关系如下(标准C大调音阶及其高八度音阶)按键1234567890-=音符C#CD#DEF#FG#GA#AB按键QWERTYUIOP音符HC#HCHD#HDHEHF#HFHG#HGHA#HAHB音长即为按键时间。随着键盘的按下与弹起,屏幕上的相应琴键也有起伏变化,如有非上表中的键按下,则忽略之。按Esc键返回主菜单。进入播放功能后,出现播放菜单,用户可根据菜单提示自行选择播放速度,按1键为快速,按2键为中速,按3键为慢速,按M键返回主菜单。选择播放速度后,即出现开始播放的提示语,同时开始播放乐曲,播放结束后亦出现提示语,并呈现播放菜单供用户继续选择。进入节拍器后,出现节拍器菜单,用户可根据菜单提示自行选择节拍种类按2键为2/4拍,按3键为3/4拍,按4键为4/4拍,按M键返回主菜单。选择完种类后,用户被要求继续选择节拍长度,按S键选择短(即产生10个周期的节拍),按L键选择长(即产生20个周期的节拍)。之后用户被要求选择节拍速度,按S键为慢速,按F键为快速。在上述选择过程中,按错的键被忽略,用户继续输入正确的按键即可。选择结束后,出现开始产生节拍的提示语,同时开始产生节拍,伴有随拍子强弱变化的提示音和LED闪亮。结束后亦出现提示语,并呈现节拍器菜单供用户继续选择。讨论一,存在的问题:我认为,实验中的不足之处在于与真实电子琴和节拍器的差距。真实电子琴的音量可调,同时具有减弱效果;这主要是由于没有使用基于波形叠加原理的方案,从而无法灵活控制正弦波的振幅。再者,未能实现和弦;和弦涉及复杂的数学计算,难以掌握。同时,未能有效的对各种乐器的音色进行模仿,这需要输出功放有良好的音效,且需要对各种乐器乐音的波形特征有充分的了解。真实的节拍器有种类更多的节拍可供选择,包括3/8拍等,同时拍速灵活可调。这需要增加程序容量,设立专门变量控制拍速,即控制延时。二,改进的措施:改变声音的幅度必须采用波形叠加的输出形式,可考虑事先将减弱的波形存储在内存里,使用时调用即可;可以参照对播放速度的控制,设立专门变量控制振幅,即在基本振幅上乘以此系数。对于和弦的控制,也需要以波形叠加为基础,通过波形中不同的频率成分体现和弦效果,为保证输出相应速度,可以事先将各种和弦计算并存储,通过按键识别调用相应数据输出。对于各种乐器音色的模仿,亦可将其特定波形存储后调用输出;同时这也需要高保真功放,否则仅仅用实验中的喇叭是很难分辨出这些音色的区别。1. 对于真是节拍器的模仿,可以增加程序的选择分支,同时设立专门变量取得用户想要的拍速。三,展望:为了更好的实现人机交互,可以考虑使用汇编语言和高级语言的混合编程,从而有效读入用户对音量,拍速等的精细要求。同时,鉴于电子琴使用的芯片和扬声器在TPC-H实验箱上,而节拍器的分频芯片和扬声器在微机内部,两者没有相互冲突的部分,可以考虑将电子琴和节拍器结合起来,即在弹奏或是播放录音的同时有节拍器输出节拍供用户掌握节奏,这样实用效果更强大。结束语十多年练习小提琴的经历让我对乐器和节拍有独特的感情,所以毫不犹豫地选择了这个课题作为微机综合实验。一路走来,学到的东西很多很多。一方面,增强了我对8253,8255A和DAC0832等芯片的理解与运用能力,也很好的锻炼了软硬件相结合的处理能力;另一方面,又更深刻的感受到了汇编语言的强大功能和独到魅力。相信这些收获的知识和方法不论对以后的学习还是对将来的科研都将有极大的帮助。在这里,要特别感谢在实验过程中给与我帮助的老师和同学。赵思同学帮助我更好的理解了图形界面的用法,杨老师耐心认真地解答我遇到的各种问题。十分感谢老师和同学们热情启发和无尽支持,这些我都会受益终身,谢谢你们。附录完整程序代码如下:;DATADATASEGMENTKEYBOARDDB179DUP(6)DB6DUP(6),8DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),1DUP(0)DB8DUP(7),7DUP(0),5DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),1DUP(0)DB8DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),1DUP(0)DB8DUP(7),7DUP(0),5DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),6DUP(6)DB6DUP(6),8DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),1DUP(0)DB8DUP(7),7DUP(8),5DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),1DUP(0)DB8DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),1DUP(0)DB8DUP(7),7DUP(8),5DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),6DUP(6)DB6DUP(6),11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0)DB11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0)DB11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0)DB11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),6DUP(6)DB6DUP(6),11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0)DB11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0)DB11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0)DB11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),6DUP(6)BUFFERDW1024DUP(?)SCALEDW476,450,424,402,378,356,336,316,300,282,268,252DW238,224,210,200,188,182,170,158,150,140,132,124SINDB127,139,152,164,176,187,198,208DB217,225,233,239,244,249,252,253DB254,253,252,249,244,239,233,225DB217,208,198,187,176,164,152,139DB127,115,102,90,78,67,56,46DB37,29,21,15,10,5,2,1DB0,1,2,5,10,15,21,29DB37,46,56,67,78,90,102,115MMENUDBPIANO,0DH,0AHDBMainMenu:,0DH,0AHDBPforplaying,0DH,0AHDBLforlisteningtorecordedmusic,0DH,0AHDBRfortherythemgenerator,0DH,0AHDBforexit,0DH,0AH,$LMENUDB1forfast,0DH,0AHDB2formiddle,0DH,0AHDB3forslow,0DH,0AHDBMforreturningtothemainmenu,0DH,0AH,$LBEGDBRecordedmusicnow,0DH,0AH,0DH,0AH,$LENDDBEndoftherecord,0DH,0AH,0DH,0AH,$RMENUDBInputthekindofrythemyouwant,0DH,0AHDB2,3or4,0DH,0AHDBMforreturningtothemainmenu,0DH,0AH,$R4LENDBInputthelengthoftherythem,0DH,0AHDBSforshort,LforIong,0DH,0AH,$RLENDW?R4SPEEDDBWhatspeeddoyoulike?,0DH,0AHDBSforslow,0DH,0AHDBFforfast,0DH,0AHRSPEEDDW?RBEGDBRythemgenerationnow,0DH,0AH,0DH,0AH,$RENDDBEndoftherythemgeneration,0DH,0AH,0DH,0AH,$COLOR1DB?;用于画出键盘按下的情况COLOR2DB?;用于画出键盘恢复的情况WIDDW?;用于画出键盘按下和恢复的情况LENDW?;用于画出键盘按下和恢复的情况MODEDB?;用于判别播放录音的快慢:fast,middleorslowDATAENDS;STACKSTACKSEGMENTSTACKSTCKDW1024DUPSTACKENDS;CODECODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;段寄存器初始化MOVDS,AXMOVAX,STACKMOVSS,AXLEASI,SCALELEADI,BUFFERINCDIINCDIMOVDX,28BH;8255初始化MOVAL,10000001B;写方式控制字,端口A工作于方式0,输出OUTDX,AL;端口C下半部工作与方式0,输入MOVDX,288HMOVAL,0;端口A输出低电平,不发声OUTDX,ALMOVDX,2B0H;DAC输入为零,不发声MOVAL,0OUTDX,ALMOVAX,00H;寄存器清零MOVBX,00HMOVCX,00HMOVDX,00HMAINMENU:LEADX,MMENU;输出主菜单MOVAH,09HINT21HMOVAH,08H;读键盘输入INT21HCMPAL,1BHJNZPPMOVAH,00H;如果是,则恢复正常显示并退出MOVAL,03HINT10HJMPOVERPP:;如果不是,则开始工作CMPAL,PJNERRCALLDRAW;画出电子琴键盘界面CALLPIANO;开始弹琴JMPMAINMENU;重新回到主菜单RR:CMPAL,RJNELLCALLRYTHEM;节拍器开始工作JMPMAINMENULL:CMPAL,LJNEMAINMENU;按错键了,返回主菜单CALLLIST;开始放录音JMPMAINMENU;重新回到主菜单OVER:MOVAH,4CH;返回DOSINT21H;LISTLISTPROCNEARLISTMENU:LEADX,LMENU;显示放录音时的菜单MOVAH,09HINT21HLIN:MOVAH,07H;读入播放速度或返回主菜单的要求INT21HCMPAL,MJNZFFFJMPMAINMENU;返回主菜单FFF:CMPAL,1JNZMMMMOVMODE,1;快速播放JMPNEXTMMM:CMPAL,2JNZLLLMOVMODE,4;中速播放JMPNEXTLLL:CMPAL,3JNZLIN;按错键了则重新读入MOVMODE,8;慢速播放NEXT:LEADX,LBEG;显示播放录音时的提示语MOVAH,09HINT21HLI:LEADI,BUFFERINCDIINCDILIO:MOVBX,DIINCDIINCDICMPBX,0FFFFHJZLI_END;如果是录音的结尾则结束播放,否则继续MOVDX,288H;使能喇叭,开始播放MOVAL,1OUTDX,ALMOVDX,283HMOVAL,00110110B;8253初始化,计数器0,16位读写OUTDX,AL;工作于方式3,二进制计数MOVDX,280H;输出计数初值,即控制声音的频率MOVAX,BX+SIOUTDX,ALMOVAL,AHOUTDX,ALMOVDX,283HMOVAL,01010110B;8253初始化,计数器1,低8位读写OUTDX,AL;工作与方式3,二进制计数MOVDX,281H;输出计数器初值,控制向DAC0832写入的频率MOVAL,32OUTDX,ALMOVBX,DI;取得声音时长MOVAX,BX;加以播放速度的控制MULMODEMOVBX,AXINCDIINCDIDELAY:;延时输出声音PUSHSILEASI,SIN;输出一个周期的正弦波MOVCX,32;频率由计数器0和1的分频结果控制L1:WAIT3:MOVDX,2B0H;在分频输出方波为1时输出正弦波的第2n个值MOVAL,SI;其中n=0,1,2,.,31OUTDX,AL;将正弦波的数值写入DAC,由其转化为模拟量输出MOVDX,28AHINAL,DXCMPAL,01HJZWAIT3INCSIWAIT4:MOVDX,2B0H;在分频输出方波为0时输出正弦波的第2n+1个值MOVAL,SIOUTDX,ALMOVDX,28AHINAL,DXCMPAL,00HJZWAIT4INCSILOOPL1POPSIDECBXJNZDELAYMOVDX,288H;停止喇叭输出MOVAL,0OUTDX,ALMOVDX,2B0H;DAC输入为零,不发声MOVAL,0OUTDX,ALJMPLIO;播放下一个音符LI_END:;显示播放结束提示语LEADX,LENDMOVAH,09HINT21HJMPLISTMENU;回到播放主菜单RETLISTENDP;RYTHEMRYTHEMPROCNEARRYTHMENU:LEADX,RMENU;输出节拍器菜单MOVAH,09HINT21HRIN:MOVAH,07HINT21HCMPAL,MJNZTEST_BINJMPMAINMENU;返回主菜单TEST_BIN:CMPAL,2JNZTEST_TRIJMPBIN;2/4拍TEST_TRI:CMPAL,3JNZTEST_QUAJMPTRI;3/4拍TEST_QUA:CMPAL,4JNZRIN;按错键了则重新读入JMPQUA;4/4拍BIN:LEADX,R4LEN;请用户输入节拍的持续长度MOVAH,09HINT21HMOVAH,07HINT21HCMPAL,SJZBIN_S;想要较短的CMPAL,LJZBIN_L;想要较长的JMPBINBIN_S:MOVRLEN,10;节拍次数赋值CALLR_BINARY;开始产生节拍JMPRYTH_ENDBIN_L:MOVRLEN,20CALLR_BINARYJMPRYTH_ENDTRI:LEADX,R4LENMOVAH,09HINT21HMOVAH,07HINT21HCMPAL,SJZTRI_SCMPAL,LJZTRI_LJMPTRITRI_S:MOVRLEN,10CALLR_TRIPLEXJMPRYTH_ENDTRI_L:MOVRLEN,20CALLR_TRIPLEXJMPRYTH_ENDQUA:LEADX,R4LENMOVAH,09HINT21HMOVAH,07HINT21HCMPAL,SJZQUA_SCMPAL,LJZQUA_LJMPQUAQUA_S:MOVRLEN,10CALLR_QUADRUPLEJMPRYTH_ENDQUA_L:MOVRLEN,20CALLR_QUADRUPLEJMPRYTH_ENDRYTH_END:;显示结束提示语LEADX,RENDMOVAH,09HINT21HJMPRYTHMENU;回到节拍器菜单RETRYTHEMENDP;RYTHEMOFBINARYR_BINARYPROCNEARLEADX,R4SPEED;请用户输入想要的速度MOVAH,09HINT21HBIN_SPEED:MOVAH,07HINT21HCMPAL,SJZBIN_SL;慢速CMPAL,FJZBIN_F;快速JMPBIN_SPEEDBIN_SL:MOVRSPEED,10;速度赋值JMPBIN_STARTBIN_F:JNZBIN_SPEEDMOVRSPEED,5BIN_START:LEADX,RBEG;显示开始产生节拍的提示语MOVAH,09HINT21HMOVCX,RLEN;产生节拍次数LBIN:PUSHCXMOVDX,288H;控制LED指示灯MOVAL,0;先清零OUTDX,ALMOVAL,00000100B;强拍,L1亮OUTDX,ALCALLBEEP1;输出强拍提示音MOVAH,86H;延时MOVCX,RSPEEDMOVDX,0INT15HMOVDX,288HMOVAL,00000010B;弱拍,L0亮OUTDX,ALCALLBEEP3;输出弱拍提示音MOVAH,86H;延时MOVCX,RSPEEDMOVDX,0INT15HPOPCXLED清零LOOPLBINMOVDX,288H;全部节拍完成后,MOVAL,00000000BOUTDX,ALRETR_BINARYENDP;RYTHEMOFTRIPLEXR_TRIPLEXPROCNEARLEADX,R4SPEEDMOVAH,09HINT21HTRI_SPEED:MOVAH,07HINT21HCMPAL,SJZTRI_SLCMPAL,FJZTRI_FJMPTRI_SPEEDTRI_SL:MOVRSPEED,10JMPTRI_STARTTRI_F:JNZTRI_SPEEDMOVRSPEED,5TRI_START:LEADX,RBEGMOVAH,09HINT21HMOVCX,RLENLTRI:PUSHCXMOVDX,288HMOVAL,0OUTDX,ALMOVAL,00001000B;强拍,L2亮OUTDX,ALCALLBEEP1;强拍提示音MOVAH,86HMOVCX,RSPEEDMOVDX,0INT15HMOVDX,288HMOVAL,00000100B;弱拍,L1亮OUTDX,ALCALLBEEP3;弱拍提示音MOVAH,86HMOVCX,RSPEEDMOVDX,0INT15HMOVDX,288HMOVAL,00000010B;弱拍,L0亮OUTDX,ALCALLBEEP3;弱拍提示音MOVAH,86HMOVCX,RSPEEDMOVDX,0INT15HPOPCXLOOPLTRIMOVDX,288HMOVAL,00000000BOUTDX,ALRETR_TRIPLEXENDP;RYTHEMOFQUADRUPLER_QUADRUPLEPROCNEARLEADX,R4SPEEDMOVAH,09HINT21HQUA_SPEED:MOVAH,07HINT21HCMPAL,SJZQUA_SLCMPAL,FJZQUA_FJMPQUA_SPEEDQUA_SL:MOVRSPEED,10JMPQUA_STARTQUA_F:JNZQUA_SPEEDMOVRSPEED,5QUA_START:LEADX,RBEGMOVAH,09HINT21HMOVCX,RLENLQUA:PUSHCXMOVDX,288HMOVAL,0OUTDX,ALMOVAL,00010000B;强拍,L3亮OUTDX,ALCALLBEEP1;强拍提示音MOVAH,86HMOVCX,RSPEEDMOVDX,0INT15HMOVDX,288HMOVAL,00001000B;弱拍,L2亮OUTDX,ALCALLBEEP3;弱拍提示音MOVAH,86HMOVCX,RSPEEDMOVDX,0INT15HMOVDX,288HMOVAL,00000100B;次强拍,L1亮OUTDX,ALCALLBEEP2;次强拍提示音MOVAH,86HMOVCX,RS
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!