怎样用单片机控制音响的音量

怎样用单片机控制音响的音量,第1张

单片敬颤物机控制音响的音量的方式有两种:

一种是控制音响音量的采用马达电位器,单片机控制马达顺时针或逆时针转动,实现音量控制。和传统的电位器相比相当于在普通电位器基础上增加了马达实现音量控制,这类电位器的尺寸比洞老较大,而且因为马达经常转动,故障率相对较高。

还有种是采用集成电路来实现:亮液用专用的音量控制集成电路加上编码开关(也叫数字电位器)配合单片机程序实现对音量控制。例如PTC(台湾普城 http://www.princeton.com.tw)品牌的PT2313等,和马达控制相比较有可靠性高,体积小的优点。

/************************************************************************

[文件名] C51音乐程序(八月桂花)

[功能]通过单片机演奏音乐

注意:通过了74HC14控制ULN2003 驱动芯片驱动蜂鸣器 *

/**********************************************************************/

#include <REG52.H>

#include <INTRINS.H>绝中

//本例采用89C52, 晶振为11.0592MHZ

//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.

//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少散冲拍

//所以拿出谱子, 试探编吧!

sbit Beep = P1^5

unsigned char n=0 //n为节拍常数变量

unsigned char code music_tab[] ={

0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率冲宏歼常数, 节拍常数,

0x20, 0x40, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x10,

0x1C, 0x10, 0x18 , 0x40,

0x1C, 0x20, 0x20 , 0x20,

0x1C, 0x20, 0x18 , 0x20,

0x20, 0x80, 0xFF , 0x20,

0x30, 0x1C, 0x10 , 0x18,

0x20, 0x15, 0x20 , 0x1C,

0x20, 0x20, 0x20 , 0x26,

0x40, 0x20, 0x20 , 0x2B,

0x20, 0x26, 0x20 , 0x20,

0x20, 0x30, 0x80 , 0xFF,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x80,

0x20, 0x30, 0x1C , 0x10,

0x20, 0x10, 0x1C , 0x10,

0x20, 0x20, 0x26 , 0x20,

0x2B, 0x20, 0x30 , 0x20,

0x2B, 0x40, 0x20 , 0x15,

0x1F, 0x05, 0x20 , 0x10,

0x1C, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x30,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x40, 0x1C , 0x20,

0x20, 0x20, 0x26 , 0x40,

0x13, 0x60, 0x18 , 0x20,

0x15, 0x40, 0x13 , 0x40,

0x18, 0x80, 0x00

}

void int0() interrupt 1 //采用中断0 控制节拍

{ TH0=0xd8

TL0=0xef

n--

}

void delay (unsigned char m) //控制频率延时

{

unsigned i=3*m

while(--i)

}

void delayms(unsigned char a) //豪秒延时子程序

{

while(--a) //采用while(--a) 不要采用while(a--)各位可编译一下看看汇编结果就知道了!

}

void main()

{ unsigned char p,m //m为频率常数变量

unsigned char i=0

TMOD&=0x0f

TMOD|=0x01

TH0=0xd8TL0=0xef

IE=0x82

play:

while(1)

{

a: p=music_tab[i]

if(p==0x00) { i=0, delayms(1000)goto play} //如果碰到结束符,延时1秒,回到开始再来一遍

else if(p==0xff) { i=i+1delayms(100),TR0=0goto a} //若碰到休止符,延时100ms,继续取下一音符

else {m=music_tab[i++], n=music_tab[i++]} //取频率常数 和 节拍常数

TR0=1//开定时器1

while(n!=0) Beep=~Beep,delay(m)//等待节拍完成, 通过P1口输出音频(可多声道哦!)

TR0=0//关定时器1

}

}

这个演奏的曲子就是存在程序后面定义的名为TAB的表里面,埋瞎哪基本思路就是用不同大小的电流使蜂鸣器发出声调不同的声音,如果你要神誉换曲子的话还是比较困难的,因为你首先要知道多大的数据能发出多高的音调,然后再根据某弯码一只歌的乐谱把数据排列好存到表里。个人愚见,仅供参考


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12388158.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存