|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
五色LED音乐频谱源程序和原理图 原件清单& e3 `! W+ u; U1 O
" C5 g8 M: n# W6 u
8 y8 n" l' R8 a! C- ?9 o5 B/ ~12单片机频闪,五色LED音乐频谱源程序代码% n" t- Z% @! U( u* x% N) e
/ F; u4 ?" Y+ w! S9 @$ u原理图如下:/ U4 V0 U0 g' f# @& a
' {- ]! x n( o元件清单:2 l) L5 d, [; @
% @% h* h& l* ?& i) K
五色LED音乐频谱源程序:
; V! }* p! F' K6 v% `' q) b: n#include <stc12c5a60s2.h>
* J5 T' I& G) c9 T#include<intrins.h>
; ?1 B S( ~! z, h$ O#define BIN(n) LongToBin(0x##n##)
3 V* j3 l: A& s1 F! v% B#define uchar unsigned char
0 u o9 e6 `# m! l0 ]4 f L#define uint unsigned int
9 M! F0 l! E3 v1 f; k, e4 z#define SAMPLE_NUM 64
# B/ Q0 `* f! K ?#define NUM_2_LOG 6
# [8 N8 q& z- \$ i0 W#define FFT_OUT_MIN 3
2 L# q0 s' X' [3 b9 o5 p. |/ l6 f#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))9 }/ q* f9 H5 R: ^
: H: ?4 k7 q! ]8 e \+ }6 a1 ~7 J o
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};
7 |: E# u! ~* z% |# @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 };
; j' ^( f9 E! i A0 s8 b1 y H9 I" M7 S
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 a/ s# o0 Z+ W: N
uchar a[21];& s; ^3 m& h* K8 B1 k7 [1 I
uchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;//用于分离) {1 _. N; _1 I3 R0 M$ K, M, G
- }/ O9 s: v# @: [9 [3 |8 w% p/*加入数组用于显示相应led灯数目*/
& z$ D1 z* F* T8 [uchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组 P2组控制
' z. R: p. k) s6 T5 Yint xdata FftReal[SAMPLE_NUM];- q7 ?3 ~+ b) @
int xdata FftImage[SAMPLE_NUM];
% \9 h3 J) Q: I; ]sbit p30=P3^0;0 a. N7 q; u: \# j! H* F* d* ^
sbit p31=P3^1;$ o% J) G+ o9 ~* X
sbit p32=P3^2;
& @ [+ a! v2 F( t0 Y* Psbit p33=P3^3;
) g5 h/ Q* ]. b2 Xsbit p34=P3^4;
; O% F+ j t# K* e, g+ V) D, Bsbit p35=P3^5;//9-11的led控制% x% t% O, U: x9 j `: Z
sbit p36=P3^6;
* o& |3 L& {6 {sbit p37=P3^7;4 |6 w; m3 b) w) W5 [# z) W
; F- }* @0 \) o2 Z" Xvoid timerinit()//定时器 初始化函数
" S' C* p- n1 i! j) _; u! Y" s) n{1 o( K s2 a, h2 L% |5 T
TMOD=0x01;
7 k2 K+ r; s$ g; ^# s; L TH0=(65536-6000)/256;# B4 f) m% g6 m2 u
TL0=(65536-6000)%256;9 j% C9 K# b V; t
EA=1;, \" ` E. u) x' R( I2 Z& z
ET0=1;3 Q- ~7 |# Y2 \* a: H0 e
TR0=1;
8 I$ Q% J' z. k9 {& q/ Y}
( `, T+ Z: b2 ^void disp()
# u4 \7 P$ W3 a U# l- a{' ^/ n6 ?- h& m) g. m' B* ?
timernum++;
% p- E1 L# m( S9 M if(timernum==6) timernum=1;7 [6 K5 R3 z0 ~! l4 r
P2=0;//显示前先关闭3 ~; p3 u+ g0 S1 H6 p$ ]+ b8 l
P3=P3&0x1f;
j* C* p6 K2 Y6 X4 e! n7 l) [, p switch(timernum)2 H# a) h. `( a! W6 g+ y
{
. |8 n; B, C9 X+ f7 \ case 1:anum=a[0];p34=0;p33=1;p32=1;p31=1;p30=1;break;
& |4 {# U" S. v3 {* F: w case 2:anum=a[1];p34=1;p33=0;p32=1;p31=1;p30=1;break;
2 S+ U) {. Q1 C d case 3:anum=a[2];p34=1;p33=1;p32=0;p31=1;p30=1;break;
1 y* E+ B5 A" p: j i9 \% s; X4 u case 4:anum=a[3];p34=1;p33=1;p32=1;p31=0;p30=1;break;
4 }2 \2 r5 n" z* j6 Z5 W case 5:anum=a[4];p34=1;p33=1;p32=1;p31=1;p30=0;break; @" v- E9 U% j X+ T: n1 j: o' c* k
}$ B4 Q$ @1 `" f/ P' L1 e' v
//anum=a[10];/*修改可以改变光柱高度 (anum值分开几个部分用定时器区分显示)(a[]内逐加) */
0 ~7 Q: E% Q [* w% v" N) m! D; Z4 t/ E$ X if(anum<=8){P2=lednum[anum] 3=P3&0x1f;}//屏蔽高三位 C- O! }) \9 t0 N+ `: H* C" b) `
//else {P2=0xff 3=lednum2[anum-9];}
! r2 H. T; z+ Y _* ~ if(anum==9){P2=0xff;p35=1;p36=0;p37=0;}( w0 A9 S& O1 u3 E; D' v
if(anum==10){P2=0xff;p35=1;p36=1;p37=0;}
2 _2 l; ?+ V* w8 n' |8 ] if(anum==11){P2=0xff;p35=1;p36=1;p37=1;}$ N) w, Q8 e( h+ o# U( @) k+ K3 U
8 w* ?- @- g1 P! H: T( n
}
4 C& c0 n3 s; n0 M, ]2 ]" q! h, d, Q+ Y
uchar STC_ADC() //!!根据数据手册写一个ad读取函数7 n3 B, {- }/ K X* H+ m
{
2 E ?9 ^$ Y3 p8 p uchar i; J- T: y: g5 [) I
ADC_RES = 0;! I2 x, e4 J. V1 Q: M
ADC_RESL = 0;
$ A3 O. Y, a% [- Q* H ADC_CONTR = BIN(10001000);
/ D u" E. x6 c% _% p i=3;
; s2 y" n8 q3 \! H- ?5 y+ j while(i--);
$ r% @0 V# R. ] while (1) 4 W9 e) T3 V- {* y( v( z; S" K
{4 U6 x( a1 m g* Z) e% T4 Q' m; W
if (ADC_CONTR & BIN(10000))
, q M8 W3 W$ F% @- j# J& j { ! g: W7 e5 r: W
break;
, p0 N7 V; {, K- W }4 I* [7 R7 _( W: @# g
}" c @0 C9 l8 C! o ^
ADC_CONTR = BIN(10000000);
+ P# u, f: I |3 N! R1 ], m& Q return( ADC_RESL<<2) ; p( u! M# M6 P' U" {, r
}8 g. P1 }. [$ L' v# s
short sqrt_16( unsigned long M) 6 l/ G4 k* `# ]; `2 w7 [2 [( U8 [3 A2 Y
{" a6 K( ]" z: y! E% a6 J
unsigned int N, i;! K6 Z1 Z: {* g; b C; x
unsigned long tmp, ttp;
) e9 D3 B! n. | N if( M == 0 ) ! T9 u# N4 x0 H2 F
return 0;6 U& o# p5 T7 M- Y
2 s( G1 J G3 q8 {
N = 0;
0 ]* a. C- J6 U% S' `/ b4 M" v9 U# J$ ?* q
tmp = ( M >> 30 );
. J6 ^' F7 c( v* d9 C) g M <<= 2;
0 q. `6 g. P. g' D if( tmp > 1 )
( a4 F& c: A m( B) d1 T8 t {( H6 T% \7 l& E' E
N ++;
, Y( J+ c7 W( Q$ g; K0 W tmp -= N;+ V9 }6 @' k+ e+ y
}- x+ I- I r1 V+ L% _
& u d4 g7 r' L' ~' ?9 W" {0 o for( i=15; i>0; i-- ) 1 A) m# a9 B, Y$ d2 Y1 y
{
9 b$ f: G# B) j0 }. s N <<= 1; , B& v3 `& u. N! a
1 q. d+ D' A ]3 r
tmp <<= 2;: S6 h; ]; Q% {$ }0 s
tmp += (M >> 30);
. g9 N/ Y& d+ c$ j& x. c: ~
/ S7 J% A$ p: P# C: M0 Q: A! @ ttp = N;, Y3 q3 {4 Q' n$ ]
ttp = (ttp<<1)+1;
( W! j' f( d! v; S7 L- L5 Y/ ?5 o3 [" V: I7 i1 V
M <<= 2;
& u! C- J! ~% `# n- l+ c. B if( tmp >= ttp )
+ z2 \7 y( Q8 ^$ P9 L& f0 M6 b {0 p( X/ X1 a- a# a4 A9 b5 t [
tmp -= ttp;) R. `: Z# x- B3 h* q) k# i
N ++;/ c$ w' e- f. g3 l$ b7 ]. o
} % E; h! ^1 i+ e) Q
}
. ^4 l6 a: W4 H/ M t/ m" d* B% q# ^& C% Z0 F
return N;
. d+ j2 }7 d- U}! B" N( H3 u" o! o0 C) ?
void FFT()0 f4 k1 r6 \5 c0 Q' |) d U
{+ J$ @1 }( Z1 ~* d
register uchar i,bb,j,k,p,max;
+ _; v( {! b% j5 x* y. b( d6 j h register short TR,TI,temp;% A3 d. V9 P7 u" U R/ A
unsigned long ulReal;
, i1 t# B7 k( Q. v unsigned long ulImage;3 g+ i9 i2 u: ]/ r. U- ?
1 Z3 J! j! W4 U3 c4 c* t
5 [# F0 j1 v$ ~9 T1 b
2 y2 m8 g! R. j$ H1 A: R$ o( d3 { for(i=0; i<SAMPLE_NUM;i++) //此处可以加入自动增益( P- l" Q r4 H( y& q
{
6 K3 Z9 Y: ^6 g' { FftReal[BRTable] = STC_ADC()<<keep;//使显示保持在一定范围内! |) L/ f' ~: o9 T9 A! l5 X# ]
FftImage = 0;+ S* U2 H9 F" \( B* F1 p
} l, O+ e0 g ^, r" N/ i" V4 ^
+ U2 ]; F3 `7 N ^4 K; A
keepnum=FftReal[2]/32;//提取等级数
% _$ F1 V# Q, M9 k" U$ p8 p if((7<keepnum)&&(keepnum<=8)) {keep=1;}
& t3 Z6 l/ i/ J' d3 o% Y1 L else if((4<keepnum)&&(keepnum<=6)) {keep=2;}5 v. @, Z |$ X0 D5 J7 {8 |
else if((2<keepnum)&&(keepnum<=4)) {keep=3;}
) @2 U. o* P* j7 P7 x: K: i9 l else {keep=5;} " ~" a! h' X4 V6 W. C1 K8 N& K1 ~
) F Z+ k' \! F) o; T5 } for( i=1; i<=NUM_2_LOG; i++)
( ?3 ] h1 n. n* X2 u0 g0 }2 L2 M {
3 [8 @: ^2 N+ Z7 \ bb=1;
0 W2 y$ s. C0 C( ? bb <<= (i-1);
/ t5 `: c! U: j+ u5 [ for( j=0; j<=bb-1; j++)
6 v+ I) F) o3 }. `7 @ { t$ l) p4 K/ l( @5 r5 H9 Z; k$ p
p=1;* c& d1 k& v/ U7 X5 ?5 h
p <<= (NUM_2_LOG-i); % l# Y; M) f) v3 Z' Z
p = p*j;4 M J) r, P, q: ~1 D: L
for( k=j; k<SAMPLE_NUM; k=k+2*bb) ) `& p8 f5 d2 C0 [9 g$ u3 p. v. s4 P
{ 3 c: j$ @, }' i: c7 M+ t
TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];' J+ J8 z0 _0 [- U' X4 l1 P
FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);8 K5 v: h8 Z k9 o* A# l
FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);
4 \) [7 F+ h1 ?6 S0 } s( O FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);9 Q3 d9 F+ }) X- i; b* }9 C7 @! R
FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7); . d" W5 x/ @+ M& M* s3 q* N
& j+ Q9 F- O0 ?+ ^ FftReal[k] >>= 1; 6 p1 g6 R5 W# m# M
FftImage[k] >>= 1;
' N r. s4 ^* s6 Y FftReal[k+bb] >>= 1;
- F9 E( |/ V8 ^8 W; S3 m5 W7 z3 ~5 I FftImage[k+bb] >>= 1;
! Q& M, I9 A# o( f; u8 o
8 ~! i. g( N7 ? } 6 r0 q: Q; U$ p5 o. M; Y
}
1 t5 x" k9 S; h, {$ L7 [9 x* k( E; s }
; d/ n' s$ ~& D J/ b, }. u max=0;
8 D3 @( G) W. J8 I0 P0 M6 u/ p for( i=0; i<5; i++)//5: k; O6 H: F# j5 h- C
{ 6 b! r8 y7 I: y
ulReal = FftReal[i+1];
" m$ Z; O/ K+ Q4 \5 c ulReal *= ulReal;
( }7 R: k9 ~6 O) Z+ M3 i6 i- _0 C ulImage = FftImage[i+1];
2 b+ |" x4 |, K t) @1 n ulImage *= ulImage;
0 h- ?9 e* N- C! g( d9 L% V
! O0 u7 j# G% p6 | a = sqrt_16( ulReal + ulImage ); //修改9 a: J: e( z# r7 O: P' U1 `
; e& Z5 O; z7 {# V if( a < FFT_OUT_MIN )
* Q! G( y& C4 U- _4 e, r! Z' }- b a = 0;//修改1 S3 ~2 ^2 r( r2 z6 K2 y( v
else
E2 w' H) S, F* B& ] a = a-FFT_OUT_MIN;0 t2 F, a1 _5 T2 V/ Z; B3 m4 {, I
if( a >max)
7 Y1 N- s2 H* G+ S, ~ max =a;
( E& N/ Q% E0 v# M" O //disp();
- [9 V- r; b3 `1 M# } }+ y4 a' C% n9 g6 Y
if(max>11) //11
+ X3 q9 U, T1 e5 q& S/ } {
' y' u5 X% A; Q) P6 T max/=11;
( q# y# u, Q9 n) v! M3 o for( i=0; i<5; i++) //输出a的5个分离数值
8 M: a7 R6 g! u, A9 X6 \( ?5 ]- Z {
' g: ]6 H9 ^& D9 j a/=max;
* i, C" k4 E2 m$ x6 q* s9 f4 Y2 h* U
}
6 [& r& k: r% p' X$ P/ S }* j! }5 c$ ^/ L5 D
}
8 C/ b7 z$ K. y9 ~ Y# m$ X( f+ c) z
/ { j m7 v8 p* }9 q% E: H0 h9 u( |& r1 e( o" e5 f
void main()
- b8 ~3 c7 G6 C8 l9 o: I{
1 I( q3 P! s7 Y- Z* L, T5 b P2M0=0xff;// (11111111);//P2组设置为推挽输出
% P, g2 ` C5 P# M; Y P2M1=0; : h# J- }5 b* V6 G. R% h0 o
8 ~$ a, B! Y6 r
…………余下代码请下载附件…………
! B" { P6 j' g: F下载:
; K( C" z) }, ?% C4 Q% F
6 D4 Y% M. F8 d: r3 O% G! s
) |. G/ Z/ W% q& i$ y% W |
|