基于单片机STC89C52的数字音乐盒设计说明Word文件下载.docx

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

基于单片机STC89C52的数字音乐盒设计说明Word文件下载.docx

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

基于单片机STC89C52的数字音乐盒设计说明Word文件下载.docx

低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

(1)

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

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

(2)是音符编码表:

音符编码

不发音

1

2

3

4

5

中3M

6

7

中5SO

8

9

中7SI

A

高1DO

B

高2RE

C

D

高4FA

E

F

高6LA

G

(2)

3、节拍频率的产生

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

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

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

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

表(3)是节拍数编码表,表(4)是乐谱节拍编程时间延时表:

按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

表(3)

乐谱节拍

1/4拍的延时时间

1/8拍的延时时间

125ms

62ms

187ms

94ms

250ms

表(4)

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

2.2硬件总体设计

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

硬件的总体框图如图

(1)所示:

 

(1)

根据系统框图,使用Proteus软件绘制总原理图,总原理图如图

(2)所示:

(2)

原理说明:

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

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

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

2.3软件总体设计

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

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

音乐盒设计的总程序流程图如图(3)所示:

图(3)

按照主程序的流程图用Keil软件编写系统的主程序。

程序清单如附录所示。

三、硬件设计

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

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

图(4)

跟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口具有第二功能,可以实现串行和并行通信的数据接收和发送,也可以控制单片机的中断类型。

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

1、时钟复位电路

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

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

时钟复位电路如图(5)所示:

图(5)

2、按键输入电路

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

图(6)

3、显示电路

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

显示电路的接法如图(7)所示:

图(7)

4、音频输出电路

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

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

音频输出电路如图(8)所示:

图(8)

5、彩灯控制电路

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

彩灯控制电路如图(9)所示:

图(9)

四、软件设计

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

主要的子程序框图如图(10)、(11)、(12)所示:

音乐播放程序框图图(10)

中断程序框图图(11)

系统各主要程序的程序清单可见于附录

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

五、仿真、调试电路

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

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

六、存在问题和解决方法

在设计过程中,虽然在音频输出电路中加了放大电路,来增大输出的电流,但是在调试过程中喇叭的声音还是有点小声,我认为不要采用单个三极管作为放大电路,而应该采用集成运算放大器,因为集成运放里面已经是由多个三极管组成的多级放大电路了,在外部适当的添加一些电阻和电容就能实现功率的放大。

七、总结与体会

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

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

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

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

但是这次单片机课程设计也不是一帆风顺的,在编程和仿真过程中倒是没有出现太大的问题,而在焊接完电路板,进行电路调试时却发现整个电路都不工作。

我们检查了两天都没发现什么问题。

当我正想放弃时,我突然想起爱迪生说过的一句话“无论什么时候,不管遇到什么情况,我绝不允许自己有一点点灰心丧气。

”于是,我决定重新买器件再焊过一块电路板,老天还是很眷顾我的,第二块电路板调试最终成功了,我非常开心,我觉得第一块电路板里可能是电容或晶振坏了,但我又不知道怎么检查电容和晶振。

因此果断焊过第二块。

总而言之,这次课程设计我获益匪浅。

不仅锻炼了我各方面的能力,在人生哲理上,我也更加成熟。

我更加深刻地认识到:

在人生的道路上,路并不是一直平坦的,会有无数的荆棘、无数的高墙挡在你的前面,但是只有坚持不懈,才能斩断挡在你面前的荆棘,退到你面前的高墙,开辟一条新的道路,只有这样才能跨越自己的极限,走到像《桃花源记》里面所说的世外桃源一样,最终你的梦想也将实现。

八、参考文献

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

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

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

[4]图书馆相关书籍;

[5]网上资料;

元件清单:

PNP型三极管(8550)

STC89C52芯片

电阻10k

电阻200Ω

16

按键

喇叭

七段共阴数码管

发光二极管

晶振(12MHz)

电容22pF

10uF

附录

源程序:

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

MOVR0,A

INCR5

INCR0

MOVA,R5

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

MOVOUT_NUM,A

MOVR7,#00H;

R7中存放歌曲总信息的入口地址

START0:

MOVR4,#00H;

R4存放当前正在播放歌曲的第几个节拍数

MOVR0,#30H;

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

MOVA,R7;

将歌曲的节拍表的入口地址送到DPTR

ADDA,R0

MOVDPH,R0

MOVDPL,R0

MOVA,R4

INCR4

MOVCA,A+DPTR;

取出第一节拍数,其实第一个节拍不是歌曲的第一个节拍,而是表示几分音符

;

****************************************************

MOV26H,A;

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

NEXT:

开始取出歌曲的第一个数据

MOVA,R7

MOVCA,A+DPTR;

放在A中

JZEND0;

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

MOVR1,A;

不为0,取出节拍数

ANLA,#0FH

MOVR2,A

MOVA,R1

SWAPA

JNZSING;

音符不为0,唱

CLRTR0;

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

SJMPSING1

SING:

DECA;

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

MOVR3,A

RLA

MOV21H,A

MOVTH0,A

MOVA,R3

INCA

MOV20H,A

MOVTL0,A

SETBTR0;

开唱

START:

MOVDPTR,#DTABLE

MOVA,50H

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;

是不是全部歌曲都唱完

全部唱完,则从第一首开始再唱

MOVR7,#00H

MOVOUT_NUM,#57H;

数码管显视第一首歌曲编号

AJMPWWW

WW:

MOVA,R7;

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

ADDA,#4

MOVR7,A

INC22H

CLREA

PUSHDPH

PUSHDPL

MOVDPTR,#OUT_TAB

MOVOUT_NUM,A;

数码管显视相应的歌曲编号

POPDPL

POPDPH

WWW:

SETBEA

AJMPSTART0;

开始下一首的演唱

F_T0:

MOVTH0,21H;

定时器0置初值

MOVTL0,20H

CPLOUT;

频率产生

RETI

NEXT_SONG:

PUSHACC;

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

CLREA;

关中断

CJNEA,#N,Q;

是最后一首吗?

是最后一首,则R7指向第一首,演唱第一首

MOV22H,#01H

AJMPBACK

Q:

INC22H;

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

BACK:

MOVR4,#00H;

********************************************

MOVB,R0;

对下首要演唱的歌曲的几分拍进行调整,同时对R0中的容进行保护

MOVR4,#00H

MOVR0,#30H

MOV26H,A;

结果存入26H单元中

DECR4

MOVR0,B;

恢复R0中的容

POPDPL;

恢复现场

POPACC

RETI;

中断返回

LAST_SONG:

PUSHACC;

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

CLREA;

曲目数送A

CJNEA,#1,QQ;

是否是第一首

MOV22H,#N;

是第一首歌曲

MOVB,#4;

将R7指向最后一首歌曲

MOVA,#N-1

MULAB

AJMPBACK2;

处理结束

QQ:

DEC22H

MOVA,R7;

R7减4

SUBBA,#4

BACK2:

数码管显视相应歌曲的编号

MOVB,R0;

I

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

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

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

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