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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
五色LED音乐频谱源程序和原理图 原件清单
: ~8 U& u$ F& }
7 U7 ~6 `: l- u4 Z
% ?1 i% ^% q1 A9 k# {1 H
12单片机频闪,五色LED音乐频谱源程序代码
) q3 D' p6 Q7 _. X5 ~8 `
- G( \) E1 D1 S4 E5 y! E$ i) o. m6 ^原理图如下:
% F7 v0 E$ H- g, b0 w3 y' u * s3 D( O; }) G1 h/ ~4 x; y
元件清单:
) e+ l7 Z- P6 X9 \6 B
4 m: l- e8 X. o% ~! @0 f0 W五色LED音乐频谱源程序:

" U+ ~) _. W. |/ g8 g#include <stc12c5a60s2.h>
( ?- M% g6 b( R9 |#include<intrins.h>
* a, E0 P4 {& d" ]0 s. C. t& _: S#define BIN(n) LongToBin(0x##n##)
" j2 v* W0 [2 R! c. ^#define uchar  unsigned char
# e3 [6 n. Y: }2 B% j1 G#define uint  unsigned int
& A6 m) e+ i5 k0 ]/ m5 J' E#define SAMPLE_NUM 64
( ?% k  G3 `7 C0 j! |* I/ i, z#define NUM_2_LOG 68 ^! {, I2 m: O  Y
#define FFT_OUT_MIN 38 _/ u) k* }" U: u9 y
#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)): q$ X% V' _! T, H* e$ ^

, y4 x6 I7 y- O2 S! quchar 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};" a6 W$ H' s1 _9 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  };
* o3 R0 ?. j0 y: L3 h
4 D6 |4 y9 ^8 a8 _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 };
5 O: v' f" j; ruchar a[21];6 z) _9 A- |' n" T* p" I. }6 F
uchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;//用于分离
7 _3 N$ Q8 h0 E' Y+ H# b/ P4 }/ C  ]
/*加入数组用于显示相应led灯数目*/
' z( H+ V/ u: l8 w! ]9 Cuchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制" C7 L1 b5 s. B  H8 f1 o) {1 w, P# u
int xdata FftReal[SAMPLE_NUM];% D, E2 c: ]. H/ k
int xdata FftImage[SAMPLE_NUM];) H3 I9 x6 Z8 a8 v' e( ~
sbit p30=P3^0;
0 v+ j! U1 I9 ^3 Y$ E! Esbit p31=P3^1;  J: x) r* P" Y0 C' v5 _  \  u  _
sbit p32=P3^2;
& b1 e; i! `, J5 |" }) _3 y% _sbit p33=P3^3;7 ?& p4 F8 U# _2 \$ `! t. c% E0 I: Q
sbit p34=P3^4;
/ X7 K5 u# o3 [: W1 T* `) H3 qsbit p35=P3^5;//9-11的led控制$ X0 v- z8 R) P7 L. B
sbit p36=P3^6;1 T1 |/ w( J- y' ^
sbit p37=P3^7;5 y% l" _% _* L* ^; \! p, f
2 K  T8 [  o. V- T
void timerinit()//定时器 初始化函数
7 c$ g( F* K1 P{
( i5 q! W& j  i0 Q         TMOD=0x01;
8 A  M+ J% ^2 ]7 {) {! F1 E         TH0=(65536-6000)/256;0 _% \1 ?6 A" z( @
         TL0=(65536-6000)%256;5 W  o6 {& l5 o7 t0 ?7 k$ `
         EA=1;
; Y4 y; {* }7 `; v( O6 g7 f) d         ET0=1;
: V2 C, g" a1 x         TR0=1;) o) Z' r% T4 Z& a7 O9 A2 f  a
}3 G, b$ u( F- L) m5 @
void disp()0 k' E! K. o9 b- I8 e- h, B
{6 L% b+ [( D! _2 B* |  ~7 m
        timernum++;  ^5 F) n% \7 ?) m
        if(timernum==6) timernum=1;  r5 v  c/ D! v
        P2=0;//显示前先关闭7 S$ m* Y  j2 a" {
        P3=P3&0x1f;
) T" {0 {2 o' L2 h2 X+ A        switch(timernum)+ }! i1 q3 H( z7 o! ]. v: }. O( W: y
        {
' l4 ~" {* F* T1 Z5 m  b8 u                case 1:anum=a[0];p34=0;p33=1;p32=1;p31=1;p30=1;break;& S5 P& q/ o4 C) c: \) j; `
                case 2:anum=a[1];p34=1;p33=0;p32=1;p31=1;p30=1;break;, M8 @9 I- P# b9 U. p
                case 3:anum=a[2];p34=1;p33=1;p32=0;p31=1;p30=1;break;0 {' r: Y- @- F; F3 |6 q. h/ B
                case 4:anum=a[3];p34=1;p33=1;p32=1;p31=0;p30=1;break;
& \: U1 {  o! J% Z3 L  X                case 5:anum=a[4];p34=1;p33=1;p32=1;p31=1;p30=0;break;
; y( t4 E& q: f  z% }1 c        }
$ K( Z& ?% H/ H# t6 ?: ^6 e; x        //anum=a[10];/*修改可以改变光柱高度 (anum值分开几个部分用定时器区分显示)(a[]内逐加) */1 n5 j% Y* j% f  ?& r, w) ]7 T
        if(anum<=8){P2=lednum[anum]3=P3&0x1f;}//屏蔽高三位
/ _# v( w9 D8 W) I        //else {P2=0xff3=lednum2[anum-9];}; N( d6 N* z: W
        if(anum==9){P2=0xff;p35=1;p36=0;p37=0;}
0 V* i" U+ s- G' q$ ]6 d2 G% e        if(anum==10){P2=0xff;p35=1;p36=1;p37=0;}% |3 v9 x6 J, t6 B- c( \1 Y; G
        if(anum==11){P2=0xff;p35=1;p36=1;p37=1;}6 h5 @, g6 E  \, i7 e
) i9 u. g% Z% M7 s6 I( }; {* B
}
  o" x4 M$ A  H/ u8 d: z
+ b7 d. j# a! A6 f& ~; V1 D# iuchar STC_ADC()                   //!!根据数据手册写一个ad读取函数
( l) x2 k$ |- S: ?  {% a3 U$ `% K2 A* \( m+ L+ Q
     uchar i;
2 O- j# {9 ^$ a* ]8 I7 G8 {$ h        ADC_RES   = 0;" s; w5 S. J  B' m" g' U
        ADC_RESL  = 0;
9 Q0 _8 t/ r/ B+ O" j  ADC_CONTR = BIN(10001000);( C. a7 A2 V6 g& K7 ~! M4 Y
  i=3;2 T1 {) C8 y5 `3 d
        while(i--);' X: M( V+ q2 y
        while (1)                     
1 P* I& D" C' r2 a% K% f     {
: p" n# V! P, N( Q         if (ADC_CONTR & BIN(10000))      
# {3 {: F7 `7 a! m+ B2 _+ I         {
5 y: m4 _# ^6 B) j; L/ r; L! T            break;7 g/ L1 Q" M5 n/ ?9 }
           }
# i! Y3 K' F9 K' A  \$ ?     }2 h0 z& U' j4 P! Y
     ADC_CONTR = BIN(10000000);# ], l$ X/ i1 `. N1 a3 v, S
  return( ADC_RESL<<2) ;; i6 C* \$ E- I1 q
}
  Z# T- H+ l- [short sqrt_16( unsigned long M)   
6 C' L- _; k  s# h" D1 L{
0 [  R3 m4 a6 N0 [5 ?    unsigned int N, i;8 d/ o0 G0 X# X9 ~: Z
    unsigned long tmp, ttp;
4 E3 t) H. ~; Y/ M    if( M == 0 )             0 u! _+ c* i5 X& b* j; ~3 x
        return 0;. a1 B, d  O. y- i

' ]) U' g+ D! ?& V# X    N = 0;# H+ B( Q% m. m  J; u  }9 e9 W
+ V. P. d2 o6 l; @7 N' @$ a
    tmp = ( M >> 30 );        
5 C; x6 S2 d8 }3 j" @    M <<= 2;
  y$ U. P  f2 N6 }) _9 e    if( tmp > 1 )            6 c1 w# B2 {+ J
    {
( A: z! w8 R% I        N ++;               6 H4 |' J0 ^' G0 v9 K) Y
        tmp -= N;
- k% W# C" t8 c& h; v/ n    }8 U0 ^3 x. k% K5 {; X  r$ ~

% A& V: U: w# L    for( i=15; i>0; i-- )   : E2 n  Q) j+ j  ]* |. d1 x/ e; o  f
    {
2 k8 ~3 j; |5 Q        N <<= 1;           ' @7 Y" e9 Z# g

; w/ p7 j: u8 N, t2 Z6 K& M" w+ S        tmp <<= 2;( U) M% d: J/ E7 b, h# `- B% b/ @
        tmp += (M >> 30);  ( M% l& w- f+ a# M; o

3 x" H) g  H3 Q5 m6 R. C        ttp = N;$ \- k6 r, f6 j
        ttp = (ttp<<1)+1;
/ Z) o& @. x/ ?& N( _
' k  x* e* }- d! ]        M <<= 2;
4 a# m- g: B! @5 p& Q5 h1 Z' a        if( tmp >= ttp )   
6 ^4 ]! Y; T$ A        {' J2 C8 y6 R: w" z5 K+ D
            tmp -= ttp;
+ {% H: W& C4 S- U( Y0 P            N ++;
" A% Z0 Y9 F" i5 P9 W# U2 F7 h        }      
0 x% ^! C. T% ~8 {    }
* e' ]- h" {6 m; F# L
# x7 X1 L# Y2 m9 n, n1 X    return N;
/ V7 v2 K6 H) n) U+ P}
# Z9 g) x8 z: i! M+ N( fvoid FFT()
- P+ u: \" Z( W/ l3 e, ~" `. ~1 ?{- z! i' t3 T( a3 _& Q2 {3 _, C+ `
register    uchar i,bb,j,k,p,max;
( z2 ~/ E& {8 Y! a& B$ `$ w register short TR,TI,temp;
, e' q7 j5 C. s" U( Q4 n6 \4 y    unsigned long ulReal;                             $ @- Q! _- s: ?/ p" N. r
    unsigned long ulImage;
1 ]0 N2 S) g/ o1 {$ o6 [* [' a& X7 A) g, H) j& `, H7 Y

6 n  O5 O1 p) A% W/ B( p: A  i1 f. L' Q; K5 T3 _
for(i=0; i<SAMPLE_NUM;i++)          //此处可以加入自动增益+ V% ^& ]$ K) Y2 Z/ N/ L
{
9 K# A6 M8 |( f! \; d                FftReal[BRTable] = STC_ADC()<<keep;//使显示保持在一定范围内
9 U, s5 {! E, O        FftImage = 0;; }5 H# D* c" z: u
}
. |- ~/ a) `- h' a
% {  x" p% ~3 U         keepnum=FftReal[2]/32;//提取等级数
6 B9 q7 R, h& m4 B                   if((7<keepnum)&&(keepnum<=8)) {keep=1;}4 q. K2 L+ f% B# ~, d+ C! y) u) C
         else if((4<keepnum)&&(keepnum<=6)) {keep=2;}
. q8 O  m! U) U         else if((2<keepnum)&&(keepnum<=4)) {keep=3;}
0 d1 T$ \  _  S         else {keep=5;}        
! ?7 L4 D5 f# i7 N6 E' v4 \4 P; R5 t6 D  D. k
    for( i=1; i<=NUM_2_LOG; i++)                          
2 j* W( c# Q& P; \    {
, {6 q3 \* ]9 R4 B* |! z1 N( r& }# _        bb=1;
; I5 j* d; d4 C2 w, p        bb <<= (i-1);                                      
. O0 A( w- f& o9 E        for( j=0; j<=bb-1; j++)                            * M# ~9 ~2 B  g$ Q' h1 \
        { / W" ^) g+ H* J* }3 U4 \4 y
            p=1;
: p6 N. G7 z0 D' C' i8 p  @  [            p <<= (NUM_2_LOG-i);            
- G4 T0 |/ L3 _9 l# |! [) v            p = p*j;
8 k; V' s, E8 w0 u7 x( A5 T            for( k=j; k<SAMPLE_NUM; k=k+2*bb)               
( m6 R9 N) I& b3 |) R3 p0 N( y. B$ w8 o            { % O) p* T: g% X: l4 r7 c+ \# Q
                TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];
  N" F# ~8 s9 f+ C* I" ^                FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);
5 F$ i* a3 Q- J9 G                FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);- I* v2 V% ]3 e; {. ~+ O
                FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);
: a$ M9 N- X' S+ Q+ k; Q& W) ?- r( [" ~                FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7);
; ?$ v7 k- F8 \7 W8 f; N. a" d
) k7 K( I( p7 U6 y                FftReal[k]  >>= 1;             % i, m9 Q6 {' Y! l% {% B
                FftImage[k]  >>= 1;
% ]; O, e. q5 p" `% W& R                FftReal[k+bb]  >>= 1;                 
& m3 Q3 L) _1 g. z+ y                FftImage[k+bb]  >>= 1;
) w3 H- x, o' ~- m  |0 S) |7 ~
2 I* p; |% n% e7 Z1 W1 B5 n            }  
5 q  R, L. k  y  L1 W+ }        }
8 ~# `3 H. K$ F' E2 ~/ T" E- H    }9 E5 f/ p* A# e
    max=0;3 r: Z/ w7 T- Q! \* j7 I
    for( i=0; i<5; i++)//58 S( T2 w* J- J4 b# f
    {  
6 \0 y! c+ Z3 F0 i8 ~% x        ulReal = FftReal[i+1];
$ I) O* k, {% G$ F3 s1 V        ulReal *= ulReal;, C- Q+ ]/ }" }& i5 x
        ulImage = FftImage[i+1];
, a8 H% s: Q. O# ]6 x        ulImage *= ulImage;
4 ]6 k* X) @: v1 _0 P) [. [" x% z0 W
, \7 D. ~8 a- c, u* M3 L# U        a = sqrt_16( ulReal + ulImage );   //修改
2 i! [5 S; E* X9 ?7 a# k6 Y3 N; y/ A( J; B/ r
        if( a < FFT_OUT_MIN )     . k+ l9 f/ ]2 E2 A% Q8 l1 f
            a = 0;//修改( r) L6 ]* i+ Q, L5 s; }
        else
  [% e7 x0 G; W7 \/ |$ s          a = a-FFT_OUT_MIN;  R6 g6 H9 G6 v4 p8 J
        if( a >max)
8 _6 y# g7 X0 |8 D             max =a;1 G$ \* `* \. c  v* t, w% Y
                         //disp();                      - {( L7 u& U7 X+ X# _% F* [
    }! q* ]& z7 Y2 _* L! E
    if(max>11) //11
4 D+ _' r: L, E. r    {, n3 y" ]7 V0 }; k* @# |! v) Z  q
       max/=11;        
( H5 {( ]5 {5 @* t' t: _% a        for( i=0; i<5; i++) //输出a的5个分离数值
% z; t5 b+ M( M9 B7 y        {      
% h" ^& {/ I3 b! W- I6 i7 M             a/=max;
; k2 \! T( c* N: J5 i1 K9 r6 D
0 f6 S. J3 P$ y+ R" K  V- U3 ?  C9 N        }  - y* v: K/ T" K! K+ W, r3 V
    }) L- \0 P3 B4 v* H2 ^
}            
* \/ P" t9 Z0 @, c. `
9 Q' A6 r+ F6 I# m' K/ N
3 |# t6 ~! f* }8 I7 _" Svoid main()
2 ?% o  e. u( k: S$ i{
* o4 f. t: D8 e7 [, ]- w        P2M0=0xff;//  (11111111);//P2组设置为推挽输出$ M9 D9 e( I* i
        P2M1=0; # `* E, b  P/ c9 A

3 t0 \+ @/ [2 h        …………余下代码请下载附件…………/ X& r) |. c0 W
下载:- W8 I, ?$ c4 u8 r  x
游客,如果您要查看本帖隐藏内容请回复
1 N7 s8 v8 O/ c

6 D" m, [5 c8 X6 f" p. A! Z, ]5 q

该用户从未签到

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

该用户从未签到

4#
发表于 2020-8-10 23:58 | 只看该作者
看看,多谢                  
  l# W' ~" j1 k8 P0 @: r
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-13 09:10 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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