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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
五色LED音乐频谱源程序和原理图 原件清单
' i0 Y& v6 V/ t3 T7 @- T; X- E% V% a6 v) f- p

  e9 Z9 T3 A, i12单片机频闪,五色LED音乐频谱源程序代码
2 W% g5 d) Q# u( n1 ^6 N; G; P
# }4 R& i* `& S7 f, Q; R' Z. L原理图如下:
4 {6 K9 ]1 o/ {7 K+ Q$ e 0 f8 Q6 v( c- u4 P9 R
元件清单:8 G* y1 ^/ e# x# R- i. l
7 w% b/ g5 j/ C7 L) B6 T
五色LED音乐频谱源程序:
# C  Z# y7 F, }# o; E5 q' M7 _
#include <stc12c5a60s2.h>' A! J2 h& u, B4 x+ Y& A! x
#include<intrins.h>
& D, ?- V( f0 s- k4 N#define BIN(n) LongToBin(0x##n##)( }; S: f  ^1 o0 {' x% H7 T
#define uchar  unsigned char
$ U! y# u. T; c& ^4 e- G9 t#define uint  unsigned int
3 ^8 F7 ^* n  G0 Z3 ^) T#define SAMPLE_NUM 64
. H0 n! U8 F' a4 k0 ?/ L#define NUM_2_LOG 6
) L+ f$ d. k( C+ L% {#define FFT_OUT_MIN 30 r! E- }0 w* J/ l# c: b
#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))' h: N% ]) b9 }6 a! y

9 W5 B. ]( \- V% r# ?; Xuchar 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};  V! ]* L2 ~; c0 G) q( J& c
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  };
; ^5 X( X3 f4 b' O$ N1 d$ Y6 Q& I, c
4 C) b. i& J& {, a0 L2 {! \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 };& {6 b. J: i; H) E
uchar a[21];' C4 |6 _& K* F  I
uchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;//用于分离
9 N, O# n- G1 G/ m3 j2 ^
! @2 q8 p$ |! p3 a4 E  i/*加入数组用于显示相应led灯数目*/4 N( ^0 b) l" O7 R- w
uchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制
" G1 y' `. P" U" ~" u- S% E* ^7 Tint xdata FftReal[SAMPLE_NUM];( p; v- h: u" z# c) E9 b0 U) Z0 H
int xdata FftImage[SAMPLE_NUM];
* v9 r# g: a8 Y9 B# B1 G; h' g! lsbit p30=P3^0;" a( T4 z( O, X5 Z
sbit p31=P3^1;+ N8 c: R8 u) c% h% o( S
sbit p32=P3^2;
# \# i9 I2 y7 Bsbit p33=P3^3;
% Q9 [4 N. p, a, T4 b; Xsbit p34=P3^4;2 N, R  I. P6 P9 ~
sbit p35=P3^5;//9-11的led控制! R! L$ Z2 K( A" j
sbit p36=P3^6;
5 w, j4 y$ m' ?, V+ t- `4 s  Bsbit p37=P3^7;
; T3 `' g) H$ u, w' o0 H. |* [4 J9 K) w# C# f
void timerinit()//定时器 初始化函数) r& k/ c; {& t; k9 Y
{
! [1 h" M8 l4 T& i& D         TMOD=0x01;& f* z; U) A* i2 u! S) \5 P# d
         TH0=(65536-6000)/256;
2 Q. R6 L2 G. I3 |+ C         TL0=(65536-6000)%256;
$ w' t: `. M( I& [         EA=1;
# L- X, v9 a/ J: d  @         ET0=1;( H7 o# S$ @1 ?& p7 B' I# M0 [
         TR0=1;6 E4 S. C2 ^4 n! _- s
}3 W7 i7 e9 y; l1 j# F& C9 Q
void disp()- v- p& ^+ }5 m2 @- t7 w2 X
{8 G3 J! P) @0 ^2 L: t" g
        timernum++;
9 p; _7 o2 f' d! S7 G- ^( X        if(timernum==6) timernum=1;
. a2 W  E! i+ K1 s) k2 |9 I        P2=0;//显示前先关闭& k5 t- w. H; u
        P3=P3&0x1f;$ S: s' V1 ~' r
        switch(timernum)4 ]) E& ~* ~; d- I9 n1 I( `
        {5 `: Q# I8 d* B0 ^$ C/ w2 L" K
                case 1:anum=a[0];p34=0;p33=1;p32=1;p31=1;p30=1;break;* c) L8 ~2 Q! i6 ~$ X$ ^
                case 2:anum=a[1];p34=1;p33=0;p32=1;p31=1;p30=1;break;8 [3 Z( a3 s- o* s
                case 3:anum=a[2];p34=1;p33=1;p32=0;p31=1;p30=1;break;
# D' L0 x* g7 o* Q+ H# C                case 4:anum=a[3];p34=1;p33=1;p32=1;p31=0;p30=1;break;
1 `6 v6 i+ C8 J* J6 j. b3 a                case 5:anum=a[4];p34=1;p33=1;p32=1;p31=1;p30=0;break;
7 h2 v& P% U% i        }
( X; p( Z9 ~9 J3 X        //anum=a[10];/*修改可以改变光柱高度 (anum值分开几个部分用定时器区分显示)(a[]内逐加) */8 y+ U+ B8 q/ Y' Z
        if(anum<=8){P2=lednum[anum]3=P3&0x1f;}//屏蔽高三位3 `4 G& ]8 D5 q  ]5 K+ [
        //else {P2=0xff3=lednum2[anum-9];}
/ P! j& ~0 J- U) J) X% ?        if(anum==9){P2=0xff;p35=1;p36=0;p37=0;}
, M# q3 O" \+ ?3 G: u        if(anum==10){P2=0xff;p35=1;p36=1;p37=0;}
) c6 X) b. V- n0 _" t8 B        if(anum==11){P2=0xff;p35=1;p36=1;p37=1;}6 S$ R) P2 c: q4 }8 ^& u4 t

2 ~9 A4 @$ Z( s/ R. J}" c! R4 H, [4 f1 P
% i+ R- ^; j( W: s3 f
uchar STC_ADC()                   //!!根据数据手册写一个ad读取函数( f6 s- I; `1 x
  {" ?! r2 {" C$ ^5 @: }9 C
     uchar i;  `# V  }" E* |/ Y# S: J
        ADC_RES   = 0;- ?5 i7 ~6 L+ M' H* D+ t
        ADC_RESL  = 0;
; y  u3 T: _* K  ADC_CONTR = BIN(10001000);; N0 q9 J9 f* K! @' C- M( c
  i=3;' H' H" e& B' `) y) e5 s
        while(i--);
- I  a  }7 F# g+ h        while (1)                     
- I9 k2 Y" D2 X4 W* L. O! n     {, x/ C$ p4 E9 \3 K! z; B
         if (ADC_CONTR & BIN(10000))      
/ ?3 m6 ]6 T% b         {
0 }5 s8 j7 H8 N1 ^5 t6 n* t: s            break;- ?1 _& n/ m0 K' U
           }
3 c5 ^  ~3 @) Z& V3 g     }" `5 r: `0 n1 a6 e7 J- P  l" c! Y
     ADC_CONTR = BIN(10000000);; L% o1 @7 I! ]0 t  Y" `1 t
  return( ADC_RESL<<2) ;4 ]. {' E: l( ?9 R
}
8 `1 P% H0 A9 Z5 r7 Qshort sqrt_16( unsigned long M)   ! _7 ~6 e. A' ~$ s# c: B
{: O  Y/ B3 K0 Y% _: H9 X
    unsigned int N, i;9 q7 {' H1 `0 V" L1 X6 m
    unsigned long tmp, ttp; 9 O# b1 O8 _1 z* V
    if( M == 0 )            
% ?/ ^' }2 }  y  g7 d( K" P: c        return 0;
+ s' X2 f$ [  R) f" a. V* r7 M$ x
$ G6 ]0 {! n- L2 O1 C  s    N = 0;
4 X6 D+ h* {6 `( _0 S( M7 f. ?+ _! C" Z4 A, c, i) M$ A- w4 U
    tmp = ( M >> 30 );        
& c3 i5 ~% a) I" ^7 j    M <<= 2;
% Z0 a0 k2 E  I" g4 C    if( tmp > 1 )            8 A0 d5 n' m$ A
    {; q$ m4 a- n) r
        N ++;               ) O9 l0 C" ~# |
        tmp -= N;
( d; P5 x4 y- W0 _    }
2 v% s- e, Y  q+ G/ M$ F. _' V0 X1 s# D
    for( i=15; i>0; i-- )   ( [6 P$ |3 e" w* z) }! }7 z
    {+ ?6 l' c/ {. E, ?( I! \7 _7 V6 z4 V7 X
        N <<= 1;           
5 N3 e- [  H% f: A3 Q' X1 O) S
0 n1 V$ C4 R% O8 N( R        tmp <<= 2;
2 ~8 D0 ]2 E  S+ t        tmp += (M >> 30);  
$ i8 @8 N% O! z! @4 v9 Q  q3 o* E1 N) f( m$ n9 F* H
        ttp = N;1 J2 Y8 H$ P& Y# o" m% w1 K: I
        ttp = (ttp<<1)+1;% F" k2 x" v, r

* y' r( _* M( {5 r) P1 I        M <<= 2;/ h: W$ G3 B0 N5 t, f* z- q
        if( tmp >= ttp )    3 P2 d/ v8 W# E4 T3 x
        {, y7 R% R; q. z' o( D* X1 I
            tmp -= ttp;' s+ t# S6 N9 l
            N ++;4 g2 K. B" x# \+ a: g/ o
        }       ) B1 Y& \) B/ |3 u; y6 W
    }
6 t' g3 ?8 Y  z  Z
9 X8 J8 L% J  |$ n  J& ?; }    return N;5 M1 ~+ i, r5 c' d9 h6 _. s1 V
}5 j; x2 g# Z4 U
void FFT()
: }6 \2 f  @; ~8 W& Z! K* _{
, I2 V* P: _) n# B( P register    uchar i,bb,j,k,p,max;
9 `, I, X5 k( X( L- y register short TR,TI,temp;: g2 a/ w) E7 b# R% a% O
    unsigned long ulReal;                             * O1 q% a5 `! h; E
    unsigned long ulImage;
1 ?# v* R* ?6 c, I  X2 N
2 g. O/ v" h  F4 z* I
! E; e* S5 d9 s4 h) ~2 @+ {8 \  r& g# N6 r
for(i=0; i<SAMPLE_NUM;i++)          //此处可以加入自动增益
; ^/ f8 ]+ k2 |% Y7 R4 M {
$ w# [+ \9 t4 S! M                FftReal[BRTable] = STC_ADC()<<keep;//使显示保持在一定范围内
! k0 H  S& A. G- _        FftImage = 0;
+ n) `. J" P) D9 S" r) J/ ^5 R4 f }
6 n* U- _/ p- O3 C# A
9 A; e: C7 b5 C% v6 h& c         keepnum=FftReal[2]/32;//提取等级数. c4 H. d: m# q! R1 t! [
                   if((7<keepnum)&&(keepnum<=8)) {keep=1;}' R0 F; J5 O# W
         else if((4<keepnum)&&(keepnum<=6)) {keep=2;}
! h  Z% f7 G5 A. f1 h; ^         else if((2<keepnum)&&(keepnum<=4)) {keep=3;}
/ u7 m% N  [8 r) w% _$ b         else {keep=5;}        
! c( |, W# T# P, H2 }: q
. X$ m4 Y/ ^2 [! R7 l    for( i=1; i<=NUM_2_LOG; i++)                          & ^, q0 E$ o2 i/ O4 m
    {
7 }  c9 p, ^& U# K/ b; Q/ A        bb=1;
9 n6 P$ X/ ~7 D$ I        bb <<= (i-1);                                      - X& P- b6 j+ e
        for( j=0; j<=bb-1; j++)                           
$ {0 x- ^0 S& `- W        {
! A8 j  c  u7 u0 j            p=1;) }2 H6 x' N$ D9 p
            p <<= (NUM_2_LOG-i);            
4 I! n, p7 c( S: {            p = p*j;
. F& V. X. @0 ]' T+ D. J5 `            for( k=j; k<SAMPLE_NUM; k=k+2*bb)               0 R6 D+ y+ v% |( s/ I4 A
            {
$ Z! r" Z/ P5 I/ b. T                TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];
- \) d( Z, |/ T: Z5 ]                FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);
: H& h' W% v, G  g( H3 v                FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);
, J+ m: X' G) n  v. H  ]                FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);
1 m6 i* i3 v* v; C8 @) M; P3 X' v                FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7); " G0 H5 A$ i- ?$ j4 c
7 e' [0 {. K& ?: i
                FftReal[k]  >>= 1;               `: C1 o$ f9 [( ^# F. p, A
                FftImage[k]  >>= 1; ' u8 F# V- O+ V! [* A# [& W0 q9 T$ q
                FftReal[k+bb]  >>= 1;                 
' K* L* |: h4 q9 j% O                FftImage[k+bb]  >>= 1; ' F! i- l( R. b, q1 l/ `. g
& b0 v" |, F7 Q3 q
            }  5 p! o- q* @& u7 p
        }! i' T* ^9 a: D, m" V
    }
. n7 L- r) R& B" c4 j# }+ H& i    max=0;
/ Y) ?. B# ]3 s2 }# d$ Q    for( i=0; i<5; i++)//5
/ r# D/ P* k' y# ^0 u9 b  K: y    {  8 Z( U; m# w+ D; C; {- T
        ulReal = FftReal[i+1];
. Y- d; d' }3 \: n% {+ [        ulReal *= ulReal;! ?, r' e. y1 r1 j
        ulImage = FftImage[i+1];! V5 G8 \9 [. \: v
        ulImage *= ulImage;) D2 L7 w. _: k) B( _
4 y! \1 b  z7 \0 w
        a = sqrt_16( ulReal + ulImage );   //修改3 Y. @* S+ q0 x6 l. t7 z1 M

7 {, o! d* l5 h* x  }        if( a < FFT_OUT_MIN )     5 K& Z2 w' g" N7 }( A, W
            a = 0;//修改
" ]% u3 _. x9 P5 N        else* ^4 ?/ T4 l! t5 D) {, p
          a = a-FFT_OUT_MIN;
0 {6 n' f( q9 ~0 O        if( a >max), K! y# @+ W9 p" z. W& ]
             max =a;% s& t5 Y8 j' B; o
                         //disp();                     
* k* }" U. W+ g" L, D" E7 P9 X2 ^/ a    }
6 z5 i: Q! S8 N: p- r1 `* L6 J2 t2 ~    if(max>11) //11
4 A2 B: [4 A! ]# o5 Y3 G7 [    {& }$ v& V! c9 y% |+ _
       max/=11;        
! G: V0 t* V$ J) g- U  F- K+ @- `        for( i=0; i<5; i++) //输出a的5个分离数值9 {' f, _$ a! k' c; D& R
        {      
( Q1 V$ v( ~3 i" z             a/=max;1 K- Q! m; i7 w0 m# b

4 _$ B9 R. g9 ?! A( ~# a        }  
; B, Y3 Q% g0 F& b6 A& |    }
+ R+ r8 K" S% P; s}             5 o7 M' D6 e+ M6 `5 }/ f

. x8 `+ b/ f( B& ^3 u! t% \/ I; m. J* k0 T9 N# Y
void main()
$ E) @! F1 L' A& _{0 g7 X2 ^9 N( |4 P
        P2M0=0xff;//  (11111111);//P2组设置为推挽输出
" F# g2 L; ], X( }3 k9 _: d3 o8 s        P2M1=0; 5 K6 E5 E8 J  J5 L$ N

% z( W0 F" E- J7 u- t        …………余下代码请下载附件…………4 i+ `% J$ k& g( `0 h* g
下载:
& H0 x* J% d7 N  Q) l1 k4 q
游客,如果您要查看本帖隐藏内容请回复

/ x; x- Q* Y/ M. s3 a' k

$ V3 c4 U* h$ C5 j

该用户从未签到

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

该用户从未签到

4#
发表于 2020-8-10 23:58 | 只看该作者
看看,多谢                   , q. K) `7 d4 c! C: t" x; X2 H
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 21:05 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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