找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机五色LED音乐频谱详细制作过程及程序电路分享

  [复制链接]
跳转到指定楼层
楼主
LED音乐频谱:



diy单片机音乐频谱全部制作资料下载: LED音乐频谱文件.zip (7.49 MB, 下载次数: 729)

diy制作教程:

关于灯珠颜色的排列如下:
下面我进行图文详细的介绍关于音乐频谱的制作, 懒惰者可以直接看图, 跳过文字的明, 因为图片已经明一切了。
首先,我们要在 9*15cm 的洞洞板上焊接上 LED 灯,因此要先前量度好板子,合理分配每个 LED 灯的焊接位置,每一竖的光柱为 11 个,总共有 5 竖,经过分配后就可以焊接上LED,如图所示,焊接LED 发光二极管,逐个放上 LED 灯在洞洞板上,然后在背面用焊锡固定好,引脚不要剪去,到后面还有用,焊接后就如图所示。
根据你选用的洞洞板从而平均分配焊接位置,焊接好一竖的 LED
后就如图所示, 这些都不难完成的, 要注意的是焊接 LED 的时候, 最好用一只手指按住 LED的草帽位置,然后用焊锡在背面焊接上固定,这样就可以避免焊接出来的 LED 灯歪曲了。
按照同样的方法焊接好其他几排的 LED 灯。
直至焊接好所有的 LED 灯, 只要你觉得好看,之于怎么排列和如何选择 LED 灯的颜色,我不管,反正你是对的。焊接好所有 LED 灯就如图所示,这时候不要急着下一个步骤,先用 3V 的纽扣电池逐个测试每个 LED 是否能亮起,免得到最后发现有 LED 灯不亮就糟糕了,发现不亮就及时更换修改,因为引脚焊接时间过长会损害 LED 灯的,这里特别提醒一下
如图所示为焊接好所有 LED 灯的背面, 注意 LED 灯的引脚不要弄歪了, 同时注意焊接点不要出现虚焊的情况,检测完毕,下一步!
接下来,把 LED 灯的负极端(较短的一端引脚)逐个向下弯曲,如图所示形成手拉手的状
况, 这个是学习外国同志的做法。 由于小弟我思维不发达, 确实找不到比这种更好的处理方法,因此在这里借用一下,最终的研究成果归所有,再次说明一下。
其他颜色的负极也向同一个方向摆在一边, 要确保每一种颜色的 LED 负极端都接触在一起,而且要注意弯曲的时候要尽量压低负极的管脚高度。完成这一步骤后就如图所示。
接下来是处理 LED 的正极端(较长的 LED 管脚) ,也按照同样做法,把 LED 的正极端弯向右边, 同时也要确保每一行的正极端接触在一起, 特别要注意正极弯曲的时候不要接触到之前的负极, 由于正极端管脚较长, 因此可以把正极弯曲后的高度高一些, 正极和负极要形成一定的高度差,如果还是不能确保弯曲后会互相接触到的话, 最好就是用绝缘胶带在每个交叉点粘上,以防误触。
如图所示, 分别把正负极的接触点都用焊锡焊接上, 固定好, 并且把多出的一部分管脚修剪掉,完成这一步,音乐频谱的显示部分就完成了。
接下来,是焊接音乐频谱的控制部分电路,按照电路图,控制部分的电路也较为简单,先在
另一块的 9*15的洞洞板下方焊接好单片机的 IC 插座和晶振部分电路, 焊接好就上图所示,注意,IC 插座是倒着焊接的,还有,晶振选用的是 24MHZ,不要选错了。
同时在背面焊接上 470 欧的贴片限流电阻(为了降低难度,发货一律使用直插电阻),当然,如果没有贴片电阻的也可以选择直插电阻。
还有,分别在上下如图所示位置上焊接上两排 8 针的排针,同时还要在电源正负极之间焊
接上 0.1uf 的滤波电容,用以滤掉电源的高频信号干扰,而且参照 STC 单片机的数据手册,
还需在 AD 采集端口和地线之间要接上一个 47pf 电容。焊接完成后如图所示。
接下来, 打开一个 3.5mm 的音频插头, 在内部用排线分别引出地线和左右声道任意一个声道线。选用合适长度的排线即可,最好选用内部是铜线的,减少干扰。
然后如图所示,把两条排线分别接上 AD 采集端口(我选用的是 P1.0 口)和地线,为了不使排线摆动时弄断接触部分,还要把两根排线如图用线捆绑固定住。
接下来,把两条 8 针的杜邦线的一端剪去,在每一根排线的一端刨去熟料部分,使其露出铜芯,按照电路图,用焊锡把每根线分别接上 LED 显示部分的正极和负极,然后,对应好位置后把杜邦插座插座先前焊接好的排针上面,焊接完成后如图所示。
在 IC 插座上插上下载好程序的单片机后,然后选用合适高度的铜柱子把两块洞洞板四个角
上的洞固定起来,这样不仅可以保护内部的控制部分电路,而且显示屏还可以立起来, 方便随时更改摆放位置。完成后如图上所示。
把一分二的音频线分别插上音箱的音频线和音乐频谱的音频线, 另一端插在电脑或者其他播放设备上面。
原理上讲, 完成上面的部分作品都可以工作了, 但是长期使用,我发现音乐频谱的显示会出现不稳定的情况,也就是说在我还没有插上播放设备上也会有所显示,经过后来一番研究,
发现原来是电源输出的不稳定因素造成的,之前的 0.1uf 电容已经把电源的高频信号滤掉,
但是电源还有低频的干扰信号,于是还要在电源正负极之间加上一个 100uf 左右的电容,
我加上 100uf 的电容后就不会出现之前的情况了。

  1. #include <stc12c5a60s2.h>//"stc12c5620ad.h"
  2. #include<intrins.h>
  3. #define LongToBin(n) (((n>>21)&0x80)|((n>>18)&0x40)|((n>>15)&0x20)|((n>>12)&0x10)|((n>>9)&0x08)|((n>>6)&0x04)|((n>>3)&0x02)|((n)&0x01))
  4. #define BIN(n) LongToBin(0x##n##)
  5. #define uchar  unsigned char
  6. #define uint  unsigned int
  7. #define SAMPLE_NUM 64
  8. #define NUM_2_LOG 6
  9. #define FFT_OUT_MIN 3
  10. uchar code BRTable[SAMPLE_NUM] ={ 0, 32, 16, 48, 8, 40, 24, 56,4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57,5, 37, 21, 53, 13, 45, 29, 61,3, 35, 19, 51, 11, 43, 27, 59,7, 39, 23, 55, 15, 47, 31, 63};
  11. char code sin_tabb[SAMPLE_NUM] = { 0 ,12 ,25 ,37 ,49 ,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,125 ,126 ,127 ,126 ,125 ,122 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,0 ,-12 ,-25 ,-37 ,-49 ,-60 ,-71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,-127 ,-126 ,-125 ,-122 ,-117 ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12  };
  12.                                  
  13. char code cos_tabb[SAMPLE_NUM] = {127 ,126 ,125 ,122 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,0 ,-12 ,-25 ,-37 ,-49 ,-60 ,-71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,-127 ,-126 ,-125 ,-122 ,-117 ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12 ,0 ,12 ,25 ,37 ,49 ,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,125 ,126 };
  14. uchar a[21];
  15. uchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;//用于分离

  16. /*加入数组用于显示相应led灯数目*/
  17. uchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制
  18. int xdata FftReal[SAMPLE_NUM];
  19. int xdata FftImage[SAMPLE_NUM];
  20. sbit p30=P3^0;
  21. sbit p31=P3^1;
  22. sbit p32=P3^2;
  23. sbit p33=P3^3;
  24. sbit p34=P3^4;
  25. sbit p35=P3^5;//9-11的led控制
  26. sbit p36=P3^6;
  27. sbit p37=P3^7;

  28. void timerinit()//定时器 初始化函数
  29. {
  30.          TMOD=0x01;
  31.          TH0=(65536-6000)/256;
  32.          TL0=(65536-6000)%256;
  33.          EA=1;
  34.          ET0=1;
  35.          TR0=1;
  36. }
  37. void disp()
  38. {
  39.         timernum++;
  40.         if(timernum==6) timernum=1;
  41.         P2=0;//显示前先关闭
  42.         P3=P3&0x1f;
  43.         switch(timernum)
  44.         {
  45.                 case 1:anum=a[0];p34=0;p33=1;p32=1;p31=1;p30=1;break;
  46.                 case 2:anum=a[1];p34=1;p33=0;p32=1;p31=1;p30=1;break;
  47.                 case 3:anum=a[2];p34=1;p33=1;p32=0;p31=1;p30=1;break;
  48.                 case 4:anum=a[3];p34=1;p33=1;p32=1;p31=0;p30=1;break;
  49.                 case 5:anum=a[4];p34=1;p33=1;p32=1;p31=1;p30=0;break;
  50.         }
  51.         //anum=a[10];/*修改可以改变光柱高度 (anum值分开几个部分用定时器区分显示)(a[]内逐加) */
  52.         if(anum<=8){P2=lednum[anum];P3=P3&0x1f;}//屏蔽高三位
  53.         //else {P2=0xff;P3=lednum2[anum-9];}
  54.         if(anum==9){P2=0xff;p35=1;p36=0;p37=0;}
  55.         if(anum==10){P2=0xff;p35=1;p36=1;p37=0;}
  56.         if(anum==11){P2=0xff;p35=1;p36=1;p37=1;}

  57. }

  58. uchar STC_ADC()                   //!!根据数据手册写一个ad读取函数
  59.   {
  60.      uchar i;
  61.         ADC_RES   = 0;
  62.         ADC_RESL  = 0;
  63.   ADC_CONTR = BIN(10001000);
  64.   i=3;
  65.         while(i--);
  66.         while (1)                     
  67.      {
  68.          if (ADC_CONTR & BIN(10000))      
  69.          {
  70.             break;
  71.            }
  72.      }
  73.      ADC_CONTR = BIN(10000000);
  74.   return( ADC_RESL<<2) ;
  75. }
  76. short sqrt_16( unsigned long M)   
  77. {
  78.     unsigned int N, i;
  79.     unsigned long tmp, ttp;
  80.     if( M == 0 )            
  81.         return 0;
  82.    
  83.     N = 0;
  84.    
  85.     tmp = ( M >> 30 );        
  86.     M <<= 2;
  87.     if( tmp > 1 )            
  88.     {
  89.         N ++;               
  90.         tmp -= N;
  91.     }
  92.    
  93.     for( i=15; i>0; i-- )   
  94.     {
  95.         N <<= 1;           
  96.         
  97.         tmp <<= 2;
  98.         tmp += (M >> 30);  
  99.         
  100.         ttp = N;
  101.         ttp = (ttp<<1)+1;
  102.         
  103.         M <<= 2;
  104.         if( tmp >= ttp )   
  105.         {
  106.             tmp -= ttp;
  107.             N ++;
  108.         }      
  109.     }
  110.    
  111.     return N;
  112. }
  113. void FFT()
  114. {
  115. register    uchar i,bb,j,k,p,max;
  116. register short TR,TI,temp;
  117.     unsigned long ulReal;                             
  118.     unsigned long ulImage;
  119.    
  120.    
  121.                                                                  
  122. for(i=0; i<SAMPLE_NUM;i++)          //此处可以加入自动增益
  123. {
  124.                 FftReal[BRTable[i]] = STC_ADC()<<keep;//使显示保持在一定范围内
  125.         FftImage[i] = 0;
  126. }

  127.          keepnum=FftReal[2]/32;//提取等级数
  128.                    if((7<keepnum)&&(keepnum<=8)) {keep=1;}
  129.          else if((4<keepnum)&&(keepnum<=6)) {keep=2;}
  130.          else if((2<keepnum)&&(keepnum<=4)) {keep=3;}
  131.          else {keep=5;}       
  132.    
  133.     for( i=1; i<=NUM_2_LOG; i++)                          
  134.     {
  135.         bb=1;
  136.         bb <<= (i-1);                                      
  137.         for( j=0; j<=bb-1; j++)                           
  138.         {
  139.             p=1;
  140.             p <<= (NUM_2_LOG-i);            
  141.             p = p*j;
  142.             for( k=j; k<SAMPLE_NUM; k=k+2*bb)               
  143.             {
  144.                 TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];
  145.                 FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);
  146.                 FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);
  147.                 FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);
  148.                 FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7);
  149.                
  150.                 FftReal[k]  >>= 1;            
  151.                 FftImage[k]  >>= 1;
  152.                 FftReal[k+bb]  >>= 1;                 
  153.                 FftImage[k+bb]  >>= 1;
  154.                                                                               
  155.             }  
  156.         }
  157.     }
  158.     max=0;
  159.     for( i=0; i<5; i++)//5
  160.     {  
  161.         ulReal = FftReal[i+1];
  162.         ulReal *= ulReal;
  163.         ulImage = FftImage[i+1];
  164.         ulImage *= ulImage;
  165.         
  166.         a[i] = sqrt_16( ulReal + ulImage );   //修改
  167.                         
  168.         if( a[i] < FFT_OUT_MIN )     
  169.             a[i] = 0;//修改
  170.         else
  171.           a[i] = a[i]-FFT_OUT_MIN;
  172.         if( a[i] >max)
  173.              max =a[i];
  174.                          //disp();                     
  175.     }
  176.     if(max>11) //11
  177.     {
  178.        max/=11;       
  179.         for( i=0; i<5; i++) //输出a的5个分离数值
  180.         {      
  181.              a[i]/=max;
  182.             
  183.         }  
  184.     }
  185. }            


  186. void main()
  187. {
  188.         P2M0=0xff;//  BIN(11111111);//P2组设置为推挽输出
  189.         P2M1=0;          
  190.         P3M0=0xe0;//  BIN(11111111);
  191.         P3M1=0;
  192.         P1M0=0x00;
  193.         P1M1=0x01;
  194.         P1ASF =1;           //设置P1.0为AD口
  195.     AUXR1 =BIN(100);

  196.         keep=0;
  197.         keepnum=0;

  198.         timerinit();//定时器初始化

  199.         timernum=3;//从3开始
  200.         timernum2=0;
  201.     while(1)
  202. {
  203.            FFT();
  204. }
  205. }

  206. void timer0() interrupt 1
  207. {
  208.         TH0=(65536-6000)/256;         //6000
  209.         TL0=(65536-6000)%256;
  210.         disp();
  211. }
复制代码


评分

参与人数 3黑币 +59 收起 理由
一世顾你 + 5 很给力!
qjzyx + 4 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:112693 发表于 2016-4-17 21:49 | 只看该作者
好东西,有时间Diy 一下  

51黑有你更精彩
回复

使用道具 举报

板凳
ID:114829 发表于 2016-4-18 23:25 | 只看该作者
支持下 ,单片机频谱的效果很漂亮 果断收藏下载,到时候制作的时候再向楼主请教。
回复

使用道具 举报

地板
ID:108508 发表于 2016-4-19 21:25 | 只看该作者
学习了  51黑有你更精彩
回复

使用道具 举报

5#
ID:87193 发表于 2016-4-20 10:24 | 只看该作者
很漂亮,值得学习一下
回复

使用道具 举报

6#
ID:86621 发表于 2016-4-22 09:23 | 只看该作者
我的只有小晶振可以吗     大的就是40的有源晶振了
回复

使用道具 举报

7#
ID:138242 发表于 2016-9-2 11:07 | 只看该作者
好东西就要分享,这个平台不错。
回复

使用道具 举报

8#
ID:138242 发表于 2016-9-2 11:07 | 只看该作者
好东西就要分享,不错的平台
回复

使用道具 举报

9#
ID:136460 发表于 2016-9-2 20:17 | 只看该作者
51黑有你更精彩
回复

使用道具 举报

10#
ID:138343 发表于 2016-9-3 16:19 | 只看该作者
比较喜欢那种电平指示器的效果,只有一条或者两条,会悬停的那种,楼主有没有经验也分享一个关于电平指示器的制作
回复

使用道具 举报

11#
ID:187536 发表于 2017-4-8 20:03 | 只看该作者
大家好,我模仿做了一个,接上5V电源和音乐,可是灯不亮,其他元件用万用表测都有电压,可能出现的问题在哪?求大神相助
回复

使用道具 举报

12#
ID:284163 发表于 2018-2-15 15:07 来自手机 | 只看该作者
谢谢分享,学习学习!
回复

使用道具 举报

13#
ID:284163 发表于 2018-2-15 15:08 来自手机 | 只看该作者
谢谢分享,学习学习!哦哦
回复

使用道具 举报

14#
ID:284163 发表于 2018-2-15 15:17 来自手机 | 只看该作者
谢谢分享,我要好好学习了
回复

使用道具 举报

15#
ID:284163 发表于 2018-2-15 15:18 来自手机 | 只看该作者
很想做一个这样的显示器,希望我能成功
回复

使用道具 举报

16#
ID:266116 发表于 2018-2-16 12:24 | 只看该作者
谢谢分享,51黑有你更精彩!!!
回复

使用道具 举报

17#
ID:194397 发表于 2018-2-23 04:19 | 只看该作者
谢谢分享,多多学习!
回复

使用道具 举报

18#
ID:124995 发表于 2018-2-28 17:31 | 只看该作者
谢谢分享 加油加油
回复

使用道具 举报

19#
ID:288930 发表于 2018-3-12 12:16 | 只看该作者
很好,感谢分享!
回复

使用道具 举报

20#
ID:281065 发表于 2018-4-5 15:16 来自手机 | 只看该作者
为什么我做的闪的特别快呢
回复

使用道具 举报

21#
ID:299588 发表于 2018-4-9 10:11 来自手机 | 只看该作者
向楼主学习
回复

使用道具 举报

22#
ID:48413 发表于 2018-4-9 11:17 | 只看该作者
谢谢楼主
回复

使用道具 举报

23#
ID:300077 发表于 2018-4-9 14:42 | 只看该作者
很有用,参考了一下,准备做校赛
回复

使用道具 举报

24#
ID:303190 发表于 2018-4-10 20:26 | 只看该作者
谢谢分享
回复

使用道具 举报

25#
ID:249545 发表于 2018-4-11 08:31 | 只看该作者
这个看起来比LM3914 LM3915要好玩!
回复

使用道具 举报

26#
ID:320718 发表于 2018-5-2 19:55 | 只看该作者
谢谢分享 ,电子小白
回复

使用道具 举报

27#
ID:320718 发表于 2018-5-2 19:57 | 只看该作者
谢谢分享 ,我是电子小白
回复

使用道具 举报

28#
ID:320718 发表于 2018-5-2 20:00 | 只看该作者
新手入论坛,一脸懵哦
回复

使用道具 举报

29#
ID:292585 发表于 2018-5-9 02:21 | 只看该作者
学习了  51黑有你更精彩
回复

使用道具 举报

30#
ID:324272 发表于 2018-5-9 11:30 来自手机 | 只看该作者
图片没显示
回复

使用道具 举报

31#
ID:328609 发表于 2018-5-13 01:03 | 只看该作者
好东西,有时间Diy 一下!!!!
回复

使用道具 举报

32#
ID:329635 发表于 2018-5-14 15:34 来自手机 | 只看该作者
准备做一个
回复

使用道具 举报

33#
ID:328609 发表于 2018-5-14 21:03 | 只看该作者
没有图片啊
回复

使用道具 举报

34#
ID:336199 发表于 2018-5-23 05:11 | 只看该作者
正需要这个
回复

使用道具 举报

35#
ID:323199 发表于 2018-5-31 01:09 | 只看该作者
膜大佬
回复

使用道具 举报

36#
ID:342129 发表于 2018-7-3 20:54 | 只看该作者
学习了  51黑有你更精彩
回复

使用道具 举报

37#
ID:380389 发表于 2018-8-1 14:07 来自手机 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

38#
ID:56002 发表于 2018-8-2 13:58 | 只看该作者
给大家推荐一种专用音频信号电平指示芯片觉得还可以,LM3915做电平指示非常不错,可以联级使用
回复

使用道具 举报

39#
ID:369134 发表于 2018-8-10 21:35 | 只看该作者
很给力!
回复

使用道具 举报

40#
ID:387077 发表于 2018-8-16 23:09 | 只看该作者
学习了  51黑有你更精彩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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