标题: DIY单片机迷你音乐频谱显示器 点阵显示 带FFT [打印本页]
作者: 51hei学习技术中 时间: 2016-10-25 14:02
标题: DIY单片机迷你音乐频谱显示器 点阵显示 带FFT
所有制作资料打包下载:
实现功能:
# 电路制作简单,无需PCB板,只需元器件,采用USB 接口供电
# 采用LED点阵16*8显示,随音频变化而起伏显示
# 自动增益校正功能,音量调大调小都不会过满显示或显示过少(当然,音量也不能太小了。输入音量过小、电平比较低时,可以把音响的音量调小一点,音源的音量调大一些)
电路原理图:
管脚连接说明:
单片机的1脚为音频信号输入端,2~9/32~39为LED1点阵引脚,10~17/24~31为LED2点阵引脚,18/19为晶振、电容引脚,21/22为指示灯引脚(21为负极,22为正极),
40脚为VCC电源5V正极,20脚为GND电源负极(也是音频信号输入负极),23脚为空脚悬空。
制作说明:
1、用热熔胶或502胶水将USB公头反向粘到芯片底座的左侧(底座缺口一侧)
2、将USB公头上的正极连至40脚,负极连至20脚,将2PIN排针粘到芯片底座的右侧(频谱接口),上端接1脚,下端接20脚
3、2个30PF电容连接至芯片底座的18、19、20脚(一个接18、20脚,另一个接19、20脚)
4、32.768MHZ晶振连接至芯片底座的18、19脚
5、将芯片安放置底座上,缺口对缺口
6、8*8点阵管脚识别方法:点阵旁边的字朝下,下边那行的左边开始数是第一脚,然后逆时针走一圈1~16脚,和集成块的数法一样,然后对照点阵原理图看!
7、将2个8*8点阵安放于另一个芯片底座上,如图所示,左侧空出1列,右侧空出3列,右侧底下两只脚接发光二极管(左正右负)
8、将两块芯片底座合并,40个管脚依次焊接到一起,USB公头接上USB延长线到电脑,音频接口接上杜邦线到音频线,到音频分离器
9、制作音频线:
10、一分二音频分线器可以让音乐频谱显示器与音响并联
11、音乐频谱显示器通过USB接口取电,从音频接口采集音乐信号
注意事项:
1、电脑音量不能太小,因为检测电压幅值,音量太小了对单片机ADC采集会有影响,建议音量调到中等以上为最佳显示效果。同时,可以通过调节音响的音量来控制声音的大小(把音响的音量调小一点,电脑的音量调大一些)。
2、拔掉音频接口信号输入端(悬空),显示会满屏,拔掉音频接口信号接地端,只显示最下面一行!
3、在静音的状态下,显示屏若时有波动,这是空中的电磁波的影响,是属于正常情况。
12、成品展示
元器件清单:
1、单片机STC12C5A60S2 PDIP40 (1片)
2、0788形红色8*8LED点阵屏(2块)
3、普通芯片座PIN40(2个)
4、USB公头(1个)
5、32.768MHz石英晶体(1个)
6、30pF电容(2个)
7、2PIN排针(1个)
8、1PIN杜邦线(2根)
9、USB延长线公对母(1根)
10、音频头(1个)
11、音频线(1根)
12、音频分离器(1个)
13、发光二极管(1个)
14、导线 若干
主程序:
fft程序:
- #ifndef _FFT_INCLUDED_
- #define _FFT_INCLUDED_
- struct compx
- {
- float real;
- float imag;
- };//定义数据存放机构体
- struct compx dd[65]; //FFT数据段
- code float iw[64]=
- {
- 1.000,0,0.9952,-0.0980,0.9808,-0.1951,0.9569,-0.2903,0.9239,-0.3827,0.8819,-0.4714,0.8315,-0.5556,
- 0.7730,-0.6344,0.7071,-0.7071,0.6344,-0.7730,0.5556,-0.8315,0.4714,-0.8819,0.3827,-0.9239,0.2903,-0.9569,
- 0.1951,-0.9808,0.0980,-0.9952,0.0,-1.0000,-0.0980,-0.9952,-0.1951,-0.9808,-0.2903,0.9569,-0.3827,-0.9239,
- -0.4714,-0.8819,-0.5556,-0.8315,-0.6344,-0.7730,-0.7071,-0.7071,-0.7730,-0.6344,-0.8315,-0.5556,-0.8819,-0.4714,
- -0.9239,-0.3827,-0.9569,-0.2903,-0.9808,-0.1951,-0.9952,-0.0980
- };//w值缓存区
- data struct compx temp;
- //复数乘法
- void ee(struct compx b1,uchar data b2)
- {
- temp.real=b1.real*iw[2*b2]-b1.imag*iw[2*b2+1];
- temp.imag=b1.real*iw[2*b2+1]+b1.imag*iw[2*b2];
- }
- //乘方函数,计算 nbottom^ntop
- uint mypow(uchar data nbottom,uchar data ntop)
- {
- uint data result=1;
- uchar data t;
- for(t=0;t<ntop;t++)result*=nbottom;//nbottom^ntop
- return result;
- }
- //快速傅立叶变换
- void fft(struct compx *xin,uchar data N)
- {
- uchar data fftnum,i,j,k,l,m,n,disbuff,dispos,dissec;
- data struct compx t;
- fftnum=N;//傅立叶变换的点数
- for(m=1;(fftnum=fftnum/2)!=1;m++);//求得M的值
- for(k=0;k<=N-1;k++)//码位倒置
- {
- n=k;
- j=0;
- for(i=m;i>0;i--)//倒置
- {
- j=j+((n%2)<<(i-1));
- n=n/2;
- }
- if(k<j){t=xin[1+j];xin[1+j]=xin[1+k];xin[1+k]=t;}//交换数据
- }
- for(l=1;l<=m;l++)//fft运算
- {
- disbuff=mypow(2,l);//求得碟间距离
- dispos=disbuff/2;//求得碟形两点之间的距离
- for(j=1;j<=dispos;j++)
- for(i=j;i<N;i=i+disbuff)//遍历M级所有的碟形
- {
- dissec=i+dispos;//求得第二点的位置
- ee(xin[dissec],(uint)(j-1)*(uint)N/disbuff);//复数乘法
- t=temp;
- xin[dissec].real=xin[i].real-t.real;
- xin[dissec].imag=xin[i].imag-t.imag;
- xin[i].real=xin[i].real+t.real;
- xin[i].imag=xin[i].imag+t.imag;
- }
- }
- }
- //对fft数据进行处理,得到各个频率段的电压幅值
- void processfft( )
- {
- uchar data pt=0,tmp;
- for(pt=1;pt<65;pt++)
- {
- dd[pt].imag=0; //清零虚部
- }
- fft(dd,64);//对当前数据进行傅立叶变换
- dd[0].imag=0; dd[0].real=0;
- for(pt=1;pt<65;pt++)
- {
- dd[pt].real=sqrt(dd[pt].real*dd[pt].real+dd[pt].imag*dd[pt].imag);//取均方根
- }
- if(Menu==1)
- {
- for(pt=2;pt<34;pt+=2)
- {
- for(tmp=(dd[pt].real/32)+1,LEDBuf[pt]=0xFF;tmp>=1;tmp--) //tmp>1;不保留 最低位那一行常亮;{}一次也不执行;
- {
- LEDBuf[pt]<<=1;
-
- }
- LEDBuf[pt]=~(LEDBuf[pt]);
- }
- }
- else if(Menu==2)
- {
- //下落感频谱
- for(pt=2;pt<34;pt+=2)
- {
- tmp=(dd[pt].real/32)+1;
- if(refreshflag[pt]<tmp) //刷新数据,取较大高度值 存储显示
- {
- for(LEDBuf[pt]=0xFF;tmp>1;tmp--) //tmp>1;不保留 最低位那一行常亮;{}一次也不执行;
- {
- LEDBuf[pt]<<=1;
-
- }
- refreshflag[pt]=(dd[pt].real/32)+1;
- }
- else
- {
- if(refreshflag[pt]>1)refreshflag[pt]--; //顶端下落速度控制 改变值可以改变下降速度
- for(LEDBuf[pt]=0xFF,tmp=refreshflag[pt];tmp>1;tmp--) //tmp>1;不保留 最低位那一行常亮;{}一次也不执行;
- {
- LEDBuf[pt]<<=1;
-
- }
- }
-
- }
- }
- else if(Menu==0)
- {
- //下落感频谱
- for(pt=2;pt<34;pt+=2)
- {
- tmp=(dd[pt].real/32)+1;
- if(refreshflag[pt]<tmp) //刷新数据,取较大高度值 存储显示
- {
- for(LEDBuf[pt]=0xFF;tmp>=1;tmp--) //tmp>1;不保留 最低位那一行常亮;{}一次也不执行;
- {
- LEDBuf[pt]<<=1;
-
- }
- refreshflag[pt]=(dd[pt].real/32)+1;
- }
- else
- {
- if(refreshflag[pt]>1)refreshflag[pt]--; //顶端下落速度控制 改变值可以改变下降速度
- for(LEDBuf[pt]=0xFF,tmp=refreshflag[pt];tmp>=1;tmp--) //tmp>1;不保留 最低位那一行常亮;{}一次也不执行;
- {
- LEDBuf[pt]<<=1;
-
- }
- }
- LEDBuf[pt]=~(LEDBuf[pt]);
-
- }
- }
-
- }
- #endif
复制代码
作者: 好久不见 时间: 2016-11-20 18:19
你好问一下,那个音频头上三根线,为什么到单片机上就两根了(p1.0和GND),还有我用32M晶振可以吗?最近做了一个但是不亮,可以恢复一下吗,万分感谢
作者: 好久不见 时间: 2016-11-20 18:28
你好问一下,那个音频头上三根线,为什么到单片机上就两根了(p1.0和GND),还有我用32M晶振可以吗?最近做了一个但是不亮,可以恢复一下吗,万分感谢
作者: 年时01 时间: 2016-12-27 09:51
拿走了啊
作者: zeng_fanlong 时间: 2016-12-28 08:52
好东西,自己也做一个
作者: comcomcat 时间: 2017-3-22 15:09
不错,不错
作者: zaizaidage 时间: 2017-3-22 23:18
hahahahah
作者: zqy181818 时间: 2017-3-22 23:56
给力!
作者: 51阿伦 时间: 2017-4-8 16:26
哇 还不错 想自己diy一个大一点的 40*40的,不知道还要改哪里
作者: 51阿伦 时间: 2017-4-30 20:45
好东西,感谢楼主的分享
作者: 後輪追前輪 时间: 2017-5-16 10:40
学习
作者: allen2016 时间: 2017-7-31 14:00
不错不错,多谢分享。想搞一个简单的
作者: yzb1048294351 时间: 2017-9-11 13:30
厉害厉害
作者: 958842929qq 时间: 2017-10-5 17:53
点阵屏是主流。很不错。
作者: xi@n 时间: 2017-10-23 11:00
这个挺好的
作者: 958842929qq 时间: 2017-11-19 14:06
你好,可以问一下8*8的LED点阵屏在protel里原理图的器件和pcb里的封装有吗。
作者: cz取 时间: 2017-11-22 12:05
这个需要matlab仿真吗,如果不需要为什么函数标识用FFTMTL呢??
作者: 秋叶枫 时间: 2017-12-20 23:12
马上可以来试试!!
作者: 秦延雷 时间: 2018-1-4 17:58
有没有办法收集成语音信号?
作者: zxy2266 时间: 2018-1-27 21:10
想玩,可是程序不懂,看不明白
作者: dpj1185090651 时间: 2018-4-20 09:54
很给力!
作者: opop1988 时间: 2018-4-21 23:22
灰常不错,赞一个
作者: LYSHLRZH8888 时间: 2018-4-29 23:38
不错,学习一下,自己也做一个
作者: lycwhy 时间: 2018-5-1 15:18
为什么附件下载到一半多就下载不动了
作者: 996054544 时间: 2018-5-14 20:57
有电路图就好了
作者: FQ967 时间: 2018-7-26 08:03
感谢楼主的分享!下载了看看!
作者: songyuan 时间: 2018-7-26 09:04
写的非常不错,顶一个
作者: IdeaMing 时间: 2018-7-26 10:06
简直是666啊!
作者: 流年521 时间: 2018-7-26 11:10
谢谢楼主,自己也尝试做一个
作者: liming_nefu 时间: 2018-11-26 17:52
太帅了,好崇拜楼主!
最近突发奇想也要做个类似的东东,没想到咱们论坛都有现成的啦~~~
作者: 枫舞、 时间: 2018-11-26 21:11
不错啊,厉害
作者: 484 时间: 2018-12-19 20:22
课设就做它了
作者: 张宗昱 时间: 2019-1-2 15:31
为啥使用32.768M的晶振啊,12M不行吗
作者: 魔菲音电子 时间: 2019-1-24 12:00
谢谢楼主,做一个试一下
作者: fgl2599 时间: 2019-4-5 00:05
非常好的帖子,顶起来
作者: stolle 时间: 2019-4-22 23:12
灵感和学习效果的完美页面..我对这项创新感到非常惊讶好主意,和我们在一起!不幸的是,我不懂你的语言,我严重依赖翻译。谢谢分享。
作者: 杜安安 时间: 2019-7-23 18:39
好久不见 发表于 2016-11-20 18:28
你好问一下,那个音频头上三根线,为什么到单片机上就两根了(p1.0和GND),还有我用32M晶振可以吗?最 ...
我觉得这就是音量采集直接出来应该就可以了,接头和端口连就可以。三根线不是接都接头上,然后p1.0相连接可以起到控制p1.0电压的作用。不知对不没试过
作者: 张明211 时间: 2020-2-10 15:38
学习一下
作者: zxule 时间: 2020-2-11 11:37
很好,点阵是共阴的还是共阳的?
作者: 付浩东 时间: 2020-2-13 17:43
好东西哎,赶紧自己做一个
作者: zxule 时间: 2020-2-18 13:59
亲测可以,就是频谱闪的特别厉害,什么原因?谢谢
作者: wcs1668 时间: 2020-3-16 21:49
楼主加油
作者: 中恒电子asus 时间: 2020-4-5 12:14
好东西,感谢楼主的分享
作者: zzzzz.c 时间: 2020-4-7 09:55
真是太感谢了,谢谢分享,大佬膜拜,我也正在学习呢
作者: 魔菲音电子 时间: 2020-4-8 09:38
P4.7的那排灯不亮,能说一下什么问题吗?
作者: auxccc 时间: 2022-3-6 09:33
51黑有你更精彩
作者: 许玩童 时间: 2023-4-10 11:35
不错,学习一下,可以仿真运行吗
作者: zzz988 时间: 2023-7-10 09:39
很好的制作,学习一下!
作者: wangwenhai8 时间: 2023-8-6 16:28
还好,试试、试试、事实
作者: mmla 时间: 2023-8-11 07:51
不错,赶紧自己做一个
作者: yang23943 时间: 2023-9-19 10:43
程序是用什么烧录器烧录
作者: ccccc5321c 时间: 2024-10-14 09:21
很好很强大
作者: luly8818 时间: 2024-10-18 18:12
感谢分享 学习了
作者: hclin 时间: 2024-11-30 17:57
值得DIY,謝謝分享
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |