基于单片机STC89C52的数字音乐盒设计Word下载.docx
《基于单片机STC89C52的数字音乐盒设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机STC89C52的数字音乐盒设计Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
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
MOV@R0,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
MOVR0,A
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;