数字音乐盒

  • 格式:doc
  • 大小:151.50 KB
  • 文档页数:20

目录

项目概述 ---------------------------------------------- 1

项目要求 ---------------------------------------------- 1

系统原理 ---------------------------------------------- 1

硬件设计 ---------------------------------------------- 4

软件设计 ---------------------------------------------- 6

系统仿真和调试 ---------------------------------------- 7

学习过程的体会 ---------------------------------------- 8

附录1 ------------------------------------------------- 9

附录2 ------------------------------------------------- 18

1

一、 项目概述

本设计是一个基于AT89C51系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能音乐盒。该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。使用两个按键控制音乐盒,一个用来切换歌曲。播放歌曲时,蜂鸣器发出某个音调,与之对应的LED亮起。本设计利用KEILC编程软件对音乐盒源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试,节约了设计时间。

二、 项目要求

1.利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲

2.可通过功能键选择乐曲,暂停,播放。

三、系统原理

1.芯片AT89C51的介绍

AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash

Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

2.音调的产生

不同的音调对应着不同的物理频率,而若要产生一定频率的声音,我们只需用一定频率的方波来驱动蜂鸣器即可。对于固定频率的产生方法,本系统中用定时器0设置为工作方式1(TMOD=0x01),对不同的音调依据频率装入对应的计数初值,定时器计数完时将输出端取反(编程中采用异或),进而产生对应的方波。具体计算如下:

如对于编码为1的低音SO,其频率为392HZ,我们实验中采用的为12M晶振,因此机器周期为1us,那么该音调对应的计数初值为:

65536-1000000/(2*392)=65536-1276=64270 2 解释:由于工作方式0中计数器的THO和TL0所有位均用于装载计数初值,因此最大计数值为256*256=65536,周期为1x106-s,频率为392HZ,每定时一次对输出取反,因此计数初值应除以2。以下为所有音调标准频率及其在本设计中的的计数初值表

计数初值表

低音 频率 T 参数 中音 频率 T 参数 高音 频率 T 参数

Do 262 1908 229 Do 523 956 115 Do 1046 57 57

Do﹟ 277 1805 217 Do﹟ 554 903 108 Do﹟ 1109 54 54

Re 294 1701 204 Re 587 852 102 Re 1175 51 51

Re﹟ 311 1608 193 Re﹟ 622 804 97 Re﹟ 1245 48 48

Mi 330 1515 182 Mi 659 759 91 Mi 1318 45 45

Fa 349 1433 172 Fa 698 716 86 Fa 1397 43 43

Fa﹟ 370 1351 162 Fa﹟ 740 676 81 Fa﹟ 1480 41 41

So 392 1276 153 So 784 638 77 So 1568 38 38

So﹟ 415 1205 145 So﹟ 831 602 72 So﹟ 1661 36 36

La 440 1136 136 La 880 568 68 La 1760 34 34

La﹟ 464 1078 129 La﹟ 932 536 64 La﹟ 1865 32 32

Si 494 1012 121 Si 988 506 61 Si 1976 30

30

3.节拍的确定

学习音乐时,每个音符都有对应的节拍,我们唱拍的时候通常叫做打拍子,用来区分音符之间所间隔的时间,因此音符的产生不仅要有频率,还要有节拍。我们知道一共有12中不同的节拍,每一拍的时间都是最短拍的整数倍,例如4/4拍是1/4拍的4倍,因此我们可以确定一个基准的延时时间,然后用它的倍数表示不同的节拍,用一个无符号整数来表示其倍数。具体代码如下

void delay(uint p)

{ uint j;

uint k,l;

for(l=0;l

for(k=165;k>0;k--)

for(j=0;j<160;j++);

}

通过此程序,每一拍为107ms,可以实现要求,对于节拍没有固定的时间,也可以通过调节循环初值进行延时修改。

4.音符的编码

由计数初值表可以看到,如果采用将每一个音符的所对应的计数初值都直接编入音乐的码流中,每个码占两个字节,并且不易记忆,因此我们采用将不同音符的3 频率写入一个如下所示码表中,通过查表确定计数初值。

uchar code yd[]={

0xff,0xff,//占位

0xFC,0x8E,//中央C调1-7

0xFC,0xED,

0xFD,0x43,

0xFD,0x6A,

0xFD,0xB3,

0xFD,0xF3,

0xFE,0x2D,

0xFE,0x47, //高八度1-7

0xFE,0x76,

0xFE,0xA1,

0xFE,0xC7,

0xFE,0xD9,

0xFE,0xF9,

0xFF,0x16

};

编码表如下

简谱 发音 简谱码 T值 节拍码 节拍数

5 低音SO 1 64260 1 1/4拍

6 低音LA 2 64400 2 2/4拍

7 低音TI 3 64524 3 3/4拍

1 中音DO 4 64580 4 1拍

2 中音RE 5 64684 5 1又1/4拍

3 中音MI 6 64777 6 1又1/2拍

4 中音FA 7 64820 8 2拍

5 中音SO 8 64898 A 2又1/2拍

6 中音LA 9 64968 C 3拍

7 中音TI A 65030 F 3又3/4拍

1 高音DO B 65058

2 高音RE C 65110

3 高音MI D 65157

4 高音FA E 65178

5 高音SO F 65217

4 对照乐谱编码时,可以查上表进行对应的编码

四、硬件电路

1.电路图

电路参数:

芯片:AT89C51 C1:10uF

C2:30pF C3:30pF

R1:200Ω R2:1KΩ

晶振:12MHZ

1、晶振回路:12MHZ晶振电路,其中C1和C2为微调电容

2、复位电路:采用按键电平复位

原理介绍: 5 电路运行时,通过中断int0和int1向cpu发出中断申请,执行相应中断服务,通过调整各标志位实现相应的功能6 五.软件设计

1.主程序流程图(主程序为死循环,在此略去主循环部分,没有结束框)

2、中断服务子程序流程图 是 否 否 是 开始

初始化

Count不为0

是 延时等待按键

否 S!=0XFF

分离高低四位 关闭蜂鸣器

切歌,i=0

高四位为0 关闭蜂鸣器,延时

唱一个音,i++ 判断count。从相应数组读取数据

关闭蜂鸣器延时、循环 暂停标识为1 7 外部中断服务0:暂停与继续播放

外部中断服务1:开始、停止、切歌子程序流程图

流程图说明:由于外部中断服务执行与否来取决于外部硬件,并且可能在执行主程序的任何一个时刻发生,因此在此单独列出两个中断服务子程序,执行完之后将自动跳回主程序中继续执行。

3.具体代码见附录 否 是 中断开始

歌曲播放标识Count++ 数据读取指针i清0 Count==3 Count=0

暂停标识置0

结束,返回 开始

关闭定时器0

关闭蜂鸣器

中断标识取反

结束中断,返回song()