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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
五色LED音乐频谱源程序和原理图 原件清单7 R, C" c% l: @6 h' p/ @4 L3 B& m' p9 K

. E) E8 n6 W8 R3 e3 f+ ~5 }
, y- l+ P) F3 Y1 B% s
12单片机频闪,五色LED音乐频谱源程序代码9 r. S+ Z# \5 K7 E+ G5 V
4 X$ J* F# Y6 G2 V" z) h+ F, @, ]
原理图如下:
( b% J- n! n: u. n! n+ Q
# W" ?6 o' }6 x: t# K. ]元件清单:4 U- Q8 a0 Z1 ?( L. s

; r2 y9 [1 J- \! Q. x五色LED音乐频谱源程序:

" q6 z' s3 j7 X#include <stc12c5a60s2.h>
* P: j% u; D- s- J1 l#include<intrins.h>; p6 K' `6 C' Y2 {
#define BIN(n) LongToBin(0x##n##)  |' |: \6 i5 x" B
#define uchar  unsigned char* k/ |' I: M  C: b9 ]3 v4 d% z
#define uint  unsigned int
3 g' A3 ^, c2 Z. H# `. Q% q#define SAMPLE_NUM 64
" f  O, g5 z3 r, u* |#define NUM_2_LOG 60 S/ S6 ~" n! P7 R" @
#define FFT_OUT_MIN 3: e9 F7 p/ A* F/ r0 `$ z% X( u1 \/ a* g
#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))
- e+ K: J; w( k  G* L5 n% _" P: G
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};
/ Q9 p0 Z; M6 P8 D6 o2 Fchar 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  }; 8 p7 T5 c; `6 s# D$ n' ~  v7 I5 O  a

0 d# _; n9 G5 X4 @# W0 x. [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 };
) @$ I2 T8 w. g6 l" C9 c" muchar a[21];
0 i* K' r! u' H! Z7 `3 ouchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;//用于分离
$ j" O) v: a. _" H1 i. g) w
! O/ G( f' f; B/*加入数组用于显示相应led灯数目*/
2 j+ p0 k; g' v% K; \uchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制
$ Y3 J2 z0 n9 I& A9 D* g  [$ v7 Bint xdata FftReal[SAMPLE_NUM];0 M( s2 m& o1 x, w' b  d" ]$ I
int xdata FftImage[SAMPLE_NUM];/ g1 o  ^  Z6 p4 V
sbit p30=P3^0;
$ U. i7 t' v- ]6 T- }! ]sbit p31=P3^1;3 N. v0 C- t. o9 p, X
sbit p32=P3^2;
! U6 K- e2 k2 R1 q, t( {" l" |sbit p33=P3^3;
. I; F# [  A! Q: Bsbit p34=P3^4;$ x4 ]. ?  L# i) i
sbit p35=P3^5;//9-11的led控制' a* t3 v$ E4 U0 V/ \  M
sbit p36=P3^6;
' B0 J+ j1 F7 ?4 Q' |2 msbit p37=P3^7;
# x' O8 o- o9 h- V5 R& f% L7 {5 E$ e  L$ Z
void timerinit()//定时器 初始化函数! F0 W# U0 T0 a; N6 a+ b/ K* s/ @
{
$ v& K, }/ |; m( ?5 ?  L         TMOD=0x01;
# p  R2 t' s6 x, O         TH0=(65536-6000)/256;
3 ~, o2 G- U4 }: J8 @  c         TL0=(65536-6000)%256;
' l3 z0 T5 k2 M) i0 I4 u, k4 T, E: b         EA=1;2 w5 C9 F* g  Q4 E" i! i
         ET0=1;+ `9 k, J. b, O; y
         TR0=1;
% l* e8 N0 b3 Z: \5 w- Z; W}- s' P1 `: m4 x
void disp()
  ^* T8 z9 z# ~$ V% O+ q$ ~{
) o; r5 h$ ?) \' I+ W+ P  r1 f        timernum++;
4 C7 k& q% L" a5 R        if(timernum==6) timernum=1;
  A! h7 }+ _: M9 r. h* h( m        P2=0;//显示前先关闭
: k1 j8 p& V1 k# p4 R: N! w! S+ q        P3=P3&0x1f;# u& [: |6 h! T$ w8 c
        switch(timernum)5 K) J" C% c1 d* E
        {$ e! I0 K4 d( X$ I
                case 1:anum=a[0];p34=0;p33=1;p32=1;p31=1;p30=1;break;
8 l+ @3 V7 p6 E8 A8 @1 s( E                case 2:anum=a[1];p34=1;p33=0;p32=1;p31=1;p30=1;break;
8 [' Z! q9 X' L- C  Q  E  g* t                case 3:anum=a[2];p34=1;p33=1;p32=0;p31=1;p30=1;break;, M+ `4 w; D' f2 W
                case 4:anum=a[3];p34=1;p33=1;p32=1;p31=0;p30=1;break;
5 ?) ]# h5 K  ]  ~2 U                case 5:anum=a[4];p34=1;p33=1;p32=1;p31=1;p30=0;break;
' {- g# L6 F5 O# W; M' E4 I        }+ {/ N  y! i6 U  ^
        //anum=a[10];/*修改可以改变光柱高度 (anum值分开几个部分用定时器区分显示)(a[]内逐加) */, i3 B2 m. c+ V2 m7 U( F
        if(anum<=8){P2=lednum[anum]3=P3&0x1f;}//屏蔽高三位
, f9 v! I# e: K- P  n4 U; B        //else {P2=0xff3=lednum2[anum-9];}! C+ O& Q# s: X) C- P% Q
        if(anum==9){P2=0xff;p35=1;p36=0;p37=0;}% j& O4 w/ R, |/ a3 ?1 h* P3 S1 |
        if(anum==10){P2=0xff;p35=1;p36=1;p37=0;}
) Q' M4 d& e) |1 S+ g0 o. c        if(anum==11){P2=0xff;p35=1;p36=1;p37=1;}
/ T/ d5 `( w9 ]+ }$ n$ i7 k6 Y
1 v4 R: B6 r3 S) C0 C4 M  X- {}
# T9 W0 n6 w& W/ B/ _7 U1 |# r+ u2 I, t/ s( {& R9 g
uchar STC_ADC()                   //!!根据数据手册写一个ad读取函数( V1 ^. G! E$ f; b' O+ Q
  {8 K2 ~4 L) o' y8 p
     uchar i;
1 E; ^, C- g( `. l& {1 r        ADC_RES   = 0;+ N0 Z% M3 O# r/ e! G+ E) J
        ADC_RESL  = 0;. @/ n) c; Y- s
  ADC_CONTR = BIN(10001000);
* ~% ], k$ n" Y  i=3;4 M4 ?3 X" E- n2 U, v# ^+ _$ O
        while(i--);6 G; O& {) [/ A. l- V
        while (1)                      , @/ `8 w* o' u/ Y* l& L: g- r
     {% r4 Q0 f4 Y2 o6 b
         if (ADC_CONTR & BIN(10000))      
8 x* s% [' \6 n9 L9 u& W) @9 z         { # u# N9 _7 \" i3 G9 H( V% x
            break;; \: {* `( F/ m2 b0 \2 q& P& x
           }4 C. [, |+ k+ o4 k5 W( ?9 w' d; B0 [
     }  ~7 `- F, D: b/ d, b- R5 q
     ADC_CONTR = BIN(10000000);
& @! m: T. D$ x+ `, s- i# _  return( ADC_RESL<<2) ;# X/ r7 N  ?7 ~& r5 B
}! g7 |6 G" E' U
short sqrt_16( unsigned long M)   
: W' w& P8 M0 ~) a{
9 A5 l' r8 F/ D+ g2 Q! y    unsigned int N, i;
( V; [$ E! `- \  @; |, V! a# I6 Q    unsigned long tmp, ttp;
9 f# h8 O( f: G4 D4 _+ w1 u    if( M == 0 )            
* F5 T& Y" J+ H0 ?. M* [        return 0;& _2 y* O1 w& @. N
( Q" U9 \& R$ O4 G7 o6 P1 G
    N = 0;
8 o# O) \$ u# n( R$ `
+ e4 y( ]) l0 f4 g" S+ a( B' q    tmp = ( M >> 30 );        
; u2 |! T* V( Z% r, |6 Q    M <<= 2;3 p. [/ L) I+ F- y! j( X
    if( tmp > 1 )            / u2 z, i7 A" L4 E& K8 P5 F
    {
8 y9 Y6 V% k9 P4 ^2 a        N ++;               
" T/ x# S' ~& ^8 K        tmp -= N;, N6 s) g; B) d* N
    }
# a% d1 Y/ v6 Z$ S( ^7 T% @- V6 P5 d- B/ w. j) U; U
    for( i=15; i>0; i-- )   
4 {7 r* b# z. ?  X- F    {, P) ~7 B8 ^: b1 N
        N <<= 1;           + \0 r1 i( ?+ O/ P

1 y3 }3 e% l/ I" ^6 @        tmp <<= 2;
; Y( D& D  x! V- Z# q+ Y        tmp += (M >> 30);  
# o5 N6 B* x. d( t3 q7 M/ q9 G$ }! w. W+ U# |
        ttp = N;# |- ?5 q) N& T8 A; M" s7 J
        ttp = (ttp<<1)+1;
; ]. P! t8 L3 [; N
. n: w8 ^& l# X7 h$ z2 R        M <<= 2;
0 |7 [% b* D) r* `# w: A' {2 z0 e/ O        if( tmp >= ttp )    $ r5 [+ ^$ P1 J  V1 D' f# b
        {3 E7 B5 u6 w/ p" w3 U
            tmp -= ttp;
* y9 s2 \- Q! W1 A+ q8 u2 S            N ++;
3 a( `9 w8 I/ y# j# b        }       + p: r- B; }$ L& F& G# R# H
    }& [3 P1 a' |9 m" _+ g
# C5 ~/ v. A# J5 g6 I. x1 f& V
    return N;
: t; s# n  `) Y: A}
8 X: H, @/ X/ E% l9 e5 A$ Svoid FFT()
; f$ ?6 G5 h' u- R% W7 ]{: X  j  C  B! [8 ~! j
register    uchar i,bb,j,k,p,max;
8 A( e" l! ~% m: ^ register short TR,TI,temp;2 N5 m7 I$ r4 W/ G7 V0 k$ M
    unsigned long ulReal;                             
/ T, O4 \: P. f    unsigned long ulImage;
/ L9 Z1 C% Q$ ]1 q: V3 u8 V  d% L5 x+ D- g
8 c6 T2 f0 M+ e# Y8 q2 D% M

. U  p6 e7 N2 [& ? for(i=0; i<SAMPLE_NUM;i++)          //此处可以加入自动增益1 |( s# ?& A" y" o1 E2 Z
{3 a$ {$ O4 M/ r  ~1 ]* P" T
                FftReal[BRTable] = STC_ADC()<<keep;//使显示保持在一定范围内
6 X/ C9 U8 V' h0 |        FftImage = 0;
9 o' |/ J* g* {' |# Z+ { }
( ^( o$ p: ]' S
& I: T- g% ^% G: }         keepnum=FftReal[2]/32;//提取等级数
3 G& W; H: {/ _. K  g5 S9 J) W                   if((7<keepnum)&&(keepnum<=8)) {keep=1;}
8 u' |& K+ k" \) @0 j! C         else if((4<keepnum)&&(keepnum<=6)) {keep=2;}& z* h" Z# q; d
         else if((2<keepnum)&&(keepnum<=4)) {keep=3;}, J9 a( i6 ^6 K# _6 {( _+ g
         else {keep=5;}        
8 E7 D8 d# v6 d. ^, B1 R/ J. E  V# p! {3 I! X' L
    for( i=1; i<=NUM_2_LOG; i++)                          
6 F$ G, l- @7 ~% N( X3 o    { " ^! d) L5 ]2 ]. A8 Y9 c) Z
        bb=1;# s' k( [5 H+ r, U3 |% w
        bb <<= (i-1);                                      
  K2 U% T7 `: {1 B' r0 M        for( j=0; j<=bb-1; j++)                            9 [0 Y! z. @3 n+ @4 ]/ p- d
        { 4 Q. c; X; h% M2 }) d
            p=1;& u3 Z& J: D" f8 k7 w3 ~( z/ a" X
            p <<= (NUM_2_LOG-i);            * ^7 x' g1 t' n) r3 z
            p = p*j;
5 R5 E; z+ V% D( [            for( k=j; k<SAMPLE_NUM; k=k+2*bb)               5 M- O3 c4 s% }8 q! o3 c7 `; j
            {
7 E$ |  X7 S) t+ Z& G- n5 ~8 b                TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];  x, W6 y/ f& e) ^+ N
                FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);
0 R$ M5 l$ h( I- [$ M1 d                FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);
, N7 p) ~1 |7 {6 c: H1 P* w                FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);
1 k& [# ^; p0 H5 @! F, H7 y                FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7); + i8 k8 v2 k: {( h

/ t& E! y0 J+ U  @& k- z                FftReal[k]  >>= 1;            
% u9 o( h5 A8 v1 I                FftImage[k]  >>= 1;
; o- ]! e4 C* E$ ?" q                FftReal[k+bb]  >>= 1;                 
9 z' U* n6 j* w" K) `- g4 k& H                FftImage[k+bb]  >>= 1;
% F9 l2 D; K3 J# s. M  O- i1 F# M/ R% e* _% m1 `5 ~
            }  ; [1 a$ [( b# y3 V
        }; }# D' M. J" _6 R) y- ?& U& \
    }
6 ~; y4 W, s9 [5 g" g0 N: D    max=0;3 l, _' z# K' k9 `1 ?
    for( i=0; i<5; i++)//5
- `" J1 K- C% Q    {  
1 h& s+ Z0 U& d. A  ?" a        ulReal = FftReal[i+1];3 {3 n- q6 _( m7 i7 T
        ulReal *= ulReal;! V# q& m$ ]" x) w+ x  o, U0 C0 y$ p
        ulImage = FftImage[i+1];
( S( B4 v/ ~5 Q! o        ulImage *= ulImage;
0 e$ b) o; ~6 v  c0 l
, M1 c1 W. S7 c2 m2 E        a = sqrt_16( ulReal + ulImage );   //修改3 I+ D. G# |- @& i

5 i& p: x: [7 X$ J+ o, M! i  a* K* x        if( a < FFT_OUT_MIN )     + W" u/ B; m% r2 H; \& v  _! ?
            a = 0;//修改3 u/ l* g, T6 E3 h& d4 |
        else: m+ t: n4 x4 |! ?
          a = a-FFT_OUT_MIN;" v/ R+ ~1 F( c+ y
        if( a >max)
- _0 f( C/ L6 g0 m. S; \# F             max =a;8 j% H, p* L$ b& I& w) W
                         //disp();                      . Y$ T* c4 ^& Q) W$ H: Z! H
    }
  V% P1 `' `* ]    if(max>11) //11
" g) N$ P) u) M: g    {
, Z- t5 w: H7 p$ v9 s       max/=11;        
' A9 e6 \; Y- q( E7 Y        for( i=0; i<5; i++) //输出a的5个分离数值. i: E/ p# q  w
        {      
* s; p3 N7 Q2 g4 J             a/=max;
2 t, P- K* E) X
2 o4 U  b; ^# G3 }  {5 P        }  ) ~% ^! o& l; `, v2 `
    }
" y% I% j) i+ F8 J$ P}            
0 j& r  A# U5 F! n0 Y4 F
% \) N1 o4 O) w1 n/ k! F+ r
$ b8 a; D# W, ?" w6 jvoid main()
" q3 q2 x( Z* \! _/ p, p{
9 ~' P5 O9 c2 {% S- Y0 L        P2M0=0xff;//  (11111111);//P2组设置为推挽输出
7 I& D: w) x) _# P9 }9 ]1 z        P2M1=0;
' p% L' c. M) I& u3 O: O
5 e3 y6 i( e' p        …………余下代码请下载附件…………
, \# A8 R" j1 ?/ H" a0 }' s5 s下载:
5 S' n7 d$ E6 h3 Z; p
游客,如果您要查看本帖隐藏内容请回复
2 f4 [/ E' E6 K3 v3 x. B" s  Q0 S/ @

9 J: _1 T" V7 v% P

该用户从未签到

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

该用户从未签到

4#
发表于 2020-8-10 23:58 | 只看该作者
看看,多谢                  
. v+ k+ i; I( x6 m( V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 14:26 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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