电子音乐盒的设计 联系客服

发布时间 : 星期日 文章电子音乐盒的设计更新完毕开始阅读ae392e0cbdeb19e8b8f67c1cfad6195f302be828

键盘是由一组按压式或触摸式开关构成的阵列,是一种常用的输入设备。键盘可分为编码式键盘和非编码式键盘两种。编码键盘通过硬件电路产生被按按键的键码,这种键盘所需程序简单,但硬件电路复杂、价格昂贵通常不被单片机系统采用。非编码键盘常用一些按键排列成行列矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来决定。非编码键盘的硬件接口简单,但是要占用较多的CPU时间,通常采用可编程键盘管理芯片来克服这个缺点。本设计使用两种按键,一种是按键式非编码键盘和轻触式非编码开关。

3.5 蜂鸣器电路设计

图3.5 蜂鸣器电路

一般所指的蜂鸣器是以压电陶瓷为主要元件的。压电陶瓷是一类有将压力与电流相互转换能力的特殊陶瓷。这种能力缘于其特殊的晶体结构。当压电陶瓷在一定方向上受到一个压力使其晶体结构发生形变时,它就会在内部产生一个电流,并且电流的变化与压力的变化密切相关。反之亦然。所以利用这一特性,在压电陶瓷上通过一定频率的电流,就会引起压电陶瓷微小形变,这一形变带动空气发生振动,如果频率适当,就可以被人耳所听见,也就是产生了蜂鸣声。

4 系统软件设计

4.1音调,节拍以及编码的确定

1.音调的确定

一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同的频率组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可以产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。

2.节拍的确定

每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍。如果1拍为0.4秒,1/4拍就是0.1秒,只要设定延迟时间就可得到节拍时间。假设1/4拍为1delay,则1拍应为4delay,以此类推。所以只要求得1/4拍的delay时间,其余的节拍就是它的倍数。

3.编码的确定

Do,re,mi,fa,so,la,xi分别编码为1-7,重音do编为8,重音re编为9,停顿编为0。播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0xff作为曲谱的结束标志。

4.2主要部分软件程序分析 1.延时165ms,即十六分音符子函数

void delay1(uint z) {

uint x,y;

for(x=z;x>0;x--)

for(y=19000;y>0;y--); }

// 延时165ms,十六分音符子函数,即十六分之一拍。 2.延时1ms子函数

void delay2(uint z) {

uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

// 延时1ms子函数。 3.定时器0中断子函数

void t0() interrupt {

TH0=a; TL0=b;

BEEP=~BEEP; }

4.播放音乐子函数

void song() {

uint temp;

uchar aa; // aa c=0; while(1) {

if(k1==0) {count2=1;} if(k2==0) {count2=2;} if(k3==0) {count2=3;} if(count2==0)

{ break; } if(count2==1) // temp=table1[c]; if(count2==2) temp=table2[c]; if(count2==3) temp=table3[c]; if(count2==4) temp=table4[c]; if(temp==0xff) break;

aa=temp/16; // 用于产生各种音调,a是简谱高四位,b是简谱低四位。 是简谱 // 若按下k1,k1=0,扫描键盘后得到键值count2=1,则放第一首歌曲;若按下k2,k2=0,扫描键盘后得到键值count2=2,则放第二首歌曲;若按下k3,k3=0,扫描键盘后得到键值count2=3,则放第三首歌曲。 选曲 // 取数的高4位

1

if(aa!=0) {

a=cuzhi[aa*2]; b=cuzhi[aa*2+1]; } else { TR1=0;

BEEP=1; // }

delay1(temp); TR1=0; // BEEP=1;

delay2(10); TR1=1; c++; }

TR1=0; BEEP=1; }

5.主函数

void main() {

TMOD=0x10; TH1=0; TL1=0; ET1=1;

EA=1; // EX1=1; // IT1=1; // EX0=1; // IT0=1; // while(1) // {

song(); } }

关蜂鸣器 // 取数的低4位 唱完一个音停10ms 开总中断 开外部中断

下降沿时触发中断 开外部中断0 下降沿时触发中断 大循环