单片机的可控数字音乐盒设计.docx
《单片机的可控数字音乐盒设计.docx》由会员分享,可在线阅读,更多相关《单片机的可控数字音乐盒设计.docx(32页珍藏版)》请在冰豆网上搜索。
单片机的可控数字音乐盒设计
单片机和音乐盒硬件的功能
随着当代单片机技术的突飞猛进,单片机的功能也越来越强大,主要包括有:
(1)单片机集成度高;
(2)系统结构简单,使用方便,实现模块化;
(3)单片机可靠性高,处理功能强,速度快;
(4)低电压,低功耗,便于生产便携式产品;
(5)控制功能强大。
而本文设计采用的是AT89C51单片机,这是一款性价比非常高的单片机。
2.1AT89C51芯片的功能
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。
俗称单片机[2]。
如图:
图2-1AT89C51单片机引脚图
图2-2AT89C51单片机实物图
引脚功能[3]:
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.2音乐盒的硬件及其功能
本文设计的数字音乐盒,所需要的硬件有:
AT89C51芯片:
主控制器;
LED彩灯:
灯光闪烁,P1.0-P1.7控制八路LED彩灯;
数码管:
音乐序号显示,P0.0-P0.6控制数码管;
晶振:
给单片机正常工作提供稳定的时钟信号,电路为12MHZ晶振频率工作,起振电路中C1、C2均为30PF。
电容:
保持一个恒定的偏执电压供给;
喇叭:
发出声音,P3.7控制喇叭
电源:
供电;
电阻;控制电路;
开关:
控制音乐,P3.2控制LED彩灯花样的切换,P3.3控制音乐的切换。
数字音乐盒的主体设计方案
3.1音乐盒的主体结构
该音乐盒主要是通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同音调的音乐。
如图:
图3-1音乐盒主体结构框图
本设计是一个基于AT89C51系列单片机的数字音乐盒,一共设计了五首不同风格的歌曲,在播放歌曲同时八路LED彩灯随音调变化而变化,同时利用数码管显示歌曲的序号,以便切换歌曲。
在不播放歌曲的时候还设计了八路LED彩灯,可以随意变化三种花样,给人们带来视听的双重享受。
一共设计了两个开关,一个用以切换LED彩灯花样,一个用以切换歌曲。
4音乐盒硬件设计
4.1总设计框图
通过前面的介绍,本文的设计思路已经基本清晰,总设计框图如下:
图4-1总设计框图
4.2各部分硬件的作用
硬件除了AT89C51芯片外,主要的就是时钟振荡电路、LED彩灯以及数码管的设计。
4.2.1时钟振荡电路
AT89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自然振荡器。
外接石英晶体及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。
对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易、程序及温度稳定性。
如果使用石英晶体,我们推荐电容使用30PF-10PF,而如果使用陶瓷振荡器建议选择40PF-10PF。
用户也可以采用外部时钟。
采用外部时钟的电路如图示。
这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。
由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。
振荡器电路图如下:
图4-2单片机内部、外部振荡电路
4.2.2LED和数码管的设计
(1)八路LED彩灯,分别接在P1.0-P1.7这八个端口上,连接方式为共阳极,若为低电平,可使LED亮起。
发光二极管的亮、熄由内部程序控制,八个LED发光二极管分别对应不同的音阶,所以LED会随着音阶的变化按规律亮、熄。
设计如图:
图4-3LED设计图
(2)数码管接在AT89C51的P0端口上,数码管采用的是共阴极数码管[5],在数码管与端口之间接了上拉电阻以使数码管能正常工作。
如图所示:
图4-4数码管设计图
音调和节拍的设计
5.1音调和节拍的设计以及音乐基础知识
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。
因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时间[6]。
不同音高的乐音是用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下,有些人快一点,有些人慢一点,只要听的悦耳就好。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。
了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。
对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时、计数器来产生这样的方波频率信号。
因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
而节拍的定义如表所示:
表5-1节拍的定义
音符名称
写法
时值
全音符
5———
四拍
二分音符
5—
二拍
四分音符
5
一拍
八分音符
5
半拍
十六分音符
5
四分之一拍
三十二分音符
5
-
八分之一拍
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,图5.2为节拍码的对照。
如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。
假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。
所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如图5.3为1/4和1/8节拍的时间设定。
表5-21/4和1/8节拍的时间设定
曲调值
DELAY
曲调值
DELAY
调4/4
125毫秒
调4/4
62毫秒
调3/4
187毫秒
调3/4
94毫秒
调2/4
250毫秒
调2/4
125毫秒
5.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位,得到延时时间,接着调用软件延时。
表5-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
C源程序设计
6.1音乐程序
音乐程序根据上面的音调节拍编码方案,用第一首歌《劳动最光荣》为例[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
//劳动的快乐说不尽,劳动的创造最光荣
};
6.2LED花样程序
LED彩灯一共有三种花样:
(1)第一种花样:
花灯先从左到右依次亮、熄,然后在从右到左一次亮、熄。
如图:
图6-1LED花样一
程序如下:
ucharcodehuayang1[]=
{0x7f,0xbf,0xdf,0xef,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//花样一
(2)第二种花样:
花灯从左右两边同时开始亮、熄,并向中间靠拢,然后再一次从中间同时向两边亮、熄。
如图:
图6-2LED花样二
程序如下:
ucharcodehuayang2[]=
{0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e};//花样二
(3)第三种花样:
奇数灯依次亮且不熄灭,奇数灯亮完后全部熄灭,接着偶数灯亮且不熄灭,偶数灯亮完后全部熄灭,然后相邻两个灯同时亮,并从左向右依次亮灯齐亮、熄,最后全部都亮、熄。
如图:
图6-3LED花样三
程序如下:
ucharcodehuayang3[]=
{0x7f,0x5f,0x57,0x55,0xbf,0xaf,0xab,0xaa,0x3f,0xcf,0xf3,0xfc,0x00};//花样三
6.3数码管程序
数码管用以显示序号,当播放第一首歌曲是显示‘1’,第二首为‘2’,第三首为‘3’,依此类推,当不播放歌曲只显示三种花灯花样时始终显示‘0’。
如图所示:
图6-4数码管仿真运行图
程序如下[9]:
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;
}
数字音乐盒总设计图与总程序
7.1仿真总设计图
仿真总图如图:
图7-1仿真总设计图
图7-2实物总设计图
附录总程序源代码及注释
主程序流程图如图:
图11-1主程序流程图
程序如下:
#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
ucharcodehuayang3[]=
{0x7f,0x5f,0x57,0x55,0xbf,0xaf,0xab,0xaa,0x3f,0xcf,0xf3,0xfc,0x00};//花样3
ucharcount1;//花样标志
ucharcount2;//歌曲标志
uchartimeh,timel,i;
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//歌曲结束符号
//劳动的快乐说不尽,劳动的创造最光荣
};
ucharcodewy[]={//唯一[10]
0x33,0x53,0x63,0x53,0x63,0x73,0x63,0x33,0x53,0x03,0x53,0x53,0x53,0x43,0x44,
0x52,0x43,0x33,0x22,0x14,0x38,
//我的天空多么的清新,透明的承诺是过去的空气
0x04,0x43,0x43,0x43,0x33,0x23,0x13,0x38,0x03,0x13,0x23,0x13,0x33,0x26,0x04,
0x33,0x23,0x13,0x2c,0x04,
//牵着我的手是你,但你的笑容却看不清
0x33,0x53,0x63,0x53,0x63,0x73,0x63,0x33,0x55,0x03,0x53,0x53,0x53,0x43,0x44,
0x52,0x43,0x33,0x23,0x13,0x35,
//是否一颗星星变了心,从前的愿望也全都被抛弃
0x04,0x43,0x43,0x43,0x33,0x23,0x13,0x33,0x54,0x83,0x83,0x93,0xA3,0x92,0x81,
0x63,0x62,0xA3,0x93,0x83,0x96,0x04,0x04,
//最近我无法呼吸,连自己的影子也都想逃避
0xA4,0x94,0x82,0x82,0x82,0x52,0x82,0x92,0xA4,
//BaBy你就是我的唯一
0x72,0x72,0x72,0x52,0x72,0x82,0x94,0x04,0xA2,0xA2,0xB2,0xA2,0x82,0x92,
//两个世界都变心,回去谈何容易
0x04,0xA4,0x94,0x82,0x82,0x82,0x52,0x82,0x92,0xA4,
//确定你就是我的唯一
0x72,0x72,0x72,0x52,0x72,0x82,0x92,0xA2,0x84,0x64,0x03,0x51,0xB2,0xA2,0x82,
0x61,0x51,
//独自对着电话说我爱你,我真的爱你
0x04,0xA4,0x94,0x82,0x82,0x82,0x82,0x72,0x82,0x52,0x32,0x68,
//BABY我已不能多爱你一些
0x02,0xA4,0x94,0x82,0x82,0x82,0x82,0x72,0x82,0x54,0x42,0x66,0xff
//其实早已超过了爱的极限
};
ucharcodetzdn[]={//同桌的你[11]
0x56,0x56,0x32,0x42,0x52,0x76,0x66,0x56,0x52,0x22,0x32,0x46,0x16,0x26,0x04,
//前奏
0x52,0x52,0x52,0x52,0x32,0x42,0x56,0x86,0x62,0x62,0x62,0x62,0x42,0x62,0x56,
0x04,
//明天你是否会想起,昨天你写的日记
0x52,0x52,0x52,0x52,0x72,0x62,0x52,0x44,0x02,0x42,0x42,0x42,0x42,0x33,0x21,
0x16,0x02,
//明天你是否还惦记,曾经最爱哭的你
0x82,0x82,0x82,0x82,0x52,0x32,0x86,0x82,0xA4,0x92,0x92,0x92,0x93,0x81,0x72,
0x66,0x02,
//谁娶了多愁善感的你,谁看了你的日记
0x72,0x72,0x72,0x72,0x72,0x82,0x96,0x54,0x02,0x72,0x72,0x82,0x92,0x82,0x72,
0x16,0x02,
//谁把你的长发盘起,谁给你做的嫁衣
0x84,0x82,0x82,0x52,0x62,0x86,0xA6,0x94,0x92,0x92,0x82,0x72,0x66,0x74,0x72,
0x72,0x72,0x82,0x96,0x56,
//啦……,啦……,啦……
0x72,0x72,0x82,0x92,0x82,0x72,0x86,0x94,0x92,0x92,0x62,0x72,0x96,0xB6,0x94,
0x92,0x92,0x82,0x72,0x66,
//啦……,啦……,啦……
0x72,0x72,0x72,0x72,0x72,0x82,0x96,0x56,0x72,0x72,0x82,0x92,0x82,0x72,0x96,
0x86,0xff
//啦……,啦……,啦……,啦……
};
ucharcode