标题: 单片机蜂鸣器音乐播放器+LCD+LED 含keil源码 [打印本页]

作者: zdxfhgvjhbk    时间: 2025-5-21 23:39
标题: 单片机蜂鸣器音乐播放器+LCD+LED 含keil源码
通过蜂鸣器实现播放三首音乐,三个按键分别控制上一首,下一首,暂停与播放,lcd显示播放音乐名称,同时led点阵根据音乐闪烁(爱心形状)

制作出来的实物图如下:


单片机源程序如下:
  1. #include <REGX52.H>
  2. #include "LCD1602.h"
  3. #include <intrins.h>
  4. sbit Buzzer = P2^5;
  5. sbit KEY_PREV = P3^0;    // 上一曲
  6. sbit KEY_NEXT = P3^1;    // 下一曲
  7. sbit KEY_PAUSE = P3^2;   // 暂停/继续
  8. sbit SCK=P3^6;
  9. sbit RCK=P3^5;
  10. sbit SER=P3^4;
  11. unsigned char Index = 1;
  12. bit updateLED=0;
  13. bit pause = 0;           // 初始开始状态
  14. unsigned int FreqSelect;
  15. //--定义要使用的IO口--//
  16. #define Led_Port                P0

  17. //--列选通控制--//
  18. unsigned char code TAB[8]  = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

  19. void Delay(unsigned int xms) {
  20.     while(xms--) {
  21.         unsigned char i = 2, j = 239;
  22.         do { while (--j); } while (--i);
  23.     }
  24. }

  25. void _74HC595_WriteByte(unsigned char Byte)
  26. {
  27.         unsigned char i;
  28.         for(i=0;i<8;i++)
  29.         {
  30.                 SER=Byte&(0x80>>i);    // 取出每一位数据
  31.                 SCK=1;        // 下移一位
  32.                 SCK=0;
  33.         }
  34.         RCK=1;        //传输数据
  35.         RCK=0;
  36. }

  37. void MatrixLED_ShowColumn(unsigned char Column,Data)
  38. {
  39.         _74HC595_WriteByte(Data);
  40.         Led_Port=~(0x80>>Column);    // 将数据显示在相应的列上
  41.         Delay(1);        // 消隐操作
  42.         Led_Port=0xFF;
  43. }

  44. void love_display()
  45. {
  46.                 SCK=0;
  47.           RCK=0;
  48.                 MatrixLED_ShowColumn(0,0x30);
  49.                 MatrixLED_ShowColumn(1,0x78);
  50.                 MatrixLED_ShowColumn(2,0x7C);
  51.                 MatrixLED_ShowColumn(3,0x3E);
  52.                 MatrixLED_ShowColumn(4,0x7C);
  53.                 MatrixLED_ShowColumn(5,0x78);
  54.                 MatrixLED_ShowColumn(6,0x30);
  55.                 MatrixLED_ShowColumn(7,0x00);
  56.        
  57. }
  58. #define        P0        0        //休止符
  59. #define        L1        1        //低音L
  60. #define        L1_        2        //'_'表示升半音
  61. #define        L2        3
  62. #define        L2_        4
  63. #define        L3        5
  64. #define        L4        6
  65. #define        L4_        7
  66. #define        L5        8
  67. #define        L5_        9
  68. #define        L6        10
  69. #define        L6_        11
  70. #define        L7        12
  71. #define        M1        13        //中音M
  72. #define        M1_        14
  73. #define        M2        15
  74. #define        M2_        16
  75. #define        M3        17
  76. #define        M4        18
  77. #define        M4_        19
  78. #define        M5        20
  79. #define        M5_        21
  80. #define        M6        22
  81. #define        M6_        23       
  82. #define        M7        24
  83. #define        H1        25        //高音H
  84. #define        H1_        26
  85. #define        H2        27
  86. #define        H2_        28
  87. #define        H3        29
  88. #define        H4        30       
  89. #define        H4_        31
  90. #define        H5        32       
  91. #define        H5_        33
  92. #define        H6        34
  93. #define        H6_        35
  94. #define        H7        36

  95. #define SPEED                500        //宏定义四分音符时常为500ms

  96. unsigned int code AutoFreq[]={//基于C大调
  97.     0,//休止符
  98.     63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,//低音
  99.     64582,64633,64686,64732,64778,64820,64860,64898,64934,64968,65000,65032,//中音
  100.     65059,65085,65111,65134,65157,65178,65198,65217,65235,65252,65268,65284 //高音
  101. };
  102. //小星星乐谱
  103. unsigned char code Music1[] = {
  104.         //S1
  105.         M1, 4,
  106.         M1, 4,
  107.         M5, 4,
  108.         M5, 4,
  109.         //S2
  110.         M6, 4,
  111.         M6, 4,
  112.         M5, 4+4,
  113.         //S3
  114.         M4, 4,
  115.         M4, 4,
  116.         M3, 4,
  117.         M3, 4,
  118.         //S4
  119.         M2, 4,
  120.         M2, 4,
  121.         M1, 4+4,
  122.         //S5
  123.         M5, 4,
  124.         M5, 4,
  125.         M4, 4,
  126.         M4, 4,
  127.         //S6
  128.         M3, 4,
  129.         M3, 4,
  130.         M2, 4+4,
  131.         //S7
  132.         M5, 4,
  133.         M5, 4,
  134.         M4, 4,
  135.         M4, 4,
  136.         //S8
  137.         M3, 4,
  138.         M3, 4,
  139.         M2, 4+4,
  140.         //S9
  141.         M1, 4,
  142.         M1, 4,
  143.         M5, 4,
  144.         M5, 4,
  145.         //S10
  146.         M6, 4,
  147.         M6, 4,
  148.         M5, 4+4,
  149.         //S11
  150.         M4, 4,
  151.         M4, 4,
  152.         M3, 4,
  153.         M3, 4,
  154.         //S12
  155.         M2, 4,
  156.         M2, 4,
  157.         M1, 4+4,
  158.         //终止符
  159.         0xFF
  160. };


  161. //Music1《天空之城》
  162. unsigned char code Music2[]={                //(音高,时长)
  163. //1
  164.                 P0,4,P0,4,P0,4,M6,2,M7,2,                //每一行为一小节,
  165.                 H1,4+2,M7,2,H1,4,H3,4,
  166.                 M7,4+4+4,M3,2,M3,2,       
  167. //2
  168.                 M6,4+2,M5,2,M6,4,H1,4,               
  169.                 M5,4+4+4,M3,4,               
  170.                 M4,4+2,M3,2,M4,4,H1,4,
  171. //3
  172.                 M3,4+4,P0,2,H1,2,H1,2,H1,2,               
  173.                 M7,4+2,M4_,2,M4_,4,M7,4,               
  174.                 M7,4+4,P0,4,M6,2,M7,2,
  175. //4
  176.                 H1,4+2,M7,2,H1,4,H3,4,               
  177.                 M7,4+4+4,M3,2,M3,2,               
  178.                 M6,4+2,M5,2,M6,4,H1,6,
  179. //5
  180.                 M5,4+4+4,M2,2,M3,2,               
  181.                 M4,4,H1,2,M7,2+2,H1,2+4,               
  182.                 H2,2,H2,2,H3,2,H1,2+4+4,
  183. //6
  184.                 H1,2,M7,2,M6,2,M6,2,M7,4,M5_,4,               
  185.                 M6,4+4+4,H1,2,H2,2,               
  186.                 H3,4+2,H2,2,H3,4,H5,4,
  187. //7
  188.                 H2,4+4+4,M5,2,M5,2,               
  189.                 H1,4+2,M7,2,H1,4,H3,4,               
  190.                 H3,4+4+4,
  191. //8
  192.                 M6,2,M7,2,H1,4,M7,4,H2,2,H2,2,               
  193.                 H1,4+2,M5,2+4+4,               
  194.                 H4,4,H3,4,H2,4,H1,4,       
  195. //9
  196.                 H3,4+4+4,H3,4,               
  197.                 H6,4+4,H5,4,H5,4,               
  198.                 H3,2,H2,2,H1,4+4,P0,2,H1,2,
  199. //10
  200.                 H2,4,H1,2,H2,2,H2,4,H5,4,               
  201.                 H3,4+4+4,H3,4,               
  202.                 H6,4+4,H5,4+4,
  203. //11
  204.                 H3,2,H2,2,H1,4+4,P0,2,H1,2,               
  205.                 H2,4,H1,2,H2,2+4,M7,4,               
  206.                 M6,4+4+4,M6,2,M7,2,
  207.        
  208.                 0xff //结束
  209. };
  210. //Music2
  211. unsigned char code Music3[]={                //(音高,时长)
  212. //1
  213.                 M1,2,M2,2,L6,2,L5,2,M5,6,M6,2,//每一行为一小节,
  214.                 M3,2,M5,2,H1,2,M6,2,M5,8,
  215.                 M5,4,M6,2,M5,2,M3,2,M2,2,M3,4,
  216.                 M5,2,M3,2,L6,2,M1,2,M2,8,
  217. //2
  218.                 M2,2,M5,2,M3,2,M1,2,L6,4,L5,2,L6,2,
  219.                 M2,2,M6,2,M5,2,M6,2,M3,6,M2,2,
  220.                 M1,2,M2,1,M2,1,M3,2,M5,1,M5,1,H1,2,M6,2,M5,4,
  221. //3
  222.                 M5,2,L6,2,M1,2,M2,2,M4,6,M6,1,M6,1,
  223.                 M5,3,M6,1,M3,2,M2,2,M1,8,
  224.                 M1,8,P0,4,M5,2,M5,2,
  225.                 H1,8,H2,6,H1,2,
  226.                 M6,2,H1,2,M5,2,M7,2,M6,8,
  227. //4
  228.                 M5,4,M3,4,H1,4,M6,3,M6,1,
  229.                 M5,2,M6,2,M1,2,M2,2,M3,8,
  230.                 M3,4,M3,2,M5,2,M6,4,M6,2,H1,2,
  231.                 H2,4,H3,2,H1,2,H2,4+2,H1,2,
  232. //5
  233.                 H2,2,M3,2,M5,2,M6,2,M7,2,H2,1,H2,1,M6,2,M7,2,
  234.                 M5,16,
  235.                 H2,2,M7,2,M6,2,M5,2,M3,2,M5,1,M5,1,M6,2,H2,2,
  236.                 H1,16,
  237.                
  238.                         0xff //结束
  239. };



  240. void Key_Proc() {
  241.     static bit key_flag = 0;
  242.     static unsigned char MusicSelect = 0;

  243.     // 下一曲检测
  244.     if (!KEY_NEXT) {
  245.         Delay(10); // 消抖
  246.         if (!KEY_NEXT && !key_flag) {
  247.             key_flag = 1;
  248.             if (++Index > 3) Index = 1;
  249.             MusicSelect = 0;
  250.         }
  251.     } else if (KEY_NEXT) {
  252.         key_flag = 0;
  253.     }

  254.     // 上一曲检测
  255.     if (!KEY_PREV) {
  256.         Delay(10); // 消抖
  257.         if (!KEY_PREV && !key_flag) {
  258.             key_flag = 1;
  259.             if (--Index < 1) Index = 3;
  260.             MusicSelect = 0;
  261.         }
  262.     } else if (KEY_PREV) {
  263.         key_flag = 0;
  264.     }

  265.     // 暂停/继续检测
  266.     if (!KEY_PAUSE) {
  267.         Delay(10); // 消抖
  268.         if (!KEY_PAUSE) {
  269.             pause = !pause;

  270.             if (pause) {
  271.                 TR0 = 0;
  272.                 Buzzer = 0; // 关闭蜂鸣器
  273.             } else {
  274.                 TR0 = 1;
  275.             }
  276.         }
  277.         while (!KEY_PAUSE); // 等待按键释放
  278.     }
  279. }
  280. void Autoplay() {
  281.     static unsigned char MusicSelect = 0;
  282.     static unsigned char lastIndex = 0;  // 新增索引跟踪
  283.     const unsigned char *currentMusic=0;

  284.     // 歌曲切换时重置播放位置
  285.     if(Index != lastIndex) {
  286.         MusicSelect = 0;
  287.         lastIndex = Index;
  288.     }

  289.     // 选择当前歌曲
  290.     switch(Index) {
  291.         case 1: currentMusic = Music1; break;
  292.         case 2: currentMusic = Music2; break;
  293.         case 3: currentMusic = Music3; break;
  294.         default: return;
  295.     }

  296.     if(!pause) {
  297.         if(currentMusic[MusicSelect] != 0xff) {
  298.             FreqSelect = currentMusic[MusicSelect];
  299.             MusicSelect++;
  300.             Delay(SPEED/4 * currentMusic[MusicSelect]);
  301.             MusicSelect++;
  302.             
  303.             // 音符间隔处理
  304.             TR0 = 0;
  305.             Delay(5);
  306.             TR0 = 1;
  307.         } else {
  308.             MusicSelect = 0;  // 循环播放
  309.         }
  310.     } else
  311.                 {
  312.         TR0 = 0;
  313.         Buzzer = 0;
  314.     }
  315. }

  316. void Display() {
  317.     static unsigned char lastIndex = 0;
  318.     static bit lastPause = 0;
  319.     static unsigned int refreshCnt = 0;
  320.     if (++refreshCnt >= 1000||pause != lastPause || Index != lastIndex) {
  321.         refreshCnt = 0;
  322.                         EA=0;
  323.                         LCD1602_Clear(); // 清屏(已优化延时)
  324.         Delay(5);
  325.         if (pause) {
  326.             LCD1602_DispString(1, 1, "Paused       "); // 填充至16字符
  327.         } else {
  328.             switch(Index) {
  329.                 case 1:
  330.                     // 第1行:"Twinkle Twinkle"(16字符)
  331.                     LCD1602_DispString(1, 1, "Twinkle Twinkle");
  332.                     // 第2行:"Little Star    "(16字符,2个空格)
  333.                     LCD1602_DispString(2, 1, "Little Star    ");
  334.                     break;
  335.                 case 2:
  336.                     // 第1行:"Castle in the Sky"(16字符,修正空格)
  337.                     LCD1602_DispString(1, 1, "Castle in theSky");
  338.                     // 第2行留空
  339.                     LCD1602_DispString(2, 1, "                ");
  340.                     break;
  341.                 case 3:
  342.                     // 第1行:"My Motherland  "(16字符,2个空格)
  343.                     LCD1602_DispString(1, 1, "My Motherland  ");
  344.                     // 第2行留空
  345.                     LCD1602_DispString(2, 1, "                ");
  346.                     break;
  347.             }
  348.         }
  349.                                 EA=1;
  350.         lastIndex = Index;
  351.         lastPause = pause;
  352.     }
  353. }

  354. void Timer0Init(void)
  355. {
  356.     TMOD &= 0xF0;
  357.     TMOD |= 0x01;
  358. ……………………

  359. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

Keil5程序51hei附件下载:
大实验.rar (62.76 KB, 下载次数: 0)






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1