找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机音乐盒程序 一个独立按键实现四首歌循坏播放

[复制链接]
跳转到指定楼层
楼主
ID:512872 发表于 2019-10-3 10:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个独立按键实现四首歌循坏播放

单片机源程序如下:
  1. /************************************************************************  
  2. [文件名]  C51音乐程序(八月桂花)  
  3. [功能]    通过单片机演奏音乐  
  4.   
  5. /**********************************************************************/   
  6. #include <REG52.H>   
  7. #include <INTRINS.H>   
  8. //本例采用89C52, 晶振为12MHZ   
  9. //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.   
  10. //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;   
  11. //所以拿出谱子, 试探编吧!   
  12. #define uint unsigned int
  13. #define uchar unsigned char
  14. sbit Beep =  P3^1;
  15. sbit s1=P1^0;  //流水灯顺时针流水
  16. uchar code discode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};        //送段码0-9和"-"   
  17. unsigned char n=0;  //n为节拍常数变量
  18. void ini(void)                               
  19. {
  20.   TMOD&=0x0f;   
  21.   TMOD|=0x01;   
  22.   TH0=0xd8;TL0=0xef;   
  23.   IE=0x82;
  24. }
  25. void delay (unsigned char m)   //控制频率延时   
  26. {   
  27. unsigned i=3*m;   
  28. while(--i);   
  29. }   
  30. void delay1(unsigned char yj)
  31.     {
  32.       uchar yj2=2;
  33.        while(yj!=0)
  34.          {      
  35.                while(yj2!=0)
  36.                   {
  37.                      yj2--;
  38.                      }
  39.                   yj2=2;
  40.              yj--;  
  41.        }
  42.    
  43.      }   
  44. void delayms(unsigned char a)  //豪秒延时子程序   
  45. {   
  46.   while(--a);                  //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!   
  47. }
  48. void shuma()
  49. {  
  50.            while(s1==1)
  51.         {
  52.         P0=0X8C;
  53.         P2=0X01;
  54.         }
  55. }   
  56. uchar code music_tab[] ={   
  57. 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,   
  58. 0x20, 0x40, 0x1C , 0x10,   
  59. 0x18, 0x10, 0x20 , 0x10,   
  60. 0x1C, 0x10, 0x18 , 0x40,   
  61. 0x1C, 0x20, 0x20 , 0x20,   
  62. 0x1C, 0x20, 0x18 , 0x20,   
  63. 0x20, 0x80, 0xFF , 0x20,   
  64. 0x30, 0x1C, 0x10 , 0x18,   
  65. 0x20, 0x15, 0x20 , 0x1C,   
  66. 0x20, 0x20, 0x20 , 0x26,   
  67. 0x40, 0x20, 0x20 , 0x2B,   
  68. 0x20, 0x26, 0x20 , 0x20,   
  69. 0x20, 0x30, 0x80 , 0xFF,   
  70. 0x20, 0x20, 0x1C , 0x10,   
  71. 0x18, 0x10, 0x20 , 0x20,   
  72. 0x26, 0x20, 0x2B , 0x20,   
  73. 0x30, 0x20, 0x2B , 0x40,   
  74. 0x20, 0x20, 0x1C , 0x10,   
  75. 0x18, 0x10, 0x20 , 0x20,   
  76. 0x26, 0x20, 0x2B , 0x20,   
  77. 0x30, 0x20, 0x2B , 0x40,   
  78. 0x20, 0x30, 0x1C , 0x10,   
  79. 0x18, 0x20, 0x15 , 0x20,   
  80. 0x1C, 0x20, 0x20 , 0x20,   
  81. 0x26, 0x40, 0x20 , 0x20,   
  82. 0x2B, 0x20, 0x26 , 0x20,   
  83. 0x20, 0x20, 0x30 , 0x80,   
  84. 0x20, 0x30, 0x1C , 0x10,   
  85. 0x20, 0x10, 0x1C , 0x10,   
  86. 0x20, 0x20, 0x26 , 0x20,   
  87. 0x2B, 0x20, 0x30 , 0x20,   
  88. 0x2B, 0x40, 0x20 , 0x15,   
  89. 0x1F, 0x05, 0x20 , 0x10,   
  90. 0x1C, 0x10, 0x20 , 0x20,   
  91. 0x26, 0x20, 0x2B , 0x20,   
  92. 0x30, 0x20, 0x2B , 0x40,   
  93. 0x20, 0x30, 0x1C , 0x10,   
  94. 0x18, 0x20, 0x15 , 0x20,   
  95. 0x1C, 0x20, 0x20 , 0x20,   
  96. 0x26, 0x40, 0x20 , 0x20,   
  97. 0x2B, 0x20, 0x26 , 0x20,   
  98. 0x20, 0x20, 0x30 , 0x30,   
  99. 0x20, 0x30, 0x1C , 0x10,   
  100. 0x18, 0x40, 0x1C , 0x20,   
  101. 0x20, 0x20, 0x26 , 0x40,   
  102. 0x13, 0x60, 0x18 , 0x20,   
  103. 0x15, 0x40, 0x13 , 0x40,   
  104. 0x18, 0x80, 0x00 , 0x00  
  105. };
  106. //挥着翅膀的女孩
  107. uchar code music_tab1[]={ 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,

  108. 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,

  109. 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,

  110. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,

  111. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,

  112. 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,

  113. 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,

  114. 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,

  115. 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,

  116. 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,

  117. 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,

  118. 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,

  119. 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,

  120. 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00
  121.                                                                   };

  122. //两只蝴蝶                                 
  123. uchar code music_tab2[] ={ 0x26,0x10,0x1c,0x10,0x1c,0x10,0x26,0x10,0x20,0x10,0x1c,0x10,0x20,0x10,
  124.                     0x1c,0x10,0x26,0x10,0x20,0x10,0x1c,0x10,0x20,0x10,0x26,0x10,0x0e,0x10,
  125.                     0x2b,0x10,0x2b,0x10,0x0e,0x10,0x30,0x10,0x2b,0x10,0x30,0x10,0x2b,0x10,
  126.                     0x2b,0x10,0x0e,0x10,0x30,0x10,0x2b,0x10,0x30,0x10,0x0e,0x10,0x26,0x10,
  127.                     0x1c,0x10,0x1c,0x10,0x26,0x10,0x20,0x10,0x1c,0x10,0x20,0x10,0x1c,0x10,
  128.                     0x1c,0x10,0x26,0x10,0x20,0x10,0x1c,0x10,0x20,0x10,0x26,0x10,0x0e,0x10,
  129.                     0x2b,0x10,0x2b,0x10,0x0e,0x10,0x30,0x10,0x2b,0x10,0x30,0x10,0x2b,0x10,
  130.                     0x30,0x10,0x2b,0x10,0x26,0x10,0x1c,0x10,0x19,0x10,0x1c,0x10,0x20,0x10,
  131.                     0x1c,0x10,0x1c,0x10,0x19,0x10,0x00
  132.                    };  
  133. /******************生日·快乐***************/
  134. unsigned char code music_tab3[]={
  135.                    0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x60,0x20,0x19,0x20,0x20,0x20,
  136.                     0x20,0x20,0x1c,0x20,0x20,0x20,0x55,0x20,0x60,0x20,0x20,0x20,0x20,0x20,
  137.                     0x40,0x20,0x4c,0x20,0x60,0x20,0x19,0x20,0x1c,0x20,0x48,0x20,0x48,0x20,
  138.                     0x4c,0x20,0x60,0x20,0x55,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x00};
  139. //电影音乐僵尸中音乐盒的歌在单片机中的编码
  140. unsigned char code music_tab4[]={
  141.                     0x40,0x20,0x39,0x20,0x40,0x20,0x48,0x20,0x4c,0x20,0x48,0x20,0x40,0x20,
  142.                     0x55,0x20,0x4c,0x20,0x48,0x20,0x4c,0x20,0x48,0x20,0x40,0x20,0x40,0x20,
  143.                     0x39,0x20,0x40,0x20,0x48,0x20,0x4c,0x20,0x48,0x20,0x40,0x20,0x55,0x20,
  144.                     0x40,0x20,0x4c,0x20,0x60,0x20,0x00,
  145.                    };
  146.   
  147. void gequ1()
  148. {
  149.   uchar p,m;   //m为频率常数变量   
  150.   uchar i=0;
  151.   s1=P1^0;
  152. play:   
  153.    while(s1==1)   
  154.     {   
  155.     a: p=music_tab[i];   
  156.        if(p==0x00)       { i=0; delayms(1000); goto play;}     //如果碰到结束符,延时1秒,回到开始再来一遍   
  157.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延时100ms,继续取下一音符   
  158.             else         {m=music_tab[i++], n=music_tab[i++];}  //取频率常数 和 节拍常数   
  159.              TR0=1;                                             //开定时器1   
  160.            while(n!=0) Beep=~Beep,delay(m);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)   
  161.        TR0=0;                                             //关定时器1   
  162.     }
  163. }
  164. void gequ2()
  165. {
  166.   uchar p,yj;   //m为频率常数变量   
  167.   uchar i=0;
  168.   s1=P1^0;
  169. play1:   
  170.    while(s1==1)   
  171.     {   
  172.     a1: p=music_tab1[i];   
  173.        if(p==0x00)       { i=0, delayms(1000); goto play1;}     //如果碰到结束符,延时1秒,回到开始再来一遍   
  174.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a1;}  //若碰到休止符,延时100ms,继续取下一音符   
  175.             yj=music_tab1[i++], n=music_tab1[i++];  //取频率常数 和 节拍常数   
  176.             TR0=1;                                             //开定时器1   
  177.            while(n!=0) Beep=~Beep,delay1(yj);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)   
  178.        TR0=0;                                             //关定时器1   
  179.     }
  180. }
  181. void gequ3()
  182. {
  183.   uchar p,yj;   //m为频率常数变量   
  184.   uchar i=0;
  185.   s1=P1^0;
  186. play2:   
  187.    while(s1==1)   
  188.     {   
  189.     a2: p=music_tab2[i];   
  190.        if(p==0x00)       { i=0, delayms(1000); goto play2;}     //如果碰到结束符,延时1秒,回到开始再来一遍   
  191.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a2;}  //若碰到休止符,延时100ms,继续取下一音符   
  192.             else         {yj=music_tab2[i++], n=music_tab2[i++];}  //取频率常数 和 节拍常数   
  193.              TR0=1;                                             //开定时器1   
  194.            while(n!=0) Beep=~Beep,delay1(yj);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)   
  195.        TR0=0;                                             //关定时器1   
  196.     }
  197. }  
  198. void gequ4()
  199. {
  200.   uchar p,yj;   //m为频率常数变量   
  201.   uchar i=0;
  202.   s1=P1^0;
  203. play3:   
  204.    while(s1==1)   
  205.     {   
  206.     a3: p=music_tab3[i];   
  207.        if(p==0x00)       { i=0, delayms(1000); goto play3;}     //如果碰到结束符,延时1秒,回到开始再来一遍   
  208.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a3;}  //若碰到休止符,延时100ms,继续取下一音符   
  209.             else         {yj=music_tab3[i++], n=music_tab3[i++];}  //取频率常数 和 节拍常数   
  210.              TR0=1;                                             //开定时器1   
  211.            while(n!=0) Beep=~Beep,delay1(yj);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)   
  212.        TR0=0;                                             //关定时器1   
  213.     }
  214. }
  215. void gequ5()
  216. {
  217.   uchar p,yj;   //m为频率常数变量   
  218.   uchar i=0;
  219.   s1=P1^0;
  220. play4:   
  221.    while(s1==1)   
  222.     {   
  223.     a4: p=music_tab4[i];   
  224.        if(p==0x00)       { i=0, delayms(1000); goto play4;}     //如果碰到结束符,延时1秒,回到开始再来一遍   
  225.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a4;}  //若碰到休止符,延时100ms,继续取下一音符   
  226.             else         {yj=music_tab4[i++], n=music_tab4[i++];}  //取频率常数 和 节拍常数   
  227.             TR0=1;                                             //开定时器1   
  228.            while(n!=0) Beep=~Beep,delay1(yj);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)   
  229.        TR0=0;                                             //关定时器1   
  230.     }
  231. }
  232. void int0()  interrupt 1   //采用中断0 控制节拍   
  233. {  TH0=0xd8;   
  234.    TL0=0xef;   
  235.    n--;   
  236. }        
  237.    
  238. void main()   
  239. {
  240.   uchar num,i;
  241.   ini();
  242.   shuma();
  243.   while(1)
  244. {
  245.              if(s1==0)
  246.   {
  247.   delay(500);
  248.     if(s1==0)
  249.         {
  250.           num++;
  251.           if(num>5)
  252.           {
  253.             num=1;
  254.           }
  255.           while((i<50)&&(s1==0))
  256.           {
  257.           delay(200);
  258.           i++;
  259.           }
  260.           i=0;
  261.         }
  262.   }
  263. switch(num)
  264.    {
  265. case 1:
  266.         P0=discode[1];
  267.                 P2=0x01;
  268.             gequ1();
  269.                 break;
  270. case 2:
  271.         P0=discode[2];
  272.                 P2=0x01;
  273.             gequ2();
  274.                 break;
  275. case 3:
  276.         P0=discode[3];
  277.                 P2=0x01;
  278.             gequ3();
  279.                 break;
  280. case 4:
  281.         P0=discode[4];
  282.                 P2=0x01;
  283.             gequ4();
  284.                 break;
  285. case 5:
  286.         P0=discode[5];
  287.                 P2=0x01;
  288.             gequ5();
  289.                 break;
  290.   }  
  291. }
  292. }
复制代码

所有资料51hei提供下载:
我的音乐盒.zip (31.44 KB, 下载次数: 29)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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