找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 147333|回复: 22
收起左侧

51单片机蜂鸣器播放音乐代码(生日快乐 两只蝴蝶 祝你平安)

  [复制链接]
ID:80436 发表于 2015-5-20 18:18 | 显示全部楼层 |阅读模式
本帖最后由 liuqq 于 2015-5-20 18:20 编辑

/*生日快乐歌曲*/
/*******************************************/
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit beep = P1^5;
  5. uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
  6. 212,212,106,126,159,169,190,119,119,126,159,142,159,0};

  7. uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
  8. 9,3,12,12,12,12,12,9,3,12,12,12,24,0};

  9. //延时
  10. void DelayMS(uint x)
  11. {
  12. uchar t;
  13. while(x--) for(t=0;t<120;t++);
  14. }

  15. void PlayMusic()
  16. {
  17. uint i=0,j,k;
  18. while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
  19. { //播放各个音符,SONG_LONG 为拍子长度
  20.     for(j=0;j<SONG_LONG[i]*20;j++)
  21. {
  22.     beep=~beep;
  23. //SONG_TONE 延时表决定了每个音符的频率
  24.     for(k=0;k<SONG_TONE[i]/3;k++);
  25. }
  26.     DelayMS(10);
  27.     i++;
  28. }
  29. }


  30. void main()
  31. {

  32. beep=0;
  33. while(1)
  34. {
  35. PlayMusic(); //播放生日快乐
  36. DelayMS(500); //播放完后暂停一段时间
  37. }
  38. }
复制代码





/*两只蝴蝶歌曲*/  
/*******************************************/
  1. #include <reg51.h>             // 这是  单片机音乐代码生成器  生成的代码
  2. #define uchar unsigned char
  3. sbit beepIO=P1^5;                 // 输出 为 P1.5  可以修改 成 其它 IO 口
  4. uchar m,n;
  5. uchar code T[49][2]={{0,0},
  6. {0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},
  7. {0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
  8. {0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},
  9. {0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
  10. };
  11. uchar code music[][2]={{0,4},
  12. {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
  13. {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,24},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{21,24},
  14. {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
  15. {23,4},{26,4},{26,16},{26,4},{28,4},{26,4},{23,24},{21,4},{23,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{16,2},{19,2},{19,24},{0,20},
  16. {26,4},{26,4},{28,4},{31,4},{30,4},{30,4},{28,4},{23,4},{21,4},{21,4},{23,16},{0,4},{23,4},{23,4},{26,4},{28,8},{28,12},{16,4},{23,4},{21,4},
  17. {21,24},{23,4},{26,4},{26,4},{23,4},{26,8},{0,4},{31,8},{30,4},{28,4},{30,4},{23,8},{0,4},{28,4},{28,4},{30,4},{28,4},{26,4},{23,4},{21,8},{23,4},{21,4},{23,4},{26,16},
  18. {0xFF,0xFF}};
  19. void delay(uchar p)
  20. {
  21.     uchar i,j;
  22.     for(;p>0;p--)
  23.     for(i=181;i>0;i--)
  24.     for(j=181;j>0;j--);
  25. }
  26. void pause()
  27. {
  28.     uchar i,j;
  29.     for(i=150;i>0;i--)
  30.     for(j=150;j>0;j--);
  31. }
  32. void T0_int() interrupt 1
  33. {
  34. beepIO=!beepIO;
  35. TH0=T[m][0]; TL0=T[m][1];
  36. }
  37. void main()
  38. {
  39. uchar i=0;
  40. TMOD=0x01;  EA=1; ET0=1;
  41. while(1)
  42.       {
  43.         m=music[i][0];n=music[i][1];
  44.            if(m==0x00)
  45.              {TR0=0;delay(n);i++;}
  46.            else if(m==0xFF)
  47.              {TR0=0;delay(30);i=0;}
  48.            else if(m==music[i+1][0])
  49.              {TR0=1;delay(n);TR0=0;pause();i++;}
  50.            else
  51.              {TR0=1;delay(n);i++;}
  52.       }
  53. }
复制代码

祝你平安:
  1. #include "reg52.h"
  2. unsigned char Count;
  3. sbit _Speak =P1^5 ;
  4. unsigned char code SONG[] ={      //祝你平安
  5. 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
  6. 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
  7. 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
  8. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
  9. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
  10. 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
  11. 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
  12. 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
  13. 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
  14. 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
  15. 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
  16. 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
  17. 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
  18. 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00};

  19. void Time0_Init()
  20. {
  21. TMOD = 0x01;
  22. IE   = 0x82;
  23. TH0  = 0xD8;
  24. TL0  = 0xEF;  //12MZ晶振,10ms
  25. }

  26. void Time0_Int() interrupt 1
  27. {
  28. TH0 = 0xD8;
  29. TL0 = 0xEF;
  30. Count++;   //长度加1
  31. }

  32. /*-------------------------------------------------
  33. 功能:1MS延时子程序
  34. -------------------------------------------------*/
  35. void Delay_xMs(unsigned int x)
  36. {
  37.     unsigned int i,j;
  38.     for( i =0;i < x;i++ )
  39.     {
  40.         for( j =0;j<3;j++ );
  41.     }
  42. }

  43. void Play_Song(unsigned char i)
  44. {
  45. unsigned char Temp1,Temp2;
  46. unsigned int Addr;
  47. Count = 0;      //中断计数器清0
  48. Addr = i * 217;
  49. while(1)
  50. {
  51.   Temp1 = SONG[Addr++];
  52.      if ( Temp1 == 0xFF )          //休止符
  53.      {
  54.       TR0 = 0;
  55.       Delay_xMs(100);
  56.      }
  57.      else if ( Temp1 == 0x00 )   //歌曲结束符
  58.      {
  59.       return;
  60.      }
  61.      else
  62.      {
  63.       Temp2 = SONG[Addr++];
  64.       TR0 = 1;
  65.      while(1)
  66.      {
  67.        _Speak = ~_Speak;
  68.        Delay_xMs(Temp1);
  69.        if ( Temp2 == Count )
  70.        {
  71.         Count = 0;
  72.         break;
  73.        }
  74.       }
  75.      }
  76. }
  77. }
  78. /*-------------------------------------------------
  79. 功能:主程序
  80. -------------------------------------------------*/
  81. void main()
  82. {
  83. Time0_Init();   //定时器0中断初始化
  84. while(1)
  85. {
  86.   Play_Song(0);  //播放
  87. }
  88. }
复制代码



其他的可以使用音乐代码转换器转换即可,不过很麻烦而已!!!



评分

参与人数 1黑币 +5 收起 理由
15479468 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:92909 发表于 2015-10-19 13:34 | 显示全部楼层
你好,请问你有音乐代码转换器吗
回复

使用道具 举报

ID:93224 发表于 2015-10-22 18:52 来自手机 | 显示全部楼层
求电路图
回复

使用道具 举报

ID:93224 发表于 2015-10-22 18:53 来自手机 | 显示全部楼层
求仿真图
回复

使用道具 举报

ID:107927 发表于 2016-3-9 16:15 | 显示全部楼层
这三个怎么组到一起啊,通过按键控制播放哪首歌曲。
回复

使用道具 举报

ID:147796 发表于 2016-11-15 12:47 | 显示全部楼层
这三个怎么组到一起啊,通过按键控制播放哪首歌曲
回复

使用道具 举报

ID:137916 发表于 2017-1-25 11:10 | 显示全部楼层
很好用   厉害
回复

使用道具 举报

ID:158729 发表于 2017-1-26 19:00 | 显示全部楼层
感谢分享,虽然谱出来不太好听
回复

使用道具 举报

ID:163075 发表于 2017-1-29 13:24 | 显示全部楼层
很有用啊
回复

使用道具 举报

ID:202137 发表于 2017-5-18 13:02 来自手机 | 显示全部楼层
各位大神!求解释
回复

使用道具 举报

ID:192926 发表于 2017-5-18 15:28 | 显示全部楼层
感谢分享。
回复

使用道具 举报

ID:239541 发表于 2017-10-18 20:08 | 显示全部楼层
最近想弄弄这个谢谢分享
回复

使用道具 举报

ID:241954 发表于 2017-10-22 22:24 | 显示全部楼层
超人强 发表于 2016-3-9 16:15
**** 作者被禁止或删除 内容自动屏蔽 ****

# include <stdio.h>   //stdio.h    输入输出  printf     scanf(输入)  在判断选择播放的歌
回复

使用道具 举报

ID:241829 发表于 2017-10-28 19:48 | 显示全部楼层
请问为什么我添加到其他函数上
QQ图片20171028194756.png
回复

使用道具 举报

ID:238749 发表于 2017-11-26 18:19 | 显示全部楼层
楼主能问下如何在播放音乐的同时在主函数里做其他的事情吗,我在主函数的play之后写的其他程序与蜂鸣器冲突。
回复

使用道具 举报

ID:272245 发表于 2018-1-16 14:44 | 显示全部楼层
我下载到单片机上不能用,蜂鸣器的端口改过了,这是怎么回事呢
回复

使用道具 举报

ID:283896 发表于 2018-2-13 20:07 | 显示全部楼层
求转换器
回复

使用道具 举报

ID:338282 发表于 2018-5-25 18:42 | 显示全部楼层

加上最小系统,把小喇叭接到p^5扣
回复

使用道具 举报

ID:351351 发表于 2018-7-15 17:36 | 显示全部楼层
stc12c5a60s2芯片可以能正常发音吗?
回复

使用道具 举报

ID:382249 发表于 2018-8-16 18:28 | 显示全部楼层
可以正常发声,但是部分代码不明白,求教里面*20   和  /3  什么意思?
void PlayMusic()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{ //播放各个音符,SONG_LONG 为拍子长度
    for(j=0;j<SONG_LONG[i]*20;j++)
{
    beep=~beep;
//SONG_TONE 延时表决定了每个音符的频率
    for(k=0;k<SONG_TONE[i]/3;k++);
}
    DelayMS(10);
    i++;
}
}
回复

使用道具 举报

ID:385303 发表于 2018-8-16 21:34 | 显示全部楼层
可以,能不能把电路图分享出来啊
回复

使用道具 举报

ID:395167 发表于 2018-10-25 15:27 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:358405 发表于 2020-5-27 12:24 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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