|
|
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=0xff 3=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; p2 f4 [/ E' E6 K3 v3 x. B" s Q0 S/ @
9 J: _1 T" V7 v% P |
|