|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
五色LED音乐频谱源程序和原理图 原件清单
) f4 a/ r; f" C5 }$ H" w
" Z. o9 C, c9 H. x1 a$ Q% U, K) p3 K; P. E( J3 I
12单片机频闪,五色LED音乐频谱源程序代码6 d( m# `+ I5 i9 P* Z' k. X
6 W$ X% ^4 Y8 y' _原理图如下:
$ B: l* t F# z4 v B) x5 ~3 _
$ u/ A/ ~* d" j* A& x3 R* o$ \! d元件清单:2 O" F; v; W/ z4 E4 C5 n
# X. O" T+ C9 L/ s, w6 R, \, N
五色LED音乐频谱源程序:6 G& V8 C+ ^! e: p* v
#include <stc12c5a60s2.h>2 C: V& e- f y8 ~7 `& B
#include<intrins.h>
! E! g! m' E% P* `#define BIN(n) LongToBin(0x##n##) O; v# [) g$ S' J
#define uchar unsigned char
1 @* v3 C$ }, [9 w0 }9 V5 u6 V#define uint unsigned int
. O' y, d: J9 x7 g' X#define SAMPLE_NUM 64" k3 |5 O/ s7 H8 D1 t
#define NUM_2_LOG 6
, ], @$ ?- n7 d# C+ P# g, Y#define FFT_OUT_MIN 3
& V( A& v& I {! ]#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)); {1 j$ B _' V) p
2 m r- _* Z; c
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};2 P3 \2 U% I4 ]* l3 o7 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 }; : I8 d& \/ Q' B; f5 ?, \' {
8 I/ ~$ c7 |" S* ?1 Z, e9 F9 @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 };$ O! i7 V. w: V* ]5 I. c3 K. I
uchar a[21];
' ^( f# u* v! S4 uuchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;//用于分离1 W: h2 ^9 M+ Z8 @* r
- k$ D7 `0 w) U! p9 `* U2 l; v/*加入数组用于显示相应led灯数目*/
0 b3 V [$ Y% @" f T3 |uchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组 P2组控制
; X' w' y+ x; V& Y& @7 Nint xdata FftReal[SAMPLE_NUM];
7 c; t7 e) P! K- V% X, P# m: Eint xdata FftImage[SAMPLE_NUM];
, I; f; u2 W& U# l+ Ksbit p30=P3^0;7 q, V9 g3 M+ }1 d$ ?
sbit p31=P3^1;
6 ^0 j5 _$ `, \% V; j- _. `sbit p32=P3^2; G9 B- `4 F" F9 i n% U
sbit p33=P3^3;
, R% E: G0 T5 r0 b3 m- d O' s4 msbit p34=P3^4;
* H3 d9 i' P7 \ E) n: }* Ysbit p35=P3^5;//9-11的led控制
' G, `2 z# M9 N1 |; a9 @1 R; ?sbit p36=P3^6;
+ X, q) |6 ]/ p/ N1 \9 F; Csbit p37=P3^7;
{. B0 |8 @# M/ E
/ Z/ m, _% `5 O9 evoid timerinit()//定时器 初始化函数, [0 ^# R8 [( s# |" w4 v
{6 o" Z9 D# ]1 Y2 N3 x5 w+ U
TMOD=0x01;
1 q" V1 A% ^$ n) Q$ F TH0=(65536-6000)/256;9 ^5 [8 E, H" c
TL0=(65536-6000)%256;/ H2 L! M: ^# N) l; ?6 |' n
EA=1;
0 l! ~9 U7 y( ] ET0=1;5 m* k) Y7 d/ {. Q9 Q! E6 S: G
TR0=1;) h" L4 Q7 h3 }/ m1 Z; F4 o# [& s
}. N' j- C8 Y3 J$ I% b1 G5 C! `; E7 `6 @
void disp()6 _9 t3 q* k3 M5 s- r7 e5 u# r
{3 V2 Q! i# C6 B9 e- s
timernum++;& L5 m+ k0 Y5 O1 J; t/ ?
if(timernum==6) timernum=1;" A- @- z/ |' k. w
P2=0;//显示前先关闭
' z, Z' b% A+ w: a2 @ P3=P3&0x1f;4 ^+ t1 G- t) y) ?
switch(timernum), `- I7 u$ g8 B! k, s$ k' F: D
{
- b ~4 ~+ N( w: B% q case 1:anum=a[0];p34=0;p33=1;p32=1;p31=1;p30=1;break;$ `+ F5 G" O) @( \: ]" p3 Q+ s
case 2:anum=a[1];p34=1;p33=0;p32=1;p31=1;p30=1;break;
( e, d# q& f+ n" w case 3:anum=a[2];p34=1;p33=1;p32=0;p31=1;p30=1;break;4 P7 q4 X2 D& Z
case 4:anum=a[3];p34=1;p33=1;p32=1;p31=0;p30=1;break;
" X+ i l6 u0 P5 x" V5 Y case 5:anum=a[4];p34=1;p33=1;p32=1;p31=1;p30=0;break;: Y. b0 L4 \" C* G& K
}
8 v' _6 {. s L7 ^( @ //anum=a[10];/*修改可以改变光柱高度 (anum值分开几个部分用定时器区分显示)(a[]内逐加) */
* ~. A1 V: D- H9 Y: Q4 t' ^ if(anum<=8){P2=lednum[anum] 3=P3&0x1f;}//屏蔽高三位
# ^- t- R/ s3 L- ?5 ]; M/ j& z //else {P2=0xff 3=lednum2[anum-9];}
! |8 t) d. P& _. S5 n if(anum==9){P2=0xff;p35=1;p36=0;p37=0;} a. `& D7 H" j$ g1 W
if(anum==10){P2=0xff;p35=1;p36=1;p37=0;}. O/ M1 T0 a1 S' b' w
if(anum==11){P2=0xff;p35=1;p36=1;p37=1;}
+ n& _1 C& h+ x W. d" T+ [8 [4 x: n# \' z! z4 g
}
% J. D8 n+ x5 E) f
2 r& h+ ^5 p+ a& m0 r$ Yuchar STC_ADC() //!!根据数据手册写一个ad读取函数
, p' p, l+ }0 s9 W' A% R6 H- m+ ^ {
8 H2 M! H ~4 ~7 ] uchar i;
1 A, b4 e. ]- a0 H- r7 L: |& n ADC_RES = 0;7 T+ U0 V8 U# @
ADC_RESL = 0;- M7 ]1 @& o" Q5 Z& j v5 s
ADC_CONTR = BIN(10001000);( F7 [* x) {) U# o. ]
i=3;" j4 X' y: K! z8 q$ `7 u
while(i--);& v3 L. v$ ` v" N; x. M, e5 \+ ?
while (1) |0 V9 @3 P' g6 y
{
2 s. d+ P0 ~5 U: k4 q if (ADC_CONTR & BIN(10000))
$ `! L" | O/ y% E) D+ z {
1 |* U: _% F% N5 c( r break;; E) \8 q8 d: @( t: T
}3 N. \. }$ r3 i0 x( o* |
}7 Z. b" l* C3 W5 A' M0 V8 h1 I* @
ADC_CONTR = BIN(10000000);9 s4 Q3 x9 Y0 S, |( Z8 X
return( ADC_RESL<<2) ;
2 M5 f; i" V% x, c* x }2 `2 M7 q- i7 V: A
short sqrt_16( unsigned long M) " }" d2 Z+ a, t5 G
{; G2 g7 _9 Y# u1 H& _
unsigned int N, i;0 P8 H: ~, O) r# n, A
unsigned long tmp, ttp; 0 N* K7 ]4 Z. f% ^
if( M == 0 ) * E& |: x7 a3 W0 w; I* X
return 0;
( M; Y; S/ v; P5 o6 u. P7 P' m. ], ?. _+ \6 }8 o( {0 o# e$ B
N = 0;
7 M2 C% O2 @8 _. l; ~( d
" u; m0 g: C* q! g" U tmp = ( M >> 30 ); * |/ `8 q& ~4 g* _/ S% B+ _
M <<= 2;1 L* b6 q7 P- o+ Z, a+ B! g& w. P
if( tmp > 1 ) * E, L* a8 R1 x( R
{0 A! v$ T% o7 `9 S' _6 Z6 L
N ++;
6 m6 B! A. K7 ]& ]+ R9 Z tmp -= N;
9 l) n# e- \; Z2 Z }! e: ^" S" B" x z/ h
8 T1 S5 j& B! B& ?! n for( i=15; i>0; i-- ) 3 W1 ]2 z8 a+ V }. T8 q+ f- j
{: L' z6 k1 `1 f' U
N <<= 1;
1 `7 V& U8 G& l: V: b9 ?4 ]( }# J8 i) Q+ Y& `; S; B4 ^2 F* R
tmp <<= 2;
) U" f0 W c4 C( U8 t) R tmp += (M >> 30);
. D1 c! H2 X8 e+ J+ @1 X9 c0 ]+ f2 W
ttp = N;
$ {0 D) f$ R5 j5 z9 q ttp = (ttp<<1)+1;
' O9 |3 s( z- s7 ?0 S4 \1 Q0 V) N9 a1 j1 r+ [! ]$ x B
M <<= 2;) V3 L( P8 [8 E# g4 L- n4 c- @
if( tmp >= ttp ) ' \. A& B; }) d/ \! j8 ~/ ^" b* ?
{7 ]9 Y j& |' ~% W2 ?; P
tmp -= ttp;
: p* W$ z6 c: w0 @ N ++;
7 m' u: b& w& r } 2 d1 s7 Z% X0 T& W) t- g4 y& y
}6 D* p) \5 ?) b3 l5 J& `3 H$ f5 ~
- K1 k$ W8 q5 C0 V2 S return N;
$ g" T- r# n3 K- v}- ]6 G; m# ] K4 N/ W2 m$ U
void FFT()
! B; D1 l( |+ \7 }/ `{0 u; I" H6 i k7 \% S0 p
register uchar i,bb,j,k,p,max;2 k9 S/ W; d! S% ^) G
register short TR,TI,temp;) W* o4 x$ ?8 d1 `: S5 d
unsigned long ulReal; ) ]9 I8 {6 f! h; K
unsigned long ulImage;
: b7 x8 g; K! ^% O, }9 r
" H& Z+ \2 t# s( |* U- _) t4 S2 ^' r9 X
2 A3 b8 N; H9 B" M+ I( Y
for(i=0; i<SAMPLE_NUM;i++) //此处可以加入自动增益/ K) G" J$ q6 z3 O5 D
{3 C/ H# p1 m5 Q+ ~- w
FftReal[BRTable] = STC_ADC()<<keep;//使显示保持在一定范围内
$ I$ _, Z( j5 ~1 ?4 T FftImage = 0;
! C5 ]% G. z2 Y }
+ h' u8 ?: ~. h( B1 i2 P! h2 o
0 i1 b/ t9 K3 r0 v) |8 V" J keepnum=FftReal[2]/32;//提取等级数
; D% E" Z9 a4 V+ f- F6 d if((7<keepnum)&&(keepnum<=8)) {keep=1;}
R! f; Z% u/ f/ l5 q else if((4<keepnum)&&(keepnum<=6)) {keep=2;}
' f8 T" n5 \, {1 F7 L. E# X3 \' E else if((2<keepnum)&&(keepnum<=4)) {keep=3;}3 h7 _2 b% x% Q$ d# L* w
else {keep=5;}
" c3 x) h5 W: H. T: Q4 @: K+ F! C% c
for( i=1; i<=NUM_2_LOG; i++)
6 Z/ \! e. }; E/ x* J+ J {
. R1 j& r8 {; W6 k1 p0 F$ P bb=1;
f! |0 Z+ `) b: B$ P1 A+ R9 J5 X bb <<= (i-1); - T8 Z! |. ~% p6 D2 _5 _
for( j=0; j<=bb-1; j++) M% k' }/ O6 Z; Y! X* y
{ 3 r- S) b6 c- M& h- {
p=1;5 n1 S5 }$ s8 e, m2 O9 [
p <<= (NUM_2_LOG-i);
4 j+ s, h3 P9 C4 j! H$ n z p = p*j;# s. u: R- N. I$ t) d9 i3 Q
for( k=j; k<SAMPLE_NUM; k=k+2*bb)
4 y, W* D' U( B: J( B% m C {
8 Y3 Q9 s+ E7 B$ a5 L' v2 N. I+ j6 ] TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];
6 E5 T% q3 Z) e! L1 f: z FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);
) w$ h$ N. w) |# _) [* p FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);
6 ?! x. Z3 l* k6 E& I; h FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);7 g, b) Z8 \ T
FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7); ' v+ t \5 `5 m+ P8 P: d" A$ h/ e
% X+ o# U2 m; k4 r
FftReal[k] >>= 1;
( |9 i4 |' ~) I- N9 _' ~% n FftImage[k] >>= 1; 1 v7 A. z' f/ Z/ P. Y
FftReal[k+bb] >>= 1; # U6 e0 l! Z5 y! w' C) q! A* J/ Z
FftImage[k+bb] >>= 1;
) v) ?; H2 r& a) f/ o- u* y+ E; P0 s' F# v( f1 `4 D6 ~; g
}
( `2 l; ?% W: v: Y0 p3 e) U }
! w- K5 O9 A0 M }0 ~* `3 d" Q: q/ O% Z' w9 E
max=0;# j9 H: Q& |! P: [' G) ^
for( i=0; i<5; i++)//5 f% `* m; V3 e/ L1 p
{ 2 E. w. @. @: M! j; [
ulReal = FftReal[i+1];
% e* b- Z, N7 p) A% S ulReal *= ulReal;
3 C, Q) d9 W! s ulImage = FftImage[i+1];
6 g- S7 u, T; L, k/ a6 Q ulImage *= ulImage;' A- s2 u6 A$ t+ ~/ k
: P6 K+ a( ^- B& |' P
a = sqrt_16( ulReal + ulImage ); //修改
% L* P. [. B8 v {1 @% s0 }# a4 M) g$ O5 Z/ {& A( N- q- n
if( a < FFT_OUT_MIN )
" A& q2 t2 T2 P7 X a = 0;//修改' ]3 D" y" M# m, o% s
else4 q+ \8 ]1 d* h4 A4 x
a = a-FFT_OUT_MIN;) W& e/ M# l- R' p
if( a >max). @1 M5 B4 f% n& z' r
max =a;
! I7 v% ^) ^' g: g2 @1 _9 e: y+ Z9 | //disp();
: ^. r- Q* e: J. A2 e" R }3 |6 q. N3 t. k5 h+ o w: J1 }
if(max>11) //11
" l# R; E4 N, q* e" H7 v {
. w- a0 V" l* A) d$ c H max/=11;
* \! k+ y- r. w! \' j, N. F9 q3 g for( i=0; i<5; i++) //输出a的5个分离数值7 f' ~7 w9 V4 T" z. a' w( M
{ ( [ w$ }. Y: y9 ?1 s3 j
a/=max;( y# X- Z' Q3 c" Q# ?; g3 `
( E& J4 A- f' x& t0 }
}
+ E2 B( @0 D+ f9 o% y3 P }2 B; g' W/ K U$ C# L5 s
}
" Y+ S" Q1 Y1 h1 }
3 m+ e7 j* U9 N U
' y6 T, Q% a7 k. l! B$ cvoid main()6 d$ O$ U) s5 M# x8 T
{
$ M& g0 ]6 |/ A5 M" G P2M0=0xff;// (11111111);//P2组设置为推挽输出
( W" }# f; @* \; ?( v P2M1=0; . L2 X9 H ~ B m
5 }: w- P5 E8 f( O5 \ {; H …………余下代码请下载附件…………" q' f5 Z0 u1 c" u
下载:; M L0 \0 U! |& F0 D; n4 \
, C2 T- r+ x. a
5 R; u3 s' y( @+ ]2 E6 V$ r |
|