标题: 用51单片机做的音乐频谱显示器 [打印本页]

作者: admin    时间: 2013-6-16 03:24
标题: 用51单片机做的音乐频谱显示器
注意按键一定要离单片机很近,触摸按键最怕有干扰






































制作资料下载:
DIY音乐频谱显示资料.zip (4.69 MB, 下载次数: 3416)




作者: admin    时间: 2013-6-16 03:31
下面是主函数的源代码:完整的可到楼主的贴中下载
#include "src\STC12C5A.h"		 

#include <intrins.h>      //51基本运算(包括_nop_空函数)
#include <math.h>

#include "src\Define.h"


///////全局变量///////
uchar data DelayTime=9;	  //<=8效果最好;
uchar data INTTime=0x40;  //0x40;	
uchar data gain=6;
uchar data Menu=2;
uchar idata refreshflag[40];
uchar  data LEDBuf[35];	  //15列;从左到右;亮的位为真(1);
uint32  data TouchKey=0;
uchar data CBeep=0;
//////////////////////


void Delays(uint t)
{  
	uint j;
	while(--t)
		for(j=0;j<5;j++);    
}
void Delaysms(uint t)
{  
	uint j;
	while(--t)
		for(j=0;j<15;j++);    
}



#include "src\ADC.c"
#include "src\Font.c"
#include "src\fft.h"



void PWM_init (void)	  //PWM初始化函数	 //PWM模式,接P1.3接口(PWM0),强上拉.
{		   
	CMOD=0x00;    //设置PCA定时器	  0x00~0x03;
 	CL=0xEF; 
 	CH=0xEF;
	CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
 	CCAP0L=0xEF; //设置PWM0初始值与CCAP0H相同
 	CCAP0H=0xFF; // PWM0初始时为0

 	CR=1;        //启动PCA定时器
}

void PWM0_set (uchar set)	   //PWM0占空比设置函数	(0x00~0xFF)
{
	CCAP0L= set; //设置值写入CCAP0L
 	CCAP0H= set; //设置值写入CCAP0H
}


void IOINIT(void)							  //I/O强上拉模式;
{
	P4SW = 0xff;	                          //启动I/O:P4;
	P4M1 = B(00000000); P4M0 = B(10000000);P47=0;//震动马达;
	P0M1 = 0x00;	    P0M0 = 0xff;       P0=0; //点阵列(Y)(L:OFF; H,H+:ON,ON+;)
	P1M1 = B(01000011); P1M0 = B(00110100);P1=B(10110111); //(P17@(高阻,IN)&P16@(高阻,IN);TouchKey) ... P14@(传统IO,Beep,IN) P13@(强推,OUT)呼吸灯 ... P11@(高阻,IN)AD2;P10@(高阻,IN)AD1;      
	P2M1 = B(00000000); P2M0 = B(11111111);P2=0; //点阵行(X0(Left))(L:OFF; H,H+:ON,ON+;)  
	P3M1 = B(00000000);	P3M0 = B(11111111);P3=0; //点阵行(X1(Right))(L:OFF; H,H+:ON,ON+;)  	      
	P1ASF =B(00000011);                          //将P10,P11的IO设置为模拟输入功能;     

//  Y(P0)
//  ↑
//H	|
// 	|
//	|
//L	|
//	 ---------------------→
//	[L:X0(P2):H][L:X1(P3):H]

//TestCode:
//	P0=B(10000000);
//	P2=B(00000001);
//	P3=B(00010000);

}



void BufToLED_Refresh()                     //Refresh&Write Buf to LED ;
{	
	 uchar data i; 
	 uchar data X=1;	  
	 uchar data Y=1;
	 for(X=1,i=2;X;X<<=1,i+=2)              //for(X=1;X!=0;X<<=1) //8bit
	 {
	  	P2=X;
		for(Y=1;Y!=0;Y<<=1)		            //Y=Y<<1;
	 	{
			P0=Y&LEDBuf[i];
			Delays(DelayTime);
			P0=0;
		}
		P2=0;	
	 };
	 for(X=1;X<B(10000000);X<<=1,i+=2)	    //7bit
	 {
	  	P3=X;
		for(Y=1;Y!=0;Y<<=1)		            //Y=Y<<1;
	 	{
			P0=Y&LEDBuf[i];
			Delays(DelayTime);
			P0=0;
		}
		P3=0;	
	 };
		
}




void LEDRefresh_INT() interrupt 3 //using 3   
{ 
	static uint x=0;		   
	static uchar flag=1;

    TL1 = 0x00;      
    TH1 = INTTime;               //0x50~0x80 

 	if(flag)
	{
		if(++x==0xFF)			 //MINOUTPUT
		{
			flag=0;		
		}		
	}
	else
	{
		if(--x==0xCF)	         //MAXOUTPUT
		{
			flag=1;			
		}
	}	 		
	PWM0_set(x);                 //设置PWM占空比

	BufToLED_Refresh();	 		
}  


void Timer_INT()
{
 	TMOD = 0x11; //高4位控制T/C1 
	EA = 1;	     //开总中断
	TH1 = 0x00;  //16位计数寄存器T1高8位
	TL1 = 0x00;  //16位计数寄存器T1低8位
	ET1 = 1;     //T/C1中断开
    TR1 = 1;     //T/C1启动

}


void FullScan()
{
	uchar data X=1;	  
	uchar data Y=1;

	 for(Y=1;Y!=0;Y<<=1)		       //Y=Y<<1;
	 {	
	 	P0=Y;
		for(X=1;X;X<<=1)	           //8bit
		{
		 	P2=X;
			Delays(7);	
		};

		P2=0;
		for(X=1;X<B(10000000);X<<=1)    //7bit
		{
		 	P3=X;
			Delays(7);
		};
		P3=0;
		P0=0;
	 }
}


void Main()
{  
	uint data Count=700;
	uchar data i,Cgain,num=0;

	IOINIT();
	InitADC();                   

	while(--Count)
		FullScan();

	for(i=0;i<40;i++) refreshflag[i]=0x09;
	
	P14=0;			  //Beep
	Delays(4000);
	P14=1;

	PWM_init();      //PWM初始化
	PWM0_set(0xFB);
	
	Timer_INT();

	for(i=0;i<34;i++) 
		LEDBuf[i]=0x00;
	FontDisp();

	while(520)
	{
		for(i=0;i<65;i++)
		{  
			dd[i].real=(GetADCResult(0)+GetADCResult(1))<<gain;	  //读取ad结果并放大;
		}

		 processfft();//傅立叶变化及处理

		 ///////////////////TouchKey//////////////////////////
		 while(P16==1)					   //依据:脉冲 干扰持续时间短;
		 {	
			if(CBeep)P14=0;
			if(++TouchKey>0x0000FF00)break;	
		 }
		 P14=1;

		 if(P16==1)
		 {
			if(++Menu==4)Menu=0;

			P14=0;
			P47=1;
			Delays(7000);	  
			P14=1;
			P47=0;		
		 }	
			TouchKey=0;
		 //////////////////////////////////////////////

		if(P17==0)CBeep=!CBeep;

		 if(dd[2].real<32)
		 {
			 if(++Count==300)	  //电平值过小,这降低gain,减少噪音的电平显示;
			 {
				Count=0;
				//if(++Menu==4)Menu=0;	  	//切换Menu,显示方式;
				gain=6;

				P14=0;			  //Beep
				Delays(1000);
				P14=1;
			 }
		 }
		 else 
		 {
			 Count=1;
	
			 if(++num==0xAF)			 //播放时,Auto gain;
			 {
				num=0;

				P14=0;			           //Beep
				Delays(700);
				P14=1;
				                           //自动增益;Automatic gain;
				Cgain=dd[2].real/32;
				if(7<Cgain<=8) 
				{
					gain=4;
					
				}
				else if(4<Cgain<=6) 
				{
					gain=5;
					
				}
				else if(2<Cgain<=4) 
				{
					gain=6;
				}
				else 
				{
					gain=7;
			
				}
	
			 }

		  }		 
	}
	while(1);
}



作者: ahshmj    时间: 2013-6-16 15:36
PRJ.C(299): error C249: 'DATA': SEGMENT TOO LARGE  
??
作者: admin    时间: 2013-6-16 18:32
keil4 的工程文件呢
作者: eric.ghost    时间: 2013-7-7 00:21
貌似要焊到手抽~~
作者: 大龄学生啊~~    时间: 2013-7-17 17:46
看看,,程序齐的吧
作者: Fly_    时间: 2013-7-20 13:49
谢谢分享~~~~~~~~~~
作者: kxm2008    时间: 2013-7-21 08:17
很强啊,楼主
作者: 1156615097    时间: 2013-7-23 22:22
有套件卖吗?我要
作者: Living_on_Your_    时间: 2013-7-26 21:24
真帅!!!
作者: full    时间: 2013-7-26 21:54
kanakn
作者: yyyxiaowei    时间: 2013-7-26 23:05
学习中
作者: 这些年我们在一    时间: 2013-8-8 04:05
谢谢 分享
作者: 这些年我们在一    时间: 2013-8-10 11:05
程序 还需要修改吗??按照你 套件我也做了一套  烧出来没反应
作者: 辷噺一意    时间: 2013-8-12 15:27
进来看看
作者: HUFUHA    时间: 2013-10-9 02:35
看看学习学习。。
作者: 家电维修    时间: 2013-10-10 12:22
手都要掉了
作者: azhiarm9    时间: 2013-10-10 12:33
keil4 的工程文件呢
作者: 白色米兔    时间: 2013-10-13 05:49

很强啊
作者: samyang13    时间: 2013-12-25 20:16
同二楼问题相同
作者: lyMarvin    时间: 2013-12-27 18:32
怎么没见效果图?
作者: Simoni    时间: 2014-3-18 14:25
谢谢分享
作者: zxf88welding    时间: 2014-3-21 22:27
谢谢 分享
作者: rsbook    时间: 2014-4-2 16:56
有做成功的吗?
作者: 我不知道    时间: 2014-4-3 16:40
我顶,向楼主学习。
作者: txwp    时间: 2014-4-4 11:36
admin 发表于 2013-6-16 03:31
下面是主函数的源代码:完整的可到楼主的贴中下载
#include "src\STC12C5A.h"                 

很好  学习  谢谢
作者: 箫风竹影    时间: 2014-5-9 13:05
好东西
作者: userxun    时间: 2014-5-13 20:44
要焊死
作者: wwqcf1    时间: 2014-5-14 11:54
进来看看
作者: rich3524    时间: 2014-5-15 10:46
好东西.谢谢
作者: firesparker    时间: 2014-7-6 18:48
恩恩,下载来自己做做
作者: feng370654382    时间: 2014-7-7 10:26
谢楼主分享啊。。
作者: fslgh123    时间: 2014-8-28 16:22
正想学习学习。
作者: 13304563556    时间: 2014-9-5 13:03
放个视频出来更好
作者: lin1161061863    时间: 2014-10-8 19:55
好复杂啊
作者: tianxing    时间: 2014-10-14 17:53
谢了。
作者: 唉丶芒果    时间: 2014-10-15 19:34
谢谢分享
作者: h-zhz    时间: 2014-11-17 22:10
支持一下~谢谢分享
作者: zjf110    时间: 2014-11-25 01:25
不错 顶顶顶顶
作者: kongmeng0814    时间: 2014-12-9 03:07
如果 我还想控制更多的LED我该怎么做呢?
作者: mycookie    时间: 2014-12-9 10:05
很强啊
作者: 师太来取精    时间: 2015-1-6 02:36
找了好久 谢谢你啊
作者: 潍坊论坛    时间: 2015-1-8 21:31
下载学习
作者: yufeng998    时间: 2015-1-26 10:30
正在做这个东西,学习一下。
作者: yufeng998    时间: 2015-2-5 17:43
'
程序 还需要修改吗??按照你 套件我也做了一套  烧出来没反应'同问??
作者: 1176658950    时间: 2015-5-10 01:10
好东西赞黑币!下载!
作者: jyk20100    时间: 2015-5-10 11:28
俺也试试,谢谢楼主分享
作者: 疯狂DE三级管    时间: 2015-5-12 13:18
已经在做了。。下来看看
作者: 天空的颜色    时间: 2015-5-29 23:28
想下载来看下,但不够黑币啊
作者: 286458071    时间: 2015-5-30 10:43
*罒ο罒*(`)谢谢分享了
作者: enzo7777    时间: 2015-5-31 22:34
下载 了,没看见C或者KEIL 文档??HEX就一个 是整个的 代码烧成的马? 还没在PROTUES仿真?? 源代码哪里?
作者: zhang1728356725    时间: 2015-6-2 00:00
看看不错哦
作者: miuifen    时间: 2015-7-31 09:43
用STC89c52单片机可以吗
作者: Bearchang    时间: 2015-7-31 22:35
miuifen 发表于 2015-7-31 09:43
用STC89c52单片机可以吗

不行,因为频谱需要AD采集
作者: 明月    时间: 2015-9-12 17:05
看看,,,,,,,,,,,,, 点点滴滴点点滴滴的滴滴答答滴滴答答滴滴答答滴滴答答的
作者: bentaozhenti    时间: 2015-9-14 14:26
感谢楼主
作者: 810364072@qq.co    时间: 2015-10-12 11:15
不错 正在学习
作者: 76748724    时间: 2015-10-23 17:05
挺好的
作者: 小古月    时间: 2015-10-30 17:10
很好的东东
作者: 小古月    时间: 2015-10-30 19:19
很不错
作者: lym_tb_1    时间: 2015-10-31 22:52
我想说的是第一张微波炉的图片是啥意思?
作者: 飞刀问情    时间: 2015-11-2 11:20
谢谢,真心
作者: xiaoyuxinke    时间: 2015-11-2 22:19
来个通电测试的效果图片呗
作者: stewart_leung    时间: 2015-11-3 09:26
管理员也是个牛人啊
作者: ludaijin    时间: 2015-11-5 08:06
楼上的朋友有做成功的 没有
作者: 吾2481    时间: 2015-11-5 11:37
各位大神都好厉害,支持一下
作者: linport    时间: 2015-11-5 15:54
很想也做一个
作者: 着陆的海    时间: 2015-11-17 17:31
您好,可以请教您一些问题吗?
可以加一下我的扣扣号吗?“2562294410”
谢谢您了
作者: 我是傻逼    时间: 2015-11-17 21:50
要焊废手
作者: lthy640220    时间: 2015-11-20 18:48
有做成功的吗?我非常想做一个

作者: BH2RAI    时间: 2015-11-24 09:06
谢谢分享 楼主辛苦
作者: 旭日青草    时间: 2015-11-28 12:42
楼主没用74HC595和138,这么用有点浪费啊
作者: 旭日青草    时间: 2015-11-28 12:47
楼主竟然把电磁炉当显示屏了,,,,
作者: 夜雨轻风    时间: 2015-11-29 12:19
学习学习
作者: 夜雨轻风    时间: 2015-11-29 12:20

支持一下~谢谢分享
作者: 夜雨轻风    时间: 2015-11-29 12:21
貌似要焊到手抽~~~~
作者: bxyyhan    时间: 2015-11-29 14:41
夜雨轻风 发表于 2015-11-29 12:21
貌似要焊到手抽~~~~

我用的点阵管做的,8*24位的。
作者: liyang0727    时间: 2015-12-2 15:37
下载学习
作者: liyang0727    时间: 2015-12-2 15:38
感谢楼主
作者: siked123    时间: 2015-12-9 16:57
非常支持! 下载了
作者: 博学而笃志    时间: 2015-12-29 16:42
这个真的很好
作者: xpz418    时间: 2016-2-28 15:11
不错,学习了
作者: xpz418    时间: 2016-2-28 15:11
不错的东西,学习了

作者: blacknowhite    时间: 2016-3-21 23:48
对于玩音乐的来说,最好了
作者: wanggoals    时间: 2016-3-21 23:59
牛逼啊
作者: wanggoals    时间: 2016-3-21 23:59
真是人才啊,太厉害了
作者: jiaaizyj    时间: 2016-3-28 21:17
谢谢分享~~~~~~~~~~
作者: 无言    时间: 2016-4-11 09:46
谢谢楼主,希望有用
作者: dianyu7824    时间: 2016-4-26 16:41
不错
作者: chaijin1127    时间: 2016-4-29 20:39
item.taobao点com/item.htm?spm=a230r.1.14.88.kqxYRd&id=44455098483
作者: 401831383    时间: 2016-5-13 15:51
1单片机做的音乐频谱显示
作者: dmhrat    时间: 2016-5-14 12:22
电磁炉是干嘛用
作者: 陈涉太息曰    时间: 2016-5-16 10:26
谢谢分享
作者: owenrao    时间: 2016-6-4 02:16
效果怎么样
作者: qzhyjd    时间: 2016-6-4 16:37
应该用矩阵二极管,少很多焊接
作者: sonkouri    时间: 2016-6-7 20:13
正在学习这个制作,很不错
作者: 马成虎    时间: 2016-6-19 10:36
楼主在吗
作者: 马成虎    时间: 2016-6-19 10:38
程序有点错误
作者: 李某某    时间: 2016-7-30 20:53
哎呦,不错哦
作者: xiaoliu023    时间: 2016-8-19 19:58
谢谢分享,就是我的黑金不够




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1