微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机放出音乐的例程——感兴趣的同学可以试试哦!

单片机放出音乐的例程——感兴趣的同学可以试试哦!

时间:10-02 整理:3721RD 点击:

  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit duan=P2^6;
  5. sbit key1=P3^2;//按key1可切换花样
  6. sbit key2=P3^3;//按key2可切换歌曲
  7. sbit fm=P3^7;//蜂鸣器连续的IO口
  8. sbit P34=P3^4;//矩阵键盘的一列
  9. uchar code huayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
  10.       0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//花样1
  11. uchar code huayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,
  12.       0xef,0xfb,0xdf,0xfd,0xbf,0xfe};//花样2
  13. uchar code huayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,
  14.       0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
  15. char code huayang4[]={ 0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};
  16. uchar count1;//花样标志
  17. uchar count2;//歌曲标志
  18. uchar timeh,timel,i;
  19. //---------------------------简谱---------------------------------------
  20. //编程规则:字节高位是简谱,低位是持续时间,
  21. //代表多少个十六分音符
  22. //1-7代表中央C调,8-E代表高八度,0代表停顿
  23. //最后的0是结束标志
  24. uchar code qnzl[]={  //千年之恋
  25. 0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,
  26. //前奏
  27. 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
  28. //竹林的灯火 到过的沙漠
  29. 0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,
  30. //七色的国度 不断飘逸风中
  31. 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
  32. //有一种神秘 灰色的旋涡
  33. 0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,
  34. //将我卷入了迷雾中
  35. 0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,
  36. //看不清的双手
  37. 0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,
  38. //一朵花传来谁经过的温柔
  39. 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,
  40. //穿越千年的伤痛
  41. 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  42. //只为求一个结果
  43. 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  44. //你留下的轮廓 指引我
  45. 0x42,0x63,0x83,0x83,0x91,0x91,
  46. //黑夜中不寂寞
  47. 0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,
  48. //穿越千年的哀愁
  49. 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  50. //是你在尽头等我
  51. 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  52. //最美丽的感动 会值得
  53. 0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff//结束标志
  54. //用一生守候
  55. };
  56. uchar code jmszl[]={ //寂寞沙洲冷
  57. 0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,
  58. //自你走后心憔悴
  59. 0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,
  60. //白色油桐风中纷飞
  61. 0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,
  62. //落花似人有情 这个季节
  63. 0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,
  64. //河畔的风放肆拼命地吹
  65. 0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,
  66. //不断拨弄离人的眼泪
  67. 0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,
  68. //那样浓烈的爱再也无法给
  69. 0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,
  70. //伤感一夜一夜
  71. 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,
  72. //当记忆的线缠绕过往支离破碎
  73. 0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,
  74. //是慌乱占据了心扉                  
  75. 0x31,0x81,0x81,0x81,0x61,0x91,0x82,
  76. //有花儿伴着蝴蝶
  77. 0x51,0x51,0x51,0x51,0x31,0x61,0x53,
  78. //孤雁可以双飞
  79. 0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,
  80. //夜深人静独徘徊
  81. 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,
  82. //当幸福恋人寄来红色分享喜悦
  83. 0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,
  84. //闭上双眼难过头也不敢回
  85. 0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,
  86. //仍然捡尽寒枝不肯安歇微带着后悔
  87. 0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,
  88. //寂寞沙洲我该思念谁
  89. 0xff};
  90. //----------------------------简谱音调对应的定时器初值---------------------------
  91. //适合11.0592M的晶振
  92. uchar code cuzhi[]={
  93.   0xff,0xff,//占位
  94.   0xFC,0x8E,//中央C调1-7
  95.   0xFC,0xED,
  96.   0xFD,0x43,
  97.   0xFD,0x6A,
  98.   0xFD,0xB3,
  99.   0xFD,0xF3,
  100.   0xFE,0x2D,
  101.   0xFE,0x47, //高八度1-7   
  102.   0xFE,0x76,
  103.   0xFE,0xA1,
  104.   0xFE,0xC7,
  105.   0xFE,0xD9,
  106.   0xFE,0xF9,
  107.   0xFF,0x16
  108.   };
  109. uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};
  110. //将音调转化为对应的LED样式
  111. void delay1(uint z); //延时1MS
  112. void delay(uint z); //延时165MS,即十六分音符
  113. void song();
  114. void beep();//蜂鸣器叫一声
  115. main()
  116. { uchar x;
  117. count1=0;//流水灯无花样
  118. count2=1;//唱第一首歌
  119. P34=0;//选取矩阵键盘的一列
  120. EA=1;//开总中断
  121. EX0=1;//开外部中断0
  122. IT0=1;//外部中断0下降沿触发方式
  123. EX1=1;//开外部中断1
  124. IT1=1;//外部中断1下降沿触发方式
  125. TMOD=0x01;//定时器0工作在方式1
  126. TH0=0;
  127. TL0=0;
  128. ET0=1;

  129. while(1)
  130. {
  131.   if(count1!=0)
  132.   {
  133.    switch(count1)
  134.    {
  135.     case 1:
  136.      for(x=0;x<14;x++)
  137.      {
  138.       duan=1;
  139.       P1=huayang1[x];
  140.       beep();
  141.       delay1(300);
  142.       duan=0;
  143.       if(count1!=1)
  144.        break;
  145.      }
  146.     break;
  147.     case 2:
  148.      for(x=0;x<14;x++)
  149.      {
  150.       duan=1;
  151.       P1=huayang2[x];
  152.       beep();
  153.       delay1(300);
  154.       duan=0;
  155.       if(count1!=2)
  156.        break;
  157.      }
  158.     break;
  159.     case 3:
  160.      for(x=0;x<16;x++)
  161.      {
  162.       duan=1;
  163.       P1=huayang3[x];
  164.       beep();
  165.       delay1(300);
  166.       duan=0;
  167.       if(count1!=3)
  168.        break;
  169.      }
  170.     break;
  171.     case 4:
  172.      for(x=0;x<8;x++)
  173.      {
  174.       duan=1;
  175.       P1=huayang4[x];
  176.       beep();
  177.       delay1(300);
  178.       duan=0;
  179.       if(count1!=4)
  180.        break;
  181.      }
  182.     break;
  183.    }
  184.   }
  185.   else
  186.   {
  187.    song();
  188.    delay1(1000);
  189.   }
  190. }
  191.      
  192. }
  193. void int0() interrupt 0
  194. {
  195. EA=0;//关总中断
  196. delay1(1);//去抖
  197. if(key1==0)
  198. {
  199.   count2=0;//不让蜂鸣器唱歌
  200.   TR0=0;
  201.   count1++;
  202.   if(count1==5)
  203.     count1=1;
  204. }
  205. EA=1;//开总中断
  206. }
  207. void int1() interrupt 2
  208. {
  209. EA=0;//关总中断
  210. delay1(1);//去抖
  211. if(key2==0)
  212. {
  213.   count1=0;//流水灯无花样
  214.   TR0=1;
  215.   i=0;//从头开始唱
  216.   count2++;
  217.   if(count2==3)
  218.     count2=1;
  219. }
  220. EA=1;//开总中断
  221. }
  222. void timer0() interrupt 1  //用于产生各种音调
  223. {
  224. TH0=timeh;
  225. TL0=timel;
  226. fm=~fm;
  227. }
  228. void song()
  229. {
  230. uint temp;
  231. uchar jp;//jp是简谱
  232. i=0;
  233. while(1)
  234. { if(count2==0)
  235.   {
  236.    break;
  237.   }
  238.   if(count2==1) //选曲
  239.     temp=qnzl[i];
  240.   if(count2==2)
  241.    temp=jmszl[i];
  242.   if(temp==0xff)
  243.    break;
  244.    
  245.   jp=temp/16; //取数的高4位
  246.   duan=1;
  247.   P1=yinyue[jp];
  248.   duan=0;
  249.   if(jp!=0)
  250.   {
  251.   timeh=cuzhi[jp*2];
  252.   timel=cuzhi[jp*2+1];
  253.   }
  254.   else
  255.   {
  256.   TR0=0;
  257.   fm=1;//关蜂鸣器
  258.   }
  259.   delay(temp%16); //取数的低4位
  260.   TR0=0;  //唱完一个音停10MS
  261.   fm=1;
  262.   delay1(10);
  263.   TR0=1;
  264.   i++;
  265. }
  266. TR0=0;
  267. fm=1;

  268. }
  269. void delay(uint z) //延时165MS,即十六分音符
  270. { uint x,y;
  271. for(x=z;x>0;x--)
  272.    for(y=19000;y>0;y--);
  273. }
  274. void delay1(uint z) //延时1MS
  275. { uint x,y;
  276. for(x=z;x>0;x--)
  277.    for(y=112;y>0;y--);
  278. }
  279. void beep() //蜂鸣器叫一声
  280. { uchar i;
  281. for(i=0;i<50;i++)
  282. { fm=~fm;
  283.   delay1(1);
  284. }
  285. fm=1;
  286. }

复制代码

不是原创

不是原创的,发出来也不错呀

单片机放出音乐  推荐大家学习

很好

小编不错,那些说不是原创的,你咋不贡献?

太长了

还不错

先收藏,慢慢消化

谢谢了

试试看

学习学习

实践一下

想要写一首生日快乐。

下来试试不错!感谢了!1

先收了在说

谢谢

好玩

好音乐也可以利用单片机

好长好长啊,LZ怎么不分成几页写呢?学习下,慢慢消化。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top