转载请注明出处: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的值,每一个值相应一种显示效果四种效果凝视相当easy理解,我就只是多介绍了。对比着实际效果看代码会更easy理解。效果视频和完整的代码下载在概述里面。

1.幅值量化

代码之中有这样一句tmp = (tmp/8)+1有小伙伴可能没看懂,以下我解释下

a.tmp是什么?

答:tmp是你要亮灯的个数。

b.为什么是8而不是其余的数?

答:调试的结果,要综合点阵的行数。声音的大小考虑。假设你换成16,那么你要提高你的输入音量。

再说的简单点,这个8乘以行数要小于频谱的最大值(或者基本不超过)。所以说即使是如今。我调高输入源的音量或者减少输入源的音量,频谱也会发生变化。8是一个我兼顾了输出声音的大小(由于这个设计中是能够输出声音的)。调试出来的一个值。

c.还是不明确为什么要这么写?

答:我们要LED量化频谱,你的行数相当于分辨率,终于人眼要看到是是几行,假如你是10行那么你最移的位数是定死的,超过10显示的是全亮(没考虑+1,第一行必须亮的情况。为了美观)。那么你必需要控制你这个频谱可以大致显示到屏幕中,所以正常的tmp必需要除一个数来压缩它的频谱。以下我画一张图:

假设不处理直接左移则会出现全屏皆亮的情况,处理之后。则可避免。

三.点阵输出图像

	 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音乐频谱之输出数据处理的更多相关文章

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

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38023431 通过前面的介绍我们知道.声音信号要通过AD转换,变成我们可以处理 ...

  2. LED音乐频谱之概述

    点击打开链接       转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/37929733 这个LED音乐频谱是我在学51单片机的 ...

  3. LED音乐频谱之点阵

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/37967455 一.硬件 watermark/2/text/aHR0cDovL2 ...

  4. Three.js + HTML5 Audio API 打造3D音乐频谱,Let’s ROCK!

    继续玩味之前写的音乐频谱作品,将原来在Canvas标签上的 作图利用Three.js让它通过WebGL呈现,这样就打造出了一个全立体感的频谱效果了. 项目详情及源码 项目GitHub地址:https: ...

  5. STM32通过FSMC驱动3.2寸液晶屏实现的音乐频谱

    视频演示: http://player.youku.com/player.php/sid/XNDcyMDgwMTE2/v.swf 源码下载: lattice_ music _tft.rar(1.42 ...

  6. android获取和展示音乐的频谱

    做了个音乐播放器 就一直想做个加一个音乐频谱的展示界面 觉的这是一个好玩的东西,可以将耳边动听的声音形象化,仿佛眼前可以看到声音一样. 但是我在文档的开发者指南里没有讲任何有关音乐频谱的东西,最后还是 ...

  7. 【玩转单片机系列001】 08接口双色LED显示屏驱动方式探索

    前些日子,从淘宝上购得一块08接口的双色LED显示屏(打算做个音乐频谱显示器),捣鼓了好几天,终于搞清楚了其控制原理,在这里做个总结,算是备忘吧. 1.LED显示屏的扫描方式 LED显示屏的扫描方式有 ...

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

    这段时间给GitHub Recorder开源库添加了两个新的音频可视化功能,比以前单一的动态波形显示丰富了好多(下图后两行是不是比第一行看起来丰满些):趁热打铁写了一个音频可视化相关扩展测试代码,下面 ...

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

    环境介绍: 开发板:qq2440 交叉编译器:arm-linux-gcc 3.4.1 内核版本:2.6.13 一.针对该类问题从两个方面入手: 1.从权限出发,权限不够会出现此问题 2.从库文件出发, ...

随机推荐

  1. 图的遍历(DFS、BFS)

    理论: 深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广: 广度优先搜索(Breadth_First Search) 遍历类似于树的按层次遍历的过程: ...

  2. 数据库中简单的增删改查(CRUD)

    一切都是基于数据,而对数据的管理都离不开数据库.最近学到数据库的简单操作,所以写下这篇文章,总结一下学习到的知识.浅陋之处,多多见谅. 补充一下:一直弄不清SQL Server,Mysql ,以及Or ...

  3. RESTEasy 3.X Helloworld

    最近呢,RESTEasy也升级了.升到了3.X. 官网:http://www.jboss.org/resteasy 集成使用也非常简单(相比SOAP而言) 第一步:下载jar包 resteasy是托管 ...

  4. Android UI布局之FrameLayout

    一个FrameLayout对象就好比一块屏幕上提前预定好的空白区域.然后能够填充一些元素到里边.例如说一张图片等.须要注意的是,全部的元素都被放置在FrameLayout区域最左边上的区域.并且无法为 ...

  5. SEO 外链 内链 的定义

    外链 外链就是指从别的网站导入到自己网站的链接.导入链接对于网站优化来说是非常重要的一个过程.导入链接的质量(即导入链接所在页面的权重)直接决定了我们的网站在搜索引擎中的权重. 外链是互联网的血液,是 ...

  6. Window.open 实现导航与打开窗口,导航到一个特定链接地址,也可以打开一个新的浏览器窗体

    语法 window.open(strUrl,strWindowName,strWindowFeatures ,replace) strUrl: 打开资源的地址 strWindowName: 表示窗体名 ...

  7. MVVM模式

    MVVM的最大缺点貌似是,报错后不好找, 在安卓6.0的时候出现了一个工具叫做databinding,其中呢主要是用来帮助实现MVVM模式的快速开发   在使用databinding的时候我们需要做的 ...

  8. (原+转)VS2013:正在从以下位置加载符号

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5158020.html 这段时间启动调试时,vs2013加载时间很长很长...然后下面网址给出了解决方法 ...

  9. java实现web文件无刷新上传

    最近在做如何实现文件上传的相关工作,查阅了很多资料,发现网上写的都不是很直观,且调试复杂,经实验成功. 把form的target设为页面里一个看不见的iframe,这样上传时候就不会刷新页面了,比如 ...

  10. 【译】JavaScript 开发者年度调查报告

    截至目前有超过了 5000 人参与了(该次调查),准确的说是 5350 人.我迫不及待的想要和大家分享一下这次调查的细节.在分享之前我想要感谢参与调查的每一个人.这是 JavaScript 社区一个伟 ...