基于51单片机的可调歌音乐盒设计.docx
《基于51单片机的可调歌音乐盒设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的可调歌音乐盒设计.docx(12页珍藏版)》请在冰豆网上搜索。
基于51单片机的可调歌音乐盒设计
学号:
20095044005
本科学年论文
学院物理电子工程学院
专业电子科学与技术
年级2009级
姓名张家义
论文题目基于51单片机的音乐播放器设计
指导教师仓玉萍职称讲师
成绩
2012年6月5日
目录
摘要1
Abstract1
引言1
1系统主要功能2
2设计原理2
2.1STC89C51单片机的介绍2
2.2音乐发生器设计流程及思路2
2.3音频脉冲和音乐节拍的实现3
2.4音频功放5
3系统设计5
3.1硬件电路设计5
3.2软件设计6
3.3系统仿真7
结论8
参考文献8
致谢9
附录10
基于51单片机的音乐播放器设计
学生姓名:
张家义学号:
20095044005
学院:
物理电子工程学院专业:
电子科学与技术
指导教师:
仓玉萍职称:
讲师
摘要:
本音乐播放器是利用STC89C51单片机结合内部定时系统及数码管显示,设计一个简易的微电脑音乐盒。
本文分析了基于51单片机的音乐播放器的硬件电路和软件的设计的具体过程,包括数据处理子程序的设计、显示子程序的设计,最后针对仿真过程遇到的现象进行了具体的分析与说明。
关键词:
STC89C51;音乐播放;中断
51Microcontroller-basedMusicPlayerDesign
Abstract:
ThemusicplayeristheuseofSTC89C51withcombinationofsingle-chiptimingsystemandthedigitaldisplay,designasimplemicrocomputermusicbox.Thisarticleanalysesthemusicplayerbasedon51singlechipcomputerhardwarecircuitandsoftwarespecifictothedesignprocess,includingthedesignofdataprocessingprogramsanddisplay,Andatlast,explainingthesimulationprocessforanalysisanddescriptionofthespecificphenomenonencountered.
Keywords:
STC89C51;musicplayer;interrupt
引言
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括的讲:
一块芯片就成了一台计算机
。
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量
。
采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。
例如精密的测量设备(功率计,示波器,各种分析仪)。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
利用单片机实现音乐播放有很多要点,例如外部电路简单,控制方便等,因而备受广大单片机爱好者的喜爱。
通过音乐发声器的设计方案,掌握C语言的编程方法
。
并熟练的运用89C51单片机定时器产生固定频率的方波信号,驱动喇叭发出旋律,按下按键可以演奏预先设置的歌曲旋律,最重要的是自己还可以通过程序设计输入自己喜欢的歌曲来演奏,本设计采用简易音阶编码直觉式输入法方便设计音乐旋律。
1系统主要功能
本课题主要任务是利用单片机等部件设计一个多功能音乐盒,实现音乐的播放。
以及通过按键的控制实现曲目的选择,并能通过按键对播放进行控制,以实现音乐的播放和暂停。
本文分析了基于51单片机的音乐播放器的硬件电路和软件的设计,具体过程包括数据处理子程序的设计、显示子程序的设计,最后针对仿真过程遇到的现象进行了具体说明与分析
。
2设计原理
2.1STC89C51单片机的介绍
STC系列单片机是美国STC公司最新推出的一种新型51内核的单片机。
片内含有Flash程序存储器、SRAM、UART、SPI、A\D、PWM等模块
。
该器件的基本功能与普通的51单片机完全兼容。
2.2音乐发生器设计流程及思路
在进行设计前,首先要对音乐知识有基本的理解,其次要明白单片机产生音乐脉冲的原理,最后完成硬件原理图和相关程序的设计。
音作为一种物理现象,是由于物体振动而产生的,振动产生的声波作用于人耳,听觉系统将神经冲动传达给大脑,进而产生听觉。
人耳能听到的声音频率大约在11~20000Hz,而音乐中使用的音一般在27~4100Hz。
乐音体系中各音级的名称叫做音名,被广泛采用的是CDEFGAB(doremifasolasi则多用于歌唱,称为唱名)。
乐音体系中音高关系的最小尽量单位叫做半音,两个半音构成一个全音。
乐音中有几十个高低不同的音,但是最基本的只有这七个音,其他高、低音的音名都是在这个基础上变化出来的。
在乐谱表上用来表示正在进行的音的长短的符号,叫做音符。
不同的音符代表不同的长度。
音符有一下几种:
全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符、六十四分音符。
此外,还有一种附点音符,它就是指带附点的音符,所谓附点就是记载音符右边的小圆点,表示增加前面音符时值的一半。
音持续的长短即时值,一般用拍数表示,休止符表示暂停发音。
音符与节拍数之间的对应关系如表1所示。
表1音符与节拍数之间的对应关系表
音符
节拍数
音符
节拍数
x--(全音符)
4拍
x·(附点八分音符)
3/4拍
x-(二分音符)
2拍
x·(附点十六分音符)
3/8拍
X(四分音符)
1拍
000(三分休止符)
休止3拍
X(八分音符)
1/2拍
00(二分休止符)
休止2拍
X(十六分音符)
1/4拍
0(四分休止符)
休止1拍
x·(附点四分音符)
1.5拍
0(八分休止符)
休止1/2拍
一首音乐及时由许多不同的音符组成的,而每一个音符对应着不同的频率,这样就可以利用不同的频率的组合,加以拍数对应的延时来构成不同的音乐。
2.3音频脉冲和音乐节拍的实现
音乐是由不同的音乐脉冲和音乐节拍配合产生的,因此设计之前,首先要对它们进行了解。
2.3.1音频脉冲的产生
音乐的产生需要不同频率的音频脉冲,对于单片机而言,可以利用它的定时/计数器产生这样的方波频率信号。
具体地说,只要知道某一音频的频率,求得它的周期,然后将次周期除以2,得到半周期的时间,利用定时/计数器计时这半个周期,计时到后就将输出脉冲的I/O反相。
就可以在I/O端口上得到此脉冲。
单片机工作在12MHz时钟频率下,其时钟周期为1us,因此可以利用89C51的内部定时/计数器T0,使其工作模式为1,工作在计数器状态下
,改变计数初值TH0和TL0以产生不同频率的脉冲信号。
T的值决定了计数初值TH0和TL0的值,TH0=T/256,TL0=T%256。
计数值公式如下:
式中,
:
单片机内部时钟周期为1us,所以其频率为1MHz。
:
产生音符所需的频率。
通过上式计算,可以求得各个音符频率的计数值T。
2.3.2音乐节拍的产生
节拍是指音乐持续的长短,是除音符之外音乐的另一关键组成部分,在单片机系统中可以通过延时来实现。
如果1/4拍的延时设为0.2s,则1拍的时间为0.8s。
以此类推,可以求出其余节拍的值,节拍的延时时间值与音乐的曲调值有相对应的关系,表2所示为不同曲调下的1/4和1/8节拍的时间设定。
如果单片机要实现自己播放音乐,那么必须在程序设计中考虑到节拍的设置,在89C51中,可以用一个直接存储一个音符,其中低4位是节拍码。
节拍数和节拍码的对照表如表3所示。
表2各调节拍的时间设定
曲调值(1/8节拍)
DELAY
曲调值(1/4节拍)
DELAY
调4/4
62ms
调4/4
125ms
调3/4
94ms
调3/4
185ms
调2/4
125ms
调2/4
250ms
表3节拍数与节拍码的对照
节拍码
节拍数
节拍码
节拍数
1
1/4拍
1
1/8拍
2
2/4拍
2
1/4拍
3
3/4拍
3
3/8拍
4
1拍
4
1/2拍
5
1.25拍
5
5/8拍
6
1.5拍
6
3/4拍
8
2拍
8
1拍
A
2.25拍
A
1.25拍
C
3拍
C
1.5拍
F
3.75拍
2.4音频功放
音乐的播放最后是通过扬声器完成的,但是直接用单片机产生的音频脉冲不足以直接驱动扬声器来完成音乐的播放,因此这就要求在单片机端口与扬声器之间链接功率放大电路,以实现最终的目的。
评定功率放大电路有3个重要的指标,即输出功率、效率、非线性失真。
总的来说,要求功率放大器在保证系统安全运用的情况下,获得尽可能大的输出功率、尽可能高的效率和尽可能小的非线性失真
。
为了简化设计,这里用了基于三极管的音频功放电路。
驱动电路如图1所示。
图1音频驱动电路
3系统设计
3.1硬件电路设计
音乐发生器设计电路包括89C51单片机系统图和音频功放电路以及显示电路。
单片机输出的音频脉冲信号比较微弱,一般只有几个微安,经过三极管的放大可以直接驱动喇叭发声。
硬件电路原理图如图2所示。
图2硬件设计图
在单片机的P1.0口设置一个按键,当按键K2按下时,P1.0口为低电平,单片机输出音频脉冲,播放音乐;当再按下时,单片机不播放音乐。
在单片机的P3.2口设置一个按键K3,当按键K3按下时数码管显示加1,当数码管显示大于2时,都会显示为0。
电路工作原理:
当按键K3按下时,会选择曲目,并在数码管显示当前的曲目;当K2按下时,就会播放当前的曲目;当K2再按下时就会停止播放。
K1是复位按键,按下之后系统进行初始化。
经过此电路后,单片机发出的不同频率的音频信号就可以通过扬声器发出想要的音乐。
3.2软件设计
软件设计是产生音乐的重要部分,音乐各音符所对应的频率和音乐的节拍都是通过软件的设计来实现的,软件设计的好坏直接决定了产生的音乐是否正确。
软件设计流程图如图3所示:
图3程序设计流程图
3.3系统仿真
用protues软件仿真,根据原理图,画出仿真电路图,得到仿真图:
图4protues仿真图
在仿真前,需要通过keilc软件将编写的程序生成HEX文件,然后加载到单片机中,仿真开始后,会发现此时数码管显示0,当按下K2按键后,数码管变为1,再按一次K2按键,数码管变为2,再按一次K2按键,数码管又重新回到0。
因为程序中也要求数码管在0到2之间显示,所以数码管与K2按键的功能正确的实现了。
按下K1按键,蜂鸣器就会播放音乐,再次按下K1按键,音乐播放就会停止,所以K1键控制音乐的播放与停止的功能也实现了。
所以,仿真很好的实现了程序的主要功能,说明电路的设计和程序的设计达到了要求。
结论
51系列单片机,体积小、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好。
本设计以51单片机为主控系统,实现了单片机控制音乐播放的功能。
功能多样,设计简单,性能稳定,具有很强的娱乐功能。
在未来的发展中利用单片机制作的产品将会给人们带来更大的乐趣。
通过本次设计的任务,我了解了做软件的艰辛,也积累了做软件的细节和经验,这些都是书本上无法学来的,这对自己无疑是一种提高。
参考文献
[1]徐晨,陈继红等.微机原理及应用[M].北京:
机械工业出版社,1998:
167-169.
[2]阎焕忠,王长涛,马斌.单片机控制里程转速表的设计[J].沈阳建筑工程学院学报(自然科学版),2002,4:
145-148.
[3]张义和,陈敌北.例说8051[M].北京:
人民邮电出版社,2006:
146-161.
[4]周越.单片机技术实验实训教程[M].上海:
中国水利水电出版社,2007.
[5]赵建领.Protel电路设计与制版宝典[M].上海:
电子工业出版社,2007.[6]郭振民,丁红.电子设计自动化EDA[M].上海:
中国水利水电出版社,2009.
[7]AdelSSedra,KennethCSmith.MicroelectronicCircuits(6thed)[M].NewYork:
OxfordUniversityPress,2010:
96-101.
[8]UTietze,ChSchenk.ElectronicCircuits-DesignandApplication[M].NewYork:
CambridgeUniversityPress,2004:
89~102.
[9]Intel.MCS-51FamilyofSingleChipMicrocomputersUsersManual[M].1990:
58~162.
[10]张齐.显示技术及单片机应用系统设计技术[M].北京:
电子工业出版社,
2004
(2):
284-285.
致谢
本论文是在仓玉萍老师的悉心指导下完成的。
老师渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,宽以待人的崇高风范,平易近人的人格魅力对我影响深远。
不仅使我掌握了基本的研究方法,还使我明白了许多待人接物与为人处世的道理。
在此,谨向老师表示崇高的敬意和衷心的感谢!
并祝所有的老师培养出越来越多的优秀人才,桃李满天下!
附录
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharSong_Index=0,Tone_Index=0;
sbitSPK=P3^7;
sbitK1=P1^0;
ucharcodeDSY_CODE[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
ucharcodeHI_LIST[]=
{
0,266,229,232,233,236,238,240,241,242,244,245,246,247,248
};
ucharcodeLO_LIST[]=
{
0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
};
ucharcodeSong[][50]=
{
{1,2,3,1,1,2,3,1,3,4,5,3,4,5,3,4,5,5,6,1,2,3,6,2,6,6,2,3,4,5,2,5,2,3,-1},
{3,3,3,5,6,2,3,4,6,2,6,4,2,1,2,3,6,2,5,6,3,4,5,6,2,3,1,2,3,5,1,2,3,-1},
{3,2,1,3,2,1,1,2,3,1,3,5,1,5,4,6,2,6,3,4,2,3,6,2,3,4,2,1,1,1,2,2,2,3,3,2,6,3,5,3,5,1,2,6,4,5,-1}
};
ucharcodeLen[][50]=
{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,-1},
{1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,-1},
{1,1,2,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,1,1,1,1,2,2,-1}
};
voidEX0_INT()interrupt0
{
TR0=0;
Song_Index=(Song_Index+1)%3;
Tone_Index=0;
P2=DSY_CODE[Song_Index];
}
voidT0_INT()interrupt1
{
SPK=!
SPK;
TH0=HI_LIST[Song[Song_Index][Tone_Index]];
TL0=LO_LIST[Song[Song_Index][Tone_Index]];
}
voiddelay(uintms)
{
uchari;
while(ms--)
{
for(i=0;i<120;i++);
}
}
voidmain()
{
P2=0xc0;
IE=0x83;
TMOD=0x00;
IT0=1;
IP=0x02;
while
(1)
{
while(K1==1);
while(K1==0);
TR0=1;
Tone_Index=0;
while(Song[Song_Index][Tone_Index]!
=-1&&K1==1&&TR0==1)
{
delay(300*Len[Song_Index][Tone_Index]);
Tone_Index++;
}
TR0=0;
while(K1==0);
}
}