LED音乐频谱之输出数据处理

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38023539

一.PWM调节

1.初始化

void  DACInit()
{
	CCON=0;	            //PAC初始化
	CL=0;				// PAC16位计数器低8位
	CH=0;				// PAC16位计数器高8位
	CMOD=0x00;			 //选择  系统时钟/12为计数脉冲,则PWM的频率f=sysclk/256/12
	CCAP0H=0X80;		 //占空比控制,0x80为百分之50	10000000所以在与PAC低八位比较时有CL>CCAPnL 一半的情况所以占空比为百分之50
        PCA_PWM0=0x00;         //使EPC0H   EPC0L为0,具体定义可看头文件
	CCAPM0=0X42;		 //允许P13作为PWM输出
	CR=1;				  //启动PCA计数器
}

2.按键调光

		if(key1==0)				//独立按键	 ,PWM调节
			{
					delayms(35);
			        if(key1==0)
					  {
					  		a++;
							CCAP0H=pwm[a];		//占空比调节
			                CCAP0L=pwm[a];
							while(!key1);
							if(a==4)
							{
								a=0;
							} 

					  }
			 }

各个模块的输出占空比是独立变化的,与使用的捕获寄存器[EPCnL,CCAPnL]有关。当寄存器CL的值小于[EPCnL,CCAPnL]时,输出为低;当寄存器CL的值等于或大于[EPCnL,CCAPnL]时,输出为高。当CL的值由FF变为00溢出时,[EPCnH,CCAPnH]的内容装载到[EPCnL,CCAPnL]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。

sfr  CCAPM0          //PCA模块0模式寄存器    Bit7    Bit6          Bit5        Bit4       Bit3          Bit2           Bit1    Bit0

//位描述                                -       ECOM0   CAPP0   CAPN0   MAT0    TOG0    PWM0    ECCF0

//初始值=x000,0000      x       0       0       0       0       0       0       0

二.位运算

if(ACT_Key == 0)												// 动作检测,切换效果
	{
		num++;
		if(num>4)
		{
			num = 1;
		}
		delay500ms();
	}

 switch(num)
	{								  // 选择显示模式
		case	1:	{
						for(pt=0;pt<15;pt++)	 					   // 	style 1
					    {       									    // 第一个点是直流分量所以不能用。style 1	第一种是直接显示的,适合节奏比较强的音乐
							LEDBuf[pt]=0xffff;
							tmp = dd[pt+2].real;					//2 6 8 10....32由于计算的是64个点	0到N是计算0到2PI。所以只需要看计算0到二分之N所以是0到32有因为一共是16列所以偶数
							tmp = (tmp/8)+1;							//将变换后的功率转换为LED灯的幅值。看里面有多少个16假如为32的话就是0xff做移2位变成11111100然后取反就为00000011(还进行了加一处理此处为算加一的目的是让第一行时钟亮)一次进行16次变成新的LED数组
							LEDBuf[pt]<<=tmp;
							LEDBuf[pt]=~(LEDBuf[pt]);
						}

						break;
					}
		case	2:	{
						for(pt=0;pt<15;pt++)	 					   //	style 2
					    {
							if(refreshflag[pt]<(dd[pt].real/8)+1)		// 第二种是带下落效果的,跟第一种差不太多。
							{
															 //加入了 refreshflag[pt]来进行下降
								LEDBuf[pt]=0xffff;
								tmp = dd[pt+2].real;
								tmp = (tmp/8)+1;
								refreshflag[pt] = tmp;
								tmp = refreshflag[pt];
								LEDBuf[pt]<<=tmp;
								LEDBuf[pt]=~(LEDBuf[pt]);
							}
							else
							{
							 	if(refreshflag[pt]>1)
								{

									refreshflag[pt]--;
								}
								LEDBuf[pt]=0xffff;
								tmp = refreshflag[pt];
								LEDBuf[pt]<<=tmp;

								LEDBuf[pt]=~(LEDBuf[pt]);
			                //	delayms(25);
							}

						}
						break;
					}
		case	3:	{														//	style 3
						for(pt=0;pt<15;pt++)	 							//第三种就是在第二种的效果上取最高的点
					    {
							LEDBuf[pt]=0xffff;
							tmp = dd[pt+2].real;
							tmp = (tmp/8)+1;
							if(refreshflag[pt]<tmp)
							{
								refreshflag[pt] = tmp;
							}
							else
							{
							 	if(refreshflag[pt]>1)
								{
									refreshflag[pt]--;
								}
								tmp = refreshflag[pt];
							}
							LEDBuf[pt]&=(0x0001<<(tmp-1));				   //与第二种区别就是取最高点例如0xff和一个00010000想与	00010000所以只有一个灯亮
						}
						break;
					}

		case	4:	{										   			//		style	4 	  最后一种是第一种和第三种的结合体吧
						for(pt=0;pt<15;pt++)
					    {
							LEDBuf[pt]=0xffff;
							tmp = dd[pt+2].real;
							tmp = (tmp/8)+1;
							LEDBuf[pt]<<=tmp;
							LEDBuf[pt]=~(LEDBuf[pt]);
							if(refreshflag[pt]<tmp)		           	   //首先叫他变成第一种,然后叫最上面那个灯进行下降效果。和音乐播放器的效果很像。
							{
								refreshflag[pt] = tmp;
							}
							else
							{
							 	if(refreshflag[pt]>1)
								{
									refreshflag[pt]--;
								}
								tmp = refreshflag[pt];
							}
							LEDBuf[pt]|=(0x0001<<(tmp-1));
						}
					}
	}

每次按键改遍num的值,每个值对应一种显示效果四种效果注释相当容易理解,我就不过多介绍了。对照着实际效果看代码会更容易理解,效果视频和完整的代码下载在概述里面。

三.点阵输出图像

	 for(i=0;i<16;i++)
		{																// 显示
			//LineInput(0x00);
			P2 = ColScan_2[i];
			LineInput(LEDBuf[i]);
			LineInput(0x0000);	  

		}

void LineInput(uint dat)                   // 单列数据显示
{
    uchar n;
    _RCLK = 0;
    for(n=0;n<16;n++)
    {
        _SRCLK = 0;
        _SER  = (dat>>n)&0x01;         //将数据的值串入输入SER中,然后并行输出
        _SRCLK = 1;
    }
    _RCLK = 1;
}

四.TDA2822输出声音

按照下图进行连接,输入的音频信号

官方的图片照这连就OK了,喇叭选择的是8Ω,0.5W的。效果一般,但还过得去。

参考: STC官方手册

百度百科

LED音乐频谱之输出数据处理,布布扣,bubuko.com

时间: 2024-08-24 19:11:15

LED音乐频谱之输出数据处理的相关文章

LED音乐频谱之输入数据处理

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38023431 通过前面的介绍我们知道,声音信号要通过AD转换,变成我们能够处理的数字信号,然后再交给FFT进行处理. 一.ADC转换 1.设置引脚 void GPIO_Init() // GPIO口的初始化 { P1M1 = B(00000011); //设置P1口模式 P1M0 = B(00000000); //设置P1口模式 只有1.0和1.1为开漏,用于AD P1 =

LED音乐频谱之概述

点击打开链接       转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/37929733 这个LED音乐频谱是我在学51单片机的时候做的一个小项目.今天再看此代码仍有非常多不规范之处,但因为硬件已经送人,没法继续调试,希望小伙伴们引以为戒.写此文主要是想让大家知道当中的原理,知道怎么做固然重要,更重要的是知道为什么要这样做. 一.效果展示 有可能有的人第一次听说过这个东西,但实际上这个东西非常早就有人做出来了. 为了让小伙伴

LED音乐频谱之综述

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/37929733 这个LED音乐频谱是我在学51单片机的时候做的一个小项目.今天再看此代码仍有很多不规范之处,但由于硬件已经送人,没法继续调试,希望小伙伴们引以为戒.写此文主要是想让大家知道其中的原理,知道怎么做固然重要,更重要的是知道为什么要这样做. 一.效果展示 有可能有的人第一次听说过这个东西,但实际上这个东西很早就有人做出来了.为了让小伙伴们能有一个感性的认识先发下我的成

LED音乐频谱之点阵

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/37967455 一.硬件 这里的LED选择直插的雾面LED,亮度可以还不失美观.注意每行要加上限流电阻.74HC138(三八译码器)作为列选,每行都连着74HC595(移位寄存器)实现串行输入,并行输出. 二.软件 led.h #ifndef __Led_H #define __Led_H #include "STC12C5A.h" #define uint unsi

Android 音乐频谱实现

最近由于需要实现音乐频谱,所以今天就为大家普及一下.关于音乐频谱你需要了解数字信号处理的知识,尤其是FFT的知识.简单说就是把时域上连续的信号(波形)强度转换成离散的频域信号(频谱).我理解波形就是信号的强度,或者说音响设备的输出的功率,功率高,音量就大.但是歌曲的曲调是不会变的,因为频谱是不会变的. 频谱反映的是这个这个音乐在某个连续时间段内,声音的震动频率.不知道理解的对不对. 本文的音乐频谱实现是仿照Android Api Demo 里的一个例子实现的,需要Android 2.3及以上系统

H5录音音频可视化-实时波形频谱绘制、频率直方图

这段时间给GitHub Recorder开源库添加了两个新的音频可视化功能,比以前单一的动态波形显示丰富了好多(下图后两行是不是比第一行看起来丰满些):趁热打铁写了一个音频可视化相关扩展测试代码,下面这张就是测试Gif截图,看起来还算过得去,测试地址 上面这些波形.频率的计算和显示都是由纯js代码编写的,并未用到浏览器专有特性,因此可以方便的移植到其他语言实现,比如移植到Android.IOS原生实现. FrequencyHistogramView音频可视化频率直方图显示 此功能源码:frequ

阿里又起社交心,天天动听做音乐轻社交?

乍一听"滴滴求歌"会以为刚更名的滴滴出行,在打车.专车.代驾之后还要做音乐呢,其实"滴滴求歌"是天天动听Android8.2版悄然上线的一个轻社交功能.什么?阿里又要做社交?支付宝刚刚来了个支付社交,难道天天动听要做音乐社交?阿里想要拓展社交业务可以理解,但这也太拼了吧. 支付宝支付轻社交之后,天天动听要是音乐轻社交? 阿里一直都有社交心,投资的陌陌.微博就不提了,只看其自身产品.从全面社交产品的来往,到主打企业社交的钉钉,再到支付宝的支付轻社交,以及最新上线的音乐

-/bin/sh: ./led: not found的解决办法

环境介绍: 开发板:qq2440 交叉编译器:arm-linux-gcc 3.4.1 内核版本:2.6.13 一.针对该类问题从两个方面入手: 1.从权限出发,权限不够会出现此问题 2.从库文件出发,一般是缺少库文件导致的 二.正好我今天遇到的是第二种情形: 1.查看应用程序led需要的库文件:arm-linux-readelf -a led,该命令输出的内容如下: ELF Header:  Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 0

Mini2440 led驱动

Mini2440 led驱动 Mini2440_leds.c 代码: #include <linux/miscdevice.h> #include <linux/delay.h>  //延时函数的头文件 #include <asm/irq.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> //硬件相关的函数 #include <linux/kernel.h>