基于C51单片机音乐盒设计.docx
《基于C51单片机音乐盒设计.docx》由会员分享,可在线阅读,更多相关《基于C51单片机音乐盒设计.docx(28页珍藏版)》请在冰豆网上搜索。
基于C51单片机音乐盒设计
基于51单片机的音乐盒设计
摘要:
随着科技越来越发达,单片机技术也越来越纯熟,单片机的应用也越来越广泛,可以说几乎很难找到哪个领域没有单片机的踪迹。
如今,单片机在各个领域都起着至关重要的作用。
以单片机为核心元件的数字音乐盒。
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点。
该数字音乐盒具有体积小,重量轻,能演奏各种各样的音乐,功能多,外观绚丽多彩,使用非常方便等诸多优点。
而且具有一定的开发价值。
基于AT89C51单片机的可控数字音乐盒的程序设计。
通过PROTEUS仿真软件对硬件电路进行仿真制作以及利用KEIL软件对音乐盒源程序进行C语言编译,而设计制作出的一个多功能数字音乐盒。
音乐盒通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同音调的音乐。
程序通过把乐谱转化成相应的定时常数来驱动发音设备演奏出悦耳动听的音乐。
一共设计了五首歌曲,同时还设计了三种LED彩灯的变化花样。
在演奏歌曲时彩灯随音调闪烁。
在停止演奏歌曲时三种彩灯花样开始闪烁。
歌曲和花样均可随意切换。
与此同时,数码管也不断变化数字,以此显示歌曲和彩灯花样的序号。
关键词:
AT89C51;KEIL;PROTEUS;数字音乐盒;数码管
1设计任务
要求设计一个基于51单片机的可控数字音乐盒,分析电路工作原理,设计电路图,编译有关音乐的程序,实现通过开关按钮控制播放五首不同的音乐的目的。
2电路设计
2.1单片机和音乐盒硬件的功能
随着当代单片机技术的突飞猛进,单片机的功能也越来越强大,主要包括有:
(1)单片机可靠性高,处理功能强,速度快;
(2)系统结构简单,使用方便,实现模块化;
(3)单片机集成度高;
(4)控制功能强大;
(5)低电压,低功耗,便于生产便携式产品。
2.2AT89C51芯片的功能
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。
俗称单片机。
引脚功能:
P0.0-P0.7:
为一个8位漏级开路双向I/O口;
P1.0-P1.7:
是一个内部提供上拉电阻的8位双向I/O口;
P2.0-P2.7:
为一个内部上拉电阻的8位双向I/O口;
P3.0-P3.7:
管脚是8个带内部上拉电阻的双向I/O口;
P3.0:
RXD(串行输入口);
P3.1:
TXD(串行输出口);
P3.2:
INT0(外部中断0);
P3.3:
INT1(外部中断1);
P3.4:
T0(记时器0外部输入);
P3.6:
WR(外部数据存储器写选通);
P3.7:
RD(外部数据存储器读选通);
EA:
当EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,此间内部程序存储器;
P3.5:
T1(记时器1外部输入);
ALE:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节;
PSEN:
外部程序存储器的选通信号;
RST:
复位输入;
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入;
XTAL2:
来自反向振荡器的输出。
2.3音乐盒的硬件及其功能
所需要的硬件有:
AT89C51芯片:
主控制器;
LED彩灯:
灯光闪烁,P1.0-P1.7控制八路LED彩灯;
数码管:
音乐序号显示,P0.0-P0.6控制数码管;
晶振:
给单片机正常工作提供稳定的时钟信号,电路为12MHZ晶振频率工作,起振电路中C2、C3均为30PF。
电容:
保持一个恒定的偏执电压供给;
喇叭:
发出声音,P3.7控制喇叭
电源:
供电;
电阻;控制电路;
开关:
控制音乐,P3.2控制LED彩灯花样的切换,P3.3控制音乐的切换。
2.4数字音乐盒的主体设计方案
2.4.1音乐盒的主体结构
音乐盒主要是通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同音调的音乐。
如图1:
图1音乐盒主体结构框图
基于AT89C51系列单片机的数字音乐盒,一共设计了五首不同风格的歌曲,在播放歌曲同时八路LED彩灯随音调变化而变化,同时利用数码管显示歌曲的序号,以便切换歌曲。
在不播放歌曲的时候还设计了八路LED彩灯,可以随意变化三种花样。
一共设计了两个开关,一个用以切换LED彩灯花样,一个用以切换歌曲。
2.5音乐盒硬件设计
2.5.1总设计框图
通过前面的介绍,设计思路已经基本清晰,总设计框图如图2:
图2总设计框图
2.5.2主设计软件的介绍
主要用到了两款软件,一款是用以对源代码进行C语言编程的KEIL软件,另一款则是用以对实物设计进行仿真的PROTEUS软件。
(1)编程软件KEIL的简介
KEILC51是美国KEILSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
KEIL提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
C51工具包的整体结构,uVision与Ishell分别是C51forWindows和forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51及C51编译器编译生成目标文件(.OBJ)。
目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
KEILC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
KEILC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
是一款非常不错的软件。
(2)仿真软件PROTEUS的简介
PROTEUS软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
PROTEUS是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC(10、12、16、18、24、30、DsPIC33)、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、KEIL和MPLAB等多种编译器。
在PROTEUS绘制好原理图后,调入已编译好的目标代码文件(.HEX),可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
PROTEUS是单片机课堂教学的先进助手。
PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。
前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。
它的元器件、连接线路等却和传统的单片机实验硬件高度对应。
这在相当程度上替代了传统的单片机实验教学的功能,例如:
元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
3电路仿真与分析
3.1各部分硬件的作用
硬件除了AT89C51芯片外,主要的就是时钟振荡电路、LED彩灯以及数码管的设计。
3.1.1时钟振荡电路
AT89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自然振荡器。
外接石英晶体及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。
对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易、程序及温度稳定性。
如果使用石英晶体,推荐电容使用30PF-10PF,而如果使用陶瓷振荡器建议选择40PF-10PF。
用户也可以采用外部时钟。
采用外部时钟的电路如图示。
这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。
由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。
3.1.2LED和数码管的设计
(1)八路LED彩灯,分别接在P1.0-P1.7这八个端口上,连接方式为共阳极,若为低电平,可使LED亮起。
发光二极管的亮、熄由内部程序控制,八个LED发光二极管分别对应不同的音阶,所以LED会随着音阶的变化按规律亮、熄。
设计如图3所示:
图3LED设计图
(2)数码管接在AT89C51的P0端口上,数码管采用的是共阴极数码管[7],在数码管与端口之间接了上拉电阻以使数码管能正常工作。
如图4所示:
图4数码管设计图
3.2音调和节拍的设计
3.2.1音调和节拍的设计以及音乐基础知识
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。
因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时间[8]。
不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。
把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。
两个音之间的距离有两个“半音”,就叫“全音”。
在钢琴等键盘乐器上,C–D、D–E、F–G、G–A、A–B两音之间隔着一个黑键,他们之间的距离就是全音;E–F、B–C两音之间没有黑键相隔,它们之间的距离就是半音。
通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b号的叫变化音。
﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。
例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266Hz)的一倍;同样的,高音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294Hz)的一倍。
要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
利用AT89C51的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。
此外结束符和休止符[7]可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。
在简谱中,数字上面带一个点就是高8度,两个点代表高16度。
数字下面带一个点就是低8度,两个点代表低16度。
若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。
“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。
若1拍实0.5s,则1/4拍为0.125s。
至于1拍多少秒,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。
了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。
对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时、计数器来产生这样的方波频率信号。
因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
而节拍的定义如表1所示:
表1节拍的定义
音符名称
写法
时值
全音符
5———
四拍
二分音符
5—
二拍
四分音符
5
一拍
八分音符
5
半拍
十六分音符
5
四分之一拍
三十二分音符
5
-
八分之一拍
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表1为节拍码的对照。
如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。
假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。
所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如图5.3为1/4和1/8节拍的时间设定。
表21/4和1/8节拍的时间设定
曲调值
DELAY
曲调值
DELAY
调4/4
125毫秒
调4/4
62毫秒
调3/4
187毫秒
调3/4
94毫秒
调2/4
250毫秒
调2/4
125毫秒
3.2.2音调和节拍的编码
doremifasolasi分别编码为1-7,重音do编为8,重音re编为9,重音mi编为A,重音fa编为B,重音so编为C,重音la编为D,重音si编为E,停顿编为0。
播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。
音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。
以0xff作为曲谱的结束标志。
举例1:
音调do,发音长度为两拍,即二分音符,将其编码为0x18。
举例2:
音调re,发音长度为半拍,即八分音符,将其编码为0x22。
歌曲播放的设计。
先将歌曲的简谱进行编码,储存在一个数据类型为unsignedchar的数组中。
程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。
表3简谱对应的简谱码、T值、节拍数
简谱
发音
简谱码
节拍码
节拍数
1
中音DO
1
1
1/4拍
2
中音RE
2
2
2/4拍
3
中音MI
3
3
3/4拍
4
中音FA
4
4
1拍
5
中音SO
5
5
1又1/4拍
6
中音LA
6
6
1又1/2拍
7
中音SI
7
8
2拍
1
高音DO
8
A
2又1/2拍
2
高音RE
9
C
3拍
3
高音MI
A
F
3又3/4拍
4
高音FA
B
5
高音SO
C
6
高音LA
D
7
高音SI
E
4电路安装与调试
4.1C源程序设计
音乐程序:
音乐程序根据上面的音调节拍编码方案,用第一首歌《劳动最光荣》为例[8],编码如下:
ucharcodeldzgr[]={//劳动最光荣
0x52,0x82,0x82,0x52,0x62,0x62,0x54,0x32,0x52,0x12,0x32,0x28,
//太阳光,金亮亮,雄鸡唱三唱;
0x52,0x84,0x52,0x62,0x62,0x54,0x52,0x81,0xA1,0x92,0x52,0x88,
//花儿醒来了,鸟儿忙梳妆
0x83,0x91,0x82,0x52,0x62,0x62,0x54,0x33,0x81,0x62,0x52,0x12,0x32,0x24,
//小喜鹊造新房,小蜜蜂采蜜糖
0x12,0x11,0x21,0x32,0x51,0x51,0x62,0x52,0x84,0x82,0x51,0x61,0x84,0xA4,0x92,
0x52,0x86,0x02,
//幸福的生活从哪里来?
要靠劳动来创造
0x52,0x81,0x81,0x82,0x52,0x62,0x61,0x81,0x54,0x32,0x51,0x61,0x53,0x31,0x12,
0x32,0x24,
//青青的叶儿红红的花,小蝴蝶贪玩耍
0x52,0x82,0x82,0x52,0x62,0x62,0x54,0x51,0x61,0x81,0xA1,0x92,0x52,0x88,
//不爱劳动不学习,我们大家不学它
0x83,0x91,0x82,0x52,0x62,0x62,0x54,0x33,0x81,0x62,0x52,0x12,0x32,0x24,
//要学喜鹊造新房,要学蜜蜂采蜜糖
0x12,0x11,0x21,0x32,0x52,0x82,0x52,0x68,0x52,0x61,0x61,0x84,0xA4,0x92,0x52,
0x84,0xff
//劳动的快乐说不尽,劳动的创造最光荣
};
4.2LED花样程序
LED彩灯一共有三种花样:
(1)第一种花样:
花灯先从左到右依次亮、熄,然后在从右到左一次亮、熄。
如图5所示:
图5LED花样一
程序如下:
ucharcodehuayang1[]=
{0x7f,0xbf,0xdf,0xef,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//花样一
(2)第二种花样:
花灯从左右两边同时开始亮、熄,并向中间靠拢,然后再一次从中间同时向两边亮、熄。
如图6所示:
图6LED花样二
程序如下:
ucharcodehuayang2[]=
{0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e};//花样二
(3)第三种花样:
奇数灯依次亮且不熄灭,奇数灯亮完后全部熄灭,接着偶数灯亮且不熄灭,偶数灯亮完后全部熄灭,然后相邻两个灯同时亮,并从左向右依次亮灯齐亮、熄,最后全部都亮、熄。
如图:
图7LED花样三
程序如下:
ucharcodehuayang3[]=
{0x7f,0x5f,0x57,0x55,0xbf,0xaf,0xab,0xaa,0x3f,0xcf,0xf3,0xfc,0x00};//花样三
4.3数码管程序
数码管用以显示序号,当播放第一首歌曲是显示‘1’,第二首为‘2’,第三首为‘3’,第三首为‘4’,第三首为‘5’,当不播放歌曲只显示三种花灯花样时始终显示‘0’。
如图所示:
图8数码管仿真运行图
程序如下:
ucharcodenum[6]={0x3f,0x06,0x5b,0x4f,0x66,0x6d};
switch(count2)
{case0:
P0=num[0];break;
case1:
P0=num[1];break;
case2:
P0=num[2];break;
case3:
P0=num[3];break;
case4:
P0=num[4];break;
case5:
P0=num[5];break;
4.4数字音乐盒总设计图与总程序
4.4.1数字音乐盒总设计图
如图9所示:
图9仿真总设计图
在通过仿真软件中的示波器测出音乐5输出的波形,如图10所示:
图10音乐5输出的波形
4.4.2主程序流程图
如图11所示:
图11主程序流程图
5设计总结
通过本次设计,我更加清楚地了解单片机的功能与价值,而且在设计过程中所遇到的问题,最终都通过老师和同学的帮助再加上自己的努力一一解决,因此我从中不仅获得了很多知识,而且还获得了很多宝贵经验,这都是我终身难忘的。
在拿到设计题目之初,我还很担心,这个题目怎么完成呢,但随着设计的一步步成功,一下就让我信心倍增,特别是当问题得到解决的时候,那种心情是无法言语的。
虽然在设计过程中,我查阅了很多资料,遇到了一些很棘手的问题,当单片机芯片在烧录我编辑的音乐程序后,放出优美的音乐时,那种美妙感永远都不会忘记。
本次论文设计,除了知识的增长外,我从中找到了成功后的自信。
这必将激励我在以后的学习生活和工作中更加努力奋斗,更加斗志昂扬。
参考文献:
[1]王玉凤/刘湘黔/杨欣.51单片机应用从零开始.北京:
清华大学出版社,2008
[2]陈卫兵.单片机技术与应用基础.北京:
人民邮电出版社,2010
[3]张毅刚/彭喜元.单片机原理及接口技术.北京:
人民邮电出版社,2008
[4]杜树春.基于Proteus和KeilC51的单片机设计与仿真.北京:
电子工业出版社,2012
[5]郭天祥.51单片机C语言教程.北京:
电子工业出版社,2009:
56
[6]东方.卓越.简谱入门基础教程.北京:
同心出版社出版,2009
[7]李重光.音乐理论基础.北京:
人民音乐出版社,1962
[8]辛笛.简谱钢琴即兴伴奏儿歌68首.上海:
上海音乐学院出版社,2010
[9]谭浩强.C程序设计.第三版,北京:
清华大学出版社,2005:
105
[10]祁麟.唯一:
王力宏歌曲精选.安徽:
安微文艺出版社,2008
[11]金巍.歌会与节庆必唱金曲1.北京:
人民音乐出版社,2009
《模拟电子技术》课程设计评分表
设计题目:
基于C5单片机的音乐盒设计学生姓名:
XXX
指导教师签名:
年月日
项目
主要内容
满分
得分
设计报告
设计报告规范、完整、无原理性错误
40
电路设计
电路设计与参数计算
20
电路测试
测试结果与分析
20
电路安装
实际电路安装与调试
20
总分
100
附录A总程序源代码及注释
程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitduan=P2^6;
sbitkey1=P3^2;//按key1可切换花样
sbitkey2=P3^3;//按key2可切换歌曲
sbitfm=P3^7;//蜂鸣器连续的IO口
sbitP34=P3^4;//矩阵键盘的一列
ucharcodehuayang1[]=
{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//花样1
ucharcodehuayang2[]=
{0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e};//花样2
ucharcodeh