|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
发个音乐频谱的单片机程序代码,带原理图和pcb AD画的0 | y% M: s+ D* Y, ~3 G1 T+ ^
, c/ T; O0 H: r9 ?, g
1 }. e: n. U" {: o音乐频谱写的不是很好,请不要喷,多给建议 呵呵
. @# t! V, a, W4 }" N" J# w
* D' W( s" p0 J8 l. Q1 Y: h
- T; k( ^- n' h
主程序:+ ~" c* o' `6 E/ k2 @" i2 K# E
#include "srcSTC12C5A.h" 6 O. B3 h2 Q4 m3 n4 d
7 \. p9 E: h( w. r
5 C. E! N, ?3 N h9 @% @* @
#include //51基本运算(包括_nop_空函数)2 y8 M+ O: M1 H) r+ ^0 V; i _0 F
#include
+ `( a8 x) i- Y) m) D4 V. P7 j. P
/ }4 d' Q$ `$ u! @( ?2 e% M9 W7 j8 L
#include "srcDefine.h"/ D7 U" a+ m$ K: x1 n l$ ^3 Z
# P4 {8 A! c! F' f. q5 |' I2 u$ W& N' x2 B' c
2 J2 e6 f6 l8 A0 i l9 z9 J2 h$ W
///////全局变量///////
# s! K+ b* a: ]" F; w2 Q! @7 T* i" duchar data DelayTime=9; //<=8效果最好;
' h2 r5 _ V$ Yuchar data INTTime=0x40; //0x40; , Z% Y8 j$ |; \6 a/ D0 ~
uchar data gain=6;
4 c" ?( {7 O9 c% H1 d1 Ouchar data Menu=2;
) ?4 l& Y. A/ `* Y; W- t% _# z- [uchar idata refreshflag[40];4 Z, v5 N+ O2 T1 b7 U# R+ c
uchar data LEDBuf[35]; //15列;从左到右;亮的位为真(1);
+ _4 L. o+ d7 V. r$ ~uint32 data TouchKey=0;: u$ N4 c9 l5 G/ B
uchar data CBeep=0;: H, x* d" e& j( [* x/ M* J) h
//////////////////////
0 V2 O* n. z. h5 ^( m( K& I3 j4 p( Z7 V2 Z5 T' B6 u
/ P* U+ l6 c& A( S" @, w# {. p# j
9 E8 b+ b, [; _$ U& `3 y
" H; I( X9 T5 G
void Delays(uint t)
$ [ K0 m' O- ~. N# e/ \{
& C/ V- Z, e8 S/ z2 F uint j;
n( @# C3 O/ L4 ~$ ^* Z. S" c while(--t)
( M1 T5 N. s2 a+ c% t* V3 @. Z for(j=0;j<5;j++);
8 c" u/ A* W* T# v}
1 Q7 h& N1 L6 M5 Ivoid Delaysms(uint t)
4 |7 N1 L: Y* |) D3 S' E( |& r{
& D+ G) s, M$ b; Y3 w x uint j;" }5 _3 n. z, n, M# }7 t; }6 c* l
while(--t): x; {+ `4 r F- t
for(j=0;j<15;j++); 3 x3 h$ f5 M* @5 K* D; C; x, N N
}
" w* ?# O, \. T! W! ]! Y. `
0 ~ ]$ w- y2 T( }7 o
" q3 j# I7 Y# F3 C' X1 j: S( K$ N0 { X$ t) O) x
6 t7 K/ u' X* @
. {( Z: O) b; F4 _' C5 I; V5 ?1 a2 q8 Q5 c/ j% N+ v4 l: v, z
#include "srcADC.c"
" Z) U- M9 a0 @7 @+ o1 o- @) Q$ ~#include "srcFont.c"
0 p+ @% x' L- M9 P2 `, n0 k4 b' W#include "srcft.h"
2 T8 h# D' b# g0 V2 N0 V( b$ p- @2 U+ |/ t0 Z$ p2 |9 G- g% G
: o6 T% a, Z9 `$ d* l
e% f) q+ ~$ h, P. `; j: r% k
]$ ]4 Z) y E1 s) S3 D3 n% @4 G
% {# W8 ?$ H# }6 {# dvoid PWM_init (void) //PWM初始化函数 //PWM模式,接P1.3接口(PWM0),强上拉.# s5 J' C" Z4 K1 C/ L) v
{ : f5 n9 e2 a- T! j/ P. n4 d
CMOD=0x00; //设置PCA定时器 0x00~0x03;" P# q! t* }* J( H/ M
CL=0xEF;
! M) K! v. G* |$ `2 A7 T8 F CH=0xEF;& C; e4 t+ m$ Z1 O$ |! P4 z+ Z6 P f
CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010) r% p7 @0 N! U* F3 S8 D. z
CCAP0L=0xEF; //设置PWM0初始值与CCAP0H相同
* f. n& y4 D% B$ M. E' A CCAP0H=0xFF; // PWM0初始时为0
$ X# X& f( w+ o) C! e7 ^: l( ^% F' x. }0 {' u
3 N- k$ s8 W3 u) T2 j$ ?; q CR=1; //启动PCA定时器
5 d+ v: l9 [7 J' b! {# T# C}
, I% I+ z- E4 ^
) j, S1 C/ E) D. n* F2 W$ A c. L- X3 C% n9 y
void PWM0_set (uchar set) //PWM0占空比设置函数 (0x00~0xFF)* n! m/ t9 j3 k5 L7 h2 u$ z5 w: v
{! y+ {% C) q8 Z
CCAP0L= set; //设置值写入CCAP0L' s8 X3 j. `' {8 S
CCAP0H= set; //设置值写入CCAP0H
5 I& ]/ Q# j- ?* D$ V9 ?5 X6 e, c}
9 U/ o' f: T" v. t7 j Q, {: x' d$ L. V$ O
- |( E' l. l; Q3 `. a Z! K: V
3 J! C2 E0 m+ X4 {7 n; B
- Z# j O! K( {+ S2 V. qvoid IOINIT(void) //I/O强上拉模式;" |1 L4 ~8 o Z4 ?6 A
{. U2 I' r3 J( v9 c5 v2 f
P4SW = 0xff; //启动I/O:P4;7 O9 p" x5 c0 _/ T& ~
P4M1 = B(00000000); P4M0 = B(10000000) 47=0;//震动马达;
4 B0 W& [* ^' k# ~8 {/ k' T P0M1 = 0x00; P0M0 = 0xff; P0=0; //点阵列(Y)(L:OFF; H,H+:ON,ON+;)
) V3 y% u6 c6 i+ n P1M1 = B(01000011); P1M0 = B(00110100) 1=B(10110111); //(P17@(高阻,IN)& 16@(高阻,IN);TouchKey) ... P14@(传统IO,Beep,IN) P13@(强推,OUT)呼吸灯 ... P11@(高阻,IN)AD2;P10@(高阻,IN)AD1; ; N4 ^$ J3 m6 W1 i: v8 \
P2M1 = B(00000000); P2M0 = B(11111111);P2=0; //点阵行(X0(Left))(L:OFF; H,H+:ON,ON+;) 7 D& T9 ^# Z+ Z g, Z! z
P3M1 = B(00000000); P3M0 = B(11111111);P3=0; //点阵行(X1(Right))(L:OFF; H,H+:ON,ON+;)
/ J" h$ G4 V7 L( q P1ASF =B(00000011); //将P10,P11的IO设置为模拟输入功能; & |( `& _& }+ {7 {4 }
/ m6 F$ a" c) q, Z! ^# y/ y1 b
3 \, ^% ~1 }' D0 S// Y(P0)
; t! j. s7 I$ X$ h# {4 H5 a. y// ↑- X+ f! y2 S' c" k
//H |8 F9 g: g p. n7 t
// |
# h' [. N( A+ F' h// |
" `8 ~8 o# b* b//L |- g6 h* r c4 D4 x4 d& B& Z, u9 P
// ---------------------→) ~ s# ?5 r+ D$ e7 M. u
// [L:X0(P2):H][L:X1(P3):H]. R8 @' k ?& A b: r
2 d3 ^ x3 F6 E/ ?' B! w
, p, J6 \) z/ e
//TestCode:$ ]6 _/ H) F* g6 G. \1 P) m/ t
// P0=B(10000000);
$ d/ k6 M8 h7 ?, m// P2=B(00000001);, f; Z- i! |" B @' @
// P3=B(00010000);7 v7 `# y3 x! e* c6 O# c# H& B
% P/ `% ]+ _6 L( s+ V! L$ Y3 `% F9 F* r, M
9 q, s" M( h& L3 l G}
( ?, ?5 P9 J |$ t9 J2 o- I- Q0 c
' }. B2 ?5 R! `7 o- y
. _/ ^/ b- F* D* T6 l3 U' x, _, |( S0 O' ^5 ` x; }0 ]3 a; z
9 ] k6 v8 K6 f! n! o! g, U' B/ d T" X6 @& L6 g; s
void BufToLED_Refresh() //Refresh&Write Buf to LED ;1 W- q; n# l W8 T4 D
{ ; K* c0 G/ N0 I: Y
uchar data i; 3 H3 u: [9 D/ A1 p
uchar data X=1;
. ~8 W9 Y/ x! P8 k uchar data Y=1;( l. N5 ^$ j; I6 f6 T; r7 W. n- y
for(X=1,i=2;X;X<<=1,i+=2) //for(X=1;X!=0;X<<=1) //8bit
; q3 C6 Z7 J( I6 ]* f {6 w/ k2 r E! Z' B7 @2 \, U
P2=X;
x' v" j) d) R8 f7 t for(Y=1;Y!=0;Y<<=1) //Y=Y<<1;6 L( j# P+ z5 j% z7 ` e ~2 O
{ {8 d; E2 g7 ~: S( P
P0=Y&LEDBuf;% ^. T4 u! `* A/ b: m/ q
Delays(DelayTime);
1 i5 s" |' H- \7 ]( x P0=0;: S# T2 w; Z+ \$ h4 ]! ^6 \
}, P* a7 R! v0 y; e
P2=0; " l$ }8 r, h9 m! j) ~8 I1 O* _2 X
};
G; I) P3 V% U$ ` for(X=1;X<b(10000000);x<<=1,i+=2) 7bit8 J$ U; E' m K$ l9 Q6 k
{8 L3 f) e( ~- ?+ t8 u! p
P3=X;
: E$ L3 b0 j- G for(Y=1;Y!=0;Y<<=1) //Y=Y<<1;$ w3 m0 D/ A' O2 D) q: J! i
{' D& `, F) d6 L+ D9 d; p' ]
P0=Y&LEDBuf;
. g% F( X! g- a# M Delays(DelayTime);
6 b, t+ e, Q9 K1 r1 b P0=0;
& y+ `% o8 c& U }7 ~1 |/ [: M* |
P3=0;
; }3 E6 L, S! w };
$ q- L: }# m" w9 Q( e0 g 0 B5 V2 u' _5 m. E8 [3 t9 o
}
% h }. Z2 T. }2 c+ A! h1 }" H
( j# ~) w4 F) f+ z( p" Q. l7 H+ `6 g( s2 m0 J
- j/ b. ?0 f8 N7 e0 [& X* A) H6 B \
; T& @1 }) L# {( R1 O9 v# ]8 L
3 _, a( G: l6 y/ X" z; F
% m: {4 j; m: s5 j* t* v( C# f( x6 M$ ^& b1 M
* T6 n* j1 `0 d% S
void LEDRefresh_INT() interrupt 3 //using 3
; l& v! y5 c7 I" J5 L3 l) a3 l{ . i7 s$ ^3 B. Z. r
static uint x=0;
8 A; n: x: \. F' U, D3 f: o6 _ static uchar flag=1;
3 h; K+ t' K) _: X' k% E4 u' r- k; T) I$ i/ X! U. s4 n/ n
8 ]1 p4 s2 Q$ }. W TL1 = 0x00; ; M: y; j% S' g/ A
TH1 = INTTime; //0x50~0x80
7 g, j7 c3 k* X8 w) k2 ~
4 C8 p- ~. a( Q( P2 H+ k# t6 a# u" I/ E% |# x* M( w8 D. K, |
if(flag)
4 E/ O- h' |" x% x7 d& ]7 j+ ? {* P5 Z |( N- y" I. u" n* x) d
if(++x==0xFF) //MINOUTPUT
6 t2 l$ W# P! l {( d u8 d$ o1 w0 A. {
flag=0; ! x0 F" H9 C) D2 Z
} F, n; A3 A8 F* W2 k K
}* H S6 A' r( Q8 C
else
! w; b1 J% Q( @0 d9 ` {6 |% J* u& h; Z
if(--x==0xCF) //MAXOUTPUT: p4 n. E3 d4 C4 V: |
{- Y' ^5 x v/ t9 J/ l$ ^
flag=1; 2 ?+ p! w1 b+ |1 |7 B3 `
}
9 m ]* d$ P! Q8 ] } 5 t, J' B/ }% m* W& T+ s
PWM0_set(x); //设置PWM占空比2 g- j( \# j: E: |4 ?# }
7 Y7 |; d9 y- P1 B9 @. z" q
; a' M5 D+ K: K g0 r
BufToLED_Refresh(); / X0 x. r6 O1 e" D+ j
}
8 R+ R* Z. e r. m9 p! {( y
' h9 ^( T3 H, P$ i+ z! u) m# m8 p
( |" B; q/ J4 c1 g+ @1 \; `" b# N/ U6 ?) ?
void Timer_INT()
6 a0 ^0 b6 l0 d, Y( o; X( H{
" C2 q C' }7 r! W TMOD = 0x11; //高4位控制T/C1
0 o$ t) a& n0 N; B EA = 1; //开总中断
; l( I2 G0 q6 x& b TH1 = 0x00; //16位计数寄存器T1高8位# s& S7 g) W4 b# O3 E
TL1 = 0x00; //16位计数寄存器T1低8位! U& L2 x0 h! }$ l: E8 t
ET1 = 1; //T/C1中断开6 F, n3 }8 M7 a& P: o
TR1 = 1; //T/C1启动
. @) r! y( h$ C8 U1 @+ h7 p, [" W; f# V d! D' F# B1 g4 C
" j* f% D% ]$ m; L
}5 K/ |& K. p. p M% ^6 J0 _6 f0 a
. I; H4 W, p3 m" A; s9 p" N) I1 J
% U5 t& J2 v+ U4 j2 _% N9 |
, {4 a" C+ b, f& @3 S+ d: B: s( V# p* |' Z' [1 L
void FullScan()* s6 i& U, T. p+ a1 E
{
% X) K0 G; B1 O' m& s/ ^6 o uchar data X=1;
4 S* d0 k* d3 F, C' n6 r uchar data Y=1;
0 u$ v g1 K6 |& P) _
0 u/ _+ }7 I" |6 b$ p4 h0 `
* k% u V: Y) D) @4 R5 L( _: A for(Y=1;Y!=0;Y<<=1) //Y=Y<<1;* H$ M+ x% y9 S3 a* j% ^
{
/ t J! d+ r8 ?( ~1 t( W* V P0=Y;
( J- e+ h: X: `# { for(X=1;X;X<<=1) //8bit* e [1 D7 u2 g1 c: q6 y' I
{* ]4 |, N# v/ H
P2=X;
0 `0 J. ]' [! p) I. C Delays(7);
j$ c+ f- }9 B' r& w) r: ~ };
% `0 N, E, r+ X7 c4 g, |. p4 Y# W8 Z7 {5 n# e$ U
" R. k$ ^# D: W' L" G: k3 q P2=0;
) q" I x! b+ u, q4 w4 @: a- c, J9 \+ W& g for(X=1;X<b(10000000);x<<=1) 7bit" l+ n% k) |4 }1 S& h; A0 ?: Q
{/ S* \$ ~( `5 O. }% ?
P3=X;, r, w/ n {3 y
Delays(7);* ?1 ~ B9 a( s( a% t4 j/ l+ J
};+ [; b/ U' B4 ]2 m( |
P3=0;9 Y/ E" t" _; Z
P0=0;8 D& w+ M8 p- Q; L- U3 H
}6 k. ~; [* q# Z$ d
}
' Q' {. K2 y: R. y) z3 j6 Q1 {. T
" g! ]% p) N6 h2 A( M: [9 t& M C
% V6 G( [' D( T( {3 ?* m6 k
! V/ y9 K8 V& ?8 H. {: B% ^9 o' ?
void Main()2 {) y: B* S! M$ [
{
% c! x' l# h+ t uint data Count=700;
, X! Z. p! i, k7 W. W uchar data i,Cgain,num=0;) E, S0 _. s) b5 G: v0 n s T
% s1 |: ]" r6 R4 ?" \1 q+ M7 Z
0 N( E9 h3 V* ]) r6 [+ `8 q IOINIT();
\" _- v6 H1 w @' H InitADC();
6 N; r3 m% \, k6 \; E4 U( w
- s( V3 K* \4 K4 Y/ X4 M
. b; r$ K/ F4 F" h# v while(--Count)" O' ^- f' q3 Y5 g
FullScan();7 g9 w/ G7 G1 D+ _
2 \4 I" ^) J3 J6 l* Y+ S1 j
6 E: I+ I: B2 e! Z! b6 X! G* k5 O
for(i=0;i<40;i++) refreshflag=0x09;
6 ]. t( `4 J' H" F9 P* J
, F) }$ c7 u2 I4 ~' L% O P14=0; //Beep
- a" ?5 i& W% N! Y; E% I2 O Delays(4000);
" `, M0 ^! j+ ]* E" p+ s/ D P14=1;
( _4 S: I* B9 F6 b/ p# Q- T6 N3 m
# I! I6 w { G9 {; H* I" s
/ `5 ?# q$ a8 z( _( J6 Q PWM_init(); //PWM初始化
6 X5 g1 s N! }0 u( f M PWM0_set(0xFB);- q: f. W, v1 b% ~3 }! {$ r% j1 ?
* U1 P0 K/ e* ]4 ]
Timer_INT();! `; o! g( a4 c+ a' b7 L
- |2 Q, J! ]; R k( h: d. J
7 J8 @0 f' H1 [( ~" F: L2 H for(i=0;i<34;i++) / w; h# I- k& u7 S7 A
LEDBuf=0x00;% L9 t P8 p5 O! \
FontDisp();
1 |; m- h9 i% B k' d9 Y* o
0 D) V1 d$ Q6 y; D/ e! T3 J+ i2 m w% h* m! _) }
while(520)
% l+ S; C7 u% C: q4 O5 C( N {/ I. J; Q+ m9 {& V) G8 e
for(i=0;i<65;i++)
. z6 J5 m/ h' ^; x- E" X {
. @$ d# Q5 F, G6 K( n% b dd.real=(GetADCResult(0)+GetADCResult(1))<<gain; 读取ad结果并放大;
# {5 ~+ y. C& J R+ i: P }1 u7 |% j1 s# V6 o, r9 z
& ~4 w: {( `1 z4 o: n; W0 T( j
% Y' {3 ^+ s% Z! m* z processfft();//傅立叶变化及处理
+ l- \( V/ ]: _' F/ y4 |4 ]+ ?* ?# X+ G$ _! ]. I% i2 Y
- ?1 b4 v I* i9 a% l) ^5 G) h ///////////////////TouchKey//////////////////////////
/ Z q/ C0 r. y. L while(P16==1) //依据:脉冲 干扰持续时间短;
% d0 p0 o* ~3 v6 e. S {
3 O6 R4 r1 M6 S8 s) l V( | if(CBeep)P14=0;
) d4 t: h# u' i: Z6 C$ x if(++TouchKey>0x0000FF00)break;
; q( V/ f$ Q4 y. O4 x }, j/ q" ~: d) ?3 x7 ?
P14=1;
* ^# A# |+ M% e; B% Y% |9 @5 p6 d8 \" T. a2 u4 y, S' V+ T
7 o U! |& [1 ~6 W8 d8 c1 X if(P16==1)6 w' Z7 L+ i5 w& f, l
{+ `- z! U; a) A
if(++Menu==4)Menu=0; C" C* G4 \, v: \
; Y3 ^! r& o3 ?/ t5 {3 c5 `5 {) E0 M
+ q2 M+ e1 O* Y! e5 i% H P14=0;8 d; W' I' C5 ^
P47=1;, | P' c% K0 z: B2 B! x$ A
Delays(7000);
0 U4 U- R/ P1 o* n P14=1;
1 K, E' J: }: K- j1 A" V& @ P47=0; . E9 Z* s% o4 j- `7 q2 Y
}
! h+ Z& i9 ~ [. E" Z3 y TouchKey=0;
* x9 a2 z7 M; \ //////////////////////////////////////////////
, R2 R; ]7 G5 c/ z8 ~
' ~0 d4 `1 K2 l+ J7 z* e2 H! S( _, r& \: B1 U) P9 g
if(P17==0)CBeep=!CBeep;# C9 |. L! x+ Y8 r
% E. U+ k+ O, \
' n% y9 C4 F; l if(dd[2].real<32)
: i# O/ g( I6 ^0 T* Z D# g {
% `/ g, }! S) {: E& l: i! V+ M, h( N if(++Count==300) //电平值过小,这降低gain,减少噪音的电平显示;
% G! E# Q1 v7 f; f* r {' o& y; L( W8 B0 V
Count=0;9 y" p6 N8 l8 W% s3 S
//if(++Menu==4)Menu=0; //切换Menu,显示方式;9 ?' _* }6 Q: |6 b# X7 g
gain=6;% i/ p$ ?8 K& F
8 E. t' A+ I# E
+ _3 d6 m, Y5 N e% Q8 E
P14=0; //Beep
7 e/ w( m$ O; ?5 G+ N/ P Delays(1000);$ n1 [9 L. k$ @! _
P14=1;: l8 w( d* O' h. P% c" K
}
, O0 f$ W( Z+ c' P2 Z }" E }) U- d8 x J! c' A
else 3 N* M$ w# _9 O% c; ~. ]8 _
{5 v$ N2 C: K# s% y/ i% _
Count=1;
6 {2 V ~, [# C: U
9 B; C3 u) x9 p4 Q- r: t; B if(++num==0xAF) //播放时,Auto gain;
& f8 p. F- ?! q {
- B/ D1 }( X: p( d2 J! [ num=0;. A* g6 ^6 {: i
/ G. Q9 c9 u1 [0 Y. n% n$ Y# b( Q7 M r
P14=0; //Beep
, W7 F$ X9 }/ C6 V Delays(700);
/ ~, R' L' ?8 B- U4 G P14=1;
: t* H: _/ z1 `9 p" k$ o //自动增益;Automatic gain;
0 ]9 |' P0 c$ G9 b! f: } Cgain=dd[2].real/32;) q+ t! P2 z i0 p4 z: e# c0 n
if(7<cgain<=8) 2 s1 b' c8 W, E' L
{& _7 K- H2 p- Z4 O
gain=4;
6 c1 o* _6 B% D2 A0 }0 V8 u$ y: t
' [' k z* h, R }1 s- e, s! o* e9 U# k: r3 b
else if(4<cgain<=6)
0 N, ~& c) X+ f/ M {
4 ]" N& q+ l$ p' D gain=5;* M5 j) X4 |) B+ {) @. b, a) A
9 M) v3 r4 h e$ T0 @# i, x( U }
/ `( T* f- c' G+ E else if(2<cgain<=4)
# Z# E1 B: D- T. ] G( Q2 w {
8 _: E3 k+ B7 h; ~) L" M gain=6;
v5 [# s' d# ?5 f }
4 i( k0 f: y4 q9 r8 H- P8 c else
+ d; y U# J! Y' n {
( y- }. A4 n! z7 w& s6 X gain=7;
9 d1 i# L0 W% U" Z ' ~* T a' x- y, L3 M! P
}
4 g' o7 J5 P+ P0 r ' i9 V4 q) J; m4 x3 h
}
# V! {3 Y% G! Y" h4 B, }- c- E; G" O! g# E4 I- I- d4 y
) H# S4 f4 _* u% x% g! E0 f }
6 E$ k8 |$ K/ }; w8 b! J% }1 v2 A$ p }2 s+ X) a+ E! D% p+ ?2 G4 ^
while(1);
6 ]: X) `( L1 L1 i/ m6 {5 j% H" b}
# k9 n+ |/ w8 u$ C! s( _/ ~0 [3 Y
1 V' e1 Y8 x, g1 B6 g- H下载:3 ~6 w& w. C+ D+ J) c5 [. ?
5 G) C4 H. Z3 G8 s# }, G. z* w( _
|
|