|
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=0xff 3=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 |
|