51单片机播放音乐简谱的函数库.docx

上传人:b****1 文档编号:156427 上传时间:2023-04-28 格式:DOCX 页数:10 大小:18.54KB
下载 相关 举报
51单片机播放音乐简谱的函数库.docx_第1页
第1页 / 共10页
51单片机播放音乐简谱的函数库.docx_第2页
第2页 / 共10页
51单片机播放音乐简谱的函数库.docx_第3页
第3页 / 共10页
51单片机播放音乐简谱的函数库.docx_第4页
第4页 / 共10页
51单片机播放音乐简谱的函数库.docx_第5页
第5页 / 共10页
51单片机播放音乐简谱的函数库.docx_第6页
第6页 / 共10页
51单片机播放音乐简谱的函数库.docx_第7页
第7页 / 共10页
51单片机播放音乐简谱的函数库.docx_第8页
第8页 / 共10页
51单片机播放音乐简谱的函数库.docx_第9页
第9页 / 共10页
51单片机播放音乐简谱的函数库.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

51单片机播放音乐简谱的函数库.docx

《51单片机播放音乐简谱的函数库.docx》由会员分享,可在线阅读,更多相关《51单片机播放音乐简谱的函数库.docx(10页珍藏版)》请在冰点文库上搜索。

51单片机播放音乐简谱的函数库.docx

51单片机播放音乐简谱的函数库

51单片机播放音乐简谱的函数库

作者:

PLC来源:

单片机学习网 2006-10-21

51单片机播放音乐简谱的函数库:

/**************************************************************************

  

         SOUNDPLAYFOR51MCU

 

                COPYRIGHT(c)  2005BYJJJ.

                        -- ALLRIGHTSRESERVED --

 

  FileName:

      SoundPlay.h

  Author:

         JiangJianJun

  Created:

        2005/5/16

  Modified:

  NO

  Revision:

  1.0

 

*******************************************************************************/

/*说明**************************************************************************

 曲谱存贮格式unsignedcharcodeMusicName{音高,音长,音高,音长....,0,0}; 末尾:

0,0表示结束(Important)

 音高由三位数字组成:

   个位是表示1~7这七个音符

   十位是表示音符所在的音区:

1-低音,2-中音,3-高音;

   百位表示这个音符是否要升半音:

0-不升,1-升半音。

 

 音长最多由三位数字组成:

   个位表示音符的时值,其对应关系是:

    |数值(n):

 |0|1|2|3|4|5|6

    |几分音符:

|1|2|4|8|16|32|64  音符=2^n

   十位表示音符的演奏效果(0-2):

 0-普通,1-连音,2-顿音

   百位是符点位:

0-无符点,1-有符点

 调用演奏子程序的格式

   Play(乐曲名,调号,升降八度,演奏速度);

 |乐曲名          :

要播放的乐曲指针,结尾以(0,0)结束;

 |调号(0-11)      :

 是指乐曲升多少个半音演奏;

 |升降八度(1-3)  :

1:

降八度,2:

不升不降,3:

升八度;

 |演奏速度(1-12000):

 值越大速度越快;

***************************************************************************/

#ifndef__SOUNDPLAY_H_REVISION_FIRST__

#define__SOUNDPLAY_H_REVISION_FIRST__

#include

//**************************************************************************

#defineSYSTEM_OSC  11059200//12000000 //定义晶振频率12000000HZ

#defineSOUND_SPACE 4/5  //定义普通音符演奏的长度分率,//每4分音符间隔

sbit   BeepIO   =   P2^6;  //定义输出管脚

unsignedint codeFreTab[12] ={262,277,294,311,330,349,369,392,415,440,466,494};//原始频率表

unsignedcharcodeSignTab[7] ={0,2,4,5,7,9,11};         //1~7在频率表中的位置

unsignedcharcodeLengthTab[7]={1,2,4,8,16,32,64};      

unsignedcharSound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存

unsignedcharSound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存

//**************************************************************************

voidInitialSound(void)

{

 BeepIO=1;

 Sound_Temp_TH1=(65535-(1/1200)*SYSTEM_OSC)/256; //计算TL1应装入的初值 (10ms的初装值)

 Sound_Temp_TL1=(65535-(1/1200)*SYSTEM_OSC)%6; //计算TH1应装入的初值

 TH1=Sound_Temp_TH1;

 TL1=Sound_Temp_TL1;

 TMOD |=0x11;

 ET0   =1;

 ET1   =0;

 TR0   =0;

 TR1   =0;

 EA    =1;

}

voidBeepTimer0(void)interrupt1 //音符发生中断

{

 BeepIO=!

BeepIO;

 TH0   =Sound_Temp_TH0;

  TL0   =Sound_Temp_TL0;

}

//**************************************************************************

voidPlay(unsignedchar*Sound,unsignedcharSignature,unsignedOctachord,unsignedintSpeed)

{

 unsignedintNewFreTab[12];  //新的频率表

unsignedchari,j;

 unsignedintPoint,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;

 unsignedcharTone,Length,SL,SH,SM,SLen,XG,FD;

 for(i=0;i<12;i++)    //根据调号及升降八度来生成新的频率表

 {

  j=i+Signature;

  if(j>11)

  {

   j=j-12;

   NewFreTab[i]=FreTab[j]*2;

  }

  else

   NewFreTab[i]=FreTab[j];

  if(Octachord==1)

   NewFreTab[i]>>=2;

  elseif(Octachord==3)

   NewFreTab[i]<<=2;

 }         

 

 SoundLength=0;

 while(Sound[SoundLength]!

=0x00) //计算歌曲长度

 {

  SoundLength+=2;

 }

 Point=0;

 Tone  =Sound[Point]; 

 Length=Sound[Point+1];   //读出第一个音符和它时时值

 

 LDiv0=12000/Speed;    //算出1分音符的长度(几个10ms) 

 LDiv4=LDiv0/4;     //算出4分音符的长度

 LDiv4=LDiv4-LDiv4*SOUND_SPACE; //普通音最长间隔标准

 TR0  =0;

 TR1  =1;

 while(Point

 {

  SL=Tone_;        //计算出音符

  SM=Tone/10_;        //计算出高低音

  SH=Tone/100;        //计算出是否升半

  CurrentFre=NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率 

  if(SL!

=0)

  {

   if(SM==1)CurrentFre>>=2;  //低音

   if(SM==3)CurrentFre<<=2;  //高音

   Temp_T=65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值

   Sound_Temp_TH0=Temp_T/256;

   Sound_Temp_TL0=Temp_T%6;

   TH0=Sound_Temp_TH0; 

   TL0=Sound_Temp_TL0+12;//加12是对中断延时的补偿

  }

  SLen=LengthTab[Length_]; //算出是几分音符

  XG=Length/10_;   //算出音符类型(0普通1连音2顿音)

  FD=Length/100;

  LDiv=LDiv0/SLen;   //算出连音音符演奏的长度(多少个10ms)

  if(FD==1)

   LDiv=LDiv+LDiv/2;

  if(XG!

=1) 

   if(XG==0)    //算出普通音符的演奏长度

    if(SLen<=4) 

     LDiv1=LDiv-LDiv4;

    else

     LDiv1=LDiv*SOUND_SPACE;

   else

    LDiv1=LDiv/2;  //算出顿音的演奏长度

  else

   LDiv1=LDiv;

  if(SL==0)LDiv1=0;

   LDiv2=LDiv-LDiv1;  //算出不发音的长度

   if(SL!

=0)

  {

   TR0=1;

   for(i=LDiv1;i>0;i--) //发规定长度的音

   {

    while(TF1==0);

    TH1=Sound_Temp_TH1;

    TL1=Sound_Temp_TL1;

    TF1=0;

   }

  }

  if(LDiv2!

=0)

  {

   TR0=0;BeepIO=1;

   for(i=LDiv2;i>0;i--) //音符间的间隔

   {

    while(TF1==0);

    TH1=Sound_Temp_TH1;

    TL1=Sound_Temp_TL1;

    TF1=0;

   }

  }

  Point+=2;

  Tone=Sound[Point];

  Length=Sound[Point+1];

 }

 BeepIO=1;

}

//**************************************************************************

#endif

 

以下为曲谱编码文件,自己可以根据规则,对照简谱编写曲谱编码表,我已经做好了一个应用程序,只需将简谱输入进去,就可以直接输出曲谱编码表,省去人工编码的痛苦。

此软件作为共享软件发布,在下面的链接可以下载。

此东东绝对是搞电子设计在校大学生泡MM的巨佳手段,呵呵。

//挥着翅膀的女孩

unsignedcharcodeMusic_Girl[]={

   0x17,0x02,0x17,0x03,0x18,0x03,0x19,0x02,0x15,0x03,

   0x16,0x03,0x17,0x03,0x17,0x03,0x17,0x03,0x18,0x03,

   0x19,0x02,0x16,0x03,0x17,0x03,0x18,0x02,0x18,0x03,

   0x17,0x03,0x15,0x02,0x18,0x03,0x17,0x03,0x18,0x02,

   0x10,0x03,0x15,0x03,0x16,0x02,0x15,0x03,0x16,0x03,

   0x17,0x02,0x17,0x03,0x18,0x03,0x19,0x02,0x1A,0x03,

   0x1B,0x03,0x1F,0x03,0x1F,0x03,0x17,0x03,0x18,0x03,

   0x19,0x02,0x16,0x03,0x17,0x03,0x18,0x03,0x17,0x03,

   0x18,0x03,0x1F,0x03,0x1F,0x02,0x16,0x03,0x17,0x03,

   0x18,0x03,0x17,0x03,0x18,0x03,0x20,0x03,0x20,0x02,

   0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,

   0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x03,

   0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,

   0x1A,0x03,0x19,0x03,0x15,0x03,0x15,0x03,0x17,0x03,

   0x16,0x66,0x17,0x04,0x18,0x04,0x18,0x03,0x19,0x03,

   0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,

   0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x03,

   0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,

   0x1A,0x03,0x19,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,

   0x1F,0x00,0x1A,0x03,0x1A,0x03,0x1A,0x03,0x1B,0x03,

   0x1B,0x03,0x1A,0x03,0x19,0x03,0x19,0x02,0x17,0x03,

   0x15,0x17,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,

   0x17,0x04,0x18,0x0E,0x18,0x03,0x17,0x04,0x18,0x0E,

   0x18,0x66,0x17,0x03,0x18,0x03,0x17,0x03,0x18,0x03,

   0x20,0x03,0x20,0x02,0x1F,0x03,0x1B,0x03,0x1F,0x66,

   0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,0x1B,0x03,

   0x1F,0x66,0x1F,0x04,0x1B,0x0E,0x1B,0x03,0x19,0x03,

   0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,

   0x15,0x03,0x15,0x03,0x17,0x03,0x16,0x66,0x17,0x04,

   0x18,0x04,0x18,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,

   0x1F,0x66,0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,

   0x1B,0x03,0x1F,0x66,0x1F,0x03,0x1B,0x03,0x19,0x03,

   0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,

   0x19,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x00,0x18,0x02,

   0x18,0x03,0x1A,0x03,0x19,0x0D,0x15,0x03,0x15,0x02,

   0x18,0x66,0x16,0x02,0x17,0x02,0x15,0x00,0x00,0x00};

//同一首歌

unsignedcharcodeMusic_Same[]={

   0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x66,0x18,0x03,

   0x17,0x02,0x15,0x02,0x16,0x01,0x15,0x02,0x10,0x02,

   0x15,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x02,

   0x17,0x03,0x18,0x03,0x19,0x02,0x15,0x02,0x18,0x66,

   0x17,0x03,0x19,0x02,0x16,0x03,0x17,0x03,0x16,0x00,

   0x17,0x01,0x19,0x02,0x1B,0x02,0x1B,0x70,0x1A,0x03,

   0x1A,0x01,0x19,0x02,0x19,0x03,0x1A,0x03,0x1B,0x02,

   0x1A,0x0D,0x19,0x03,0x17,0x00,0x18,0x66,0x18,0x03,

   0x19,0x02,0x1A,0x02,0x19,0x0C,0x18,0x0D,0x17,0x03,

   0x16,0x01,0x11,0x02,0x11,0x03,0x10,0x03,0x0F,0x0C,

   0x10,0x02,0x15,0x00,0x1F,0x01,0x1A,0x01,0x18,0x66,

   0x19,0x03,0x1A,0x01,0x1B,0x02,0x1B,0x03,0x1B,0x03,

   0x1B,0x0C,0x1A,0x0D,0x19,0x03,0x17,0x00,0x1F,0x01,

   0x1A,0x01,0x18,0x66,0x19,0x03,0x1A,0x01,0x10,0x02,

   0x10,0x03,0x10,0x03,0x1A,0x0C,0x18,0x0D,0x17,0x03,

   0x16,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x70,

   0x18,0x03,0x17,0x02,0x15,0x03,0x15,0x03,0x16,0x66,

   0x16,0x03,0x16,0x02,0x16,0x03,0x15,0x03,0x10,0x02,

   0x10,0x01,0x11,0x01,0x11,0x66,0x10,0x03,0x0F,0x0C,

   0x1A,0x02,0x19,0x02,0x16,0x03,0x16,0x03,0x18,0x66,

   0x18,0x03,0x18,0x02,0x17,0x03,0x16,0x03,0x19,0x00,

   0x00,0x00};

//两只蝴蝶                                 

unsignedcharcodeMusic_Two[]={

   0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,

   0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,

   0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,

   0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x16,0x03,

   0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,

   0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,

   0x16,0x03,0x15,0x03,0x10,0x03,0x15,0x03,0x16,0x01,

   0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,

   0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,

   0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,

   0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x19,0x03,

   0x19,0x01,0x19,0x03,0x1A,0x03,0x19,0x03,0x17,0x01,

   0x16,0x03,0x16,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,

   0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0D,0x15,0x00,

   0x19,0x03,0x19,0x03,0x1A,0x03,0x1F,0x03,0x1B,0x03,

   0x1B,0x03,0x1A,0x03,0x17,0x0D,0x16,0x03,0x16,0x03,

   0x16,0x0D,0x17,0x01,0x17,0x03,0x17,0x03,0x19,0x03,

   0x1A,0x02,0x1A,0x02,0x10,0x03,0x17,0x0D,0x16,0x03,

   0x16,0x01,0x17,0x03,0x19,0x03,0x19,0x03,0x17,0x03,

   0x19,0x02,0x1F,0x02,0x1B,0x03,0x1A,0x03,0x1A,0x0E,

   0x1B,0x04,0x17,0x02,0x1A,0x03,0x1A,0x03,0x1A,0x0E,

   0x1B,0x04,0x1A,0x03,0x19,0x03,0x17,0x03,0x16,0x03,

   0x17,0x0D,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2