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

標題: 求一個單片機的音樂播放器 [打印本頁]

作者: H-51黑電子    時間: 2017-12-19 00:16
標題: 求一個單片機的音樂播放器
1、能播放5首以上的歌
2、用獨立按鍵控制不同歌曲的切換,歌曲的播放與暫停
3、用數碼管顯示當前歌曲的號碼
用AT89C51芯片制作,簡單點,不要太復雜,滿足上面的要求就行,謝謝大家。


作者: wc86110    時間: 2017-12-19 11:59
網店這貨應該有,數碼管,液晶屏隨便選
作者: QIANLILI    時間: 2017-12-20 12:52
給你個資料參考。內含C51代碼和Proteus仿真。

C51音樂盒.rar

122.21 KB, 下載次數: 178


作者: 刺客卓    時間: 2017-12-20 19:44
可以先把PCB圖畫出來在寫程序
作者: shuisheng60    時間: 2019-2-5 21:41
網上有播放音樂的,下下來修修改改就行
作者: 小碼農    時間: 2019-2-12 18:03
我用stc12c5a60s2單片機做的 和你要求的功能差不多基本上改改晶振值就行 了


  1. /****************************
  2. 表白神器  音樂盒
  3. ****************************
  4. 晶振值33.1776MHz
  5. 功能簡介:K16控制暫停與繼續
  6.           K4 上一曲
  7.                                         K12下一曲
  8.     數碼管顯示當前歌曲序號
  9. ****************************
  10. 歌曲分別是:
  11. 紙短情長
  12. 兩只老虎
  13. 祝你生日快樂歌
  14. 小星星
  15. ****************************/
  16. #include <stc12c5a60s2.h>
  17. #define Xtal 33177600  //賦晶振值
  18. #define All 4          //歌曲總數


  19. sbit BUZZ = P1^3;  //蜂鳴器控制引腳
  20. sbit KEY = P2^4;   //按鍵定義
  21. sbit KEY4 = P2^7;
  22. sbit KEY12 = P2^5;
  23. sbit ADDR0 = P2^0; //數碼管顯示控制
  24. sbit ADDR1 = P2^1;
  25. sbit ADDR2 = P2^2;
  26. sbit ENLED = P1^1; //總線收發器

  27. bit KeySta = 1;  //當前按鍵狀態
  28. bit KeySta4 = 1;  
  29. bit KeySta12 = 1;
  30. bit backup = 1;  //默認彈起時時一
  31. bit backup4 = 1;
  32. bit backup12 = 1;
  33. bit cntkey = 0;  //判斷暫停還是播放
  34. bit breakflage = 0;//用按鍵改變歌曲標志

  35. unsigned char keybuf = 0xFF;
  36. unsigned char keybuf4 = 0xFF;
  37. unsigned char keybuf12 = 0xFF;
  38. unsigned char Num = 1; //第幾首歌
  39. unsigned char sizeofNote;//節拍的多少
  40.                
  41. extern void Delay_ms(unsigned int ms);//延時函數

  42. void PlayControl(unsigned char Num);//歌曲選擇函數
  43. void Play();//演奏函數

  44. unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};//數碼管顯示字符轉換表
  45. unsigned int code NoteFrequ[] = {  //中音1-7低音1-7和高音1-7對應頻率列表
  46.     523,  587,  659,  698,  784,  880,  988,  //中音1-7
  47.     1047, 1175, 1319, 1397, 1568, 1760, 1976,  //高音1-7
  48.           262, 294, 330, 349, 392, 440, 494,300//低音1-7  最后一個純屬湊數
  49. };
  50. unsigned int code NoteReload[] = { //中音1-7和高音1-7對應的定時器重載值
  51.     65536 - (Xtal/12) / (523*2),  //中音1
  52.     65536 - (Xtal/12) / (587*2),  //2
  53.     65536 - (Xtal/12) / (659*2),  //3
  54.     65536 - (Xtal/12) / (698*2),  //4
  55.     65536 - (Xtal/12) / (784*2),  //5
  56.     65536 - (Xtal/12) / (880*2),  //6
  57.     65536 - (Xtal/12) / (988*2),  //7
  58.     65536 - (Xtal/12) / (1047*2), //高音1
  59.     65536 - (Xtal/12) / (1175*2), //2
  60.     65536 - (Xtal/12) / (1319*2), //3
  61.     65536 - (Xtal/12) / (1397*2), //4
  62.     65536 - (Xtal/12) / (1568*2), //5
  63.     65536 - (Xtal/12) / (1760*2), //6
  64.     65536 - (Xtal/12) / (1976*2), //7
  65.           65536 - (Xtal/12) / (262*2), //低音1
  66.     65536 - (Xtal/12) / (294*2), //2
  67.     65536 - (Xtal/12) / (330*2), //3
  68.     65536 - (Xtal/12) / (349*2), //4
  69.     65536 - (Xtal/12) / (392*2), //5
  70.     65536 - (Xtal/12) / (440*2), //6
  71.     65536 - (Xtal/12) / (494*2), //7
  72.                 65536 - (Xtal/12) / (300*2), //純屬湊數
  73. };

  74. unsigned char *SongNote, *SongBeat;//指針
  75. unsigned char code XiaoXingXingNote[] = {   //小星星
  76.         1, 1, 5, 5,    6, 6, 5,    4, 4, 3, 3,    2, 2, 1,  
  77.         5, 5, 4, 4,    3, 3, 2,    5, 5, 4, 4,    3, 3, 2 ,
  78.         1, 1, 5, 5,    6, 6, 5,    4, 4, 3, 3,    2, 2, 1, 0xff    };

  79. unsigned char code XiaoXingXingBeat[] = {
  80.         4, 4, 4, 4,    4, 4, 8,    4, 4, 4, 4,    4, 4, 8,
  81.         4, 4, 4, 4,    4, 4, 8,    4, 4, 4, 4,    4, 4, 8,
  82.         4, 4, 4, 4,    4, 4, 8,    4, 4, 4, 4,    4, 4, 8,};
  83. unsigned char code TwoTigerNote[] = {    //兩只老虎音符表
  84.         1,   2,   3, 1,    1,   2,   3, 1,   3, 4, 5,   3, 4, 5,
  85.         5,6, 5,4, 3, 1,    5,6, 5,4, 3, 1,   1, 5, 1,   1, 5, 1,0xff};

  86. unsigned char code TwoTigerBeat[] = {    //兩只老虎節拍表,4表示一拍,1就是1/4拍,8就是2拍
  87.         4,   4,   4, 4,    4,   4,   4, 4,   4, 4, 8,   4, 4, 8,
  88.         3,1, 3,1, 4, 4,    3,1, 3,1, 4, 4,   4, 4, 8,   4, 4, 8,
  89.     };
  90. unsigned char code HappybirthdayNote[] = {  //生日快樂歌
  91.         5, 5, 6, 5, 8, 7, 22, 5, 5, 6, 5, 9, 8, 5, 5, 12, 10, 8, 7, 6, 11, 11,  10, 8, 9, 8,0xff };
  92. unsigned char code HappybirthdayBeat[] = {
  93.         2, 2, 4, 4, 4, 4, 4, 2, 2,  4, 4, 4, 8, 2, 2, 4, 4, 4, 4, 8, 2, 2, 4, 4, 4, 8};       
  94. unsigned char code         ZhiduanqingchangNote[] = { //紙短情長
  95.               //8, 9, 10, 9, 8, 6, 22, 11, 10, 9, 22, 7, 8, 9, 7, 7, 5, 22, 7, 9, 8, 8, 3, 4, 2, 3, 1, 1, 5, 2,  //前奏
  96.         19, 3, 3, 3, 2, 3, 1, 2, 2, 2, 1, 2, 5, 1, 1, 1, 20, 1, 20, 19,     2, 2, 2, 3, 20, 19, 4, 4, 4, 3, 4, 1, 2, 2, 2, 1, 2, 5,
  97.                1, 1, 1, 20, 1, 20, 3, 2, 2, 1, 1, 22, 22, 22, 1, 1, 2,             3, 3, 3, 22, 3, 2, 1, 21, 6, 5, 22, 5, 6, 7, 8, 3, 3, 22, 8, 7, 8,
  98.               7, 3, 5, 5, 6, 8, 5, 6, 22, 6, 5, 4,5, 3, 2, 1, 20, 1,               3, 2, 2, 1, 2, 5, 1, 2, 5, 22, 22, 22, 1, 1, 2,
  99.         3, 3, 2, 3, 22, 3, 2, 1, 5, 5, 3, 5, 22, 5, 6, 7,                   8, 8, 8, 8, 8, 7, 6, 7, 6, 3, 5, 5, 5, 6, 8, 5, 6, 22, 6, 5, 4,
  100.         5, 3, 2, 1, 6, 1, 3, 2, 2, 1, 2, 1, 20, 1, 22,                      22, 20, 1, 3, 2, 2, 22, 2, 1, 2, 1, 1, 22, 20, 1, 1, 0xff};       
  101. unsigned char code ZhiduanqingchangBeat[] = {
  102.               //2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 8, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 8, 8, 12, 4, 5, 4, 8, 8, 4,   //前奏
  103.         8, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 4, 2,       2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 4, 5, 2, 2, 2, 2, 2, 5,
  104.         2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 8, 4, 4, 2, 2, 2, 2,                4, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2,
  105.         4, 2, 5, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 2, 5, 1, 1,             2, 2, 2, 2, 2, 4, 2, 16, 16,4, 4, 2, 2, 2, 2,
  106.         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,                   2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 4, 2, 2, 2, 4, 2, 2, 2, 2, 2,
  107.         2, 4, 2, 5, 1, 1, 2, 2, 2, 2, 2, 4, 1, 12, 4,                     2, 1, 1, 2, 2, 8, 2, 1, 1, 2, 2, 8, 2, 2, 12, 16};
  108. bit enable = 1;   //蜂鳴器發聲使能標志
  109. bit tmrflag = 0;  //定時器中斷完成標志
  110. unsigned char T0RH = 0xFF;  //T0重載值的高字節
  111. unsigned char T0RL = 0x00;  //T0重載值的低字節


  112. void main()
  113. {
  114.    
  115.     EA = 1;       //使能全局中斷
  116.     TMOD = 0x11;  //配置T0,T1工作在模式1
  117.     TH0 = T0RH;   
  118.     TL0 = T0RL;
  119.     ET0 = 1;      //使能T0中斷
  120.           ET1 = 1;      //使能T1中斷
  121.           TR1 = 1;      //啟動T1
  122.           ENLED = 0x00; //使能總線收發器
  123.           ADDR2=1; ADDR1=0; ADDR0=1;//選擇最右邊的數碼管
  124.           P23 = 0;      //啟用KEY
  125.    
  126.     while (1)
  127.     {
  128.                         P0 = LedChar[Num]; //數碼管顯示當前歌曲序號
  129.       PlayControl(Num);                       
  130.                         if(breakflage == 1)
  131.                                 breakflage = 0;
  132.                         else
  133.                                 Delay_ms(500);
  134.     }
  135. }

  136. void PlayControl(unsigned char Num)
  137. {
  138.         switch(Num)
  139.         {
  140.                 case 4:SongNote = XiaoXingXingNote;    SongBeat =  XiaoXingXingBeat;  sizeofNote = sizeof(XiaoXingXingNote);   Play();break;
  141.     case 2:SongNote = TwoTigerNote;        SongBeat =TwoTigerBeat;        sizeofNote = sizeof(TwoTigerNote);       Play();break;
  142.                 case 3:SongNote = HappybirthdayNote;   SongBeat =HappybirthdayBeat;   sizeofNote = sizeof(HappybirthdayNote);  Play();break;
  143.                 case 1:SongNote = ZhiduanqingchangNote;SongBeat =ZhiduanqingchangBeat;sizeofNote = sizeof(ZhiduanqingchangNote);Play();break;               
  144.                 default:break;
  145.         }
  146. }
  147. /* 演奏函數 */
  148. void Play()//演奏函數
  149. {
  150.     unsigned char beat;   //當前節拍索引
  151.     unsigned char note;   //當前節拍對應的音符
  152.     unsigned int time = 0;      //當前節拍計時
  153.     unsigned int beatTime = 0;  //當前節拍總時間
  154.     unsigned int soundTime = 0; //當前節拍需發聲時間

  155.     for (beat=0; beat<sizeofNote; )  //用節拍索引作為循環變量
  156.     {
  157.                                 if(breakflage == 1)
  158.                                         break;
  159.         while (!tmrflag);  //每次定時器中斷完成后,檢測并處理節拍
  160.         tmrflag = 0;
  161.         if (time == 0)  //當前節拍播完則啟動一個新節拍
  162.         {
  163.                                         if(breakflage == 1)
  164.                                                 break;
  165.             note = SongNote[beat] - 1;
  166.                                           if(note == 0xfe)
  167.                                                 {
  168.                                                         if(Num == All)
  169.                                                                 Num = 1;
  170.                                                         else
  171.                                                         Num++;
  172.                                                         break;
  173.                                                 }
  174.             T0RH = NoteReload[note] >> 8;
  175.             T0RL = NoteReload[note];
  176.             beatTime = (SongBeat[beat] * NoteFrequ[note]) >> 2;//計算節拍總時間,右移2位相當于除4,移位代替除法可以加快執行速度
  177.             soundTime = beatTime - (beatTime >> 2);//計算發聲時間,
  178.             enable = 1;  //指示蜂鳴器開始發聲
  179.                                                 if (note == 21)//簡譜的0 等待
  180.                                                         enable =0;
  181.             time++;
  182.         }
  183.         else  //當前節拍未播完則處理當前節拍
  184.         {
  185.             if (time >= beatTime)  //當前持續時間到達節拍總時間時歸零,
  186.             {                      //并遞增節拍索引,以準備啟動新節拍
  187.                 time = 0;
  188.                 beat++;
  189.             }
  190.             else  //當前持續時間未達到總時間時,
  191.             {
  192.                 time++;   //累加時間計數
  193.                 if (time == soundTime)  //到達發聲時間后,指示關閉蜂鳴器,
  194.                 {                       //插入0.25*總時間的靜音間隔,
  195.                     enable = 0;         //用以區分連續的兩個節拍
  196.                 }
  197.             }
  198.         }
  199.     }
  200. }
  201. /*控制蜂鳴器發聲 */
  202. void InterruptTimer0() interrupt 1
  203. {
  204.     TH0 = T0RH;   //重新加載重載值
  205.     TL0 = T0RL;
  206.     tmrflag = 1;
  207.     if (enable)   //使能時反轉蜂鳴器控制電平
  208.         BUZZ = ~BUZZ;
  209.     else          //未使能時關閉蜂鳴器
  210.         BUZZ = 1;
  211. }
  212. /*按鍵掃描*/
  213. void InterruptTimer1() interrupt 3 //按鍵部分參看之前的帖子 帶有計次功能的秒表
  214. {
  215.         TH1 = 0xC9;
  216.         TL1 = 0xEA;
  217.        
  218.           keybuf = (keybuf<<1) | KEY;
  219.     if (keybuf == 0x00)
  220.         KeySta = 0;
  221.     else if (keybuf == 0xFF)
  222.         KeySta = 1;
  223.     else{}
  224.                        
  225.           keybuf4 = (keybuf4<<1) | KEY4;
  226.     if (keybuf4 == 0x00)
  227.         KeySta4 = 0;
  228.     else if (keybuf4 == 0xFF)
  229.         KeySta4 = 1;
  230.     else{}
  231.                        
  232.          keybuf12= (keybuf12<<1) | KEY12;
  233.     if (keybuf12 == 0x00)
  234.         KeySta12 = 0;
  235.     else if (keybuf12 == 0xFF)
  236.         KeySta12 = 1;
  237.     else{}
  238.                        
  239.                               if (KeySta != backup)  
  240.         {
  241.             if (backup == 0)        
  242.                                                 {
  243.                                                         cntkey=~cntkey;
  244.                                                         TR0 = cntkey;
  245.                                                 }
  246.             backup = KeySta;               
  247.         }
  248.                 if (KeySta4 != backup4)
  249.                 {
  250.                         if(backup4 ==0)
  251.                         {
  252.                                 breakflage = 1;
  253.                                 if(Num <All)
  254.                                   Num++;
  255.                           else if(Num == All)
  256.                                         Num =1;
  257.                                 P0 = LedChar[Num];
  258.                         }
  259.                         backup4 = KeySta4;
  260.                 }               
  261.                
  262.                 if (KeySta12 != backup12)
  263.                 {
  264.                         if(backup12 ==0)
  265.                         {
  266.                                 breakflage = 1;
  267.                                 if(Num >1)
  268.                                   Num--;
  269.                           else if(Num == 1)
  270.                                         Num =All;
  271.                                 P0 = LedChar[Num];
  272.                         }
  273.                         backup12 = KeySta12;
  274.                 }                       
  275.                
  276. }
復制代碼

作者: ZYQTABC    時間: 2019-2-13 00:08
某1個寶上買過,質量太差,同求?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 偷拍自拍网 | 国产精品一区二区免费 | 亚洲免费片 | 一级片网址 | 久久国产免费看 | 国产99久久| 国产欧美日韩综合精品一区二区 | 狠狠草视频 | 成人a视频在线观看 | 国产精品久久久久久影视 | 成人小视频在线观看 | 精品香蕉一区二区三区 | 日韩精品一区二区三区视频播放 | 99久久久国产精品 | 久久三区 | 久久成人精品视频 | 欧美一区二区三区小说 | 国产美女精品 | 国产精品日韩在线观看一区二区 | 亚洲深夜福利 | 亚洲久草视频 | 久久av.com| 99精品视频在线 | 欧美成年黄网站色视频 | 久久久久香蕉视频 | 天天干天天谢 | 国产成人精品午夜视频免费 | 自拍偷拍亚洲一区 | 91电影在线播放 | 国产精品久久久久久久7电影 | av大全在线| 正在播放国产精品 | av一级久久| 久久久久久久av | 免费观看一级特黄欧美大片 | 久操福利 | 欧美精品啪啪 | 亚洲高清一区二区三区 | 欧美九九| 99re超碰| 精区3d动漫一品二品精区 |