|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
发个音乐频谱的单片机程序代码,带原理图和pcb AD画的) k& m( W0 a( _# k: f: s6 J2 q8 v
& L& M4 F' \; b
& K0 Q9 N, l- L. t9 g音乐频谱写的不是很好,请不要喷,多给建议 呵呵3 U' d) h. C" Q. p0 i
* V/ i- L9 H7 i" _+ A
; w O* R* a. i z' f( l4 h
主程序:& o0 k1 q8 Y4 Y/ b
#include "srcSTC12C5A.h"
, L! a' C: u2 i+ d k! [8 p8 @& l2 _8 V" _$ p3 Z2 e
8 e6 t) J+ o: J4 d
#include //51基本运算(包括_nop_空函数)
C7 j+ y* X, |) S3 F ?#include / ]: l0 w( J" n
; `0 q5 y- A, W' t+ ^/ o) s
. @8 K4 G6 p: g) \% u$ S- X#include "srcDefine.h"
' d9 ^1 Q2 G) |+ \- B3 H9 R! c- x4 o& R% a, y
% R7 y4 x5 U+ O! ?" j+ ?
% U, z2 k+ `4 l7 b9 i4 ~ n! ^
# {) v/ w8 [, S- Z///////全局变量///////
1 D$ U- y! p0 P( Wuchar data DelayTime=9; //<=8效果最好;
$ R2 h/ ~; \2 O% Q5 n6 ]6 vuchar data INTTime=0x40; //0x40; 4 J9 g4 i: t' M- N( C# G6 ~
uchar data gain=6;& y* F: l6 a% F1 a/ ?
uchar data Menu=2;
# x P1 f; N7 W- ^uchar idata refreshflag[40];" X, T c2 m* ]% R( Q* V, o% K [
uchar data LEDBuf[35]; //15列;从左到右;亮的位为真(1);
( ^4 Y5 m% ] z5 F* L+ V `$ y8 @uint32 data TouchKey=0;
V7 P( D l- @6 j/ p2 Yuchar data CBeep=0;( C7 L2 H. @% \& [
//////////////////////0 `# d8 [% \, s/ c
) v2 U! Y! ~. j. P7 a, F0 R
# F/ \' [) ?/ ^: _. y1 w
: O: ?+ S3 c ?- k* t$ v
8 h. I! B" ]' K$ c; C9 \6 p" Gvoid Delays(uint t)
5 {6 B6 h! \% l* u{ $ f. M) H; k9 z2 }3 n, t6 a
uint j;
& `8 j' R% c; _, n7 r. E! A while(--t)& q; ~, ^ d' p7 {2 T
for(j=0;j<5;j++); * ]# g. D1 F6 D
}
/ W" h: O: V0 U. s' `void Delaysms(uint t)$ x/ Y& B# G: C
{ 9 t3 s7 E G5 g2 {% b
uint j; F Q8 e8 X) `: a' d
while(--t)( M# M, G/ F9 e% P/ ^; i3 H9 F# G: e
for(j=0;j<15;j++);
2 _7 B9 v2 M" [ X3 y}/ m) ?1 o1 S1 y, R9 F. ]
7 F7 I# T7 c- U1 j2 V& V
0 p I& s" B' S& d, ^( U4 c$ ^* u- \6 `/ Y
. Q b3 t" [; K+ Y" W! Q( c5 |
& J( ]3 V6 H. K2 ?, `/ g
7 F; W* v* V9 K1 M4 b6 X6 ?: h- E#include "srcADC.c"
: }2 `& m) _6 }# P7 u8 ?0 }8 @#include "srcFont.c": T# n# X, O: A' F: Y
#include "srcft.h"
9 l' i1 \" f* l* k x( X4 ^/ I) F
$ c. e2 {: r; C7 q: y. N/ V! l" }6 d( q5 C$ w" m* a& M. g3 p
4 w9 R" ^6 p' d9 n; C0 Y+ a8 Z1 i' f4 u( k; u
; g1 W4 Z. j. c. b
, e& K+ N: K, S$ M7 A/ `* avoid PWM_init (void) //PWM初始化函数 //PWM模式,接P1.3接口(PWM0),强上拉.# N E0 n1 t- Y5 Z
{
9 b8 w% O; n/ [# @$ R( ~4 N' W+ L CMOD=0x00; //设置PCA定时器 0x00~0x03;
W4 k7 o9 i. u$ d' Q3 L CL=0xEF;
4 R3 ?7 ]6 Q8 X F. g0 H CH=0xEF;
6 l1 T9 `+ t* }) B CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
( ]. X& X% c4 l1 `& G CCAP0L=0xEF; //设置PWM0初始值与CCAP0H相同
# T. H8 U: s0 I CCAP0H=0xFF; // PWM0初始时为0
! w. \1 d1 _+ L& [$ x# j; ~4 `7 w4 I S# U
3 `% u z1 M6 f5 j
CR=1; //启动PCA定时器7 M5 \* D2 F5 r( k- ^6 G& i
}" I5 D: A6 Q% G5 x# ^
5 D2 ], X) u2 O6 p/ H. o4 R; i
8 x5 n# p$ u' [$ Uvoid PWM0_set (uchar set) //PWM0占空比设置函数 (0x00~0xFF)
7 \/ z! a. F' d& T" Q{7 l- y" P4 q }- g
CCAP0L= set; //设置值写入CCAP0L" `7 D" F/ k+ V$ {* w
CCAP0H= set; //设置值写入CCAP0H Z- l+ m- M( F0 l" o, s
}
9 ?0 @) r' I! }/ p1 T: r8 q% f
8 L0 S2 T' X& y9 i; l
. Z5 D$ [& |+ u5 {0 ~" N' t* G# z" i1 J J5 ^
: I' v ~! E* |( @' i6 H
void IOINIT(void) //I/O强上拉模式;
% a/ v, @/ r' {3 k+ q' s: C0 E{ g9 Z7 n' Q% U' R) U9 N8 P) T
P4SW = 0xff; //启动I/O:P4;
- A- M. E6 @0 b; S P4M1 = B(00000000); P4M0 = B(10000000) 47=0;//震动马达;3 a: }) ^" F6 p ?" O+ O, J E
P0M1 = 0x00; P0M0 = 0xff; P0=0; //点阵列(Y)(L:OFF; H,H+:ON,ON+;)- ^$ T. v0 T& N7 Z
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;
6 C8 F6 r% j, f) K P2M1 = B(00000000); P2M0 = B(11111111);P2=0; //点阵行(X0(Left))(L:OFF; H,H+:ON,ON+;)
7 m% @ }5 c$ l P3M1 = B(00000000); P3M0 = B(11111111);P3=0; //点阵行(X1(Right))(L:OFF; H,H+:ON,ON+;)
/ ]7 K" V( V+ w# e- {5 b& | P1ASF =B(00000011); //将P10,P11的IO设置为模拟输入功能; . o8 L$ F( X w& w. F/ A5 J. f
6 f2 V8 c- C% q7 u
+ O9 h& L; h, n9 v
// Y(P0)2 u4 }5 H7 c ~& E! O! b
// ↑1 l5 p% V8 [2 z# M3 b3 |
//H |: Q9 p$ u) W2 _% y! Q
// |0 t: F0 ~9 l: O2 ]+ N/ I0 H; {
// |2 @ H8 c" S6 J8 ?. i6 c
//L |$ K4 [$ z1 k1 c; n) ]/ n
// ---------------------→0 a9 K& m0 b! _0 X) B1 c! R, J8 i
// [L:X0(P2):H][L:X1(P3):H]3 t b8 S3 @& ]; e8 y
( v# }7 p4 [* ]- r" I
6 u( r* A# z) Y9 G! K3 C7 R5 R5 S//TestCode:. M* ?2 P) ~6 y: ^) e3 a
// P0=B(10000000);' N6 S( e4 R! i( ?
// P2=B(00000001);
. ^, t2 ?0 @/ ^// P3=B(00010000);
; h# K" Z# {7 C% f7 w- ]
; Q3 i* ]' l/ u8 [5 w0 m6 k4 F6 y7 n
}7 p9 A9 F* [' t# z5 ?" y
/ s: D! _' u% s0 n: M
; G9 B# V( L& I! Q8 d. F% b
. U5 t6 M m" d2 D, q
8 I# `7 h3 I/ |1 S' M) C6 N5 _* W) l9 X! s: X
# v' V2 m4 n$ _2 @; P/ Gvoid BufToLED_Refresh() //Refresh&Write Buf to LED ;
# k: c) x& j* A{ 3 [! L) U* C: D P
uchar data i; 4 {: f* J; c( U0 C- f2 O3 M- R
uchar data X=1;
9 ?# M7 ?" n3 J3 N/ r- y uchar data Y=1;$ i7 j/ R8 l" D, m% L
for(X=1,i=2;X;X<<=1,i+=2) //for(X=1;X!=0;X<<=1) //8bit5 q, e2 J- o9 \% z( U! C; x" O2 ?8 g4 m
{! |, O% {9 w" R' K2 q
P2=X;# d4 \9 B- m2 i# v" T U
for(Y=1;Y!=0;Y<<=1) //Y=Y<<1;
1 M% [% W, o8 E, T6 U7 R! l {' `7 ], @! e1 ?) c2 L: ]; X
P0=Y&LEDBuf;
/ @4 E O( L$ G1 v1 Z Delays(DelayTime);
; r7 C% Z0 s" K- ~0 j P0=0;) ?4 {; T1 m2 X. s8 S
}
) f) }& o: L# d U7 V P2=0; " l) M U5 L/ b8 w
};, D: ] V. f9 P) C7 ^: [
for(X=1;X<b(10000000);x<<=1,i+=2) 7bit5 h( ^5 O& i8 }' I$ m
{
3 p! Z" a9 |8 Z9 A# v( w P3=X;
- F" U: m; q& v0 L1 b, ` for(Y=1;Y!=0;Y<<=1) //Y=Y<<1;
5 [5 ]. F: T8 M! r; f4 X {
7 i9 x8 c: `3 v P0=Y&LEDBuf;; O2 c- `( A0 x, q- ^
Delays(DelayTime);, D X( S- f, _/ M
P0=0;5 ^1 Q6 y' ~9 T6 Q4 i6 `
}3 k% A2 o6 H& l7 R% ]
P3=0; ; B; f2 o$ X3 q: s# A. h
};
+ n) P `; J5 Y* x
: C3 }1 S7 F3 m}
: M6 a! {2 C8 s3 i$ z/ j/ B# R% i. [2 _ A2 m7 C& q
$ W" x4 G, U9 ?! y5 z+ O5 V8 n+ u1 j
- |0 g2 h- D8 s1 @, v
2 E. F) T4 q, W* x0 w/ _: H$ i
+ I9 A9 w! r: S; Y6 O
4 ~ [, j- j$ m2 O6 M$ X; l# A8 K& | ~
) n9 h2 q. K% r0 [+ [! x
void LEDRefresh_INT() interrupt 3 //using 3
# f" _& L$ g7 A: C{ 7 E. _- X2 _/ H8 h" C
static uint x=0;
& q9 ]0 b. r9 L/ o static uchar flag=1;
. n2 d G% |$ D1 w/ L& U: I
4 v5 |) u+ V0 m8 Z. \" t: o A
8 |' H$ a- N, Z4 T# i TL1 = 0x00; # a0 G8 Y0 g$ E
TH1 = INTTime; //0x50~0x80
, g& q5 g9 ?) y6 ]1 ]
$ B4 k9 ~) F0 @, |. X
+ [: w( d* o" q( m+ k* q$ }" i if(flag)7 d# H. T5 f$ ^ l
{; D6 c' n# ~$ Y3 H
if(++x==0xFF) //MINOUTPUT
; V8 B4 D7 n7 A* t/ Q {
. t$ P% | v$ @3 x( I+ h flag=0; ) g. S; h2 P/ H1 Y. v1 V
} " M# ~/ w0 d( o5 P& N9 B6 T
}. o6 w( t5 E! z
else: D% N |6 ]! ?/ V$ f9 g
{8 H, J; u' \. I F' x
if(--x==0xCF) //MAXOUTPUT2 q9 ^2 x# ~# F" N4 E* r9 P
{
0 ]2 F; P8 x7 O* M! M flag=1; 1 s$ ~: S2 D/ F0 R- Y2 Y8 k1 @7 l9 v: Y
}
" Y% u1 q7 i4 a& b2 N) a, ^ } 9 Q* \& U; v) z+ q; ]9 j
PWM0_set(x); //设置PWM占空比
! |7 `- I) M: m. j
, [! G5 B, w- w6 B! Q6 ^: C1 [# ~4 U0 \; @+ U
BufToLED_Refresh(); b; Q' R& L4 P. `3 t$ i* b4 U* M% ^
}
5 @3 M- W: v4 K' [4 j0 L1 [
/ d' L) p. B% j8 A
+ m* G0 e% d9 m( |) {
& v+ S$ \1 j& G& W' [, M+ [' h$ U3 a$ a$ f$ ~% ?; g" b
void Timer_INT()
* N* `- q' @6 p; ^) x3 A{
9 ^' {% M6 u& Z9 v, Q ]" D TMOD = 0x11; //高4位控制T/C1 * u- L/ ?' w, u0 F
EA = 1; //开总中断
$ k- i7 a( Q% ^& f0 w" z TH1 = 0x00; //16位计数寄存器T1高8位
1 F. B% J% C9 C# F* c* {0 Q TL1 = 0x00; //16位计数寄存器T1低8位6 @0 e0 z3 O( E+ m" Q: a9 c; n& ]
ET1 = 1; //T/C1中断开+ O1 m9 ?$ B# U6 q( d/ J
TR1 = 1; //T/C1启动9 \4 u& P! z4 _0 o: C8 e- z7 N
4 M& s: N6 [9 c& P
1 Y3 R4 _2 z. d1 k7 x& z) E}
7 \8 q" K' W, a. z4 A/ n* W6 b! X
( z/ ^- b2 H: @
- @0 _- J3 p; E
% S" J' b4 g$ F6 ]! Q- Z
- Q# t) H9 `" y" V3 r" uvoid FullScan()
% {' }5 G1 n1 E- l1 L{( Z5 [: B! R2 ]8 a1 w
uchar data X=1;
5 S% {6 ^4 T( n uchar data Y=1;% }* c/ n- v& a& r2 g- ~" F" {
/ u; C9 k, |+ C$ v8 O3 s$ c2 B
/ D, y0 O' E. L+ C, { h for(Y=1;Y!=0;Y<<=1) //Y=Y<<1;) k. S) @% J: m
{ ; Z! a, z; _. f0 M; i7 v
P0=Y;
5 t+ L" ^1 o- W0 U4 f for(X=1;X;X<<=1) //8bit/ N, r" N& Y b' O- v3 D
{
! a% ?' g* K& { P2=X;" r% P1 L6 C" v5 u* Z; S; U
Delays(7);
8 G5 l. u- ~' ` };* A3 Z& `+ `. A' l9 \0 h
8 [4 A+ Z6 ]5 Y7 w0 |
7 r) q% [/ M, r5 x% x
P2=0;% B; { d4 X. Q$ S1 H
for(X=1;X<b(10000000);x<<=1) 7bit* ^9 m$ r6 ?' `3 ]6 n
{
0 Y' t& d: }, [. n/ i3 } P3=X;
0 |4 u: z( i# b2 i. A8 j4 { Delays(7);
3 r, l& ~$ g; V };1 k) r& ]& g3 P4 u4 Q9 t; {
P3=0;
+ B& [7 K b8 H9 `( N/ [ P0=0;: M, m+ B2 [8 P# q5 |
}
3 p0 C. U) g" v3 Y' k}
4 G- k, ]$ a) H2 N; U6 S# q! Z+ e+ V/ P2 o) Y& x e9 L' L% E
& ?8 R+ L/ R. Z& ?
, w+ _$ B, J _+ R6 Y5 K; d5 ?6 L8 b
void Main()9 ~! w, d3 k- _- D( E. R
{
# P$ W0 k1 r) I* K* m& G0 q uint data Count=700;
4 S* O) K* L7 o0 Z; U) ^! h uchar data i,Cgain,num=0;
$ U& L2 d" r0 I' X; O8 x, Q( S& g* @
9 ^+ R0 L/ W" q) Y4 A4 V
IOINIT();' Q$ V2 \6 S; o: @3 ~& T) t
InitADC(); 2 o- w* L- r8 I" O
# k: B! G& J0 ]/ I7 Z9 H4 C5 h
3 O& y1 C% g- i, L. ` while(--Count)& c% ^- j% y: F4 _
FullScan();) ?7 X6 ^6 Z6 A1 r
" O- C0 M9 d& Y' C: S! o/ t B1 ^% S* V/ {: d% |) v& N$ s' ?
for(i=0;i<40;i++) refreshflag=0x09;" z+ k7 x& l* B4 `1 o( Q2 l' m1 w
, H9 _1 F6 S. o9 i: q4 O) x& s N
P14=0; //Beep
( k& W$ W4 @- T: Y4 Q/ ]$ Z5 ` Delays(4000);+ s' }! ^+ F; o) d T, s/ J
P14=1;1 C) ~6 s! }- K
( B- v" m1 _# s! o
$ `, ~5 s+ }4 Q! L. i$ Q3 q PWM_init(); //PWM初始化
2 s, G5 Q) ?% Z% u9 n. [ PWM0_set(0xFB);5 m& R' E$ K4 c2 i
# A0 l0 h/ ~2 G/ H8 B
Timer_INT();
- T8 t0 U. `# L1 ^2 R) Z& J* Q& d$ K$ q4 C' w9 [
' ^) j% {/ s# S6 `. X j
for(i=0;i<34;i++)
$ l$ R% p9 }6 F( q LEDBuf=0x00;
$ }" K- K5 L" v4 _& N: o6 @ FontDisp();
6 T9 g; j. f/ ^5 f3 L; r
2 A2 j) f0 y3 C( H" [" k) k8 ~2 X! p* ^* l' ?9 s
while(520)
9 k3 N- p' m" w4 N8 w2 | {
0 `7 }) Q2 x6 w& m; k for(i=0;i<65;i++)
0 q, J, _0 k1 u- h& G' I# l { 7 d# v# \* b/ |& H3 S1 H! X5 l
dd.real=(GetADCResult(0)+GetADCResult(1))<<gain; 读取ad结果并放大;
1 o: s) E4 \& g3 h3 E }8 M% ?+ a* {* `4 F r. y! D
6 `; ] ]0 {4 T$ B' {
$ E% k( o- r. Y/ Z processfft();//傅立叶变化及处理
\' P2 h. z, T* Z! C; Y( n% O! Z& ^3 k; T) E: ]$ ]
- c5 b8 S3 J4 k& b6 S1 V
///////////////////TouchKey//////////////////////////0 R1 L1 I9 g! p! L ]. d
while(P16==1) //依据:脉冲 干扰持续时间短;* J8 P2 b! G8 H$ n2 \. H. b
{
! Q& Y5 _! W, ~4 j' ^0 Z if(CBeep)P14=0;
% N' r: }. M( J- @2 Z: Z: T+ e; G- U if(++TouchKey>0x0000FF00)break; 0 |3 O! v7 y; A' P
}
1 t- N1 i* O8 V: o) b( w P14=1;
4 T! ^( f8 g/ t3 P( g" p+ A9 y7 {# x2 `# L/ {5 J
2 ~$ v6 @# U& z6 P
if(P16==1)
]9 l# R" ?, i: L0 z {& R# d! Y# i g2 }9 b4 k
if(++Menu==4)Menu=0;6 h: A% J, p9 T0 y. M+ c% F
( x3 d8 l( ?2 O s6 \/ V
" Q' |/ w" N E3 B3 z! {' t P14=0;7 U r Q K+ E: [4 j
P47=1;
( Z: n( M6 W6 w! q# s Delays(7000); & |1 G; |! x6 o0 k" E9 F" w0 N
P14=1;
8 G" E( ]9 ?. Z$ S0 |' @' ^' [& e* D P47=0;
: N* }3 h7 ]% k+ Q+ ]" h# d } ! ~9 V3 i: B8 H# H- X
TouchKey=0;
3 l* B: W! n6 s6 l //////////////////////////////////////////////: Z# t. Z8 I. l; ]
9 w, E G( s) ]! A5 P: [. h
1 d% J& d5 L0 r5 M% ` if(P17==0)CBeep=!CBeep;
7 M5 k. w. V% \* |2 W2 n4 Q9 i
! `+ l: D) H- r# A; Y9 x9 J' q- h4 }/ L0 Z, h& x( j, l
if(dd[2].real<32)
0 K, Q! {- T+ @* W {
, S/ a* `2 Z; q* _2 A3 B4 H if(++Count==300) //电平值过小,这降低gain,减少噪音的电平显示;
6 y1 U0 K7 w/ z1 e4 P3 H) x) ^ {6 B; x( a b6 K" v: h+ q7 D2 ~
Count=0;
- i: p9 \" E$ ]. ~; Q+ ? //if(++Menu==4)Menu=0; //切换Menu,显示方式;$ ]' j% D5 t7 a
gain=6;7 \1 \1 s' b! n
; J" S( I2 Y4 e2 p# t' K
- U3 f1 _2 M9 E: a5 I P14=0; //Beep
4 r" ]$ G5 [0 j5 D" [+ g1 v Delays(1000);+ q2 K, W2 Y ?, J n& U
P14=1;
2 G8 r& }: E0 X! A4 ^. P0 c; n }
3 R3 ]; P# a5 f& M. ? }
* C1 \- ]' l q: F1 s* q else
1 f) q! \) N0 ^& k! R6 m2 H {
" Y' B# u3 |- {/ S1 {# U4 N Count=1;8 F5 x+ E9 O1 i! I; Y
% E& q- J! i N( S4 F
if(++num==0xAF) //播放时,Auto gain;
6 X* u {9 Z3 M- c* J) @& S {/ S$ t7 v% j. \
num=0;
4 ~- R! I2 a6 o Y0 w+ `7 Y+ C0 y J" @3 P% l: V' W
- c6 ?( k8 e' ~0 f$ a3 H X1 R P14=0; //Beep1 p: `. h- V' f4 N
Delays(700);& I2 U6 L' ?$ Z, q
P14=1;
2 y7 {# ?0 ]/ s3 I% \ //自动增益;Automatic gain;
x4 _% l5 ?3 n8 Y7 r8 x# _) D H" U: k Cgain=dd[2].real/32; g) e/ y+ @; K" K* _( w. [
if(7<cgain<=8) 6 [* v! \6 o/ w+ {/ Q
{
8 q/ f' R- K; L7 z2 b2 N4 g0 v* \& k gain=4;% b& e1 W t; w; d: \! T( b' y; \" e( t
( w$ w7 u. ?, u1 R$ o' f
}4 C' ~: N2 O4 n7 `& f
else if(4<cgain<=6)
* l& j+ o, B, r8 E* i {! a4 B" S5 p( v6 u
gain=5;' P8 F8 n3 y5 a% C6 a( V
# c7 b" P" w# K' V6 b3 { }
2 l* H* i! |! @! }) ?% t7 C else if(2<cgain<=4)
% q- H2 y! d; q2 `$ H! ` {
! J# o) i4 C3 D% t. \0 c& B% X gain=6;% a: U2 g) t/ K' C0 z
}9 _3 r6 R3 D4 B m# c* V3 O
else
' S6 ?" ]9 ]7 G" b {
' G% g- ~# r) Y9 q; U gain=7;. w) F3 L$ d, {; e4 L- U4 m: F
3 G: J, K# ~' B" W }
7 u `* @8 w+ e) T9 u) z2 k. {* W4 W
8 \: o* ~) g; ~8 G }4 O+ y/ c' n2 E9 E
$ F$ ^6 W5 e$ _- X, @' n
. }% u1 W" I0 i" T; F
} , Q7 V, m8 _+ {* `: W5 r
} i& \& T4 p7 V, B0 M( m5 I
while(1);5 ^9 u# O: t: q! m+ D
}
3 D; s1 e. ?; F0 x2 @1 |0 X9 B+ q/ c H' }8 P3 u
1 p# e# Z5 \, l& g
下载:
7 L3 n+ B M3 ]! z& f1 C" Q' \' m" X2 i1 b( R# Y3 \
+ a& T5 S4 F: x- S6 i8 o
|
|