找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8054|回复: 1
打印 上一主题 下一主题
收起左侧

用蜂鸣器实现播放音乐(根据网上找到的程序修改的,非原创。注意晶振11.0592)

[复制链接]
跳转到指定楼层
楼主
里面有五首歌(都是一部分,非整首歌),第一首播放青花瓷,让你感受单片机的强大魅力。注意:由于本人第一次画仿真电路图,所以仿真有瑕疵,但是在普中51单片机开发板上播放流畅,感兴趣的朋友可以根据普中51的电路图(压缩包中已提供)自己再画一个仿真。

单片机源程序如下:
  1. #include "init.h"         //初始化库函数
  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;                //记录播放哪一首歌的标志位
  9. uchar pause=0;                //暂停/播放标志位
  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, //生日快乐音调
  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代表不发声,即停顿;数字即为音调
  23. };
  24. uchar code shengri_beat[]={24,1,24,48,48,48,72,5,//节拍
  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    //节拍,即tone表各音调的延时
  27. };
  28. uchar code laohu_tone[]={1,2,3,1,0,1,2,        //两只老虎乐谱 40个音符
  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,//节拍
  33.                                                 24,48,5,24,24,48,5,24,24,72,5,24,24,24,24,//节拍
  34.                                                 24,48,5,24,24,24,24,24,72, 5,24,24,48,5,24,24,//节拍
  35.                                                 72,5//节拍  //节拍,即tone表各音调挠
  36. };
  37. uchar code yishan_tone[]={1,1,5,5,6,6,5,        //星星乐谱  54个音符
  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,//节拍
  43.                                                 5,24,24,24,24,24,24,72,5,24,24,24,24,24,24,//节拍
  44.                                                 48,5,24,24,24,24,24,24,72,5,24,24,24,24,24,24,//节拍
  45.                                                 48,5,24,24,24,24,24,24,72,5//节模tone敢舻鞯难邮?
  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个二维数组
  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]={//定义曲谱数组,前数为音律,后数为音符节拍 ,要换歌改变简谱对应的音律号即可
  61. {24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},//记录菊花台简谱歌词: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},//简谱歌词:0553235 23521 炊烟袅袅升起 隔江千万里
  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},//简谱歌词: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},//简谱歌词:就当我为遇见你伏笔
  65. {24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16}, //简谱歌词: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}, //简谱歌词:0553235 23521 月色被打捞起 掩盖了结局
  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},//简谱歌词:0123 5654 5332 25 322 11 如传世的青花瓷在独自美丽
  68. {12,4},{21,8},{19,8},{19,4},{17,20}, //简谱歌词:你眼带笑意
  69. {0xFF,0xFF}}; //歌曲结尾标识
  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. //函数声明
  99. void play(void);   //音乐播放控制函数
  100. void key();                   //判断按键函数
  101. void stop();           //暂停/播放函数
  102. void display();           //液晶显示函数
  103. void delay(uchar p); //歌曲延时函数
  104. void pause1();                 //歌曲演示函数

  105. void main()
  106. {
  107.         TMOD=0x01;
  108.         TH0=a;
  109.         TL0=b;
  110.         ET0=1;//打开定时器,但是未允许中断
  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;                                //赞同是断开定时器中断
  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];                      //取节拍
  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];                      //取节拍
  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];                      //取节拍
  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.         {                //下面这两首歌与前面的播放方式一样,因为我是在网上搜集整合的
  281.                 display();
  282.                 while(flag)
  283.                 {
  284.                         EA=0;
  285.                         c=qing_beat[m][0];                            //取音符
  286.                         s=qing_beat[m][1];                      //取节拍
  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];                      //取节拍
  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.         {                                   //播放低音,高音的音乐
  361.                 display();
  362.                 while(flag)
  363.                 {
  364.                         EA=0;
  365.                         c=yinlv[m][0];                            //取音符
  366.                         s=yinlv[m][1];                      //取节拍
  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. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
音乐播放器.7z (493.28 KB, 下载次数: 104)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:581952 发表于 2019-12-31 11:08 | 只看该作者
这个下载后,只能用winrar来解压,其他的软件都不支持 大家注意下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表