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

QQ登錄

只需一步,快速開始

帖子
查看: 3062|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

簡(jiǎn)易單片機(jī)Mp3程序 蜂鳴器播放敢問路在何方(新手入門級(jí))

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
包含Proteus仿真和源碼


單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. sbit beep = P2^3;
  3. unsigned char timer0H, timer0L, time;

  4. //單片機(jī)晶振采用11.0592MHz

  5. code unsigned char FREQH[] = {
  6.     0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567
  7.     0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
  8.     0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567
  9.     0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};   //超高音 1234567

  10. code unsigned char FREQL[] =
  11. {
  12.     0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
  13.     0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
  14.     0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
  15.     0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16        //超高音 1234567
  16. };  
  17.            
  18. code unsigned char song[] =
  19. {
  20.     6, 1, 2,  1, 2, 4,  6, 1, 2,  3, 2, 4,  2, 2, 2,  2, 2, 2,  3, 2, 1,  2, 2, 1,  1, 1, 6,    //你挑著擔(dān)
  21.     7, 1, 2,  6, 1, 4,  7, 1, 2,  2, 2, 4,  3, 2, 2,  1, 2, 2,               //我牽著馬
  22.     6, 1, 4,  6, 1, 6,  3, 2, 6,  6, 2, 5,  3, 2, 2,  6, 2, 5,
  23.     5, 2, 2,  4, 2, 2,  3, 2, 6,  1, 2, 5,  2, 2, 2,  3, 2, 6,
  24.     4, 2, 2,  3, 2, 2,  2, 2, 10,                                           //迎來日出,送走晚霞
  25.     6, 1, 4,  3, 2, 4,  2, 2, 2,  3, 2, 2,  6, 1, 4,  1, 2, 8,         
  26.     3, 2, 4,  2, 2, 2,  7, 1, 4,  3, 2, 2,  2, 2, 2,  6, 1, 2,  1, 2, 2,  2, 2, 2,  3, 2, 10,       //踏平坎坷成大道   
  27.     3, 2, 6,  6, 2, 4,  3, 2, 2,  6, 2, 4,  5, 2, 2,  4, 2, 2,  3, 2, 6,  5, 2, 2,  2, 2, 4,
  28.     4, 2, 2,  3, 2, 2,  2, 2, 2,  1, 2, 4,  2, 2, 8,  3, 2, 4,              //斗罷艱險(xiǎn)又出發(fā)
  29.     2, 2, 2,  7, 1, 4,  3, 2, 2,  7, 1, 2,  6, 1, 2,  5, 1, 4,  6, 1, 8,  
  30.     3, 2, 4,  5, 2, 8,  3, 2, 2,  5, 2, 2,  6, 2, 5,
  31.     1, 3, 2,  7, 2, 2,  6, 2, 2,  5, 2, 4,  6, 2, 10,                       //啦 啦啦 啦 啦 啦啦啦
  32.     1, 3, 6,  7, 2, 5,  6, 2, 2,  6, 2, 4,  5, 2, 6,  5, 2, 2,  6, 2, 2,  3, 2, 10,     //一番番春秋冬夏
  33.     1, 3, 6,  7, 2, 5,  6, 2, 2,  6, 2, 4,  5, 2, 6,  6, 2, 2,  3, 2, 10,               //一番番酸甜苦辣
  34.     6, 1, 5,  1, 2, 2,  3, 2, 5,  1, 2, 2,  2, 2, 2,  3, 2, 2,  2, 2, 8,    //敢問路在何方
  35.     2, 2, 2,  7, 3, 4,  2, 2, 2,  7, 1, 2,  6, 1, 2,  5, 1, 4,  6, 1, 10,   //路在腳下
  36.     6, 1, 5,  1, 2, 2,  3, 2, 5,  1, 2, 2,  2, 2, 2,  3, 2, 2,  2, 2, 8,    //敢問路在何方
  37.     3, 2, 4,  5, 2, 6,  3, 2, 4,  7, 2, 5,
  38.     1, 3, 2,  7, 2, 2,  6, 2, 2,  5, 2, 4,  6, 2, 10, 6, 2, 10, 0, 0, 0     //路在腳下
  39. };

  40. void t0int() interrupt 1         //T0中斷程序,控制發(fā)音的音調(diào)
  41. {
  42.     TR0 = 0;                     //先關(guān)閉T0
  43.     beep = !beep;          //輸出方波, 發(fā)音
  44.     TH0 = timer0H;               //下次的中斷時(shí)間, 這個(gè)時(shí)間, 控制音調(diào)高低
  45.     TL0 = timer0L;
  46.     TR0 = 1;                     //啟動(dòng)T0
  47. }

  48. void delay(unsigned char t)     //延時(shí)程序,控制發(fā)音的時(shí)間長度
  49. {
  50.     unsigned char t1;
  51.     unsigned long t2;
  52.     for(t1 = 0; t1 < t; t1++)    //雙重循環(huán), 共延時(shí)t個(gè)半拍
  53.       for(t2 = 0; t2 < 4000; t2++); //延時(shí)期間, 可進(jìn)入T0中斷去發(fā)音
  54.     TR0 = 0;                        //關(guān)閉T0, 停止發(fā)音
  55. }

  56. void sing()                      //演奏一個(gè)音符
  57. {
  58.     TH0 = timer0H;               //控制音調(diào)
  59.     TL0 = timer0L;
  60.     TR0 = 1;                     //啟動(dòng)T0, 由T0輸出方波去發(fā)音
  61.     delay(time);                 //控制時(shí)間長度
  62. }

  63. void main(void)
  64. {
  65.     unsigned char k, i;
  66.     TMOD = 1;                    //置T0定時(shí)工作方式1
  67.     ET0 = 1;                     //開T0中斷
  68.     EA = 1;                      //開總中斷
  69.     while(1)
  70.         {
  71.       i = 0;
  72.       time = 1;
  73.       while(time)
  74.           {
  75.         k = song[i] + 7 * song[i + 1] - 1;//第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度
  76.         timer0H = FREQH[k];      //從數(shù)據(jù)表中讀出頻率數(shù)值
  77.         timer0L = FREQL[k];      //實(shí)際上, 是定時(shí)的時(shí)間長度
  78.         time = song[i + 2];   //讀出時(shí)間長度數(shù)值
  79.         i += 3;
  80.         sing();                  //發(fā)出一個(gè)音符
  81.           }  
  82.     }  
  83. }
復(fù)制代碼

所有資料51hei附件下載:
MP3 - 副本.rar (34.76 KB, 下載次數(shù): 13)

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:857072 發(fā)表于 2021-9-9 08:40 來自觸屏版 | 只看該作者
你怕是對(duì)mp3有什么誤解。。。
回復(fù)

使用道具 舉報(bào)

板凳
ID:277550 發(fā)表于 2021-9-9 09:29 | 只看該作者
仿真,

//一番番酸甜苦辣

開始亂響
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2021-9-9 21:11 | 只看該作者
你管這叫MP3? 這充其量屬于,“單片機(jī)簡(jiǎn)易演奏器”。
回復(fù)

使用道具 舉報(bào)

5#
ID:885138 發(fā)表于 2021-9-10 07:23 來自觸屏版 | 只看該作者
叫mp3是不對(duì)啦,不過讓單片機(jī)把自己的想法變?yōu)閘ed的亮滅閃爍,然后是發(fā)出聲音……的確是當(dāng)年很開心的事:-)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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