找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 19889|回復(fù): 8
收起左側(cè)

一個(gè)小巧的單片機(jī)音樂(lè)程序 內(nèi)附幾首歌代碼

  [復(fù)制鏈接]
ID:396772 發(fā)表于 2018-9-13 17:01 | 顯示全部樓層 |閱讀模式
學(xué)校要求做的課程設(shè)計(jì) 也查了很多資料 有需要的可以了解一下

單片機(jī)源程序如下:
  1.                                                                                                                                  //51單片機(jī)播放音樂(lè)庫(kù)文件
  2. ///51單片機(jī)播放音樂(lè)庫(kù)文件
  3. /**************************************************************************
  4.    
  5.                                              SOUND PLAY FOR 51MCU
  6.   
  7.                                COPYRIGHT (c)   2005 BY JJJ.
  8.                                        --  ALL RIGHTS RESERVED  --
  9.   
  10.    File Name:       SoundPlay.h
  11.    Author:          Jiang Jian Jun
  12.    Created:         2005/5/16
  13.    Modified:                NO
  14.    Revision:                 1.0
  15.   
  16. *******************************************************************************/

  17. /*說(shuō)明**************************************************************************
  18. 曲譜存貯格式 unsigned char code MusicName{音高,音長(zhǎng),音高,音長(zhǎng)...., 0,0};        末尾:0,0 表示結(jié)束(Important)

  19. 音高由三位數(shù)字組成:
  20.                 個(gè)位是表示 1~7 這七個(gè)音符
  21.                 十位是表示音符所在的音區(qū):1-低音,2-中音,3-高音;
  22.                 百位表示這個(gè)音符是否要升半音: 0-不升,1-升半音。

  23. 音長(zhǎng)最多由三位數(shù)字組成:
  24.                 個(gè)位表示音符的時(shí)值,其對(duì)應(yīng)關(guān)系是:
  25.                         |數(shù)值(n):  |0 |1 |2 |3 | 4 | 5 | 6
  26.                         |幾分音符: |1 |2 |4 |8 |16 |32 |64                 音符=2^n
  27.                 十位表示音符的演奏效果(0-2):  0-普通,1-連音,2-頓音
  28.                 百位是符點(diǎn)位: 0-無(wú)符點(diǎn),1-有符點(diǎn)

  29. 調(diào)用演奏子程序的格式
  30.                 Play(樂(lè)曲名,調(diào)號(hào),升降八度,演奏速度);
  31.         |樂(lè)曲名           : 要播放的樂(lè)曲指針,結(jié)尾以(0,0)結(jié)束;
  32.         |調(diào)號(hào)(0-11)       :        是指樂(lè)曲升多少個(gè)半音演奏;
  33.         |升降八度(1-3)          : 1:降八度, 2:不升不降, 3:升八度;
  34.         |演奏速度(1-12000):        值越大速度越快;

  35. ***************************************************************************/
  36. #ifndef __SOUNDPLAY_H_REVISION_FIRST__
  37. #define __SOUNDPLAY_H_REVISION_FIRST__

  38. #include <REGX51.H>

  39. //**************************************************************************

  40. #define SYSTEM_OSC                 11059200//12000000        //定義晶振頻率12000000HZ
  41. #define SOUND_SPACE         4/5                 //定義普通音符演奏的長(zhǎng)度分率,//每4分音符間隔
  42. sbit    BeepIO    =           P1^0;                //定義輸出管腳

  43. unsigned int  code FreTab[12]  = { 212, 222, 232, 242, 252,
  44.                                   262, 272, 312, 322, 332,
  45.                                   342, 352 }; //原始頻率表
  46. unsigned char code SignTab[7]  = { 0,2,4,5,7,9,11 };                                                                   //1~7在頻率表中的位置
  47. unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };                                               
  48. unsigned char Sound_Temp_TH0,Sound_Temp_TL0;        //音符定時(shí)器初值暫存
  49. unsigned char Sound_Temp_TH1,Sound_Temp_TL1;        //音長(zhǎng)定時(shí)器初值暫存
  50. //**************************************************************************
  51. void InitialSound(void)
  52. {
  53.         BeepIO = 1;
  54.         Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;        // 計(jì)算TL1應(yīng)裝入的初值         (10ms的初裝值)
  55.         Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;        // 計(jì)算TH1應(yīng)裝入的初值
  56.         TH1 = Sound_Temp_TH1;
  57.         TL1 = Sound_Temp_TL1;
  58.         TMOD  |= 0x11;
  59.         ET0    = 1;
  60.         ET1           = 0;
  61.         TR0           = 0;
  62.         TR1    = 0;
  63.         EA     = 1;
  64. }

  65. void BeepTimer0(void) interrupt 1        //音符發(fā)生中斷
  66. {
  67.         BeepIO = !BeepIO;
  68.         TH0    = Sound_Temp_TH0;
  69.         TL0    = Sound_Temp_TL0;
  70. }
  71. //**************************************************************************
  72. void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
  73. {
  74.         unsigned int NewFreTab[12];                //新的頻率表
  75.         unsigned char i,j;
  76.         unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
  77.         unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
  78.         for(i=0;i<12;i++)                                 // 根據(jù)調(diào)號(hào)及升降八度來(lái)生成新的頻率表
  79.         {
  80.                 j = i + Signature;
  81.                 if(j > 11)
  82.                 {
  83.                         j = j-12;
  84.                         NewFreTab[i] = FreTab[j]*2;
  85.                 }
  86.                 else
  87.                         NewFreTab[i] = FreTab[j];

  88.                 if(Octachord == 1)
  89.                         NewFreTab[i]>>=2;
  90.                 else if(Octachord == 3)
  91.                         NewFreTab[i]<<=2;
  92.         }                                                                       
  93.        
  94.         SoundLength = 0;
  95.         while(Sound[SoundLength] != 0x00)        //計(jì)算歌曲長(zhǎng)度
  96.         {
  97.                 SoundLength+=2;
  98.         }

  99.         Point = 0;
  100.         Tone   = Sound[Point];       
  101.         Length = Sound[Point+1];                         // 讀出第一個(gè)音符和它時(shí)時(shí)值
  102.        
  103.         LDiv0 = 12000/Speed;                                // 算出1分音符的長(zhǎng)度(幾個(gè)10ms)        
  104.         LDiv4 = LDiv0/4;                                         // 算出4分音符的長(zhǎng)度
  105.         LDiv4 = LDiv4-LDiv4*SOUND_SPACE;         // 普通音最長(zhǎng)間隔標(biāo)準(zhǔn)
  106.         TR0          = 0;
  107.         TR1   = 1;
  108.         while(Point < SoundLength)
  109.         {
  110.                 SL=Tone%10;                                                                 //計(jì)算出音符
  111.                 SM=Tone/10%10;                                                                 //計(jì)算出高低音
  112.                 SH=Tone/100;                                                                 //計(jì)算出是否升半
  113.                 CurrentFre = NewFreTab[SignTab[SL-1]+SH];         //查出對(duì)應(yīng)音符的頻率        
  114.                 if(SL!=0)
  115.                 {
  116.                         if (SM==1) CurrentFre >>= 2;                 //低音
  117.                         if (SM==3) CurrentFre <<= 2;                 //高音
  118.                         Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計(jì)算計(jì)數(shù)器初值
  119.                         Sound_Temp_TH0 = Temp_T/256;
  120.                         Sound_Temp_TL0 = Temp_T%256;
  121.                         TH0 = Sound_Temp_TH0;  
  122.                         TL0 = Sound_Temp_TL0 + 12; //加12是對(duì)中斷延時(shí)的補(bǔ)償
  123.                 }
  124.                 SLen=LengthTab[Length%10];         //算出是幾分音符
  125.                 XG=Length/10%10;                         //算出音符類型(0普通1連音2頓音)
  126.                 FD=Length/100;
  127.                 LDiv=LDiv0/SLen;                         //算出連音音符演奏的長(zhǎng)度(多少個(gè)10ms)
  128.                 if (FD==1)
  129.                         LDiv=LDiv+LDiv/2;
  130.                 if(XG!=1)       
  131.                         if(XG==0)                                 //算出普通音符的演奏長(zhǎng)度
  132.                                 if (SLen<=4)       
  133.                                         LDiv1=LDiv-LDiv4;
  134.                                 else
  135.                                         LDiv1=LDiv*SOUND_SPACE;
  136.                         else
  137.                                 LDiv1=LDiv/2;                 //算出頓音的演奏長(zhǎng)度
  138.                 else
  139.                         LDiv1=LDiv;
  140.                 if(SL==0) LDiv1=0;
  141.                         LDiv2=LDiv-LDiv1;                 //算出不發(fā)音的長(zhǎng)度
  142.                   if (SL!=0)
  143.                 {
  144.                         TR0=1;
  145.                         for(i=LDiv1;i>0;i--)         //發(fā)規(guī)定長(zhǎng)度的音
  146.                         {
  147.                                 while(TF1==0);
  148.                                 TH1 = Sound_Temp_TH1;
  149.                                 TL1 = Sound_Temp_TL1;
  150.                                 TF1=0;
  151.                         }
  152.                 }
  153.                 if(LDiv2!=0)
  154.                 {
  155.                         TR0=0; BeepIO=1;
  156.                         for(i=LDiv2;i>0;i--)         //音符間的間隔
  157.                         {
  158.                                 while(TF1==0);
  159.                                 TH1 = Sound_Temp_TH1;
  160.                                 TL1 = Sound_Temp_TL1;
  161.                                 TF1=0;
  162.                         }
  163.                 }
  164.                 Point+=2;
  165.                 Tone=Sound[Point];
  166.                 Length=Sound[Point+1];
  167.         }
  168.         BeepIO = 1;
  169. }
  170. //**************************************************************************
  171. //#endif

  172. /***************************************************************************
  173. 附:3首曲譜編碼表

  174. //揮著翅膀的女孩
  175. unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,
  176.                                   0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,
  177.                                   0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,
  178.                                   0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,
  179.                                   0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,
  180.                                   0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,
  181.                                   0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,
  182.                                   0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,
  183.                                   0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,
  184.                                   0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,
  185.                                   0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
  186.                                   0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
  187.                                   0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
  188.                                   0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,
  189.                                   0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,
  190.                                   0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
  191.                                   0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
  192.                                   0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
  193.                                   0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
  194.                                   0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,
  195.                                   0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,
  196.                                   0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,
  197.                                   0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,
  198.                                   0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,
  199.                                   0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,
  200.                                   0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,
  201.                                   0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,
  202.                                   0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
  203.                                   0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,
  204.                                   0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
  205.                                   0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,
  206.                                   0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,
  207.                                   0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
  208.                                   0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,
  209.                                   0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,
  210.                                   0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00};
  211. //同一首歌
  212. unsigned char code Music_Same[]={ 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,
  213.                                   0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,
  214.                                   0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,
  215.                                   0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,
  216.                                   0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00,
  217.                                   0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,
  218.                                   0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,
  219.                                   0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,
  220.                                   0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03,
  221.                                   0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C,
  222.                                   0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,
  223.                                   0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,
  224.                                   0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,
  225.                                   0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,
  226.                                   0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,
  227.                                   0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,
  228.                                   0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,
  229.                                   0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,
  230.                                   0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C,
  231.                                   0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,
  232.                                   0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00,
  233.                                   0x00,0x00 };
  234. //兩只蝴蝶                                 
  235. unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
  236.                                   0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
  237.                                   0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
  238.                                   0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
  239. ……………………

  240. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
音樂(lè)程序.rar (641.6 KB, 下載次數(shù): 157)


回復(fù)

使用道具 舉報(bào)

ID:429208 發(fā)表于 2019-2-3 14:08 | 顯示全部樓層
信息分享
回復(fù)

使用道具 舉報(bào)

ID:497951 發(fā)表于 2019-4-17 19:05 來(lái)自觸屏版 | 顯示全部樓層
感謝分享,學(xué)習(xí)了?
回復(fù)

使用道具 舉報(bào)

ID:536351 發(fā)表于 2019-5-12 18:56 | 顯示全部樓層
感謝分享 學(xué)到了
回復(fù)

使用道具 舉報(bào)

ID:71883 發(fā)表于 2019-6-29 13:46 | 顯示全部樓層
編譯不通過(guò)
回復(fù)

使用道具 舉報(bào)

ID:613854 發(fā)表于 2019-12-17 15:33 | 顯示全部樓層
感恩                  
回復(fù)

使用道具 舉報(bào)

ID:689551 發(fā)表于 2020-2-2 20:55 | 顯示全部樓層
怎么我的編譯不通過(guò)??
回復(fù)

使用道具 舉報(bào)

ID:701390 發(fā)表于 2020-3-2 20:49 | 顯示全部樓層
不會(huì)調(diào)用
回復(fù)

使用道具 舉報(bào)

ID:90566 發(fā)表于 2020-5-15 10:34 | 顯示全部樓層
這個(gè)得調(diào)用兩個(gè)定時(shí)器呀
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表