找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机音乐花样灯数组方法实现 带仿真与源码

[复制链接]
跳转到指定楼层
楼主
51单片机课程设计分享,制作音乐花样灯数组法法的仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机花样灯源程序如下:
  1.                                            /*12Mhz晶振*/
  2. #include <reg52.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit key2=P3^3;//key2外部中断1 控制花样灯的切换速度
  6. sbit key1=P3^2;//key1外部中断0 控制播放哪首曲子
  7. sbit voice=P3^7;//蜂鸣器定义
  8. uchar code sound[]={0xff,                 //每个音阶  不同拍子的数据
  9. 0x60,0x10,0x55,0x10,0x4c,0x10,0x48,0x10,0x40,0x10,0x39,0x10,0x33,0x10,
  10. 0x30,0x10,0x2b,0x10,0x26,0x10,0x24,0x10,0x20,0x10,0x1c,0x10,0x19,0x10,
  11. 0x18,0x10,0x15,0x10,0x13,0x10,0x12,0x10,0x10,0x10,0x0e,0x10,0x0d,0x10,//1/4拍子低音1到高音7
  12. 0x60,0x20,0x55,0x20,0x4c,0x20,0x48,0x20,0x40,0x20,0x39,0x20,0x33,0x20,
  13. 0x30,0x20,0x2b,0x20,0x26,0x20,0x24,0x20,0x20,0x20,0x1c,0x20,0x19,0x20,
  14. 0x18,0x20,0x15,0x20,0x13,0x20,0x12,0x20,0x10,0x20,0x0e,0x20,0x0d,0x20,//2/4拍子低音1到高音7
  15. 0x60,0x30,0x55,0x30,0x4c,0x30,0x48,0x30,0x40,0x30,0x39,0x30,0x33,0x30,
  16. 0x30,0x30,0x2b,0x30,0x26,0x30,0x24,0x30,0x20,0x30,0x1c,0x30,0x19,0x30,
  17. 0x18,0x30,0x15,0x30,0x13,0x30,0x12,0x30,0x10,0x30,0x0e,0x30,0x0d,0x30,//3/4拍子低音1到高音7
  18. 0x60,0x40,0x55,0x40,0x4c,0x40,0x48,0x40,0x40,0x40,0x39,0x40,0x33,0x40,
  19. 0x30,0x40,0x2b,0x40,0x26,0x40,0x24,0x40,0x20,0x40,0x1c,0x40,0x19,0x40,
  20. 0x18,0x40,0x15,0x40,0x13,0x40,0x12,0x40,0x10,0x40,0x0e,0x40,0x0d,0x40,//4/4拍子低音1到高音7
  21. 0x60,0x60,0x55,0x60,0x4c,0x60,0x48,0x60,0x40,0x60,0x39,0x60,0x33,0x60,
  22. 0x30,0x60,0x2b,0x60,0x26,0x60,0x24,0x60,0x20,0x60,0x1c,0x60,0x19,0x60,
  23. 0x18,0x60,0x15,0x60,0x13,0x60,0x12,0x60,0x10,0x60,0x0e,0x60,0x0d,0x60,//5/4拍子低音1到高音7
  24. 0x60,0x80,0x55,0x80,0x4c,0x80,0x48,0x80,0x40,0x80,0x39,0x80,0x33,0x80,
  25. 0x30,0x80,0x2b,0x80,0x26,0x80,0x24,0x80,0x20,0x80,0x1c,0x80,0x19,0x80,
  26. 0x18,0x80,0x15,0x80,0x13,0x80,0x12,0x80,0x10,0x80,0x0e,0x80,0x0d,0x80,//6/4拍子低音1到高音7
  27. 0x60,0xc0,0x55,0xc0,0x4c,0xc0,0x48,0xc0,0x40,0xc0,0x39,0xc0,0x33,0xc0,
  28. 0x30,0xc0,0x2b,0xc0,0x26,0xc0,0x24,0xc0,0x20,0xc0,0x1c,0xc0,0x19,0xc0,
  29. 0x18,0xc0,0x15,0xc0,0x13,0xc0,0x12,0xc0,0x10,0xc0,0x0e,0xc0,0x0d,0xc0,//7/4拍子低音1到高音7
  30. 0xff,0x10,0xff,0x20,0xff,0x30,0xff,0x40,0xff,0x60,0xff,0x80,0xff,0xc0,//休止符,延时不同
  31. 0x00};
  32. uchar code kanong[]={0xff,                //卡农  
  33. 0x13,0x20,0x15,0x20,0x18,0x20,0x19,0x20,0x1c,0x20,0x20,0x20,0x1c,0x20,0x19,0x20,//第一行
  34. 0x18,0x20,0x19,0x20,0x1c,0x20,0x20,0x20,0x24,0x20,0x26,0x20,0x24,0x20,0x2b,0x20,//第二行
  35. 0x18,0x08,0x19,0x08,0x18,0x08,0x30,0x08,0x33,0x08,0x20,0x08,0x2b,0x08,0x26,0x08,//第三行
  36. 0x30,0x08,0x18,0x08,0x19,0x08,0x1c,0x08,0x19,0x08,0x13,0x08,0x10,0x08,0x0e,0x08,
  37. 0x12,0x08,0x13,0x08,0x15,0x08,0x12,0x08,0x12,0x08,0x13,0x08,0x18,0x08,0x19,0x08,
  38. 0x1c,0x08,0x20,0x08,0x24,0x08,0x26,0x08,0x2b,0x08,0x24,0x08,0x26,0x08,0x2b,0x08,
  39. 0x30,0x08,0x2b,0x08,0x26,0x08,0x24,0x08,0x20,0x08,0x2b,0x08,0x20,0x08,0x24,0x08,//第四行
  40. 0x26,0x08,0x1c,0x08,0x20,0x08,0x24,0x08,0x20,0x08,0x24,0x08,0x26,0x08,0x2b,0x08,
  41. 0x30,0x08,0x39,0x08,0x1c,0x08,0x19,0x08,0x18,0x08,0x19,0x08,0x1c,0x08,0x20,0x08,
  42. 0x24,0x08,0x26,0x08,0x2b,0x08,0x1c,0x08,0x20,0x08,0x1c,0x08,0x20,0x08,0x24,0x08,
  43. 0x26,0x10,0x13,0x10,0x15,0x20,0x18,0x20,0x15,0x20,0x18,0x10,0x13,0x10,0x15,0x10,0x12,0x10,//第五行
  44. 0x10,0x08,0x13,0x04,0x12,0x04,  0x10,0x08,0x13,0x04,0x12,0x04,  0x10,0x04,0x20,0x04,0x1c,0x04,0x19,0x04,  0x18,0x04,0x15,0x04,0x13,0x04,0x12,0x04,//第六行
  45. 0x13,0x08,0x18,0x04,0x15,0x04,  0x13,0x08,0x26,0x04,0x24,0x04,  0x20,0x04,0x1c,0x04,0x20,0x04,0x24,0x04,  0x20,0x04,0x26,0x04,0x24,0x04,0x20,0x04,
  46. 0x24,0x08,0x1c,0x04,0x20,0x04,  0x24,0x08,0x26,0x04,0x2b,0x04,  0x26,0x04,0x2b,0x04,0x30,0x04,0x2b,0x04,  0x26,0x04,0x24,0x04,0x20,0x04,0x1c,0x04,
  47. 0x24,0x08,0x1c,0x04,0x20,0x04,  0x1c,0x08,0x19,0x04,0x18,0x04,  0x20,0x04,0x1c,0x04,0x19,0x04,0x18,0x04,  0x15,0x04,0x13,0x04,0x12,0x04,0x10,0x04,//第七行
  48. 0x13,0x08,0x18,0x04,0x15,0x04,  0x13,0x08,0x15,0x04,0x18,0x04,  0x15,0x04,0x19,0x04,0x18,0x04,0x15,0x04,  0x13,0x04,0x15,0x04,0x18,0x04,0x19,0x04,
  49. 0x18,0x08,0x1c,0x04,0x19,0x04,  0x18,0x08,0x30,0x04,0x2b,0x04,  0x26,0x04,0x24,0x04,0x26,0x04,0x2b,0x04,  0x26,0x04,0x18,0x04,0x19,0x04,0x18,0x04,
  50. 0x1c,0x08,0x18,0x04,0x19,0x04,  0x1c,0x08,0x20,0x04,0x24,0x04,  0x20,0x04,0x24,0x04,0x26,0x04,0x24,0x04,  0x20,0x04,0x1c,0x04,0x19,0x04,0x30,0x04,//第八行
  51. 0x1c,0x08,0x18,0x04,0x19,0x04,  0x18,0x08,0x19,0x04,0x1c,0x04,  0x19,0x04,0x18,0x04,0x15,0x04,0x18,0x04,  0x19,0x04,0x18,0x04,0x1c,0x04,0x19,0x04,
  52. 0x13,0x08,0x26,0x08,0x24,0x08,0x26,0x08,  0x2b,0x08,0x15,0x08,0x13,0x08,0x15,0x08,  0x18,0x08,0x26,0x08,0x30,0x08,0x1c,0x08,  0x20,0x08,0x40,0x08,0x48,0x08,0x40,0x08,//第九行
  53. 0x39,0x08,0x1c,0x08,0x19,0x08,0x1c,0x08,  0x19,0x08,0x40,0x08,0x48,0x08,0x40,0x08,  0x39,0x08,0x1c,0x08,0x20,0x08,0x1c,0x08,  0x19,0x08,0x19,0x08,0x1c,0x08,0x19,0x08,
  54. 0x30,0x08,0x18,0x08,0x15,0x08,0x18,0x08,  0x19,0x08,0x33,0x08,0x30,0x08,0x33,0x08,  0x39,0x08,0x1c,0x08,0x20,0x08,0x1c,0x08,  0x19,0x08,0x33,0x08,0x26,0x08,0x2b,0x08,//第十行
  55. 0x30,0x08,0x18,0x08,0x15,0x08,0x12,0x08,  0x13,0x08,0x26,0x08,0x20,0x08,0x13,0x08,  0x18,0x08,0x12,0x08,0x13,0x08,0x12,0x08,  0x15,0x08,0x20,0x08,0x24,0x08,0x20,0x08,
  56. 0x26,0x08,0x18,0x04,0x19,0x04,  0x18,0x08,0x26,0x08,  0x20,0x08,0x20,0x04,0x1c,0x04,  0x19,0x08,0x20,0x08,//第十一行
  57. 0x26,0x08,0x18,0x04,0x15,0x04,  0x13,0x08,0x18,0x08,  0x13,0x08,0x13,0x04,0x15,0x04,  0x18,0x08,0x19,0x08,  
  58. 0x1c,0x08,0x1c,0x04,0x20,0x04,  0x1c,0x08,0x19,0x08,  0x18,0x08,0x13,0x04,0x15,0x04,  0x18,0x08,0x13,0x08,
  59. 0x00};
  60. code unsigned long Pattern[]={         //24颗LED灯花样数据
  61. 0x00fffffc,0x00fffff9,0x00fffff3,0x00ffffe7,//两个灯顺时针流水
  62. 0x00ffffcf,0x00ffff9f,0x00ffff3f,0x00fffe7f,
  63. 0x00fffcff,0x00fff9ff,0x00fff3ff,0x00ffe7ff,
  64. 0x00ffcfff,0x00ff9fff,0x00ff3fff,0x00fe7fff,
  65. 0x00fcffff,0x00f9ffff,0x00f3ffff,0x00e7ffff,
  66. 0x00cfffff,0x009fffff,0x003fffff,0x007fffff,0x00ffffff,
  67. 0x00e7e7e7,0x00dbdbdb,0x00bdbdbd,0x007e7e7e,0x00bdbdbd,0x00dbdbdb,0x00e7e7e7,0x00ffffff,//
  68. 0x00e7e7e7,0x00c3c3c3,0x00818181,0x00000000,0x00818181,0x00c3c3c3,0x00e7e7e7,0x00ffffff,//
  69. 0x00aaaaaa,0x00ffffff,0x00555555,0x00ffffff,0x00aaaaaa,0x00ffffff,0x00555555,//错位点亮
  70. 0x00181818,0x00818181,0x00181818,0x00818181,//三个相连的灯移位
  71. 0x00181818,0x00818181,0x00181818,0x00818181,0x00ffffff,
  72. 0x00f0f0f0,0x000f0f0f,0x00000000,0x00ffffff,
  73. 0x00f8f8f8,0x00f1f1f1,0x00e3e3e3,0x00c7c7c7,0x008f8f8f,0x001f1f1f,0x003f3f3f,0x007f7f7f,0x007f7f7f,//三个相连的灯流水
  74. 0x003f3f3f,0x001f1f1f,0x008f8f8f,0x00c7c7c7,0x00e3e3e3,0x00f1f1f1,0x00f8f8f8,0x00ffffff,
  75. 0x00000000,0x00000000,0x00ffffff,0x00ffffff,//全亮全灭
  76. 0x000f0f0f,0x00f0f0f0,0x000f0f0f,0x00f0f0f0,//相连的四个灯全亮全灭
  77. 0x00fffffe,0x00fffffd,0xfffffffb,0x00fffff7,//一个灯顺时针流
  78. 0x00ffffef,0x00ffffdf,0x00ffffbf,0x00ffff7f,
  79. 0x00fffeff,0x00fffdff,0x00fffbff,0x00fff7ff,
  80. 0x00ffefff,0x00ffdfff,0x00ffbfff,0x00ff7fff,
  81. 0x00feffff,0x00fdffff,0x00fbffff,0x00f7ffff,
  82. 0x00efffff,0x00dfffff,0x00bfffff,0x007fffff,0x00ffffff,       
  83. 0x00fffffe,0x00fffffc,0x00fffff8,0x00fffff0,//顺时针从一个亮到全部亮
  84. 0x00ffffe0,0x00ffffc0,0x00ffff80,0x00ffff00,
  85. 0x00fffe00,0x00fffc00,0x00fff800,0x00fff000,
  86. 0x00ffe000,0x00ffc000,0x00ff8000,0x00ff0000,
  87. 0x00fe0000,0x00fc0000,0x00f80000,0x00f00000,
  88. 0x00e00000,0x00c00000,0x00800000,0x00000000};
  89. uchar zdjs=0,jp,i=0;
  90. uchar num=0,numtop=5,count=0;
  91. void del(yj);
  92. void delay(uint z);
  93. void play(void)
  94. {
  95.         uint dpjs=0;
  96.         uchar yj;
  97.         while(1)
  98.         {  
  99.                 zdjs=0;  
  100.                 if(count==0)
  101.                 {       
  102.                         TR0=0;
  103.                         break;
  104.                 }
  105.                 if(count==1)        //选曲
  106.                 {
  107.                         dpjs++; yj=sound[dpjs];    //取出音阶的频率
  108.                         dpjs++; jp=sound[dpjs];           //取出延时时长
  109.                 }
  110.                 if(count==2)
  111.                 {
  112.                         dpjs++; yj=kanong[dpjs];
  113.                         dpjs++; jp=kanong[dpjs];
  114.                         jp=jp*4;   //这句是调音的
  115.                 }                  

  116.                          while(zdjs!=(jp))
  117.                          {
  118.                                  if(yj!=0xff)
  119.                                  {
  120.                                          if(yj!=0)  //判断音乐是否播放完毕
  121.                                          {
  122.                                                  voice=!voice;
  123.                                                  del(yj);
  124.                                          }
  125.                                          else
  126.                                          {
  127.                                                  dpjs=0;
  128.                                                  break;
  129.                                          }
  130.                                  }
  131.                                  else
  132.                                  {
  133.                                          voice=0;
  134.                                          del(jp);
  135.                                  }
  136.                         }
  137.                  }
  138. }
  139. void Time0() interrupt 1  using 1           //产生音乐基准
  140. {
  141.         TH0=0xd8, TL0=0xf0;
  142.         zdjs++;
  143. }
  144. void Time1() interrupt 3                             //控制花样灯的切换
  145. {
  146.        
  147.         TH1=0x3C, TL1=0xB0;
  148.         num++;
  149.         if(num==numtop)
  150.         {
  151.                 num=0;
  152.                 P0=Pattern[i];
  153.                 P1=Pattern[i]>>8;
  154.                 P2=Pattern[i]>>16;
  155.                 i++;
  156.                 if(i==135) i=0;
  157.         }
  158. }                         
  159. void int0() interrupt 0                 //key1外部中断0 控制播放哪首曲子
  160. {
  161.         del(5);         
  162.         EA=0;
  163.         if(key1==0)
  164.         {
  165.                 count++;                  //count决定播放哪一首曲子
  166.                 while(!key1);
  167.                 if(count==4) count=0;       
  168.         }
  169.         EA=1;
  170. }
  171. void int1() interrupt 2                   //key2外部中断1 控制花样灯的切换速度
  172. {
  173.         del(5);  //去抖
  174.         EA=0;    //关总中断
  175.         numtop++;
  176. //        while(!key2);         //去抖动
  177.         if(numtop==10) numtop=0;                //numtop 代表最长延时时间
  178.         EA=1;  //开总中断
  179. }                                  
  180. void del(yj)                 //简单延时函数
  181. {
  182.         uchar yj2=2;
  183.     while(yj!=0)
  184.     {      
  185.             while(yj2!=0)
  186.         {
  187.                 yj2--;
  188.         }
  189.         yj2=2;
  190.         yj--;  
  191.     }
  192.    
  193. }
  194. void main()
  195. {
  196.                 TMOD=0x11,IE=0x8a;
  197.                 TH0=0xd8, TL0=0xf0;  //10ms音乐基准
  198.                 TH1=0x3C, TL1=0xB0;  //50MS
  199.                 EX0=1;//开外部中断0
  200.                 IT0=0;//外部中断0下降沿触发方式
  201.                 EX1=1;//开外部中断1
  202.                 IT1=0;//外部中断1下降沿触发方式          
  203.                 TR0=1; TR1=1;
  204.             play();
  205. }


复制代码

所有资料51hei提供下载:
51单片机课程制作数组法.rar (745.65 KB, 下载次数: 26)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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