基于AT89C51单片机音乐盒设计含程序设计.docx

上传人:b****8 文档编号:11255422 上传时间:2023-02-26 格式:DOCX 页数:29 大小:366.71KB
下载 相关 举报
基于AT89C51单片机音乐盒设计含程序设计.docx_第1页
第1页 / 共29页
基于AT89C51单片机音乐盒设计含程序设计.docx_第2页
第2页 / 共29页
基于AT89C51单片机音乐盒设计含程序设计.docx_第3页
第3页 / 共29页
基于AT89C51单片机音乐盒设计含程序设计.docx_第4页
第4页 / 共29页
基于AT89C51单片机音乐盒设计含程序设计.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

基于AT89C51单片机音乐盒设计含程序设计.docx

《基于AT89C51单片机音乐盒设计含程序设计.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机音乐盒设计含程序设计.docx(29页珍藏版)》请在冰豆网上搜索。

基于AT89C51单片机音乐盒设计含程序设计.docx

基于AT89C51单片机音乐盒设计含程序设计

前言

 乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。

实现方法有许多种,在众多的实现方法中,以纯硬件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。

如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。

使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。

FPGA预装了很多已构造好的参数化库单元LPM器件。

通过EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。

本文介绍在EDA开发平台上利用单片机及汇编语言设计音乐硬件演奏电路,并定制单片机存储音乐数据,以十首乐曲为例,将音乐数据存储到单片机,就达到了以纯硬件的手段来实现乐曲的演奏效果。

只要修改单片机所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新连接到程序中就可以实现其它乐曲的演奏。

摘要…………………………………………………………………4

第1章概述……………………………………………………………5

第2章音乐盒的发音原理……………………………………………6

2.1播放音乐的原理……………………………………………6

2.2音符频率的产生……………………………………………6

2.3节拍频率的产生……………………………………………8

第3章硬件电路设计…………………………………………………9

3.1硬件电路……………………………………………………9

3.2整体硬件电路………………………………………………10

3.3原理说明…………………………………………………11

2.4键盘按键…………………………………………………11

第4章软件设计………………………………………………………12

4.1程序设计流程………………………………………………12

4.2设计源程序代码……………………………………………12

第5章仿真及调试……………………………………………………13

5.1调试………………………………………………………13

5.2仿真………………………………………………………13

5.3程序调试中出现的问题及解决的办法………………………15

第6章设计小结及建议………………………………………………17

致谢……………………………………………………………18

参考文献………………………………………………………19

附录一元器件清单…………………………………………20

附录二部分源程序代码……………………………………21

基于AT89C51单片机的音乐盒的设计

【摘要】:

随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。

小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。

传统的音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。

本文设计的音乐盒是以单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,使用方便,可以批量生产,具有一定的商业价值。

【关键词】:

音乐盒;单片机;LCD

第1章

概述

传统的音乐盒多是机械音乐盒,其工作原理是通过齿轮带动一个带有铁钉的铁桶转动,铁桶上的铁钉撞击铁片制成的琴键,从而发出声音。

但是,机械式的音乐盒体积比较大,比较笨重,且发音单调。

水、灰尘等外在因素,容易使内部金属发音条变形,从而造成发音跑调。

另外,机械音乐盒放音时为了让音色稳定,必须放平不能动摇,而且价格昂贵,不能实现大批量生产。

本文设计的音乐盒,是基于单片机设计制作的电子式音乐盒。

与传统的机械式音乐盒相比更小巧,音质更优美且能演奏和弦音乐。

电子式音乐盒动力来源是电池,制作工艺简单,可进行批量生产,所以价格便宜。

基于单片机制作的电子式音乐盒,控制功能强大,可根据需要选歌,使用方便。

所放歌曲的节奏可以根据需要进行设置,根据存储容量的大小,可以尽可能多的存储歌曲。

另外,可以设计彩灯外观效果,增设放歌时间、序号显示灯功能,使音乐盒的功能更加丰富,如图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)/初值(

音符

频率(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音符编码表

音符

音符编码

音符

音符编码

不发音

0

低5SO

1

低6LA

2

低7SI

3

中1DO

4

中2RE

5

中3M

6

中4FA

7

中5SO

8

中6LA

9

中7SI

A

高1DO

B

高2RE

C

高3M

D

高4FA

E

高5SO

F

高6LA

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

1/4

6

6/4

1

1/8

6

6/8

2

2/4

8

8/4

2

2/8

8

8/8

3

3/4

A

10/4

3

3/8

A

10/8

4

4/4

C

12/4

4

4/8

C

12/8

5

5/4

F

15/4

5

5/8

表2-4乐谱节拍编程时的时间延时表

乐谱节拍

1/4拍的延时时间

乐谱节拍

1/8拍的延时时间

4/4

125ms

4/4

62ms

3/4

187ms

3/4

94ms

2/4

250ms

2/4

125ms

音符编码和节拍编码完成后,在编程时,每个音符占一个字节,高四位是音符编码,低四位是节拍编码。

 

第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) 用P2.0~P2.2作为LCD的RS、R/W、E的控制信号;

(3)用P0.0~P0.7作为LCD的D0~D7的控制信号;

(4) 用P3.7口控制蜂鸣器;

(5) 电路为12MHz晶振频率工作,起振电路中C1,C2均为30pf。

3.4键盘按键

键盘按键分布如下:

0

1

4

8

9

A

B

C

D

 

按键功能说明:

1—A

十首歌曲

C

下一首歌曲

D

上一首歌曲

E

暂停

F

开机画面

 

第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.

 

附录

附录一元器件清单:

 

名称

数量(个)

型号/参数

备注

单片机

1

AT89C51

液晶屏

1

LM016

按键开关

16

BUTTON

普通电阻

2

10K(1个),1K(1个)

排阻

1

RESPACK-8

10K

电容

3

30pf(2个),10uf(1个)

晶振

1

12MHz

三极管

1

PNP

蜂鸣器

1

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

LCALLENABLE

MOVP0,#06H ;计数地址加1,显示幕ON

LCALLENABLE

;------------------------内存初始化

LCALLINITIL     

;------------------------------

KEY1:

LCALLKEY

LCALLMODD        

LJMPKEY1

;---------------------键盘扫描

KEY:

NOP

NOP

LCALLKS

JNZK1     ;有按键转到K1

LCALLKAIJI

LCALLSOP

XN:

LJMPKEY

K1:

LCALLMODD

LCALLMODD

LCALLKS

JNZK2

LJMPKEY

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

LJMPLK

L2:

JBACC.6,L3

MOVA,#08H

LJMPLK

L3:

JBACC.7,NEXT1

MOVA,#0CH

;----------------------------------

LK:

ADDA,R4

PUSHACC

K4:

LCALLDELAY1;若同时有其他键,则等待

LCALLKS

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   ;------列扫描

MOVA,R2

JNBACC.3,N2

LJMPN1

N2:

LJMPKEY

N1:

RLA

MOVR2,A

LJMPK3

;----------------------------------

KS:

MOVA,#0F0H    ;判断P1口

MOVP1,A

NOP

NOP

MOVA,P1

CPLA

ANLA,#0F0H

RET

;-------------------------------

DELAY1:

SETBRS0

DL:

MOVR5,#0AH

DL2:

MOVR6,#63

DL3:

NOP

NOP

DJNZR6,DL3

DJNZR5,DL2

CLRRS0    

RET

;30H-37H初值为零

;---------------------------------

INITIL:

     

MOVR3,#08H

MOVR0,#30H

M1:

MOV@R0,#00H

INCR0

DJNZR3,M1        

RET

;----------------------------------

;显示    

;----------------------------------

MODD:

 

MOVP0,#8EH

LCALLENABLE        

MOVA,37H

MOVDPTR,#TABLE3        

MOVCA,@A+DPTR

LCALLWRITE2      

RET

;----------------------------------

;开机提示字

;----------------------------------

KAIJI:

MOVA,37H

CJNEA,#0FH,DFF

MOVP0,#80H   ;设光标地址

LCALLENABLE

MOVDPTR,#TABLE1;写数据

LCALLWRITE1        

DFF:

RET

;----------------------------------

;按键值播放歌曲

;----------------------------------

SOP:

MOVA,37H

CJNEA,#01H,A11

LCALLMODD

MOV52H,#HIGH

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1