|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于AT89C51的音量控制电路与程序设计
7 e7 y% ?: h1 i c1 引言
% b% [) ]9 j% T5 t 本文介绍的音量控制IC为M62429,市面上有很多类似的产品,例如:FM62429、CD62429、CSC62429等。其实,掌握了一两种IC的编程方法,稍作改动就很容易移植到其它产品上。M62429是日本三菱公司的音量控制IC,音量调节范围是0~-83dB,控制精度每步1dB,内部电路如图一(详见M62429的使用手册)。
U( C8 _3 D+ v5 d/ k5 F
$ q: {* y3 y+ u; }9 Q图一 M62429内部电路
3 }: l$ L; w, x* _+ i* L, L2 x& T2 硬件电路: `( e3 t+ T# M% m6 J* Z6 y8 b
根据图一而设计的电路如图二。
7 H/ n, F( ] h) Z 图二中已省略了单片机与功放连接的其他电路,只剩下AT89C52的晶振部分、与M62429相关的电路、控制音量必需的按键电路等,加上电源之后,该电路可以独立工作。由于AT89C52真正的串口已用于其他用途,M62429的4脚(DATA)连至AT89C52的P2.2,M62429的5脚(CLOCK)连到AT89C52的P2.1。由这两个引脚(P2.1、P2.2)作为模拟串口与M62429通信,控制音量的数据便由这个模拟串口发出。7 D& q( W5 u: B# c' y. m$ j
音频信号从LH1输入,其中L通道信号经过C1耦合到M62429 的1脚,被控制之后从2脚输出,再经C2耦合到LH2输出到后级进行放大。R通道信号经C4耦合到M62429的8脚,被控制后从7脚输出。经C3耦合至LH2输出到后级进行放大。在LH1处输入合适的音源,从LH2处就可以监听音量控制的情况。SW1为音量增加按钮。SW2为音量减小按钮,SW3为复位按钮。: W, n, c; k, V3 h, t
; }1 d7 M2 j$ I6 k; l5 s图二 M62429与单片机的连接 J4 z: z5 N: }( O4 D3 @7 B: A
3 软件设计( z6 _& w' S1 a) H9 j' _1 z* Q
从M62429使用手册可知,送去M62429的控制数据DATA为11位。通常的用法如表一:* h# y& j$ I6 t) N
表一:M62429 常用的11位数据(DATA )结构
: F' Y3 S" [1 P& l; d* Z! o . |( c# n! y: y% j- p
表一中D2~D8是根据音量的大小变化需要改变的数据,其中D2~D6的编码如表二,! K2 L+ [% l: S, `
表二 M62429音量衰减值与D2~~D6的关系
: M: M5 B/ o( @! j; H; b: D7 g
! t; d0 P! N: X% r5 q' v$ l - W* A; E& f! s; H
从表二看出,D2~D6控制步长为4dB,需加上D7、D8(见表三)才能达到控制步长为1dB的要求。例如最大音量时衰减值为0dB,查表二,D2~D6数据为10101,查表三,D7,D8为11,所以D2~~D8应为1010111,根据表一,D0~D10这11位数据为10101011111。同理,衰减值为-1dB时的11位数据为10101010111。由于AT89C51系列单片机处理数据是8位,由P2.2、P2.1组成的模拟串口无法一次完成11位数据的发送工作。我们只好把这11位数据分为两次发送,我们可以用先发送6位、后发送5位的方法(当然也可以用其他方法)发送。例如衰减0dB的数据10101011111,先发送前6位101010,后发送5位11111。由于AT89C51系列单片机数据为8位,我们可以在这些数据后面加上“0”,补足8位。那么,衰减0dB的一组数据就成为了10101000和11111000。把这组数据用十六进制数来表示的话,就是A8H,F8H。用同样的方法,可得出各个衰减值的数据。
% a4 S5 p3 K& n2 |2 E0 F- q% m 我们设计程序的思路是:根据开机预设衰减值,用查表法查出衰减数据,然后把数据发送出去,发送时先发第一个数据的前6位,再发送另一数据的前5位。由于M62429的控制范围是0dB~-83dB。在这个范围内,数字越大,音量越小。要增加音量,就要减少用于查表那个数字(程序中R4的值)。框图如图三。! n; P3 x4 {5 J: Y+ F
4 K, |! V* x- y4 R图三 程序方框图# k. u* a* G6 h
根据上述思路设计的程序如下:
5 G; I" ^1 y! ^ ORG 00H/ }7 _) Y$ r# O
M429CK EQU P2.1 ;M62429时钟COLCK
$ T6 i- l$ c7 L g- _& i M429DA EQU P2.2 ;M62429数据DATA7 [$ G+ e* ?' S, t
UPVOL EQU P1.0 ;音量增加按键( f1 I# ~: N0 D8 e
DOWNVOL EQU P1.1 ;音量减少按键
' k: u* @; Q8 B3 k8 J0 u0 J MOV SP, #10H/ A6 e T9 V, N/ e/ j+ n4 `$ [
MOV R4, #20 ;开机预设衰减值
, U& M, K# V) T" SM62429: MOV A,R4 ;预设衰减值送A
7 D" Z, f9 \, D7 B0 D& z RL A ;乘2
5 Y2 y; {/ `0 e* u( ?. }3 { MOV DPTR,#TAB ;衰减数据表首址送DPTR
/ C1 Q6 Z. Y2 H/ m1 r: o3 d/ }" x MOVC A,@A+DPTR;查出衰减数据0 Z( N3 F7 b3 e9 Q7 O( O
MOV 9H, A ;9H、R2为一组衰减数据的两个存放单元
3 U3 T9 ^0 j; O$ F) P. J INC DPTR ;指向下一个数据
9 k0 Q7 q9 P, u9 I2 `+ r5 Y MOV A, R45 Y3 x1 j: V6 y
RL A ;乘2
' m) v% K4 }# v$ s. @* v; P MOVC A,@A+DPTR ;查出另一个衰减数据9 |" `/ ]) @5 ~5 o- X
MOV R2,A- \1 w* |) `+ @4 N, Z7 E) _
CLR M429CK
$ S6 G) ^4 y" O MOV A,9H, u4 M1 U) q2 G: H! \- ~. D) I
CALL IN6BYT ;发送前6位数据
0 e& f$ `3 o# w MOV A,R2
8 @- t, e( X$ N3 s) l1 x5 @ CALL IN5BYT ;发送后5位数据4 `+ C. F1 W9 |: z; H7 d8 H
UP: MOV C, UPVOL ;检测音量增加按键
- `6 ]& b( P( U3 r* I' m JC DOWN ;无按下,转测音量减少键
! V$ n" T. o" @* l; y CALL DELAY ;有按下,延时去抖
6 Y1 `& k6 B" x- E$ k MOV C, UPVOL ;再测
$ V/ Q X; I+ o, c JC DOWN
) W* U5 f$ s$ v9 z6 J% g JB F0,EEE ;音量已是最大转EEE
' \4 V& n: e# K% Z7 h DEC R4 ;音量衰减值减1! j+ c/ F; G4 c- d! _
CLR C5 O5 d- ]0 [- D5 L
CJNE R4, #0, M62429;与音量最大值衰减0dB比较,未达最大,转M62429
6 ]6 h B( ~& t# L SETB F0 ;己是最大,建立标志6 N: \8 g& P# Q; b/ f7 n
JMP M62429
) r/ B5 B* Q9 B' ?- I* z# T0 s EEE: INC R4 ;音量衰减值增1
1 v: G! I0 o1 T+ N; M+ v& H CLR F0
, h z/ J( g) O+ F* O JMP UP
4 k% f8 Y0 |" k1 \& K' m DOWN: MOV C, DOWNVOL ;检测音量减小键- z: J" U+ V. U% j+ W `/ V, C$ S* X0 j
JC UP
* Z* ?* h# O* o" R CALL DELAY1 a( g0 I9 q# I& Q0 H
MOV C, DOWNVOL ;再测. H% M7 U: q- f6 D
JC UP; Q% A( U: x, e# b) m) L/ ]
INC R4 ;音量衰减值增10 _, t, _) _8 b1 a
CLR C
# m1 `" M6 H A: m6 c$ v, o; Q CJNE R4, #83, BBB ;与音量最小值衰减83dB比较
+ D5 p% v/ i. @- k6 `1 y LJMP M624290 T, Z. P2 S4 i0 t
BBB: JC M62429 ;R4 |
 手机扫码浏览
|