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

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

QQ登錄

只需一步,快速開始

搜索
查看: 9497|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

用蜂鳴器實(shí)現(xiàn)播放音樂(lè)(根據(jù)網(wǎng)上找到的程序修改的,非原創(chuàng)。注意晶振11.0592)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:629845 發(fā)表于 2019-12-27 20:43 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
里面有五首歌(都是一部分,非整首歌),第一首播放青花瓷,讓你感受單片機(jī)的強(qiáng)大魅力。注意:由于本人第一次畫仿真電路圖,所以仿真有瑕疵,但是在普中51單片機(jī)開發(fā)板上播放流暢,感興趣的朋友可以根據(jù)普中51的電路圖(壓縮包中已提供)自己再畫一個(gè)仿真。

單片機(jī)源程序如下:
  1. #include "init.h"         //初始化庫(kù)函數(shù)
  2. #include "lcd.h"
  3. sbit speaker=P1^3;//蜂鳴器
  4. sbit key_next=P3^6;                //下一首
  5. sbit key_last=P3^5;                //上一首
  6. sbit key_pause=P3^7;        //暫停/播放
  7. uchar a,b;
  8. uchar number=0;                //記錄播放哪一首歌的標(biāo)志位
  9. uchar pause=0;                //暫停/播放標(biāo)志位
  10. uchar code yinfu[]={0xfb,0xe9,      //Do
  11.                    0xfc,0x5c,      //Re
  12.                    0xfc,0xc1,      //Mi
  13.                    0xfc,0xef,      //Fa
  14.                    0xfd,0x45,      //So
  15.                    0xfd,0x92,      //La
  16.                    0xfd,0xd0,      //Si
  17.                    0xfd,0xee,      //Do#
  18.                                    0x00,0x00,           //間隔
  19. };
  20. uchar code shengri_tone[]={1,0,1,2,1,4,3,0, //生日快樂(lè)音調(diào)
  21.                            1,0,1,2,1,5,4,0,
  22.                            1,0,1,8,6,4,3,2,0,7,0,7,6,4,5,4,0       //0代表不發(fā)聲,即停頓;數(shù)字即為音調(diào)
  23. };
  24. uchar code shengri_beat[]={24,1,24,48,48,48,72,5,//節(jié)拍
  25.                            24,1,24,48,48,48,72,5,
  26.                            24,1,24,48,48,48,48,72,5,24,1,24,48,48,48,72,5    //節(jié)拍,即tone表各音調(diào)的延時(shí)
  27. };
  28. uchar code laohu_tone[]={1,2,3,1,0,1,2,        //兩只老虎樂(lè)譜 40個(gè)音符
  29.                                                 3,1,0,3,4,5,0,3,4,5,0,5,6,5,4,3,
  30.                                                 1,0,5,6,5,4,3,1,0,3,2,1,0,3,2,1,0
  31. };
  32. uchar code laohu_beat[]={24,24,24,48,5,24,24,//節(jié)拍
  33.                                                 24,48,5,24,24,48,5,24,24,72,5,24,24,24,24,//節(jié)拍
  34.                                                 24,48,5,24,24,24,24,24,72, 5,24,24,48,5,24,24,//節(jié)拍
  35.                                                 72,5//節(jié)拍  //節(jié)拍,即tone表各音調(diào)撓
  36. };
  37. uchar code yishan_tone[]={1,1,5,5,6,6,5,        //星星樂(lè)譜  54個(gè)音符
  38.                                                 0,4,4,3,3,2,2,1,0,5,5,4,4,3,
  39.                                                 3,2,0,5,5,4,4,3,3,2,0,1,1,5,5,
  40.                                                 6,6,5,0,4,4,3,3,2,2,1,0
  41. };
  42. uchar code yishan_beat[]={24,24,24,24,24,24,48,//節(jié)拍
  43.                                                 5,24,24,24,24,24,24,72,5,24,24,24,24,24,24,//節(jié)拍
  44.                                                 48,5,24,24,24,24,24,24,72,5,24,24,24,24,24,24,//節(jié)拍
  45.                                                 48,5,24,24,24,24,24,24,72,5//節(jié),紅one敢艫韉難郵?
  46. };
  47. uchar code yinlv[][2]={
  48.         {0,1},{1,1},{3,1},{5,1},{6,1},{8,1},{10,1},{12,1},{13,1},//演示超低音八度 123457671
  49.         {0,1},{13,1},{15,1},{17,1},{18,1},{20,1},{22,1},{24,1},{25,1},//演示低音八度12345671
  50.         {0,1},{25,1},{27,1},{29,1},{30,1},{32,1},{34,1},{36,1},{37,1},//演示中音八度12345671
  51.         {0,1},{37,1},{39,1},{41,1},{42,1},{44,1},{46,1},{48,2},//演示高音八度 1234567
  52. };
  53. //青花瓷
  54. uchar code qing_tone[49][2]={{0,0},//定義音律49個(gè)二維數(shù)組
  55. {0xF9,0x1F},{0xF9,0x82},{0xF9,0xDF},{0xFA,0x37},{0xFA,0x8A},{0xFA,0xD8},{0xFB,0x23},{0xFB,0x68},{0xFB,0xAA},{0xFB,0xE9},{0xFC,0x24},{0xFC,0x5B},
  56. {0xFC,0x8F},{0xFC,0xC1},{0xFC,0xEF},{0xFD,0x1B},{0xFD,0x45},{0xFD,0x6C},{0xFD,0x91},{0xFD,0xB4},{0xFD,0xD5},{0xFD,0xF4},{0xFE,0x12},{0xFE,0x2D},
  57. {0xFE,0x48},{0xFE,0x60},{0xFE,0x78},{0xFE,0x86},{0xFE,0xA3},{0xFE,0xB6},{0xFE,0xC9},{0xFE,0xDA},{0xFF,0xEB},{0xFE,0xFA},{0xFF,0x09},{0xFF,0x17},
  58. {0xFF,0x24},{0xFF,0x30},{0xFF,0x3C},{0xFF,0x47},{0xFF,0x51},{0xFF,0x5B},{0xFF,0x64},{0xFF,0x6D},{0xFF,0x75},{0xFF,0x7D},{0xFF,0x84},{0xFF,0x8B}
  59. };
  60. uchar code qing_beat[][2]={//定義曲譜數(shù)組,前數(shù)為音律,后數(shù)為音符節(jié)拍 ,要換歌改變簡(jiǎn)譜對(duì)應(yīng)的音律號(hào)即可
  61. {24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},//記錄菊花臺(tái)簡(jiǎn)譜歌詞:0553236 23532 天青色等煙雨 而我在等你
  62. {24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16},//簡(jiǎn)譜歌詞:0553235 23521 炊煙裊裊升起 隔江千萬(wàn)里
  63. {17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,16},//簡(jiǎn)譜歌詞:01235654 53322 在平地書刻你房間上的飄影
  64. {17,4},{19,4},{17,4},{17,4},{19,4},{17,4},{19,4},{19,4},{21,8},{24,4},{21,4},{21,12},//簡(jiǎn)譜歌詞:就當(dāng)我為遇見你伏筆
  65. {24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16}, //簡(jiǎn)譜歌詞:0553236 23532 天青色等煙雨 而我在等你
  66. {24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16}, //簡(jiǎn)譜歌詞:0553235 23521 月色被打撈起 掩蓋了結(jié)局
  67. {17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,12},//簡(jiǎn)譜歌詞:0123 5654 5332 25 322 11 如傳世的青花瓷在獨(dú)自美麗
  68. {12,4},{21,8},{19,8},{19,4},{17,20}, //簡(jiǎn)譜歌詞:你眼帶笑意
  69. {0xFF,0xFF}}; //歌曲結(jié)尾標(biāo)識(shí)
  70. //兩只蝴蝶
  71. uchar code hudie_tone[49][2]={{0,0},
  72.         {0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},
  73.         {0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},
  74.         {0xFB,0xCF},{0xFC,0x0B},{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},
  75.         {0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},
  76.         {0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},{0xFE,0x21},
  77.         {0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},
  78.         {0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},
  79.         {0xFF,0x02},{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},
  80.         {0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},
  81.         {0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
  82.         };
  83. uchar code hudie_beat[][2]={{0,4},
  84.         {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},
  85.         {19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
  86.         {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,24},{16,4},
  87.         {19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{21,24},
  88.         {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},
  89.         {19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
  90.         {23,4},{26,4},{26,16},{26,4},{28,4},{26,4},{23,24},{21,4},{23,4},
  91.         {21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{16,2},{19,2},{19,24},{0,20},
  92.         {26,4},{26,4},{28,4},{31,4},{30,4},{30,4},{28,4},{23,4},{21,4},{21,4},
  93.         {23,16},{23,4},{23,4},{26,4},{28,8},{28,12},{16,4},{23,4},{21,4},
  94.         {21,24},{23,4},{26,4},{26,4},{23,4},{26,8},{31,8},{30,4},{28,4},
  95.         {30,4},{23,8},{28,4},{28,4},{30,4},{28,4},{26,4},{23,4},{21,8},
  96.         {23,4},{21,4},{23,4},{26,16},
  97.         {0xFF,0xFF}};
  98. //函數(shù)聲明
  99. void play(void);   //音樂(lè)播放控制函數(shù)
  100. void key();                   //判斷按鍵函數(shù)
  101. void stop();           //暫停/播放函數(shù)
  102. void display();           //液晶顯示函數(shù)
  103. void delay(uchar p); //歌曲延時(shí)函數(shù)
  104. void pause1();                 //歌曲演示函數(shù)

  105. void main()
  106. {
  107.         TMOD=0x01;
  108.         TH0=a;
  109.         TL0=b;
  110.         ET0=1;//打開定時(shí)器,但是未允許中斷
  111.         TR0=1;

  112.         number = 4;                  //首先播放青花瓷
  113.         LcdInit();
  114.         while(1)
  115.         {
  116.                 play();
  117.         }
  118. }

  119. void key()
  120. {
  121.         if(key_next==0)
  122.         {
  123.                 delay_ms(10);
  124.                 if(key_next==0)
  125.                 {
  126.                         number++;
  127.                         if(number>6)
  128.                         {
  129.                                 number=1;          //如果number>6,表示最后一首歌,返回第一首歌播放
  130.                         }
  131.                 }
  132.                         while(!key_next);        
  133.         }
  134.         if(key_last==0)
  135.         {        
  136.                 delay_ms(10);
  137.                 if(key_last==0)
  138.                 {  
  139.                         number--;
  140.                         if(number<1)
  141.                         {          //如果number<1,表示第一首歌,返回最后一首歌播放
  142.                                 number=6;
  143.                         }
  144.                 }
  145.                 while(!key_last);
  146.         }
  147.         if(key_pause==0)
  148.         {           //暫停、播放
  149.                 delay_ms(10);
  150.                 if(key_pause==0)
  151.                 {
  152.                         if(pause==1)
  153.                         {
  154.                                 pause=0;
  155.                         }
  156.                         else
  157.                         {
  158.                                 pause=1;
  159.                         }
  160.                 }
  161.                 while(!key_pause);
  162.         }
  163. }

  164. void stop()
  165. {
  166.         key();
  167.         if(pause==1)
  168.         {
  169.                 speaker=0;
  170.                 EA=0;                                //贊同是斷開定時(shí)器中斷
  171.                 while(1)
  172.                 {
  173.                         key();
  174.                         ShowString (0x01,"By:------ pause");
  175.                         if(pause==0)
  176.                         {
  177.                                 ShowString (0x01,"By:------      ");
  178.                                 EA=1;
  179.                                 break;
  180.                         }
  181.                 }
  182.         }
  183. }

  184. void play(void)
  185. {
  186.         uchar m=0;
  187.         char s;
  188.         uchar flag=1;     
  189.         uchar c=1;
  190.         if(number==1)
  191.         {
  192.                 display();                                 //顯示歌名
  193.                 while(flag)
  194.                 {
  195.                         EA=0;
  196.                         c=shengri_tone[m];                       //取音符
  197.                         s=shengri_beat[m];                      //取節(jié)拍
  198.                         a=yinfu[2*c-2];                           
  199.                         b=yinfu[2*c-1];                           
  200.                         EA=1;
  201.                         while(s--)
  202.                         {
  203.                                 delay1();
  204.                                 stop();
  205.                                 if(number!=1)
  206.                                 {
  207.                                         s=0;
  208.                                         flag=0;
  209.                                         break;
  210.                                 }        
  211.                         }
  212.                         P2=b;
  213.                         m++;
  214.                         if(m>=33){
  215.                                 number=2;
  216.                                 flag=0;
  217.                         }
  218.                 }
  219.         }
  220.         else if(number==2)
  221.         {
  222.                 display();
  223.                 while(flag)
  224.                 {
  225.                         EA=0;
  226.                         c=laohu_tone[m];                            //取音符
  227.                         s=laohu_beat[m];                      //取節(jié)拍
  228.                         a=yinfu[2*c-2];                           
  229.                         b=yinfu[2*c-1];                           
  230.                         EA=1;
  231.                         while(s--)
  232.                         {
  233.                              delay1();
  234.                                  stop();
  235.                                  if(number!=2)
  236.                                  {
  237.                                         s=0;
  238.                                         flag=0;
  239.                                         break;
  240.                                 }
  241.                         }
  242.                         P2=b;
  243.                         m++;
  244.                         if(m>=40){
  245.                                 number=3;
  246.                                 flag=0;
  247.                         }                  
  248.                 }
  249.         }
  250.         else if(number==3)
  251.         {
  252.                 display();
  253.                 while(flag){
  254.                         EA=0;
  255.                         c=yishan_tone[m];                            //取音符
  256.                         s=yishan_beat[m];                      //取節(jié)拍
  257.                         a=yinfu[2*c-2];                           
  258.                         b=yinfu[2*c-1];                           
  259.                         EA=1;
  260.                         while(s--)
  261.                         {
  262.                                 delay1();
  263.                                 stop();
  264.                                 if(number!=3)
  265.                                 {
  266.                                         s=0;
  267.                                         flag=0;
  268.                                         break;
  269.                                 }
  270.                         }
  271.                         P2=b;
  272.                         m++;
  273.                         if(m>=48){
  274.                                 number=4;
  275.                                 flag=0;
  276.                         }                     
  277.                 }
  278.         }
  279.         else if(number==4)
  280.         {                //下面這兩首歌與前面的播放方式一樣,因?yàn)槲沂窃诰W(wǎng)上搜集整合的
  281.                 display();
  282.                 while(flag)
  283.                 {
  284.                         EA=0;
  285.                         c=qing_beat[m][0];                            //取音符
  286.                         s=qing_beat[m][1];                      //取節(jié)拍
  287.                         a=qing_tone[c][0];                           
  288.                         b=qing_tone[c][1];                           
  289.                         EA=1;
  290.                         if(number!=4)
  291.                         {
  292.                                 c=0;
  293.                                 s=0;
  294.                                 flag=0;
  295.                                 break;
  296.                         }
  297.                    if(c==0xFF)
  298.                         {
  299.                                 number=5;
  300.                                 flag=0;
  301.                                 break;
  302.                         }
  303.                    else if(c==qing_beat[m+1][0])
  304.                         {
  305.                                 TR0=1;
  306.                                 delay(s);
  307.                                 TR0=0;
  308.                                 pause1();
  309.                                 m++;
  310.                         }
  311.                    else
  312.                         {
  313.                                 TR0=1;
  314.                                 delay(s);
  315.                                 m++;
  316.                         }
  317.                         P2=b;                     
  318.                 }
  319.         }
  320.         else if(number==5)
  321.         {
  322.                 display();
  323.                 while(flag){
  324.                         EA=0;
  325.                         c=hudie_beat[m][0];                            //取音符
  326.                         s=hudie_beat[m][1];                      //取節(jié)拍
  327.                         a=hudie_tone[c][0];                           
  328.                         b=hudie_tone[c][1];                           
  329.                         EA=1;
  330.                         if(number!=5)
  331.                         {
  332.                                 s=0;
  333.                                 flag=0;
  334.                                 break;
  335.                         }
  336.                    if(c==0xFF)
  337.                         {
  338.                                 number=6;
  339.                                 flag=0;
  340.                                 break;
  341.                         }
  342.                    else if(c==hudie_beat[m+1][0])
  343.                         {
  344.                                 TR0=1;
  345.                                 delay(s);
  346.                                 TR0=0;
  347.                                 pause1();
  348.                                 m++;
  349.                         }
  350.                    else
  351.                         {
  352.                                 TR0=1;
  353.                                 delay(s);
  354.                                 m++;
  355.                         }
  356.                         P2=b;                     
  357.                 }
  358.         }
  359.         else if(number==6)
  360.         {                                   //播放低音,高音的音樂(lè)
  361.                 display();
  362.                 while(flag)
  363.                 {
  364.                         EA=0;
  365.                         c=yinlv[m][0];                            //取音符
  366.                         s=yinlv[m][1];                      //取節(jié)拍
  367.                         a=qing_tone[c][0];                           
  368.                         b=qing_tone[c][1];                           
  369.                         EA=1;
  370.                         
  371.                         TR0=1;
  372.                         delay(s);
  373.                         m++;
  374.                         if(number!=6)
  375.                         {
  376.                                 s=0;
  377.                                 flag=0;
  378.                                 break;
  379.                         }        
  380.                         if(m>=36)
  381. ……………………

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

所有資料51hei提供下載:
音樂(lè)播放器.7z (493.28 KB, 下載次數(shù): 111)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:581952 發(fā)表于 2019-12-31 11:08 | 只看該作者
這個(gè)下載后,只能用winrar來(lái)解壓,其他的軟件都不支持 大家注意下
回復(fù)

使用道具 舉報(bào)

板凳
ID:3666 發(fā)表于 2025-2-14 10:26 | 只看該作者
請(qǐng)問(wèn)一下每首歌曲的節(jié)拍是怎么來(lái)的?節(jié)拍是不是可以理解為每個(gè)音符發(fā)聲時(shí)間嗎?謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 五月天天丁香婷婷在线中 | 精品一区二区观看 | 中文字幕在线免费观看 | 精品国产一区二区在线 | 亚洲一级毛片 | 罗宾被扒开腿做同人网站 | 欧美久久一区 | 色网站入口 | 成人国产在线观看 | 国产精品久久二区 | 亚洲欧美日韩成人在线 | 国产一区久久久 | 久久精品亚洲精品国产欧美 | 精品丝袜在线 | 午夜欧美一区二区三区在线播放 | 91av免费看| 国产高清视频在线 | 国产网站在线免费观看 | 欧美一区二区三区,视频 | 国产欧美精品区一区二区三区 | 亚洲自拍偷拍免费视频 | 成人在线看片 | 亚洲三区在线观看 | 日韩精品一区二区三区 | 涩涩视频在线看 | 久久精品网 | 天天艹| 干出白浆视频 | 久久久国| 日韩久草| 97视频成人 | 黄色免费网 | 中国人pornoxxx麻豆 | 91文字幕巨乱亚洲香蕉 | 国产乱肥老妇国产一区二 | 国产精品免费视频一区 | 夜夜爽99久久国产综合精品女不卡 | 91综合网 | 欧美美女爱爱 | 国产精品国产精品国产专区不蜜 | 久久精品 |