找回密码
 注册
关于网站域名变更的通知
查看: 573|回复: 3
打印 上一主题 下一主题

五色LED音乐频谱源程序和原理图 原件清单

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-21 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
五色LED音乐频谱源程序和原理图 原件清单; [; _/ J$ w  {, W3 E" L2 _8 A

5 w) H; h+ n' @+ b3 G
' _' k7 Z1 ^/ y5 g, P6 q4 U
12单片机频闪,五色LED音乐频谱源程序代码, ?) D0 [5 s1 g# s, j; f

, _. Y) s6 {+ p; L, [( z7 |原理图如下:9 v" u# t: u/ M6 H

8 g" f1 x* ]  l0 L- @元件清单:# g2 N3 f2 S% X4 m
% k: S4 D! b4 s% d1 g
五色LED音乐频谱源程序:

: c: [1 a: T: x$ v' r8 U# j% o) X#include <stc12c5a60s2.h>
% V4 q+ o2 x3 Q/ O#include<intrins.h>
4 _5 X  d" w* P; [4 d2 x#define BIN(n) LongToBin(0x##n##)1 U* d) T3 O) |
#define uchar  unsigned char7 O2 A5 K" B+ s4 f+ ]
#define uint  unsigned int  W9 H2 t1 t% a* K) }
#define SAMPLE_NUM 64
" t! ^0 @0 L( h4 z#define NUM_2_LOG 63 Y3 g) ^) y5 ~" y  k' K; z
#define FFT_OUT_MIN 3' _( ?& b" i& [, V
#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))
; b  K8 e% U/ G$ z% P9 J. h& [5 Z) @& t) w9 a4 v
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};# @; o; |. p- |* H3 ^
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  }; 9 ]. K9 z: R4 d/ n) L( h

' B+ Y" z  ]* v) N6 Z9 \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 };
( J; H4 `  O. j4 f9 F8 C/ ^$ n" yuchar a[21];
( c$ d+ S0 [0 ^: Wuchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;//用于分离
- R( _. w% a# E; r/ @/ s+ m9 b: S5 n8 s% ~
/*加入数组用于显示相应led灯数目*/
( A, U( i* z6 Tuchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制, X9 G  ]0 o! k
int xdata FftReal[SAMPLE_NUM];
/ e' ~* {9 U8 O( {: g) mint xdata FftImage[SAMPLE_NUM];2 X! w: @7 U' G& a' }
sbit p30=P3^0;
3 p5 w# V& q; p' d9 `; r. |- wsbit p31=P3^1;! X* \# c0 F- s/ [% E
sbit p32=P3^2;
. O4 \3 D- X5 X  Gsbit p33=P3^3;
$ h( @9 k' c# psbit p34=P3^4;
7 {; x& S. P) U0 ?sbit p35=P3^5;//9-11的led控制8 L/ \+ y) Y* `
sbit p36=P3^6;$ ]/ w& w( x4 ~( I# T
sbit p37=P3^7;
9 O! ^  D  r6 S0 s" L$ i. y/ H9 G5 |" f/ o9 _/ O% x
void timerinit()//定时器 初始化函数
4 i, E2 b8 o+ r+ k6 I{. A* e' g/ b+ c- ~. V/ q
         TMOD=0x01;
; M4 @9 k9 G8 K2 u& l         TH0=(65536-6000)/256;
  A- ?+ j* U& G: i; H4 s         TL0=(65536-6000)%256;
! X# a. F2 v% F, c         EA=1;  O" P0 G# g2 ?7 o7 t2 Y
         ET0=1;
" E! \+ @5 k, }. t: V/ U! A7 r         TR0=1;( W2 Q: `/ Y; y! M3 d2 L
}# D, D1 K% G0 p, z0 E$ g& E; t2 `! E
void disp()$ O# q0 A% x' b& `
{
( u2 |" U$ h( A, P9 P        timernum++;: X7 F* c! I" O& d+ p; l5 A
        if(timernum==6) timernum=1;
0 Z8 o* Q5 e: I: i        P2=0;//显示前先关闭
% Q0 X; ^+ z8 y- d        P3=P3&0x1f;9 i& U* s: }; X3 l6 j8 K4 o
        switch(timernum)/ I  Z: X) {) I( D1 h0 v$ L
        {
* K. u: C( j' N' Q3 ~0 C                case 1:anum=a[0];p34=0;p33=1;p32=1;p31=1;p30=1;break;
, t) V/ T$ G& v  k3 l% q1 S3 g                case 2:anum=a[1];p34=1;p33=0;p32=1;p31=1;p30=1;break;2 v. I" \, U. B  A: C
                case 3:anum=a[2];p34=1;p33=1;p32=0;p31=1;p30=1;break;- T# k6 O( F( u  W! ]) i# X
                case 4:anum=a[3];p34=1;p33=1;p32=1;p31=0;p30=1;break;
( V# ^6 N9 d+ c8 q                case 5:anum=a[4];p34=1;p33=1;p32=1;p31=1;p30=0;break;: n/ H& o5 {. P! V1 p
        }8 `2 G. R" e. Z+ a
        //anum=a[10];/*修改可以改变光柱高度 (anum值分开几个部分用定时器区分显示)(a[]内逐加) */
+ P# m' h9 b9 A7 g7 L        if(anum<=8){P2=lednum[anum]3=P3&0x1f;}//屏蔽高三位# z; ^8 H; A) w7 |6 e' f; t. b% Q
        //else {P2=0xff3=lednum2[anum-9];}3 ]% p- W4 J0 k  Y) L2 x, M* d9 g
        if(anum==9){P2=0xff;p35=1;p36=0;p37=0;}5 e! x( [' [+ S' J
        if(anum==10){P2=0xff;p35=1;p36=1;p37=0;}* u3 _' W6 W' n
        if(anum==11){P2=0xff;p35=1;p36=1;p37=1;}
4 D' B. G- K& ]3 J% E( ], ~8 K3 m8 @3 B5 L! B1 j
}: \7 z4 u: k& O/ }
* D  i5 H3 D4 c8 T8 ^, r9 s2 |
uchar STC_ADC()                   //!!根据数据手册写一个ad读取函数2 P/ O; A, O" n$ [/ G0 `, s
  {
& ^$ j0 U% E& R2 y8 v+ e5 a     uchar i;3 E$ M9 p; [+ t6 Y& V+ r
        ADC_RES   = 0;$ E3 _7 [' i9 V% ~) g' t6 S, o7 M- ~
        ADC_RESL  = 0;
5 ]) C, }# P; Y8 n0 L% j  ADC_CONTR = BIN(10001000);
/ |1 ~2 R7 r1 r  i=3;' V" j& c& n! U! S+ O2 f2 u
        while(i--);* t$ Q. Y7 @9 D2 v
        while (1)                     
( p  r1 k& x6 q     {
! m: \- A* X: c: O, Y: H; ^         if (ADC_CONTR & BIN(10000))      
8 s9 P6 x$ \% `: O" f8 }" m8 _/ k         {
' D8 T- H, X/ G            break;
& [0 `' c, U# s. z- h/ w           }
6 ]5 G& Z0 V( G: H  K- _     }
$ J+ f) S6 t- a     ADC_CONTR = BIN(10000000);. k! p1 U. C0 e# D+ X6 ^
  return( ADC_RESL<<2) ;1 l1 J! v4 I$ c7 j) W
}6 ?7 u$ l2 g" J8 H7 B' @
short sqrt_16( unsigned long M)   # h+ X: v. U) I7 F& E1 o7 C' N
{
7 s3 o0 h0 Z5 P% K9 B: ~9 Z    unsigned int N, i;6 E' y0 g# Q2 \; c) M- B1 |8 c) \
    unsigned long tmp, ttp;
# t6 I+ s, z' n) O    if( M == 0 )             8 [7 H9 j; \8 u& n6 P) ?7 v
        return 0;
, C  f8 a6 l. c& \0 O. L& T( o1 U
    N = 0;
6 ?/ ]& r$ `; [  j, K# p/ f* ^2 h. [4 B* O0 c0 U4 l! x2 D
    tmp = ( M >> 30 );        
. S! _! ^' c. h. J+ @    M <<= 2;
5 ~+ k$ W/ S8 s% N9 Z2 T: t; W    if( tmp > 1 )            " Q. F" w* I5 n5 {  ^  I$ `4 {
    {' f' N9 V( q! M+ a/ P
        N ++;               
; i5 a) P+ E8 t8 ?        tmp -= N;
, p& `3 ~- I6 U+ T( I    }
# }: m+ C) f" I) D
. L. {/ e' j8 g# n) S9 F( T' Y    for( i=15; i>0; i-- )   6 R/ w5 B: x7 W5 z4 X# C& n, }
    {: f6 W& x: M& p0 W2 Z
        N <<= 1;           
) H. f% e% J' D, s, i# {1 M5 k! j0 W' M8 A  R% r9 g4 d, o0 r
        tmp <<= 2;
- a- n0 z7 L/ F) i. |2 [! T0 Z$ \        tmp += (M >> 30);  
. s" `- F3 Q7 M" d5 T
- z" l6 D6 D* Q( }2 Y        ttp = N;3 Q0 e! e9 w2 T  N
        ttp = (ttp<<1)+1;4 T/ a2 c4 ]5 E/ G+ k8 X; r, k- {

# t0 ^$ f3 ?" ^  b, d        M <<= 2;
5 ^7 \% l5 ?3 O9 ^6 h' d. u        if( tmp >= ttp )   
1 Q* [! B) Z  C0 n        {
: ]/ S& m. R* ^4 r2 a            tmp -= ttp;. p7 F# r6 p% j7 T0 b' D% g/ F
            N ++;% g% L1 J+ C2 d8 D; y! N% T/ ]
        }       0 O( ]  I) `% D& c% ^* t
    }
3 N& X" p' {+ M6 H' D  l& w7 Z# v( y" E3 F2 Q- P  ]
    return N;
2 n7 r, _0 N( N+ b/ m}
6 O0 B* F6 j/ W- b# ovoid FFT()
. H4 i+ A0 u9 w: ?8 j# i* J. a{
9 V5 |: K, c* G; g register    uchar i,bb,j,k,p,max;
. ~7 T, O# j6 z* b register short TR,TI,temp;
! W3 g9 {" Q# |' {/ s; c4 F) v7 c    unsigned long ulReal;                             
- h# d( G" x* L! A$ `5 s    unsigned long ulImage;
& I3 V4 P9 v* A6 ]+ \; P6 M" f. f6 O" \& F5 L% Z. o2 _- P2 y' o

2 @; R* U6 y# e2 N6 E% w2 D: o' y2 q! Y9 y, r
for(i=0; i<SAMPLE_NUM;i++)          //此处可以加入自动增益
* G5 T3 ~; H- b {
, X6 Y8 h. L# b9 j7 l% i* h                FftReal[BRTable] = STC_ADC()<<keep;//使显示保持在一定范围内
1 t1 W8 P* j$ {; ~$ Z% k  v        FftImage = 0;- G, `1 B/ z! E( V" A5 o" O0 E" g
}
9 m0 W% }8 w$ V
% x# k7 i2 u3 P0 @6 i; g3 j         keepnum=FftReal[2]/32;//提取等级数/ n! B+ a" ~, e8 Z2 `7 {4 R
                   if((7<keepnum)&&(keepnum<=8)) {keep=1;}' O/ m5 q' w2 G- f5 C
         else if((4<keepnum)&&(keepnum<=6)) {keep=2;}
) u. f7 L+ Y$ o( p' F         else if((2<keepnum)&&(keepnum<=4)) {keep=3;}
5 E8 N2 _: _1 \( t* |         else {keep=5;}        7 q( b# \3 y9 d7 [  h

" k/ V/ w" b! U) I) J0 ~" {    for( i=1; i<=NUM_2_LOG; i++)                          
) K8 E- G. v$ l) D    {
/ \/ h, v; O0 \: T$ n        bb=1;4 V7 c3 Q: R# @* X4 D
        bb <<= (i-1);                                      2 W7 _# ~* g: _5 W
        for( j=0; j<=bb-1; j++)                            ! P7 X6 ]9 H$ s/ ]3 c4 E
        {
* a- |! A6 g: Q            p=1;
/ k" p1 N+ X/ G/ m: z            p <<= (NUM_2_LOG-i);            5 V- p9 y0 h/ ?
            p = p*j;% E* K% c0 A) Z
            for( k=j; k<SAMPLE_NUM; k=k+2*bb)               ; v  r( |$ x1 w+ r  {6 h
            {
5 \: C# b2 L4 i) \1 d0 g/ t+ G: c                TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];0 O/ E& X! K/ `) m8 e
                FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);
) w1 P5 u$ n: w4 \7 o1 f& s                FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);4 O' S2 v) z$ x! ?' a+ H  U
                FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);
5 a7 f, D, k7 P  T( q                FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7);
  N" {; X) K* ^! U4 T) s4 h6 M
0 l3 J1 g6 d% N2 z1 M' T3 ]& Y' V& X                FftReal[k]  >>= 1;            
2 s& f: k/ M1 i5 e5 ~                FftImage[k]  >>= 1; : D+ w7 o' c$ @+ z$ J
                FftReal[k+bb]  >>= 1;                 2 M3 z, m' p/ _; t- \
                FftImage[k+bb]  >>= 1; / n" d4 P+ `6 N
* b) [* A, _) e( {- {
            }  
$ L: l" [$ A- B        }$ F. r2 J7 J6 s4 @1 s0 L" |0 C
    }
4 |* t; Y8 W0 ^, ~9 M    max=0;
' |1 c6 Y9 H8 e6 o) H    for( i=0; i<5; i++)//5
& h" l" C: Q" O, V5 z9 j    {  ! O) {8 n8 \+ x3 h
        ulReal = FftReal[i+1];5 G; P- h6 w: Q# L, @: j% X$ l
        ulReal *= ulReal;
& U0 t4 C* l. j" x2 N2 L        ulImage = FftImage[i+1];
) G% R4 {7 }8 q; f        ulImage *= ulImage;" N* V. e7 e9 S# p: Q7 y0 c- G, C

, @2 Q3 f4 x2 U* s. e$ a        a = sqrt_16( ulReal + ulImage );   //修改0 j- x  m; X; T$ m7 H

! W: [0 }4 k8 ]; u& B$ h        if( a < FFT_OUT_MIN )     
3 u' n( Y3 Q8 i4 y6 W$ q            a = 0;//修改& |1 \) D( f$ U0 p
        else2 o9 ~" A7 N8 U
          a = a-FFT_OUT_MIN;( E6 u: c2 {; U. |8 b8 @7 ]5 s
        if( a >max)
9 }8 R- M5 b, M: {4 ~& b  p: _             max =a;
$ W9 \7 m5 }$ X% E+ \                         //disp();                        S4 C/ P- J: u! |' F, ^: U$ b3 s
    }
% L, b; ~) F* Q7 g) [% e5 \/ R    if(max>11) //114 ]7 v- G7 i# v" s, j
    {% z, \% E! L6 E4 A' D6 f
       max/=11;        / n0 M7 }. Q7 B
        for( i=0; i<5; i++) //输出a的5个分离数值
1 a5 n$ J' |: X: z4 ^+ _8 \+ A        {      
1 x! D0 E9 D" [- j3 c$ }             a/=max;
5 P  L; K! Z, w/ ], o5 g& e: |. ]2 V6 I/ @; @5 Z7 T! ?
        }  & y( ?, ~+ c  P: O
    }- d0 i! ^+ d- \6 ~- X1 B
}             $ k9 d3 B* N# x  {8 c
( J. ?9 q/ c  @& ?: l
* S8 ?' ]" x! M
void main()
/ Y! G" o& o; M  ~9 k! [# c! m1 C{* ^9 {% j) |+ }; _5 R$ F
        P2M0=0xff;//  (11111111);//P2组设置为推挽输出/ ]3 h3 {; q" D, u: |
        P2M1=0; ) @8 e: J- m1 ?
8 F" W& T! Y* h: x+ Y
        …………余下代码请下载附件…………
4 J1 m/ r5 E; T" A; X下载:( \; I# `/ s5 q8 x
游客,如果您要查看本帖隐藏内容请回复
) `) |* Y6 y, A7 b: L+ o

1 p% {+ e( [# ~' y: t

该用户从未签到

3#
发表于 2020-5-26 13:36 | 只看该作者

该用户从未签到

4#
发表于 2020-8-10 23:58 | 只看该作者
看看,多谢                  
! i; M* v! Y7 _3 D; u+ e: U
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-22 05:15 , Processed in 0.093750 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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