您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Msp430-mp3
综合实验项目1/22综合实验项目姓名:任晓雨班级:机械24学号:2012010510机器号:12任课教师:刘瑛岩综合实验项目2/22一、项目要求利用实验板上的8个按键和1个蜂鸣器,以及数码管,设计一个可弹奏的电子琴和音乐播放器。可参考下面步骤完成:1)编程让蜂鸣器发出1、2、3、4、5、6、7等不同音符的音调;2)在FlashROM中以表格形式存放1个或多个乐谱(含音调和音长信息),编程播放该曲,完成音乐播放功能;3)加入按键的控制,当分别按下K1~K7中的单个键时,蜂鸣器分别发出唱名为1、2、3、4、5、6、7对应的音调。4)当同时按下K7和K1~K6中的任意一个键时(如同时按下K7和K1键,或同时按下K7和K6键),蜂鸣器分别发出低音唱名为2、3、4、5、6、7对应的音调,此时K7作为低音控制键;当同时K8和K1~K6中的任意一个键时,蜂鸣器分别发出高音唱名为1、2、3、4、5、6对应的音调,此时K8作为高音控制键,从而使实验板利用8个按键可以弹出接近3个8度的音符。5)利用实验板上的数码管、发光二极管做适当的显示,如播放的曲目、或按键弹的音。增加自己设计的功能扩展。如:录制功能,将弹奏的曲子记录下来,可重新播放;通过与PC机的串行通信,选择播放、弹奏等功能的切换等。二、项目设计1、功能描述(1)弹奏功能:当分别按下K1~K7中的单个键时,蜂鸣器分别发出唱名为1、2、3、4、5、6、7对应的音调当同时按下K7和K1~K6中的任意一个键时(如同时按下K7和K1键,或同时按下K7和K6键),蜂鸣器分别发出低音唱名为2、3、4、5、6、7对应的音调,此时K7作为低音控制键;当同时K8和K1~K6中的任意一个键时,蜂鸣器分别发出高音唱名为1、2、3、4、5、6对应的音调,此时K8作为高音控制键。(2)录制功能:按照弹奏功能中描述的方式弹奏,蜂鸣器演奏并且单片机将过程记录。(3)播放录制音乐:将录制的音乐重复播放。(4)播放ROM中已有的乐谱:ROM中存储了三首乐谱《天空之城》、《欢乐颂》《小星星》,选择不同的乐曲进行播放。(5)显示功能:利用一个数码管显示当前功能或者播放乐曲(6)功能切换:通过串口与PC通信,接收到PC的指令后切换功能(7)音量调节改变宏定义VOL的值就可以改变音量大小综合实验项目3/222、硬件设计电路图端口分配:P1.0—K1P1.1—BTXDP1.2—K3P1.3—K4P2.0—K5P2.1—K6P2.2—K7P2.3—K8P1.4—DSP1.5—SHCPP1.6—BUZZP1.7—STCPP2.4—K23、软件模块与流程图软件模块划分:(主程序)Main.c(初始化)initialMP3.h(乐谱音调)MUSIC.h(定时器播放)Timera0MP3.h(显示)DISP.h软件总体流程图:综合实验项目4/22各模块流程图:Main.c流程图与总体流程图相同InitialMP3.h开始初始化显示当前功能进入不同的功能状态Switch执行当前功能状态case中断更新functionChangeflag==1YESNO结束综合实验项目5/22MUSIC.h开始时钟初始化针脚初始化定时器T0初始化定时器T1初始化串口初始化开串口中断开总中断结束开始定义音调存储乐谱结束综合实验项目6/22其中的乐谱是按照音调与音长分别存一个数组实现的。Timera0MP3.hDISP.h开始定时器T0产生指定频率PWM波定时器T1控制音长Playmusic()播放结束开始ROM显示字符数组串行输入显示结束综合实验项目7/22三、调试完成情况完成情况:调试完成,程序正确,功能全部实现。通过PC上串口小助手发给单片机的指令(’0’play;‘1’recordplay;’2’playrecord;’3’playlaputa;’4’playjoy;’5‘playstar)实现不同功能的转换调试中遇到的问题:1、刚开始时播放歌曲只有一个频率问题所在:一个与音符一个音符之间间隔太长,T1定时器定时太长,定时函数为100ms,200ms,400ms,都各编一个程序,出现未知错误解决方法:核心函数只有延时100ms的函数,之后编写一个延时为100ms任意整倍数的延时函数,解决了问题。2、在待机状态下,蜂鸣器有微弱的声响,十分小但是再响问题所在:为了在等待状态下使得T0定时器输出高电平,我将TA0CCR1置为了1,虽然几乎没有声音但是蜂鸣器实际上仍在发生,只是响度很小。解决方法:将TA0CCR1置为0。3、将播放功能和弹奏功能编写完成后要进行串口转换功能的程序编写时发现P1.1被占用了问题所在:设计时没有考虑与计算机串行通信所用的接口解决方法:将P1.1上的功能转到P2.4上,硬件连线也将K2接在P2.4上。4、录制功能调试不通过问题所在:用于录制的数组开的太大,开始时用了200的数组,超过了内存解决方法:将数组调小为100的数组之后编译通过。综合实验项目8/22附录Main.c#includeio430.h#includein430.h#includeMUSIC.h#includemath.h#includeinitialMP3.h#includetimera0MP3.h#includeDISP.h#defineVOL60unsignedcharkey=0;//keyunsignedcharkey1=0;//keycontrolunsignedshortmusic[100]={0};//recordplayunsignedcharfunction=0;unsignedcharfunctionchar=0;//switchfunction0playkey;1recordplay;2playrecord;3laputa;4joy;5starunsignedcharchangeflag=0;//checkfunctionchangevoidscankey();//SCANWHILCHKEYISENABLEunsignedcharchartonumber(unsignedcharr);voidmain(){initMP3();while(1){unsignedcharj=0;disp_LED(~(table[function]));switch(function){//functionplaycase0:while(changeflag==0){scankey();if((key1==0)&&(key!=0)){playmusic(tonez[key-1],VOL,2);key=0;}elseif((key1==7)&&(key!=0)){playmusic(toned[key-1],VOL,2);key=0;key1=0;}elseif((key1==8)&&(key!=0)){playmusic(toneg[key-1],VOL,2);key=0;key1=0;}else{}综合实验项目9/22}changeflag=0;break;//functionrecordplaycase1:j=0;while(changeflag==0){if(j==49)j=0;scankey();if((key1==0)&&(key!=0)){music[j]=tonez[key-1];playmusic(tonez[key-1],VOL,4);key=0;j++;}elseif((key1==7)&&(key!=0)){music[j]=toned[key-1];playmusic(toned[key-1],VOL,4);key=0;key1=0;j++;}elseif((key1==8)&&(key!=0)){music[j]=toneg[key-1];playmusic(toneg[key-1],VOL,4);key=0;key1=0;j++;}else{}}music[j]=0xff;changeflag=0;break;//functionplayrecordcase2://unsignedcharj2=0;j=0;while(changeflag==0){if(music[j]==0xff)j=0;playmusic(music[j],VOL,4);j++;}changeflag=0;综合实验项目10/22break;//playCityOfSkycase3://unsignedcharj3=0;j=0;while(changeflag==0){if(MUSIClaputa[j]==0xff)j=0;playmusic(MUSIClaputa[j],VOL,LENGTHlaputa[j]);j++;}changeflag=0;break;//playOdetoJoycase4://unsignedcharj4=0;j=0;while(changeflag==0){if(MUSICjoy[j]==0xff)j=0;playmusic(MUSICjoy[j],VOL,LENGTHjoy[j]);j++;}changeflag=0;break;//playtwinklestarcase5://unsignedcharj5=0;j=0;while(changeflag==0){if(MUSICstar[j]==0xff)j=0;playmusic(MUSICstar[j],VOL,LENGTHstar[j]);j++;}changeflag=0;break;case6:j=0;while(changeflag==0){if(MUSICapple[j]==0xff)j=0;playmusic(MUSICapple[j],VOL,LENGTHapple[j]);j++;}changeflag=0;综合实验项目11/22default:break;}};}voidscankey(){if((P1IN&BIT0)==0){key=1;}if((P2IN&BIT4)==0){key=2;}if((P1IN&BIT2)==0){key=3;}if((P1IN&BIT3)==0){key=4;}if((P2IN&BIT0)==0){key=5;}if((P2IN&BIT1)==0){key=6;}if((P2IN&BIT2)==0){if(key==0){key=7;}else{key1=7;}}if((P2IN&BIT3)==0){key1=8;}综合实验项目12/22}unsignedcharchartonumber(unsignedcharr){unsignedcharrr;if(r=='0')rr=0;if(r=='1')rr=1;if(r=='2')rr=2;if(r=='3')rr=3;if(r=='4')rr=4;if(r=='5')rr=5;if(r=='6')rr=6;returnrr;}#pragmavector=TIMER1_A0_VECTOR__interruptvoidtimer1A0_MP3(){//_init_TIMERA0();flaginterrupt=1;TA1CCTL0&=~CCIE;//TA1CCTL0&=~CCIFG;}#pragmavector=USCIAB0RX_VECTOR__interruptvoidUCA0RX_ISR(){functionchar=UCA0RXBUF;function=chartonumber(functionchar);changeflag=1;}InitialMP3.h#ifndefINITIALMP3_H_#defineINITIALMP3_H_//clockinitialvoid_init_clock(){if(CALBC1_12MHZ!=0xff){DCOCTL=CALBC1_12MHZ;综合实验项目13/22BCSCTL1=CALBC1_12MHZ;BCSCTL1|=DIVA_2;//ACLKDIVIDER4BCSCTL2=DIVS_3;//SMCLKDIVIDE8BCSCTL3
本文标题:Msp430-mp3
链接地址:https://www.777doc.com/doc-7281963 .html