久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19869|回復: 8
收起左側

一個小巧的單片機音樂程序 內附幾首歌代碼

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

單片機源程序如下:
  1.                                                                                                                                  //51單片機播放音樂庫文件
  2. ///51單片機播放音樂庫文件
  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. /*說明**************************************************************************
  18. 曲譜存貯格式 unsigned char code MusicName{音高,音長,音高,音長...., 0,0};        末尾:0,0 表示結束(Important)

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

  23. 音長最多由三位數字組成:
  24.                 個位表示音符的時值,其對應關系是:
  25.                         |數值(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.                 百位是符點位: 0-無符點,1-有符點

  29. 調用演奏子程序的格式
  30.                 Play(樂曲名,調號,升降八度,演奏速度);
  31.         |樂曲名           : 要播放的樂曲指針,結尾以(0,0)結束;
  32.         |調號(0-11)       :        是指樂曲升多少個半音演奏;
  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                 //定義普通音符演奏的長度分率,//每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;        //音符定時器初值暫存
  49. unsigned char Sound_Temp_TH1,Sound_Temp_TL1;        //音長定時器初值暫存
  50. //**************************************************************************
  51. void InitialSound(void)
  52. {
  53.         BeepIO = 1;
  54.         Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;        // 計算TL1應裝入的初值         (10ms的初裝值)
  55.         Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;        // 計算TH1應裝入的初值
  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        //音符發生中斷
  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++)                                 // 根據調號及升降八度來生成新的頻率表
  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)        //計算歌曲長度
  96.         {
  97.                 SoundLength+=2;
  98.         }

  99.         Point = 0;
  100.         Tone   = Sound[Point];       
  101.         Length = Sound[Point+1];                         // 讀出第一個音符和它時時值
  102.        
  103.         LDiv0 = 12000/Speed;                                // 算出1分音符的長度(幾個10ms)        
  104.         LDiv4 = LDiv0/4;                                         // 算出4分音符的長度
  105.         LDiv4 = LDiv4-LDiv4*SOUND_SPACE;         // 普通音最長間隔標準
  106.         TR0          = 0;
  107.         TR1   = 1;
  108.         while(Point < SoundLength)
  109.         {
  110.                 SL=Tone%10;                                                                 //計算出音符
  111.                 SM=Tone/10%10;                                                                 //計算出高低音
  112.                 SH=Tone/100;                                                                 //計算出是否升半
  113.                 CurrentFre = NewFreTab[SignTab[SL-1]+SH];         //查出對應音符的頻率        
  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);//計算計數器初值
  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是對中斷延時的補償
  123.                 }
  124.                 SLen=LengthTab[Length%10];         //算出是幾分音符
  125.                 XG=Length/10%10;                         //算出音符類型(0普通1連音2頓音)
  126.                 FD=Length/100;
  127.                 LDiv=LDiv0/SLen;                         //算出連音音符演奏的長度(多少個10ms)
  128.                 if (FD==1)
  129.                         LDiv=LDiv+LDiv/2;
  130.                 if(XG!=1)       
  131.                         if(XG==0)                                 //算出普通音符的演奏長度
  132.                                 if (SLen<=4)       
  133.                                         LDiv1=LDiv-LDiv4;
  134.                                 else
  135.                                         LDiv1=LDiv*SOUND_SPACE;
  136.                         else
  137.                                 LDiv1=LDiv/2;                 //算出頓音的演奏長度
  138.                 else
  139.                         LDiv1=LDiv;
  140.                 if(SL==0) LDiv1=0;
  141.                         LDiv2=LDiv-LDiv1;                 //算出不發音的長度
  142.                   if (SL!=0)
  143.                 {
  144.                         TR0=1;
  145.                         for(i=LDiv1;i>0;i--)         //發規定長度的音
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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


回復

使用道具 舉報

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

使用道具 舉報

ID:497951 發表于 2019-4-17 19:05 來自觸屏版 | 顯示全部樓層
感謝分享,學習了?
回復

使用道具 舉報

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

使用道具 舉報

ID:71883 發表于 2019-6-29 13:46 | 顯示全部樓層
編譯不通過
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:701390 發表于 2020-3-2 20:49 | 顯示全部樓層
不會調用
回復

使用道具 舉報

ID:90566 發表于 2020-5-15 10:34 | 顯示全部樓層
這個得調用兩個定時器呀
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美a级网站 | 伊人久久麻豆 | 免费的av网站 | 日韩视频 中文字幕 | www.三级| 999热视频| 亚洲欧洲中文日韩 | 久久av.com | 刘亦菲国产毛片bd | 麻豆亚洲| 国产1区| 国产91久久久久蜜臀青青天草二 | 国产精品乱码一区二区三区 | 国产亚洲欧美另类一区二区三区 | 国产精品久久久久久久久久久久久 | 久久网一区二区三区 | 综合另类 | 精品国产一区二区三区日日嗨 | 蜜桃视频在线观看免费视频网站www | 啪啪免费网 | 国产精品一二三区 | 一区二区免费视频 | 久久久999国产精品 中文字幕在线精品 | 日韩福利在线观看 | 久久精品亚洲一区二区三区浴池 | 中文字幕日韩欧美一区二区三区 | 日本又色又爽又黄的大片 | 久久精品日产第一区二区三区 | 国产精品久久久久久久久图文区 | 日本手机看片 | 国产欧美一区二区精品久导航 | 色综网| 粉嫩一区二区三区四区公司1 | 国产成人精品综合 | 久久久综合久久 | 日日av| 精品乱码一区二区 | 尤物视频在线免费观看 | 黄在线免费观看 | 天天干天天干 | 亚洲欧美日本国产 |