找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的音乐盒设计与制作

[复制链接]
跳转到指定楼层
楼主
  1. //程序如下:
  2. #include <reg51.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. sbit key1=P3^2;//按key1可切换花样
  6. sbit key2=P3^3;//按key2可切换歌曲
  7. sbit fm=P3^7;//蜂鸣器连续的IO口
  8. uchar code huayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
  9.                                                 0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//花样1
  10. uchar code huayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,
  11.                                                 0xef,0xfb,0xdf,0xfd,0xbf,0xfe};//花样2
  12. uchar code huayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,
  13.                                                 0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//花样3
  14. char code huayang4[]={0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};
  15. uchar count1;//花样标志        
  16. uchar count2;//歌曲标志        
  17. uchar timeh,timel,i;
  18. //---------------------------简谱---------------------------------------
  19. //编程规则:字节高位是简谱,低位是持续时间,
  20. //代表多少个十六分音符
  21. //1-7代表中央C调,8-E代表高八度,0代表停顿
  22. //最后的0是结束标志
  23. uchar code qnzl[]={         //千年之恋
  24. 0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,
  25. //前奏
  26. 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
  27. //竹林的灯火 到过的沙漠

  28. 0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,
  29. //七色的国度 不断飘逸风中
  30. 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
  31. //有一种神秘 灰色的旋涡
  32. 0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,
  33. //将我卷入了迷雾中
  34. 0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,
  35. //看不清的双手
  36. 0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,
  37. //一朵花传来谁经过的温柔
  38. 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,
  39. //穿越千年的伤痛
  40. 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  41. //只为求一个结果
  42. 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  43. //你留下的轮廓 指引我
  44. 0x42,0x63,0x83,0x83,0x91,0x91,
  45. //黑夜中不寂寞
  46. 0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,
  47. //穿越千年的哀愁
  48. 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
  49. //是你在尽头等我
  50. 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
  51. //最美丽的感动 会值得
  52. 0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff//结束标志
  53. //用一生守候
  54. };
  55. uchar code jmszl[]={ //寂寞沙洲冷
  56. 0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,
  57. //自你走后心憔悴
  58. 0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,
  59. //白色油桐风中纷飞
  60. 0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,
  61. //落花似人有情 这个季节
  62. 0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,
  63. //河畔的风放肆拼命地吹
  64. 0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,
  65. //不断拨弄离人的眼泪

  66. 0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,
  67. //那样浓烈的爱再也无法给
  68. 0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,
  69. //伤感一夜一夜
  70. 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,
  71. //当记忆的线缠绕过往支离破碎
  72. 0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,
  73. //是慌乱占据了心扉                                                                                                                                 
  74. 0x31,0x81,0x81,0x81,0x61,0x91,0x82,
  75. //有花儿伴着蝴蝶
  76. 0x51,0x51,0x51,0x51,0x31,0x61,0x53,
  77. //孤雁可以双飞        
  78. 0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,
  79. //夜深人静独徘徊
  80. 0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,
  81. //当幸福恋人寄来红色分享喜悦
  82. 0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,
  83. //闭上双眼难过头也不敢回
  84. 0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,
  85. //仍然捡尽寒枝不肯安歇微带着后悔
  86. 0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,
  87. //寂寞沙洲我该思念谁
  88. 0xff};
  89. //----------------------------简谱音调对应的定时器初值---------------------------
  90. //适合11.0592M的晶振
  91. uchar code cuzhi[]={
  92.          0xff,0xff,//占位
  93.          0xFC,0x8E,//中央C调1-7
  94.          0xFC,0xED,        
  95.          0xFD,0x43,        
  96.          0xFD,0x6A,        
  97.          0xFD,0xB3,        
  98.          0xFD,0xF3,        
  99.          0xFE,0x2D,
  100.          0xFE,0x47,        //高八度1-7         
  101.          0xFE,0x76,
  102.          0xFE,0xA1,
  103.          0xFE,0xC7,        
  104.          0xFE,0xD9,
  105.          0xFE,0xF9,
  106.          0xFF,0x16
  107.          };
  108. uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};
  109. //将音调转化为对应的LED样式
  110. void delay1(uint z);        //延时1MS
  111. void delay(uint z);        //延时165MS,即十六分音符
  112. void song();
  113. void beep();//蜂鸣器叫一声
  114. main()
  115. {        uchar x;
  116.         count1=0;//流水灯无花样
  117.         count2=1;//唱第一首歌
  118.         EA=1;//开总中断
  119.         EX0=1;//开外部中断0
  120.         IT0=1;//外部中断0下降沿触发方式
  121.         EX1=1;//开外部中断1
  122.         IT1=1;//外部中断1下降沿触发方式

  123.         TMOD=0x01;//定时器0工作在方式1
  124.         TH0=0;
  125.         TL0=0;
  126.         ET0=1;
  127.         
  128.         while(1)
  129.         {
  130.                 if(count1!=0)
  131.                 {
  132.                         switch(count1)
  133.                         {
  134.                                 case 1:
  135.                                         for(x=0;x<14;x++)
  136.                                         {
  137.                                                 P1=huayang1[x];
  138.                                                 beep();
  139.                                                 delay1(300);
  140.                                                 if(count1!=1)
  141.                                                         break;        
  142.                                         }
  143.                                 break;
  144.                                 case 2:
  145.                                         for(x=0;x<14;x++)
  146.                                         {
  147.                                                 P1=huayang2[x];
  148.                                                 beep();
  149.                                                 delay1(300);
  150.                                                 if(count1!=2)
  151.                                                         break;        
  152.                                         }
  153.                                 break;
  154.                                 case 3:
  155.                                         for(x=0;x<16;x++)
  156.                                         {
  157.                                                 P1=huayang3[x];
  158.                                                 beep();
  159.                                                 delay1(300);
  160.                                                 if(count1!=3)
  161.                                                         break;        
  162.                                         }
  163.                                 break;
  164.                                 case 4:
  165.                                         for(x=0;x<8;x++)
  166.                                         {
  167.                                                 P1=huayang4[x];
  168.                                                 beep();
  169.                                                 delay1(300);
  170.                                                 if(count1!=4)
  171.                                                         break;        
  172.                                         }
  173.                                 break;
  174.                         }
  175.                 }
  176.                 else
  177.                 {
  178.                         song();
  179.                         delay1(1000);
  180.                 }
  181.         }
  182.                                  
  183. }
  184. void int0() interrupt 0
  185. {
  186.         EA=0;//关总中断
  187.         delay1(1);//去抖
  188.         if(key1==0)
  189.         {
  190.                 count2=0;//不让蜂鸣器唱歌
  191.                 TR0=0;
  192.                 count1++;
  193.                 if(count1==5)
  194.                          count1=1;

  195.         }
  196.         EA=1;//开总中断
  197. }
  198. void int1() interrupt 2
  199. {
  200.         EA=0;//关总中断
  201.         delay1(1);//去抖
  202.         if(key2==0)
  203.         {
  204.                 count1=0;//流水灯无花样
  205.                 TR0=1;
  206.                 i=0;//从头开始唱
  207.                 count2++;
  208.                 if(count2==3)
  209.                          count2=1;

  210.         }
  211.         EA=1;//开总中断
  212. }
  213. void timer0() interrupt 1         //用于产生各种音调
  214. {
  215.         TH0=timeh;
  216.         TL0=timel;
  217.         fm=~fm;
  218. }
  219. void song()
  220. {
  221.         uint temp,duan;
  222.         uchar jp;//jp是简谱
  223.         i=0;
  224.         while(1)
  225.         {        if(count2==0)
  226.                 {        
  227.                         break;
  228.                 }
  229.                 if(count2==1)        //选曲
  230.                          temp=qnzl[i];
  231.                 if(count2==2)
  232.                         temp=jmszl[i];
  233.                 if(temp==0xff)
  234.                         break;
  235.                         
  236.                 jp=temp/16; //取数的高4位
  237.                 duan=1;
  238.                 P1=yinyue[jp];
  239.                 duan=0;
  240.                 if(jp!=0)
  241.                 {
  242.                 timeh=cuzhi[jp*2];
  243.                 timel=cuzhi[jp*2+1];
  244.                 }
  245.                 else
  246.                 {
  247.                 TR0=0;
  248.                 fm=1;//关蜂鸣器
  249.                 }
  250.                 delay(temp%16); //取数的低4位
  251.                 TR0=0;         //唱完一个音停10MS
  252.                 fm=1;
  253.                 delay1(10);
  254.                 TR0=1;
  255.                 i++;
  256.         }
  257.         TR0=0;
  258.         fm=1;
  259.         
  260. }
  261. void delay(uint z)        //延时165MS,即十六分音符
  262. {        uint x,y;
  263.         for(x=z;x>0;x--)
  264.                  for(y=19000;y>0;y--);
  265. }

  266. void delay1(uint z)        //延时1MS
  267. {        uint x,y;
  268.         for(x=z;x>0;x--)
  269.                  for(y=112;y>0;y--);
  270. }
  271. void beep()        //蜂鸣器叫一声
  272. {        uchar i;
  273.         for(i=0;i<50;i++)
  274.         {        fm=~fm;
  275.                 delay1(1);
  276.         }
  277.         fm=1;
  278. }
复制代码

捕获.PNG (32.27 KB, 下载次数: 16)

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

使用道具 举报

沙发
ID:510728 发表于 2019-6-30 17:53 | 只看该作者
内容不错 值得借鉴
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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