找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)音樂播放器程序 代碼注釋很詳細(xì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1016796 發(fā)表于 2023-1-28 20:29 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
基于51單片機(jī)的音樂播放器設(shè)計(jì)源程序
  1. /*
  2.         記。喝齻(gè)數(shù)字一組,代表一個(gè)音符。
  3. 第一個(gè)數(shù)字是1234567之一,代表音符哆來咪發(fā)...;
  4. 第二個(gè)數(shù)字是0123之一,代表低音、中音、高音、超高音;
  5. 第三個(gè)數(shù)字是半拍的個(gè)數(shù),代表時(shí)間長度。


  6. */


  7. #include "reg52.h"                           //頭文件調(diào)用
  8. sbit speaker = P2^5;                        //定義蜂鳴器

  9. unsigned char timer0h, timer0l; //音調(diào)高低
  10. unsigned char time;             //一個(gè)音符的時(shí)間
  11. //--------------------------------------
  12. //單片機(jī)晶振采用11.0592MHz
  13. // 頻率-半周期數(shù)據(jù)表 高八位 本軟件共保存了四個(gè)八度的28個(gè)頻率數(shù)據(jù)
  14. code unsigned char FREQH[] = {
  15. 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,            //低音1234567
  16. 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, //1,2,3,4,5,6,7,i
  17. 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,                         //高音 234567
  18. 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};                 //超高音 1234567

  19. // 頻率-半周期數(shù)據(jù)表 低八位
  20. code unsigned char FREQL[] = {
  21. 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,                 //低音1234567
  22. 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
  23. 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,                         //高音 234567
  24. 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};                 //超高音 1234567
  25. //--------------------------------------
  26. //世上只有媽媽好數(shù)據(jù)表 要想演奏不同的樂曲, 只需要修改這個(gè)數(shù)據(jù)表
  27. code unsigned char sszymmh[] = {
  28. 6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1,
  29. //一個(gè)音符有三個(gè)數(shù)字。前為第幾個(gè)音、中為第幾個(gè)八度、后為時(shí)長(以半拍為單位)。
  30. //6, 2, 3 分別代表:6, 中音, 3個(gè)半拍;
  31. //5, 2, 1 分別代表:5, 中音, 1個(gè)半拍;
  32. //3, 2, 2 分別代表:3, 中音, 2個(gè)半拍;
  33. //5, 2, 2 分別代表:5, 中音, 2個(gè)半拍;
  34. //1, 3, 2 分別代表:1, 高音, 2個(gè)半拍;
  35. //
  36. 6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,
  37. 6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2,
  38. 5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1,
  39. 2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};



  40. //《煙花易冷》
  41. unsigned char code song1[]={
  42.      5,2,1, 3,2,1, 2,2,2, 2,2,4, 3,2,1, 1,2,1, 2,2,1, 3,2,4,
  43.          5,2,1, 3,2,1, 2,2,2, 2,2,2, 5,1,1, 3,2,1, 4,2,1, 3,2,4,
  44.          3,2,1, 3,2,1, 7,2,1, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1,
  45.          2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1,
  46.          1,2,1, 7,1,1, 5,1,1, 6,1,6, 5,2,1, 3,2,1, 2,2,2, 2,2,1,
  47.          2,2,1, 3,2,1, 1,2,1, 2,2,1, 3,2,4, 5,2,1, 3,2,1, 2,2,2,
  48.          2,2,1, 2,2,1, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1,
  49.          7,2,3, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1,
  50.          6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,2,
  51.          5,1,2, 6,1,6, 0,0,0 };


  52. //--------------------------------------

  53. void t0int() interrupt 1         //T0中斷程序,控制發(fā)音的音調(diào)
  54. {
  55.         TR0 = 0;                                  //先關(guān)閉T0
  56.         speaker = !speaker;          //輸出方波, 發(fā)音
  57.         TH0 = timer0h;                          //下次的中斷時(shí)間, 這個(gè)時(shí)間, 控制音調(diào)高低
  58.         TL0 = timer0l;
  59.         TR0 = 1;                                  //啟動T0
  60. }
  61. //--------------------------------------
  62. void delay(unsigned char t) //延時(shí)程序,控制發(fā)音的時(shí)間長度
  63. {
  64.         unsigned char t1;
  65.         unsigned long t2;
  66.         for(t1 = 0; t1 < t; t1++) //雙重循環(huán), 共延時(shí)t個(gè)半拍
  67.         for(t2 = 0; t2 < 8000; t2++); //延時(shí)期間, 可進(jìn)入T0中斷去發(fā)音
  68.         TR0 = 0;                                                 //關(guān)閉T0, 停止發(fā)音
  69. }
  70. //--------------------------------------
  71. void song() //演奏一個(gè)音符
  72.         {
  73.         TH0 = timer0h; //控制音調(diào)
  74.         TL0 = timer0l;
  75.         TR0 = 1; //啟動T0, 由T0輸出方波去發(fā)音
  76.         delay(time); //控制時(shí)間長度
  77.         }
  78. //--------------------------------------
  79. void main(void)
  80. {
  81.         unsigned char k, i;
  82.         TMOD = 1; //置T0定時(shí)工作方式1
  83.         ET0 = 1; //開T0中斷
  84.         EA = 1; //開CPU中斷
  85.         while(1)
  86.         {
  87.                 i = 0;
  88.                 time = 1;
  89.                 while(time)
  90.                 {
  91.                         k = song1[i] + 7 * song1[i + 1] - 1;
  92.                         //第i個(gè)是音符, 第i+1個(gè)是第幾個(gè)八度
  93.                         timer0h = FREQH[k]; //從數(shù)據(jù)表中讀出頻率數(shù)值
  94.                         timer0l = FREQL[k]; //實(shí)際上, 是定時(shí)的時(shí)間長度
  95.                         time = song1[i + 2]; //讀出時(shí)間長度數(shù)值
  96.                         i += 3;
  97.                         song(); //發(fā)出一個(gè)音符
  98.                 }
  99.         }
  100. }
復(fù)制代碼
以上代碼的Keil工程下載(附件內(nèi)只有代碼不含其他文件,您也可以自行復(fù)制以上代碼建立工程,這樣就不必下載了):
音樂播放器設(shè)計(jì)(新).rar (42.74 KB, 下載次數(shù): 27)

評分

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

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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