基于单片机STC89C52的数字音乐盒设计.docx

上传人:b****5 文档编号:29261135 上传时间:2023-07-21 格式:DOCX 页数:33 大小:185.79KB
下载 相关 举报
基于单片机STC89C52的数字音乐盒设计.docx_第1页
第1页 / 共33页
基于单片机STC89C52的数字音乐盒设计.docx_第2页
第2页 / 共33页
基于单片机STC89C52的数字音乐盒设计.docx_第3页
第3页 / 共33页
基于单片机STC89C52的数字音乐盒设计.docx_第4页
第4页 / 共33页
基于单片机STC89C52的数字音乐盒设计.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

基于单片机STC89C52的数字音乐盒设计.docx

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

基于单片机STC89C52的数字音乐盒设计.docx

基于单片机STC89C52的数字音乐盒设计

 

目录

1引言3

2设计目的与要求3

2.1设计的目的3

2.2设计的基本要求3

3总体设计3

3.1基本工作原理3

3.1.1播放音乐的原理3

3.1.2音符频率的产生3

3.1.3节拍频率的产生5

3.2硬件总体设计6

3.3软件总体设计6

4硬件设计7

4.1单片机芯片的引脚及部分功能7

4.2各个模块的硬件电路设计8

4.2.1时钟复位电路8

4.2.2按键输入电路8

4.2.3显示电路9

4.2.4音频输出电路9

4.2.5彩灯控制电路9

5软件设计10

6仿真、调试电路11

存在问题和解决方法11

总结与体会11

致谢11

参考文献11

实物图:

12

附录:

12

1引言

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

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

2设计目的与要求

2.1设计的目的

通过课程设计,让自己熟悉单片机微机应用系统开发、研制的过程,软硬件设计的工作方法、工作内容、工.作步骤。

对自己进行基本技能训练,例如:

组成系统、编程、调试、查阅资料、焊接电路板等。

使理论联系实际,提高动手能力和分析问题、解决问题的能力。

2.2设计的基本要求

(1)利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏不同的乐曲(至少3首歌曲);

(2)采用七段数码管显示当前播放的歌曲序号;

(3)可通过功能键选择乐曲,暂停,播放,上一首,下一首;

扩展功能:

利用一个循环跟每一个音调同步,每改变一个音调就变换一下彩灯,从而实现音乐控制彩灯的功能。

3总体设计

3.1基本工作原理

3.1.1播放音乐的原理

发音原理:

播放一段音乐需要的是两个元素,一个是音调,另一个是音符。

首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。

对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调却随强度增加而上升。

另外,音符的频率有所不同。

基于上面的内容,这样就对发音的原理有了一些初步的了解。

音符的发音主要靠不同的音频脉冲。

利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

3.1.2音符频率的产生

音符及定时器的初值:

例如:

中音1(DO)的音频=523HZ,周期T=1/523s=1912

定时器/计数器0的定时时间为:

T/2=1912/2

=956

定时器956

的计数值=定时时间/机器周期=956

/1

=956(时钟频率=12MHZ)

计算得到定时器0的初值为65536-956=64580,将初值装入T0的寄存器里,启动T0后,每计数956次后就溢出中断,进入中断服务程序后,只要将I/O口的输出值取反,就可以得到中音1(DO)的音符音频。

只要改变计数初值,就能得到不同频率的音符。

表3.1是C调各音符频率与计数初值的对照表:

音符

频率(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

表3.1

音符、音符编码及定时器初始值:

为了产生音符必须求出低音到高音的计数初值,而为了便于写谱,必须进行简单的编码,在编程时,根据音符编码查找对应的计数初值,比如说音乐是C调的,低音5(SO)直接写为编码1,低音6(LA)直接写为编码2。

表3.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

表3.2

3.1.3节拍频率的产生

音乐中的节拍是利用延时产生的。

例如:

1拍=0.4s,1/4拍=0.1s。

如此类推,可得到其他节拍的时间。

为了便于写谱,也将节拍进行编码。

表3.1是节拍数编码表,表3.2是乐谱节拍编程时间延时表:

按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

表3.3

乐谱节拍

1/4拍的延时时间

乐谱节拍

1/8拍的延时时间

4/4

125ms

4/4

62ms

3/4

187ms

3/4

94ms

2/4

250ms

2/4

125ms

表3.4

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

3.2硬件总体设计

本设计是由五部分电路组成的,分别是时钟复位电路、单片机系统、按键电路、显示电路和音频输出电路。

硬件的总体框图如图3.2.1所示:

图3.2.1

 

原理说明:

*当键盘有键按下时,判断键值,启动定时器0,产生一定的频率,驱动蜂鸣器,播放歌曲,启动定时器1,显示歌曲序号;

*用P0口控制七段数码管,P1口控制彩灯变化,P2.0控制喇叭,输出音频信号;

电路采用12MHz的晶振工作,起振电路中C1和C2为22pF的电容

3.3软件总体设计

本设计采用Keil软件进行编写程序并进行编译,采用Proteus软件进行仿真

在编写程序之前,首先应该画出该程序的流程图,这样编程起来会比较简单一点,不会那么复杂。

音乐盒设计的总程序流程图如图3.3.1所示:

 

初始化

设置音节起始位置,设置节拍间距

读取音阶、音符

显示当前播放歌曲序号,彩灯循环闪烁

 

节拍结束,彩灯停止闪烁

图3.3.1

4硬件设计

4.1单片机芯片的引脚及部分功能

本设计采用的单片机型号是STC89C52,其引脚图如图4.1.1所示:

图4.1.1

跟51单片机一样STC89C52单片机也是8位的单片机,有32个准双向的I/O口,存储单元也分为了2种,程序存储器和数据存储器,其中数据存储器是256KB的,可以扩展到64KB,而程序存储器是4KB的,也可以扩展到64KB。

STC89C52单片机的中断系统里有5个中断请求源,4个用于中断控制的寄存器IE、IP、TCON和SCON,用来控制中断的类型、中断的开/关和各种中断源的优先级别,而引脚31,当接低电平时,单片机直接访问外部程序存储器,接高电平时,单片机访问片内程序存储器,当程序计数器PC的值超过4KB时,单片机也自动访问片外程序存储器。

引脚9是单片机的复位端,当接高电平时,单片机就会复位,而单片机32个I/O口中,P3口具有第二功能,可以实现串行和并行通信的数据接收和发送,也可以控制单片机的中断类型。

4.2各个模块的硬件电路设计

4.2.1时钟复位电路

时钟电路是由12MHz的晶振和2个22pF的电容组成,给单片机系统提供外部时钟信号源,以保证单片机内部定时器的正常工作。

而复位电路采用上电复位的接法,由一个10k的电阻和10uF的电容组成,在加电的瞬间电容通过充电,使RST端出现正脉冲,从而使单片机复位。

时钟复位电路如图4.2.1所示:

图4.2.1

4.2.2按键输入电路

本设计采用三个按键来控制音乐的播放,其中按键S1是控制音乐盒播放下一首歌曲,按键S2是控制音乐盒播放上一首歌曲,而按键S3则是控制音乐播放和暂停,按键电路的接法如图4.2.2所示:

图4.2.2

4.2.3显示电路

阻,本设计采用七段共阴数码管来显示当前播放歌曲的序号,其中a、b、c、d、e、f、g分别接到P0.0-P0.6口,而公共端接地,由于P0口里面没有接上拉电在外部电路里还得接上排阻,以保证P0口电平的正常输出。

显示电路的接法如图

图4.2.3

4.2.4音频输出电路

本设计采用喇叭作为音乐盒的音频输出,但是只有一个喇叭就构成整个音频输出电路的话,播放音乐的声音就会太小声,甚至有时小到连声音都听不到,为了增大喇叭的声音,才用一个放大电路使通过喇叭的电流增大,从而增大喇叭的输出功率。

放大电路是采用一个PNP型的三极管和两个电阻,其中一个作为反馈回路。

音频输出电路如图4.2.4所示:

图4.2.4

4.2.5彩灯控制电路

彩灯控制电路为本设计的扩展功能,通过音乐的播放,节拍的变化来控制彩灯的循环变化,彩灯电路有8个发光二极管和8个200欧的电阻组成,接到P1口,通过变化P1口的输出电平,控制彩灯的亮灭。

彩灯控制电路如图4.2.5所示:

图4.2.5

5软件设计

本设计可以实现课程设计的基本要求,可以播放6首歌,并通过按键控制播放、暂停等功能。

主要的子程序框图如图所示:

显示曲目号

初始化变量及数码管

播放相应的歌曲

初始化定时器

播放并显示歌曲序号N

检测是有有按键

音乐播放程序框图

保护现场

重装初值

 

P2.0反相

恢复现场

编写完程序后,用Keil软件进行编译,看是否有错,如果有错应立刻修改,直到编译正确为止。

6仿真、调试电路

在Proteus软件绘制完原理图和编译完源程续后,将Keil软件编译完生成的Hex文件加载到Proteus软件绘制出的原理图里德单片机里,就可以进行仿真,验证是否能实现课程设计的基本功能。

当仿真成功后,就可以购买元器件,开始焊接电路板了,焊完电路板后,利用单片机开发板将程序下载到单片机芯片上进行调试,看是否焊接成功,如果没有同仿真时的结果一样,就得检查一下电路,看哪里出错了,再进行调整,达到预期的要求。

存在问题和解决方法

在设计过程中,在音频输出电路中开始没有加三极管,在调试过程中喇叭的声音有点小,不清晰。

然后加上后,电路中电流增大,在外部适当的添加一些电阻就能实现功率的放大。

声音明显变大清晰,音乐自然流畅。

总结与体会

通过这次课程设计,从整体上我对单片机微机应用系统开发、研制过程软硬件设计的工作方法、工作内容、工作步骤更加了解。

不仅熟练地掌握了Keil软件和Proteus软件的使用方法,而且提高了我的动手能力和分析问题、解决问题的能力。

我觉得这次单片机课程设计是一个综合性的设计平台,除了熟练掌握了一些软件的使用和进行了基本技能的锻炼之外,还巩固了我的单片机知识,在编程方面,我也更加的熟练。

而且通过查阅资料,还拓展了我的知识视野,加强了我查阅资料的能力。

致谢

这次课程设计基本结束,学到了很多的东西,自己查找资料,思考出现的各种问题,但同时得到了老师的极大指导和帮助,有些专业性知识,在老师的帮助下很快解决,小的细节错误,也都是老师点出来,自己纠正,老师的谆谆教导给予我很多课本上没有的东西,在此对周老师深深地感谢。

 

参考文献

[1]单片机原理与接口技术,李朝青编著,北京航空航天大学出版社,2005年10月;

[2]单片机课程设计指导,楼然苗、李光飞编著,北京航空航天大学出版社,2007年7月;

[3]单片机控制实习与专题制作,蔡朝洋,北京航空航天大学出版社;

[4].Altera,NovasTeamforFPGAVisibilityEnhancement.ElectronicNews(NorthAmerica).2006,(11):

12

[5].罗杰,康华光.两种硬件描述语言VHDL/Verilog的发展及其应用.电气电子教学学报,2002,24(04):

1-5

[6]图书馆相关书籍

实物图:

附录:

源程序

OUTBITP2.0;定义音频输出端口,p2.0

NEQU6;歌曲总数

OUT_NUMEQUP0;数码管显视当前所放歌曲曲数

ORG0000H

K2:

AJMPMAIN

ORG0003H

AJMPLAST_SONG;外部中断0用于接上一曲歌按键

ORG000BH

AJMPF_T0;定时器0用于定时,作音符发生器用

ORG0013H

q4:

AJMPNEXT_SONG;外部中断1接下一曲歌按键

ORG001BH

AJMPSTART_PAUSE;定时器1用计数,这里用作中断,接开始/暂停键,初值为0ffH,方式2

ORG0030H

MAIN:

MOV50H,#00H

MOVSP,#60H

MOVDPTR,#TABLE;DPRT指向每首歌曲的入口地址的地址。

MOVR0,#30H;R0中存入数据30H,这里在以30H开始的单元存放每首歌曲的入口地址,其中30H,31H存放

;歌曲的节拍入口地址,32H,33H存放歌曲音符入口地址,每首歌占用四个存储存单元。

MOVR5,#00H;R5中存放表TABLE中正在执行操作的序号

MOVR6,#1;R6存放正在设置入口信息的歌曲数

SET_TAB:

MOVA,R5;设置每首歌曲的入口信息,存放在以30H开始的存储单元中。

MOVCA,@A+DPTR

MOV@R0,A

INCR5

INCR0

MOVA,R5

MOVCA,@A+DPTR

MOV@R0,A

INCR5

INCR0

MOVA,R5

MOVCA,@A+DPTR

MOV@R0,A

INCR0

INCR5

MOVA,R5

MOVCA,@A+DPTR

MOV@R0,A

INCR0

INCR5

INCR6;设置完一首歌曲后,歌曲数加一

CJNER6,#N+1,SET_TAB;是否设置完,没有便继续,否则进行下面的操作

;***********************************对中断,计数器的相关参数进行设置

MOVTMOD,#61H;计数器0工作方式1,计数器1工作方式2

MOVTH1,#0FFH;给计数器1置初值0FFH,又由于是工作方式2,所以

MOVTL1,#0FFH;计数器计数为1,相当于一外部中断。

SETBET1;允许计数器1中断

SETBET0;允许计数器具0中断

CLRPT0;计数器0为低优先级

SETBPT1;计数器1为高优先

SETBIT0;外部中断0为跳沿触发

SETBPX0;高优先级

SETBIT1;外部中断1为跳沿触发

SETBPX1;高优先级

SETBEX1;允许外部中断1中断

SETBEX0;允许外部中断定0中断

SETBEA;开中断总开关

SETBTR1;定时器1开始工作,作中断用

SETBOUT;音频输出端口初始化

;***********************************;设置结束

CLRF0;设置F0=0,用来作暂停/播放的标置位用

MOV22H,#01H;22H单元中存放正在播放的歌曲编号

MOVDPTR,#OUT_TAB;将正在播放的歌曲编号送数码管显视

MOVA,22H

MOVCA,@A+DPTR

MOVOUT_NUM,A

MOVR7,#00H;R7中存放歌曲总信息的入口地址

START0:

MOVR4,#00H;R4存放当前正在播放歌曲的第几个节拍数

MOVR0,#30H;30H开始的单元中存放歌曲的入口信息

MOVA,R7;将歌曲的节拍表的入口地址送到DPTR

ADDA,R0

MOVR0,A

MOVDPH,@R0

INCR0

MOVDPL,@R0

INCR0

MOVA,R4

INCR4

MOVCA,@A+DPTR;取出第一节拍数,其实第一个节拍不是歌曲的第一个节拍,而是表示几分音符

;****************************************************

MOV26H,A;将取出的音符数+节拍数保存在职26H单元中

NEXT:

MOVR0,#30H;开始取出歌曲的第一个数据

MOVA,R7

ADDA,R0

MOVR0,A

MOVDPH,@R0

INCR0

MOVDPL,@R0

INCR0

MOVA,R4

INCR4

MOVCA,@A+DPTR;放在A中

;****************************************************

JZEND0;若为0,则表示为休止符,不唱,本次音符不唱,

MOVR1,A;不为0,取出节拍数

ANLA,#0FH

MOVR2,A

MOVA,R1

SWAPA

ANLA,#0FH

JNZSING;音符不为0,唱

CLRTR0;为0,不唱,关频率发生器

SJMPSING1

SING:

DECA;开始唱,进行相应的数据处理

MOVR3,A

RLA

MOVDPH,@R0

INCR0

MOVDPL,@R0

INCR0

MOVCA,@A+DPTR

MOV21H,A

MOVTH0,A

MOVA,R3

RLA

INCA

MOVCA,@A+DPTR

MOV20H,A

MOVTL0,A

SETBTR0;开唱

START:

MOVDPTR,#DTABLE

MOVA,50H

MOVCA,@A+DPTR

MOVP1,A

INC50H

MOVA,50H

CJNEA,#15H,SING1

MOV50H,#00H

SING1:

LCALLDELAY;每个音符唱多久

JBF0,FOR;是否暂停,

AJMPNEXT;没有暂停,继续

FOR:

CLRTR0;暂停,不唱

JBF0,$;等待播放

AJMPNEXT;开始播放

END0:

CLRTR0;不唱

MOVA,22H;唱完处理

CJNEA,#N,WW;是不是全部歌曲都唱完

MOV22H,#01H;全部唱完,则从第一首开始再唱

MOVR7,#00H

MOVOUT_NUM,#57H;数码管显视第一首歌曲编号

AJMPWWW

WW:

MOVA,R7;没有全部唱完,唱下一首,歌曲的入口信息调整

ADDA,#4

MOVR7,A

INC22H

CLREA

PUSHDPH

PUSHDPL

MOVA,22H

MOVDPTR,#OUT_TAB

MOVCA,@A+DPTR

MOVOUT_NUM,A;数码管显视相应的歌曲编号

POPDPL

POPDPH

WWW:

SETBEA

AJMPSTART0;开始下一首的演唱

F_T0:

MOVTH0,21H;定时器0置初值

MOVTL0,20H

CPLOUT;频率产生

RETI

NEXT_SONG:

PUSHACC;下一曲中断程序处理,保护现场

PUSHDPH

PUSHDPL

CLREA;关中断

MOVA,22H

CJNEA,#N,Q;是最后一首吗?

MOVR7,#00H;是最后一首,则R7指向第一首,演唱第一首

MOV22H,#01H

AJMPBACK

Q:

INC22H;不是最后一首,唱下一首,R7内容加4,歌曲数加1

MOVA,R7

ADDA,#4

MOVR7,A

BACK:

MOVR4,#00H;数码管显视相应的歌曲编号

MOVA,22H

MOVDPTR,#OUT_TAB

MOVCA,@A+DPTR

MOVOUT_NUM,A

;********************************************

MOVB,R0;对下首歌曲的几分拍进行调整,同时对R0中的内容进行保护

MOVR4,#00H

MOVR0,#30H

MOVA,R7

ADDA,R0

MOVR0,A

MOVDPH,@R0

INCR0

MOVDPL,@R0

INCR0

MOVA,R4

INCR4

MOVCA,@A+DPTR

MOV26H,A;结果存入26H单元中

DECR4

MOVR0,B;恢复R0中的内容

;********************************************

POPDPL;恢复现场

POPDPH

POPACC

SETBEA

RETI;中断返回

LAST_SONG:

PUSHACC;上一曲中断程序处理开始,保护现场

PUSHDPH

PUSHDPL

CLREA;关中断

MOVA,22H;曲目数送A

CJNEA,#1,QQ;是否是第一首

MOV22H,#N;是第一首歌曲

MOVB,#4;将R7指向最后一首歌曲

MOVA,#N-1

MULAB

MOVR7,A

AJMPBACK2;处理结束

QQ:

DEC22H

MOVA,R7;R7减4

SUBBA,

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

当前位置:首页 > 自然科学 > 天文地理

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

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