基于at89c51单片机的音乐盒的设计学士学位论文Word文档下载推荐.docx
《基于at89c51单片机的音乐盒的设计学士学位论文Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于at89c51单片机的音乐盒的设计学士学位论文Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
另外,机械音乐盒放音时为了让音色稳定,必须放平不能动摇,而且价格昂贵,不能实现大批量生产。
本文设计的音乐盒,是基于单片机设计制作的电子式音乐盒。
与传统的机械式音乐盒相比更小巧,音质更优美且能演奏和弦音乐。
电子式音乐盒动力来源是电池,制作工艺简单,可进行批量生产,所以价格便宜。
基于单片机制作的电子式音乐盒,控制功能强大,可根据需要选歌,使用方便。
所放歌曲的节奏可以根据需要进行设置,根据存储容量的大小,可以尽可能多的存储歌曲。
另外,可以设计彩灯外观效果,增设放歌时间、序号显示灯功能,使音乐盒的功能更加丰富,如图1-1所示。
图1-1单片机音乐盒功能框图
第2章音乐盒的发音原理
2.1播放音乐的原理
发音原理:
播放一段音乐需要的是两个元素,一个是音调,另一个是音符。
首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。
对一定强度的纯音,音调随频率的升降而升降;
对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调却随强度增加而上升。
另外,音符的频率有所不同。
基于上面的内容,这样就对发音的原理有了一些初步的了解。
音符的发音主要靠不同的音频脉冲。
利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,然后控制P3.7引脚的输出音乐。
只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2.2音符频率的产生
音符及定时器初始值:
例如:
中音1(do)的音频=523HZ,周期T=1/523s=1912
定时器/计数器0的定时时间为:
T/2=1912/2
=956
定时器956
的计数值=定时时间/机器周期=956
/1
=956(时钟频率=12MHZ)
装入T0计数器初值为65536-956=64580
将64580装入T0寄存器中,启动T0工作后,每计数956次时将产生溢出中断,进入中断服务时,每次对P3.0引脚的输出值进行取反,就可得到中音DO(523HZ)的音符音频。
将51单片机内部定时器工作在计数器模式1下,改变计数初值TH0,TL0以产生不同的频率。
下表2-1是C调各音符频率与计数初值T的对照表:
表2-1C调各音符频率与计数初值T的对照表
音符
频率(Hz)/初值(
)
低1DO
262/63627
中1DO
523/64580
高1DO
1042/65056
低2RE
294/63835
中2RE
589/64687
高2RE
1245/65134
低3M
330/64021
中3M
661/64780
高3M
1318/65157
低4FA
350/64107
中4FA
700/64822
高4FA
1397/65178
低5SO
393/64264
中5SO
786/64900
高5SO
1568/65217
低6LA
441/64402
中6LA
882/64969
高6LA
1760/65252
低7SI
495/64526
中7SI
990/65031
高7SI
1967/65282
音符、音符编码及定时器初始值:
为了产生音符,必须求出音符低音5—高音5的计数初值。
例如C调的低1DO的THTL=65536-50000/262=63627,中音DO的THTL=65536-500000/523=64580,高音DO的THTL=65536-500000/1042=65056。
为了方便写谱,对其进行简单的编码,在编程时,根据音符编码查找对应的计数初值。
比如说音乐是C调的,那么出现低音的5SO,直接将代码写为1;
出现低音6LA,直接写一个2的代码;
出现低音7SI,直接写一个3代码。
表2-2音符编码表
音符编码
不发音
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
G
2.3节拍频率的产生
节拍的产生与编码:
音乐中的节拍用延时时间产生。
例如,1拍=0.4s,1/4拍=0.1s,以此类推。
假设1/4拍执行一次延时程序,则1/2拍就执行两次延时程序,所以只要求出1/4拍的延时时间,其余节拍就是它的倍数。
为了方便,将节拍数也进行了编码,并且计算了乐谱节拍编程时的延时时间,如表2-3和表2-4所示。
表2-3节拍数编码表
按1/4拍为一个延时时间的节拍编码与节拍对应的表
按1/8拍为一个延时时间的节拍编码与节拍对应的表
节拍编码
节拍
1/4
6/4
1/8
6/8
2/4
8/4
2/8
8/8
3/4
10/4
3/8
10/8
4/4
12/4
4/8
12/8
5/4
15/4
5/8
表2-4乐谱节拍编程时的时间延时表
乐谱节拍
1/4拍的延时时间
1/8拍的延时时间
125ms
62ms
187ms
94ms
250ms
音符编码和节拍编码完成后,在编程时,每个音符占一个字节,高四位是音符编码,低四位是节拍编码。
第3章硬件电路设计
3.1硬件电路
本设计中用到了AT89C51单片机,4*4键盘,蜂鸣器,16*2LCD等硬件电路常用元器件。
3.1.1时钟复位电路
时钟电路由单片机XTAL1、XTAL2引脚外接晶振(12MHz)及起振电容C1、C2(均为30pf)组成。
如图3-1所示:
图3-1时钟复位电路
3.1.2按键输入电路
按键输入电路由4*4矩阵键盘组成,P1口作为输入控制按键,其中P1.0~P1.3扫描行,P1.4~P1.7扫描列。
3.1.3输出显示电路
用P2.0~P2.2作为LCD的RS、R/W、E的控制信号;
用P0.0~P0.7作为LCD的D0~D7的控制信号。
由于P0口作为输出,应加上拉电阻。
用P3.7口控制蜂鸣器。
输出显示电路如图3-2所示:
图3-2输出显示电路
3.2整体硬件电路
如图3-3所示:
图3-3音乐盒硬件电路原理图
3.3原理说明:
当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。
同时启动定时器T1,显示乐曲播放的时间,并驱动LCD,显示歌曲号及播放时间。
(1)
硬件电路中用P1.0~P1.7控制按键,其中P1.0~P1.3扫描行,P1.4~P1.7扫描列;
(2)
(3)用P0.0~P0.7作为LCD的D0~D7的控制信号;
(4)
用P3.7口控制蜂鸣器;
(5)
电路为12MHz晶振频率工作,起振电路中C1,C2均为30pf。
3.4键盘按键
键盘按键分布如下:
2
3
5
6
7
E
F
按键功能说明:
1—A
十首歌曲
下一首歌曲
上一首歌曲
暂停
开机画面
第4章软件设计
本程序可以实现该课程设计的基本要求,并可以通过按键播放达10首歌曲。
4.1程序设计流程
程序设计流程图如图4-1所示:
图4-1程序设计流程图
4.2设计源程序代码(见附录)
第5章仿真及调试
5.1调试:
(1)按照第2章设计的硬件电路在proteus软件内画好电路图。
(2)打开单片机软件开发系统keil,选择AT89C51单片机,在其中编写程序,运行生成一个hex文件。
(3)电路检查无误后,双击AT89C51单片机,打开编辑元件对话框(如图5-1所示),将已经在keil环境下调试好的程序hex文件加载到单片机上。
图5-1加载单片机程序
5.2仿真:
(1)点击运行按钮之后,电路上电,按下F键,LCD上得到开机画面,显示开机字符“WELCOMHERE”及当前作用键F,如图5-2所示:
图5-2开机画面
(2)按下1-A中的某一按键,LCD显示当前作用按键(当前播放音乐的标号)并显示该音乐播放的时间,同时,蜂鸣器播放当前乐曲。
LCD显示如图5-3所示(以按下5键为例):
图5-3按下5键时LCD的显示
(3)按下C键,则LCD显示由当前乐曲跳转到下一首,蜂鸣器响起下一首乐曲。
如图5-4所示:
当前显示C键动作后
图5-4C键动作效果图
(3)按下D键,则LCD显示由当前乐曲跳转到上一首,蜂鸣器响起上一首乐曲。
如图5-5所示:
当前显示D键动作后
图5-5C键动作效果图
(4)按下E键,则蜂鸣器停止当前音乐的播放,而且LCD上播放的时间也停留在当前,再次按下E键后,音乐继续播放,播放时间继续计时。
如图4-5所示:
当前显示E键动作后
图5-6E键动作效果图
5.3程序调试中出现的问题及解决的办法:
1.有时会出现程序一点错误也没有,但就是不能正常运行的现象,最后我们发现是因为程序中有的指令书写得不规范导致的,例如有的RET返回指令一定要按正确格式书写或在两行指令间最好不要留空行。
2.程序中的跳转指令的运用很重要,为保险起见,都用LJMP,我们就遇到过跳转指令用错程序无法正常运行的现象。
当用JNZ指令时,跳转范围比较少,这时要用一个标号中转。
3.编程时要注意,在程序开始时,要写入各定时器中断的入口地址。
4.编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。
5.程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化。
6.编程前要加流程图,这样会使思路清晰,如设计思路完全可以按着MP3的工作方式列写流程图。
7.LCD计时正常显示的解决办法:
a.两个定时器同时工作,存在中断时序问题,刚开始时我们把定时器1设定在方式3,计250us,由于定时中断过于频繁,使CPU负载过大,导致音乐不能正常播放,时间不能正常显示。
解决办法:
将定时器1设定在工作方式1,16位计数,计50ms,效果有很大改观。
b.当音乐为全4拍起始时,此时音乐节奏与定时器T1中断频率错开,LCD显示和音乐播放都会好一些。
c.另外,在歌曲中,当遇到一个音符发音为4拍,在编曲中为*CH,托因时间较长,当定时器T1此时来中断时,就会对歌曲播放产生影响,若改为发音一拍,中断对歌曲播放影响减弱,但音乐效果变差。
d.改进方案:
若采用可以定时时间更长的单片机,可以避免其中的一些问题。
第6章设计小结及建议
1.本学期学习单片机的时间只有8周时间,对单片机的硬件设计,软件设计掌握的深度不够,但通过此次课程设计,却改变了很多,首先,对于硬件电路的工作原理有了进一步的学习,同样就有了进一步的认识;
其次,软件方面,在程序的设计,程序的调试方面都学到了很多东西。
2.
在一个好的氛围里才能踏下心来做东西,在这几天课程设计的时间里,电子协会的氛围对我的影响很大,这也是我能完成课程设计的动力。
另外在编程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难,我也是这么做的,这在课程设计中十分重要。
3.在大学课堂的学习只是纯理论的专业知识,而我们应该把所学的用到现实生活中去,此次的音乐盒设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应社会激烈的竞争。
4.
最后要提一点建议,希望下一次课程设计中,每个人都能有一块实验开发板,这样能使每个人都能得到充分的锻炼!
致谢
经过近一个星期的忙忙碌碌,这次的单片机课程设计已经快要接近尾声了。
在这次的单片机课程设计过程中,无论是在理论学习阶段,还是在设计的选题、资料查询和撰写的每一个环节,我都得到到了许多人的悉心的指导和帮助。
首先,借此机会我向我们的单片机授课教师及课程设计指导老师师王冠凌老师表示衷心的感谢,王老师的悉心指导和帮助,是我顺利完成本次课程设计的基础和前提。
同时,我要感谢授课的各位老师,正是由于他们的传道、授业、解惑,让我学到了专业知识,并从他们身上学到了如何求知治学、如何为人处事。
另外,感谢各位同学的帮助和勉励。
同窗之谊和手足之情,我将终生难忘!
我愿在未来的学习和研究过程中,以更加丰厚的成果来答谢曾经关心、帮助和支持过我的所有老师、同学和朋友。
参考文献
【1】韩志军,沈晋源,王振波.单片机应用系统设计(第一版)[M].北京:
机械工业出版社,2005.
【2】张毅刚.单片机原理及应用[M].北京:
高等教育出版社,2003.
【3】王为青.程国钢.单片机KeilCx51应用开发技术[M].北京:
人民邮电出版社,2007.
【4】张靖武,周领彬.单片机系统的PROTEUS设计与仿真(第一版)[M].电子工业出版社.2007.
【5】何立民.MCS-51系列单片机应用系统设计[M].北京:
北京航空航天大学出版社,1990.
附录
附录一元器件清单:
名称
数量(个)
型号/参数
备注
单片机
AT89C51
液晶屏
LM016
按键开关
16
BUTTON
普通电阻
10K(1个),1K(1个)
排阻
RESPACK-8
10K
电容
30pf(2个),10uf(1个)
晶振
12MHz
三极管
PNP
蜂鸣器
SPEAKER
附录二部分源程序代码:
RSBITP2.0;
定义液晶显示端口标号
RWBITP2.1
EBITP2.2
ORG0000H
LJMPMAIN
ORG000BH
LJMPTT0
ORG001BH
LJMPT1INT
ORG1000H
MAIN:
;
-----------------------;
液晶初始化
MOVSP,#70H
MOVP0,#01H
;
清屏
CALLENABLE
MOVP0,#38H
8位,2行显示
LCALLENABLE
MOVP0,#0FH
屏显ON,光标ON,闪烁ON
MOVP0,#06H
计数地址加1,显示幕ON
------------------------内存初始化
LCALLINITIL
------------------------------
KEY1:
LCALLKEY
LCALLMODD
LJMPKEY1
---------------------键盘扫描
KEY:
NOP
LCALLKS
JNZK1
有按键转到K1
LCALLKAIJI
LCALLSOP
XN:
LJMPKEY
K1:
LCALLMODD
JNZK2
K2:
MOVR2,#0FEH
读键盘
MOVR4,#00H
K3:
MOVA,R2
MOVP1,A
MOVA,P1
JBACC.4,L1
为1跳转,第一行无按键
MOVA,#00H
LJMPLK
L1:
JBACC.5,L2
MOVA,#04H
L2:
JBACC.6,L3
MOVA,#08H
L3:
JBACC.7,NEXT1
MOVA,#0CH
----------------------------------
LK:
ADDA,R4
PUSHACC
K4:
LCALLDELAY1;
若同时有其他键,则等待
JNZK4
MOVR3,#07H
CLRA
MOVR0,#30H
MOVR1,#31H
MM1:
MOVA,@R1
MOV@R0,A
INCR0
INCR1
DJNZR3,MM1
POPACC
MOV@R0,A
RET
---------------------------------
NEXT1:
INCR4
------列扫描
JNBACC.3,N2
LJMPN1
N2:
N1:
RLA
MOVR2,A
LJMPK3
----------------------------------
KS:
MOVA,#0F0H
判断P1口
CPLA
ANLA,#0F0H
-------------------------------
DELAY1:
SETBRS0
DL:
MOVR5,#0AH
DL2:
MOVR6,#63
DL3:
NOP
DJNZR6,DL3
DJNZR5,DL2
CLRRS0
30H-37H初值为零
---------------------------------
INITIL:
MOVR3,#08H
M1:
MOV@R0,#00H
DJNZR3,M1
----------------------------------
显示
MODD:
MOVP0,#8EH
LCALLENABLE
MOVA,37H
MOVDPTR,#TABLE3
MOVCA,@A+DPTR
LCALLWRITE2
开机提示字
KAIJI:
CJNEA,#0FH,DFF
MOVP0,#80H
设光标地址
MOVDPTR,#TABLE1;
写数据
LCALLWRITE1
DFF:
按键值播放歌曲
SOP:
CJNEA,#01H,A11
MOV52H,#HIG