基于AT89C51的音量控制电路与程序设计

发布者:JoyfulLife最新更新时间:2009-09-08 来源: 微计算机信息关键字:音量控制  汇编语言  模拟串口  M62429 手机看文章 扫描二维码
随时随地手机看文章

1  引言

    本文介绍的音量控制IC为M62429,市面上有很多类似的产品,例如:FM62429、CD62429、CSC62429等。其实,掌握了一两种IC的编程方法,稍作改动就很容易移植到其它产品上。M62429是日本三菱公司的音量控制IC,音量调节范围是0~-83dB,控制精度每步1dB,内部电路如图一(详见M62429的使用手册)。

图一 M62429内部电路

2  硬件电路

    根据图一而设计的电路如图二。

    图二中已省略了单片机与功放连接的其他电路,只剩下AT89C52的晶振部分、与M62429相关的电路、控制音量必需的按键电路等,加上电源之后,该电路可以独立工作。由于AT89C52真正的串口已用于其他用途,M62429的4脚(DATA)连至AT89C52的P2.2,M62429的5脚(CLOCK)连到AT89C52的P2.1。由这两个引脚(P2.1、P2.2)作为模拟串口与M62429通信,控制音量的数据便由这个模拟串口发出。

    音频信号从LH1输入,其中L通道信号经过C1耦合到M62429 的1脚,被控制之后从2脚输出,再经C2耦合到LH2输出到后级进行放大。R通道信号经C4耦合到M62429的8脚,被控制后从7脚输出。经C3耦合至LH2输出到后级进行放大。在LH1处输入合适的音源,从LH2处就可以监听音量控制的情况。SW1为音量增加按钮。SW2为音量减小按钮,SW3为复位按钮。

图二  M62429与单片机的连接

3  软件设计

    从M62429使用手册可知,送去M62429的控制数据DATA为11位。通常的用法如表一:

                表一:M62429 常用的11位数据(DATA )结构

    表一中D2~D8是根据音量的大小变化需要改变的数据,其中D2~D6的编码如表二,

表二  M62429音量衰减值与D2~~D6的关系

     从表二看出,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。用同样的方法,可得出各个衰减值的数据。

    我们设计程序的思路是:根据开机预设衰减值,用查表法查出衰减数据,然后把数据发送出去,发送时先发第一个数据的前6位,再发送另一数据的前5位。由于M62429的控制范围是0dB~-83dB。在这个范围内,数字越大,音量越小。要增加音量,就要减少用于查表那个数字(程序中R4的值)。框图如图三。

图三  程序方框图

根据上述思路设计的程序如下:

 ORG  00H

 M429CK  EQU  P2.1     ;M62429时钟COLCK

 M429DA  EQU  P2.2     ;M62429数据DATA

    UPVOL  EQU  P1.0     ;音量增加按键

 DOWNVOL  EQU  P1.1    ;音量减少按键

        MOV  SP, #10H

        MOV  R4, #20       ;开机预设衰减值

M62429: MOV  A,R4         ;预设衰减值送A

        RL   A             ;乘2

           MOV  DPTR,#TAB   ;衰减数据表首址送DPTR

           MOVC  A,@A+DPTR;查出衰减数据

           MOV  9H, A ;9H、R2为一组衰减数据的两个存放单元

        INC  DPTR         ;指向下一个数据

        MOV  A, R4

        RL   A             ;乘2

        MOVC  A,@A+DPTR ;查出另一个衰减数据

        MOV  R2,A

        CLR  M429CK                  

        MOV    A,9H

        CALL  IN6BYT      ;发送前6位数据

        MOV    A,R2

        CALL  IN5BYT     ;发送后5位数据

  UP:  MOV   C, UPVOL   ;检测音量增加按键

        JC    DOWN        ;无按下,转测音量减少键

        CALL  DELAY      ;有按下,延时去抖

        MOV   C, UPVOL   ;再测

        JC    DOWN

        JB    F0,EEE        ;音量已是最大转EEE

        DEC   R4           ;音量衰减值减1

        CLR   C

        CJNE  R4, #0, M62429;与音量最大值衰减0dB比较,未达最大,转M62429

        SETB  F0             ;己是最大,建立标志

        JMP   M62429

  EEE:  INC   R4             ;音量衰减值增1

        CLR   F0

        JMP   UP

 DOWN: MOV   C, DOWNVOL  ;检测音量减小键

        JC    UP

        CALL  DELAY

        MOV   C, DOWNVOL  ;再测

        JC    UP

        INC   R4              ;音量衰减值增1

        CLR   C

        CJNE  R4, #83, BBB   ;与音量最小值衰减83dB比较

        LJMP  M62429

  BBB:  JC    M62429        ;R4<83 ,转M62429

        MOV   R4,#83        ;R4>83,需修正,保证r4里的值<=83

        JMP   M62429

IN6BYT: MOV    R3,#6        ;发送6位数据子程序

本文创新点:1、程序中控制数据用查表法查得,使之控制方便,容易理解。

            2、软件硬件结合紧密。

关键字:音量控制  汇编语言  模拟串口  M62429 引用地址:基于AT89C51的音量控制电路与程序设计

上一篇:用PC104控制模块和C51单片机实现AD检测板
下一篇:基于Proteus的远程抄表系统设计与仿真

推荐阅读最新更新时间:2024-03-16 12:26

ARM汇编语言入门(四)
Part 4 内存指令:加载和存储 ARM使用加载(Load)/存储(Stroe)指令来读写内存,这意味着你只能使用LDR和STR指令访问内存。在ARM上数据必须从内存中加载到寄存器之后才能进行其他操作,而在x86上大部分指令都可以直接访问内存中的数据。如前所述,在ARM上增加内存里的一个32-bit数据值,需要三个指令(load,increment,store)。为了解释 ARM 上的 Load 和 Store 操作的基本原理,我们从一个基本示例开始,然后再使用三个基本偏移形式,每个偏移形式具有三种不同的寻址模式。为了简单化,每个示例,我们将在同一段汇编代码中使用不同 LDR/STR 偏移形式的。遵循这本段教程的最佳方法是在你的
[单片机]
ARM<font color='red'>汇编语言</font>入门(四)
C语言和汇编语言在单片机开发中的特点分别是什么
汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。 C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。 对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆栈
[单片机]
分享一个不错的立体声数字音量控制的电路图
这是立体声数字音量控制的电路图。该电路可用于升级立体声放大器电路中的手动音量管理。在这个特定的电路中,按下开关 S1 控制两个通道的正向(音量增强)操作,而相同的开关 S2 控制两个通道的反向(音量减小)操作。 在这个数字音量控制电路中,IC1 定时器 555 设置为非稳态触发器,通过按下至在开关 S1 和 S2 上。要调整来自 IC1 的脉冲宽度,您可以使用可变电阻器代替定时电阻器 R1。 操作开关 S1(向上)触发二进制输出增加,而操作 S2(向下)触发二进制输出减少。最高计数为 15(所有输出逻辑 1)和最低计数为 0(所有输出逻辑 0),分别输出最高和最低音量。 计数器的高电平有效输出 A、B、C 和 D 用于
[嵌入式]
分享一个不错的立体声数字<font color='red'>音量控制</font>的电路图
51单片机,汇编语言,按键操作控制
硬件电路: P1.0 ~ P1.5 外接 6 个 LED,分别称为 D1 ~ D6,低电平发光。 P0.0 ~ P0.3 外接 4 个 按键,分别称为 K1 ~ K4。 P3.2 ~ P3.3 外接 2 个 按键,分别称为 K5 ~ K6。 用汇编语言编程进行控制,要求: 当按下 K1 时,D1 发光; 按下 K2 时,D2、D3 发光; 按下 K3 时,D4、D5、D6 发光; 按下 K4 时,D1、D3、D6 发光; 按下 K5 时,全部熄灭; 按下 K6 时,全亮。 用查询方式完成上述动作。 做而论道编写的程序如下: 2013-04-19 23:06 ORG 0
[单片机]
电子音量控制1K2胆前级放大器
放大器是能把输入讯号的电压或功率放大的装置,由电子管或晶体管、电源变压器和其他电器元件组成。用在通讯、广播、雷达、电视、自动控制等各种装置中。
[模拟电子]
51单片机IO口模拟串口通讯3-中断法
硬件环境:STC89C52 软件环境:IDE Keil uVision V4.10 编译器 C51 V9.0 代码如下: /********************************************** 方法3:中断法 硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1 波特率:9600 描述:所谓中断法是指根据模拟出的波特率,每1位持续的时间的长短是通过定时器计数 溢出产生中断来延时的。 测试1:上电发送1个0x03的字符 测试2:上电先发送1个0x03的字符,然后等待接收,将收到的字符再发送出去(分别一个一个发送0x01,0x02,0x03,0x04,0x0
[单片机]
51单片机IO口<font color='red'>模拟</font><font color='red'>串口</font>通讯3-中断法
单片机汇编语言和最常用的高级语言分析
单片机的编程语言很多,大致分成三类:机器语言、汇编语言、高级语言。机器语言由于繁琐容易出错,一般用户已经不再使用。下面分别对单片机汇编语言和最常用的高级语言进行分析。 单片机的汇编语言   汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少,程序执行效率高,由于它一条指令就对应一条机器码,每一步的执行动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。但是不同的类型的单片机,其汇编语言可能有点差异,所以不易移植,因为他们的指令系统是有区别的。但懂得汇编语言可帮助了解影响任何语言效率的特殊规定。例如,懂得汇编语言指令就可以使用在片内ram作变量的优势,因为片
[单片机]
模拟串口自动测量波特率的单片机程序
我这个程序能够测量串口的波特率,并且将自身的波特率设置到通讯波特率。 这个在STC89C52/STC15F104(其实主要针对STC15F104,因为它没有串口)上面通过。不过因为是模拟串口,在11.0592 12T的情况下,最多到19200。 然后在STC15F104上面,要适量的减少补偿值 顺便说一句,编译器建议使用sdcc。keil的SB printf函数搞死我了 在22.1184 6T的情况下大约能到57600. 当然在STC15F系列到115200毫无压力,可是是半双工的。要做全双工只能减倍波特率 测量波特率的方法很简单。校准他的波特率的方法就是发送没有连续低电平的字符,类似0x55/0xff/0x7f之类的。使用这个
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved