您好,欢迎访问三七文档
当前位置:首页 > 医学/心理学 > 药学 > (完整版)基于51单片机的电子八音盒详细设计步骤
一、设计目的利用8052单片机结合内部定时器设计一个八音盒,按下单键可以演奏预先设置的歌曲旋律。二、设计要求其基本功能为:1,使用LED显示器来显示目前演奏的歌曲编号;2,具有8个按键操作来选择演奏哪一首歌曲;3,内建8首歌曲旋律,按下单键可以演奏歌曲。三、设计器材T89C52单片机、晶振、八个按键、二位一体共阳极数码管、电阻电容若干、导线。四、设计方案及分析设计思路:(1)选择8052单片机,通过T0定时中断,并配合P2.0引脚输出音频频率。(2)P2.0引脚输出接蜂鸣器。(3)通过P0口接LED。(4)P1口接键盘,输入歌曲号。音符产生方法:不同的音调有不同的频率。频率不同,音调也就不同。利用定时器,使其工作在模式1,定时中断,然后控制P2.0引脚的输出每次取反,就可以在P2.0的引脚输出相应的方波频率。改变计数初值,就改变了频率。定时器的定时时间等于半个周期,定时时间到就输出脉冲取反,重复此过程,就可在P2.0引脚得到一音频的脉冲。如:中音1的频率=523HZ,周期T=1/523=1912us;定时器的定时时间为:T/2=1912/2us=956us;计算得TH0,TL0的计数初值THTL=64580下面是个音符计数初值音符THTL音符编码低音50F66FH1低音60F724H2低音70F81BH3中音10F88FH4中音20F95EH5中音30FA17H6中音40FA6BH7中音50FB08H8中音60FB92H9中音70FC0EHA高音10FC4BHB高音20FCAFHC高音30FD0CHD高音40FD36HE高音50FD84HF节拍产生方法:音乐中的节拍用延时时间产生。假设1/4拍执行一次延时程序,这1/2拍就执行两次延时程序,所以只要求出1/4延时时间,其余的节拍就是他的倍数。为方便记谱,将节拍数也进行编码,如下:节拍编码节拍11/421/233/441建立曲谱编码表:编谱用8位编码,高4位代表音符,低4位代表节拍。如56中音5,中音6,都是1/2拍,则编码为:82H92H程序清单:#includereg52.h#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlongsbitSPEAK=P2^0;//接蜂鸣器管脚ucharth0_f;uchartl0_f;ucharcodeSEG[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};ucharcodejie8[8]={12,14,16,17,19,21,23,24};/**************************中断函数*******************************************/timer0()interrupt1{TL0=tl0_f;TH0=th0_f;SPEAK=~SPEAK;//取反音乐输出IO}/********************T0的值,及输出频率对照表***********************************/ucharcodefreq[36*2]={0xA9,0xEF,//00220HZ,1//00x93,0xF0,//00233HZ,1#0x73,0xF1,//00247HZ,20x49,0xF2,//00262HZ,2#0x07,0xF3,//00277HZ,30xC8,0xF3,//00294HZ,40x73,0xF4,//00311HZ,4#0x1E,0xF5,//00330HZ,50xB6,0xF5,//00349HZ,5#0x4C,0xF6,//00370HZ,60xD7,0xF6,//00392HZ,6#0x5A,0xF7,//00415HZ,70xD8,0xF7,//00440HZ1//120x4D,0xF8,//00466HZ1#//130xBD,0xF8,//00494HZ2//140x24,0xF9,//00523HZ2#//150x87,0xF9,//00554HZ3//160xE4,0xF9,//00587HZ4//170x3D,0xFA,//00622HZ4#//180x90,0xFA,//00659HZ5//190xDE,0xFA,//00698HZ5#//200x29,0xFB,//00740HZ6//210x6F,0xFB,//00784HZ6#//220xB1,0xFB,//00831HZ7//230xEF,0xFB,//00880HZ`10x2A,0xFC,//00932HZ`1#0x62,0xFC,//00988HZ`20x95,0xFC,//01046HZ`2#0xC7,0xFC,//01109HZ`30xF6,0xFC,//01175HZ`40x22,0xFD,//01244HZ`4#0x4B,0xFD,//01318HZ`50x73,0xFD,//01397HZ`5#0x98,0xFD,//01480HZ`60xBB,0xFD,//01568HZ`6#0xDC,0xFD,//01661HZ`7//35};/***************************音乐符号串解释函数****************************///入口:要解释的音乐符号串,输出的音调串,输出的时长串changedata(uchar*song,uchar*diao,uchar*jie){uchari,i1,j;chargaodi;//高低+/-12音阶ucharbanyin;//有没有半个升音阶ucharyinchang;//音长ucharcodejie7[8]={0,12,14,16,17,19,21,23};//C调的7个值*diao=*song;for(i=0,i1=0;;){gaodi=0;//高低=0banyin=0;//半音=0yinchang=4;//音长1拍if((*(song+i)=='|')||(*(song+i)==''))i++;//拍子间隔和一个空格过滤switch(*(song+i)){case',':gaodi=-12;i++;//低音break;case'`':gaodi=12;i++;//高音break;}if(*(song+i)==0)//遇到0结束{*(diao+i1)=0;//加入结束标志0*(jie+i1)=0;return;}j=*(song+i)-0x30;i++;//取出基准音j=jie7[j]+gaodi;//加上高低音yinc:switch(*(song+i)){case'#'://有半音j加一个音阶i++;j++;gotoyinc;case'-'://有一个音节加长yinchang+=4;i++;gotoyinc;case'_'://有一个音节缩短yinchang/=2;i++;gotoyinc;case'.'://有一个加半拍yinchang=yinchang+yinchang/2;i++;gotoyinc;}*(diao+i1)=j;//记录音符*(jie+i1)=yinchang;//记录音长i1++;}}/******************************奏乐函数***************************************///入口:要演奏的音乐符号串voidplay(uchar*songdata){uchari,c,j=0;uintn;uchardiaodata[48];//音调缓冲ucharjiedata[48];//音长缓冲changedata(songdata,diaodata,jiedata);//解释音乐符号串TR0=1;while(P1=0xff){for(i=0;diaodata[i]!=0;i++)//逐个符号演奏{tl0_f=freq[diaodata[i]*2];//取出对应的定时值送给T0th0_f=freq[diaodata[i]*2+1];for(c=0;cjiedata[i];c++)//按照音长延时{for(n=0;n29500;n++);//29500if(P1!=0xff)//((!K1)||(!K2)||(!K3)||(!K4))//发现按键,立即退出播放{TR0=0;return;}}TR0=0;for(n=0;n460;n++);//音符间延时TR0=1;}}TR0=0;}//茉莉花ucharcodemolihua[]={33_5_6_`1_`1_6_|55_6_5-|33_5_6_`1_`1_6_|55_6_5-|5553_5_|665-|32_3_53_2_|11_2_1|//3_2_1_3_2.3_|56_`1_5-|23_5_2_3_1_,6_|,5-,61|//2.3_1_2-1_,6_|,5--};//世上只有妈妈好ucharcodemamahao[]={6.5_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|2.3_55_6_|321-|5.3_2_1_,6_1_|,5--};//小毛驴ucharcodexiaomaolv[]={1_1_1_3_|5_5_5_5_|6_6_6_`1|5-|4_4_4_6_|3_3_3_3_|2_2_2_2_|5-};//我是一只菠萝ucharcodeboluo[]={1-|2_4_3_2_55|5_6_3_4_22|2_4_3_2_1_`1_7_6_|5_4_2_3_11|2_4_3_2_55|5_6_3_4_22|2_4_3_2_1_5_2_3_|1---|};//小星星ucharcodexiaoxingxing[]={1155|665-|4433|221-|5544|332-|5544|332-|1155|665-|4433|221-|};//春天在哪里ucharcodechuntian[]={3_3_3_1_|,5,5_|3_3_3_1_|3-|5_5_3_1_|,5_,5_,5|,6_,7_1_3_|2-|3_3_3_1_|,5,5_|3_3_3_1_|3-|5_6_5_6_|5_4_3_1_|,5_3_|2_1_};//两只老虎ucharcodelaohu[]={1231|1231|345-|345-|5_6_5_4_31|5_6_5_4_31|151-|151-};//就是爱你ucharcodejiushiaini[]={3_2_3_4_5,7_1_|1`1_7_75_6_|66_5_5_3_2_1_3_|4_,6_,7_1_32|3_2_3_4_5,7_1_|1`1_7_7_`3_|3-6_|5_4_.4_5_5-|4_,6_,7_1_32._1_|};//黑白配ucharcodeheibai[]={32345-|1,7123-|3,5,611-|};//找朋友ucharcodezhaopeng[]={5_6_5_6_|5_6_5|5_`1_7_6_|5_6_5};//数鸭子ucharcodeshuya[]={313_3_1|3_3_5_6_5-|6_6_5_5_4_4_4|2_3_2_1_2};//欢乐颂ucharcodehuanle[]={3345|5432|1123|322-|3345|5432|1123|211-|};//一分钱ucharcodeyifen[]={5`1|6_`1_5|3_5_2_3_|5|3_5_6_`1_|5_6_5_3_|5_13_2};//乐谱方式输入的音乐播放/*******************************主函数****************************************/voidmain(void){P1=0xff;P0=SEG[0];TMOD=0x01;//使用定时器0的16位工作模式TR0=0;ET0=1;EA=1;while(1){switch(P1){case0xfe:while(P1==0xfe){;}
本文标题:(完整版)基于51单片机的电子八音盒详细设计步骤
链接地址:https://www.777doc.com/doc-7366816 .html