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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
五色LED音乐频谱源程序和原理图 原件清单
) f4 a/ r; f" C5 }$ H" w
" Z. o9 C, c9 H. x
1 a$ Q% U, K) p3 K; P. E( J3 I
12单片机频闪,五色LED音乐频谱源程序代码6 d( m# `+ I5 i9 P* Z' k. X

6 W$ X% ^4 Y8 y' _原理图如下:
$ B: l* t  F# z4 v  B) x5 ~3 _
$ u/ A/ ~* d" j* A& x3 R* o$ \! d元件清单:2 O" F; v; W/ z4 E4 C5 n
# X. O" T+ C9 L/ s, w6 R, \, N
五色LED音乐频谱源程序:
6 G& V8 C+ ^! e: p* v
#include <stc12c5a60s2.h>2 C: V& e- f  y8 ~7 `& B
#include<intrins.h>
! E! g! m' E% P* `#define BIN(n) LongToBin(0x##n##)  O; v# [) g$ S' J
#define uchar  unsigned char
1 @* v3 C$ }, [9 w0 }9 V5 u6 V#define uint  unsigned int
. O' y, d: J9 x7 g' X#define SAMPLE_NUM 64" k3 |5 O/ s7 H8 D1 t
#define NUM_2_LOG 6
, ], @$ ?- n7 d# C+ P# g, Y#define FFT_OUT_MIN 3
& V( A& v& I  {! ]#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)); {1 j$ B  _' V) p
2 m  r- _* Z; c
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};2 P3 \2 U% I4 ]* l3 o7 j
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  }; : I8 d& \/ Q' B; f5 ?, \' {

8 I/ ~$ c7 |" S* ?1 Z, e9 F9 @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 };$ O! i7 V. w: V* ]5 I. c3 K. I
uchar a[21];
' ^( f# u* v! S4 uuchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;//用于分离1 W: h2 ^9 M+ Z8 @* r

- k$ D7 `0 w) U! p9 `* U2 l; v/*加入数组用于显示相应led灯数目*/
0 b3 V  [$ Y% @" f  T3 |uchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制
; X' w' y+ x; V& Y& @7 Nint xdata FftReal[SAMPLE_NUM];
7 c; t7 e) P! K- V% X, P# m: Eint xdata FftImage[SAMPLE_NUM];
, I; f; u2 W& U# l+ Ksbit p30=P3^0;7 q, V9 g3 M+ }1 d$ ?
sbit p31=P3^1;
6 ^0 j5 _$ `, \% V; j- _. `sbit p32=P3^2;  G9 B- `4 F" F9 i  n% U
sbit p33=P3^3;
, R% E: G0 T5 r0 b3 m- d  O' s4 msbit p34=P3^4;
* H3 d9 i' P7 \  E) n: }* Ysbit p35=P3^5;//9-11的led控制
' G, `2 z# M9 N1 |; a9 @1 R; ?sbit p36=P3^6;
+ X, q) |6 ]/ p/ N1 \9 F; Csbit p37=P3^7;
  {. B0 |8 @# M/ E
/ Z/ m, _% `5 O9 evoid timerinit()//定时器 初始化函数, [0 ^# R8 [( s# |" w4 v
{6 o" Z9 D# ]1 Y2 N3 x5 w+ U
         TMOD=0x01;
1 q" V1 A% ^$ n) Q$ F         TH0=(65536-6000)/256;9 ^5 [8 E, H" c
         TL0=(65536-6000)%256;/ H2 L! M: ^# N) l; ?6 |' n
         EA=1;
0 l! ~9 U7 y( ]         ET0=1;5 m* k) Y7 d/ {. Q9 Q! E6 S: G
         TR0=1;) h" L4 Q7 h3 }/ m1 Z; F4 o# [& s
}. N' j- C8 Y3 J$ I% b1 G5 C! `; E7 `6 @
void disp()6 _9 t3 q* k3 M5 s- r7 e5 u# r
{3 V2 Q! i# C6 B9 e- s
        timernum++;& L5 m+ k0 Y5 O1 J; t/ ?
        if(timernum==6) timernum=1;" A- @- z/ |' k. w
        P2=0;//显示前先关闭
' z, Z' b% A+ w: a2 @        P3=P3&0x1f;4 ^+ t1 G- t) y) ?
        switch(timernum), `- I7 u$ g8 B! k, s$ k' F: D
        {
- b  ~4 ~+ N( w: B% q                case 1:anum=a[0];p34=0;p33=1;p32=1;p31=1;p30=1;break;$ `+ F5 G" O) @( \: ]" p3 Q+ s
                case 2:anum=a[1];p34=1;p33=0;p32=1;p31=1;p30=1;break;
( e, d# q& f+ n" w                case 3:anum=a[2];p34=1;p33=1;p32=0;p31=1;p30=1;break;4 P7 q4 X2 D& Z
                case 4:anum=a[3];p34=1;p33=1;p32=1;p31=0;p30=1;break;
" X+ i  l6 u0 P5 x" V5 Y                case 5:anum=a[4];p34=1;p33=1;p32=1;p31=1;p30=0;break;: Y. b0 L4 \" C* G& K
        }
8 v' _6 {. s  L7 ^( @        //anum=a[10];/*修改可以改变光柱高度 (anum值分开几个部分用定时器区分显示)(a[]内逐加) */
* ~. A1 V: D- H9 Y: Q4 t' ^        if(anum<=8){P2=lednum[anum]3=P3&0x1f;}//屏蔽高三位
# ^- t- R/ s3 L- ?5 ]; M/ j& z        //else {P2=0xff3=lednum2[anum-9];}
! |8 t) d. P& _. S5 n        if(anum==9){P2=0xff;p35=1;p36=0;p37=0;}  a. `& D7 H" j$ g1 W
        if(anum==10){P2=0xff;p35=1;p36=1;p37=0;}. O/ M1 T0 a1 S' b' w
        if(anum==11){P2=0xff;p35=1;p36=1;p37=1;}
+ n& _1 C& h+ x  W. d" T+ [8 [4 x: n# \' z! z4 g
}
% J. D8 n+ x5 E) f
2 r& h+ ^5 p+ a& m0 r$ Yuchar STC_ADC()                   //!!根据数据手册写一个ad读取函数
, p' p, l+ }0 s9 W' A% R6 H- m+ ^  {
8 H2 M! H  ~4 ~7 ]     uchar i;
1 A, b4 e. ]- a0 H- r7 L: |& n        ADC_RES   = 0;7 T+ U0 V8 U# @
        ADC_RESL  = 0;- M7 ]1 @& o" Q5 Z& j  v5 s
  ADC_CONTR = BIN(10001000);( F7 [* x) {) U# o. ]
  i=3;" j4 X' y: K! z8 q$ `7 u
        while(i--);& v3 L. v$ `  v" N; x. M, e5 \+ ?
        while (1)                        |0 V9 @3 P' g6 y
     {
2 s. d+ P0 ~5 U: k4 q         if (ADC_CONTR & BIN(10000))      
$ `! L" |  O/ y% E) D+ z         {
1 |* U: _% F% N5 c( r            break;; E) \8 q8 d: @( t: T
           }3 N. \. }$ r3 i0 x( o* |
     }7 Z. b" l* C3 W5 A' M0 V8 h1 I* @
     ADC_CONTR = BIN(10000000);9 s4 Q3 x9 Y0 S, |( Z8 X
  return( ADC_RESL<<2) ;
2 M5 f; i" V% x, c* x }2 `2 M7 q- i7 V: A
short sqrt_16( unsigned long M)   " }" d2 Z+ a, t5 G
{; G2 g7 _9 Y# u1 H& _
    unsigned int N, i;0 P8 H: ~, O) r# n, A
    unsigned long tmp, ttp; 0 N* K7 ]4 Z. f% ^
    if( M == 0 )             * E& |: x7 a3 W0 w; I* X
        return 0;
( M; Y; S/ v; P5 o6 u. P7 P' m. ], ?. _+ \6 }8 o( {0 o# e$ B
    N = 0;
7 M2 C% O2 @8 _. l; ~( d
" u; m0 g: C* q! g" U    tmp = ( M >> 30 );        * |/ `8 q& ~4 g* _/ S% B+ _
    M <<= 2;1 L* b6 q7 P- o+ Z, a+ B! g& w. P
    if( tmp > 1 )            * E, L* a8 R1 x( R
    {0 A! v$ T% o7 `9 S' _6 Z6 L
        N ++;               
6 m6 B! A. K7 ]& ]+ R9 Z        tmp -= N;
9 l) n# e- \; Z2 Z    }! e: ^" S" B" x  z/ h

8 T1 S5 j& B! B& ?! n    for( i=15; i>0; i-- )   3 W1 ]2 z8 a+ V  }. T8 q+ f- j
    {: L' z6 k1 `1 f' U
        N <<= 1;           
1 `7 V& U8 G& l: V: b9 ?4 ]( }# J8 i) Q+ Y& `; S; B4 ^2 F* R
        tmp <<= 2;
) U" f0 W  c4 C( U8 t) R        tmp += (M >> 30);  
. D1 c! H2 X8 e+ J+ @1 X9 c0 ]+ f2 W
        ttp = N;
$ {0 D) f$ R5 j5 z9 q        ttp = (ttp<<1)+1;
' O9 |3 s( z- s7 ?0 S4 \1 Q0 V) N9 a1 j1 r+ [! ]$ x  B
        M <<= 2;) V3 L( P8 [8 E# g4 L- n4 c- @
        if( tmp >= ttp )    ' \. A& B; }) d/ \! j8 ~/ ^" b* ?
        {7 ]9 Y  j& |' ~% W2 ?; P
            tmp -= ttp;
: p* W$ z6 c: w0 @            N ++;
7 m' u: b& w& r        }       2 d1 s7 Z% X0 T& W) t- g4 y& y
    }6 D* p) \5 ?) b3 l5 J& `3 H$ f5 ~

- K1 k$ W8 q5 C0 V2 S    return N;
$ g" T- r# n3 K- v}- ]6 G; m# ]  K4 N/ W2 m$ U
void FFT()
! B; D1 l( |+ \7 }/ `{0 u; I" H6 i  k7 \% S0 p
register    uchar i,bb,j,k,p,max;2 k9 S/ W; d! S% ^) G
register short TR,TI,temp;) W* o4 x$ ?8 d1 `: S5 d
    unsigned long ulReal;                             ) ]9 I8 {6 f! h; K
    unsigned long ulImage;
: b7 x8 g; K! ^% O, }9 r
" H& Z+ \2 t# s( |* U- _) t4 S2 ^' r9 X
2 A3 b8 N; H9 B" M+ I( Y
for(i=0; i<SAMPLE_NUM;i++)          //此处可以加入自动增益/ K) G" J$ q6 z3 O5 D
{3 C/ H# p1 m5 Q+ ~- w
                FftReal[BRTable] = STC_ADC()<<keep;//使显示保持在一定范围内
$ I$ _, Z( j5 ~1 ?4 T        FftImage = 0;
! C5 ]% G. z2 Y }
+ h' u8 ?: ~. h( B1 i2 P! h2 o
0 i1 b/ t9 K3 r0 v) |8 V" J         keepnum=FftReal[2]/32;//提取等级数
; D% E" Z9 a4 V+ f- F6 d                   if((7<keepnum)&&(keepnum<=8)) {keep=1;}
  R! f; Z% u/ f/ l5 q         else if((4<keepnum)&&(keepnum<=6)) {keep=2;}
' f8 T" n5 \, {1 F7 L. E# X3 \' E         else if((2<keepnum)&&(keepnum<=4)) {keep=3;}3 h7 _2 b% x% Q$ d# L* w
         else {keep=5;}        
" c3 x) h5 W: H. T: Q4 @: K+ F! C% c
    for( i=1; i<=NUM_2_LOG; i++)                          
6 Z/ \! e. }; E/ x* J+ J    {
. R1 j& r8 {; W6 k1 p0 F$ P        bb=1;
  f! |0 Z+ `) b: B$ P1 A+ R9 J5 X        bb <<= (i-1);                                      - T8 Z! |. ~% p6 D2 _5 _
        for( j=0; j<=bb-1; j++)                              M% k' }/ O6 Z; Y! X* y
        { 3 r- S) b6 c- M& h- {
            p=1;5 n1 S5 }$ s8 e, m2 O9 [
            p <<= (NUM_2_LOG-i);            
4 j+ s, h3 P9 C4 j! H$ n  z            p = p*j;# s. u: R- N. I$ t) d9 i3 Q
            for( k=j; k<SAMPLE_NUM; k=k+2*bb)               
4 y, W* D' U( B: J( B% m  C            {
8 Y3 Q9 s+ E7 B$ a5 L' v2 N. I+ j6 ]                TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];
6 E5 T% q3 Z) e! L1 f: z                FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);
) w$ h$ N. w) |# _) [* p                FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);
6 ?! x. Z3 l* k6 E& I; h                FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);7 g, b) Z8 \  T
                FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7); ' v+ t  \5 `5 m+ P8 P: d" A$ h/ e
% X+ o# U2 m; k4 r
                FftReal[k]  >>= 1;            
( |9 i4 |' ~) I- N9 _' ~% n                FftImage[k]  >>= 1; 1 v7 A. z' f/ Z/ P. Y
                FftReal[k+bb]  >>= 1;                 # U6 e0 l! Z5 y! w' C) q! A* J/ Z
                FftImage[k+bb]  >>= 1;
) v) ?; H2 r& a) f/ o- u* y+ E; P0 s' F# v( f1 `4 D6 ~; g
            }  
( `2 l; ?% W: v: Y0 p3 e) U        }
! w- K5 O9 A0 M    }0 ~* `3 d" Q: q/ O% Z' w9 E
    max=0;# j9 H: Q& |! P: [' G) ^
    for( i=0; i<5; i++)//5  f% `* m; V3 e/ L1 p
    {  2 E. w. @. @: M! j; [
        ulReal = FftReal[i+1];
% e* b- Z, N7 p) A% S        ulReal *= ulReal;
3 C, Q) d9 W! s        ulImage = FftImage[i+1];
6 g- S7 u, T; L, k/ a6 Q        ulImage *= ulImage;' A- s2 u6 A$ t+ ~/ k
: P6 K+ a( ^- B& |' P
        a = sqrt_16( ulReal + ulImage );   //修改
% L* P. [. B8 v  {1 @% s0 }# a4 M) g$ O5 Z/ {& A( N- q- n
        if( a < FFT_OUT_MIN )     
" A& q2 t2 T2 P7 X            a = 0;//修改' ]3 D" y" M# m, o% s
        else4 q+ \8 ]1 d* h4 A4 x
          a = a-FFT_OUT_MIN;) W& e/ M# l- R' p
        if( a >max). @1 M5 B4 f% n& z' r
             max =a;
! I7 v% ^) ^' g: g2 @1 _9 e: y+ Z9 |                         //disp();                     
: ^. r- Q* e: J. A2 e" R    }3 |6 q. N3 t. k5 h+ o  w: J1 }
    if(max>11) //11
" l# R; E4 N, q* e" H7 v    {
. w- a0 V" l* A) d$ c  H       max/=11;        
* \! k+ y- r. w! \' j, N. F9 q3 g        for( i=0; i<5; i++) //输出a的5个分离数值7 f' ~7 w9 V4 T" z. a' w( M
        {      ( [  w$ }. Y: y9 ?1 s3 j
             a/=max;( y# X- Z' Q3 c" Q# ?; g3 `
( E& J4 A- f' x& t0 }
        }  
+ E2 B( @0 D+ f9 o% y3 P    }2 B; g' W/ K  U$ C# L5 s
}            
" Y+ S" Q1 Y1 h1 }
3 m+ e7 j* U9 N  U
' y6 T, Q% a7 k. l! B$ cvoid main()6 d$ O$ U) s5 M# x8 T
{
$ M& g0 ]6 |/ A5 M" G        P2M0=0xff;//  (11111111);//P2组设置为推挽输出
( W" }# f; @* \; ?( v        P2M1=0; . L2 X9 H  ~  B  m

5 }: w- P5 E8 f( O5 \  {; H        …………余下代码请下载附件…………" q' f5 Z0 u1 c" u
下载:; M  L0 \0 U! |& F0 D; n4 \
游客,如果您要查看本帖隐藏内容请回复
, C2 T- r+ x. a

5 R; u3 s' y( @+ ]2 E6 V$ r

该用户从未签到

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

该用户从未签到

4#
发表于 2020-8-10 23:58 | 只看该作者
看看,多谢                  
9 X  w) f. V9 n) I$ C
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-18 15:27 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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