数字音乐盒
※※※※※※※※※
※※ 2008级学生单片机
※※ 课程设计 ※※ ※※※※※※※※※
单片机课程设计报告书
基于单片机的数字音乐盒设计 课题名称
姓 名
学 号
院 系
专 业
指导教师
2011年 6月10日
1
一、 设计任务及要求:
1. 利用振荡器驱动AT89C52,输出到蜂鸣器发出音乐
2. 采用数码管显示音乐曲目,
3. 并用proteus实现仿真效果。
指导教师签名:
2011年 04 月 22日
二、指导教师评语:
指导教师签名:
2011年 6 月 16 日
三、成绩
验收盖章
2011年6 月 16日
2
基于单片机的数字音乐盒设计 1设计目的
应用AT89C52单片机原理和控制理论来设计音乐盒的硬件电路,并利用C51单片机语言进行程序设计。通过单片机的定时器来产生不同频率的方波,驱动喇叭发出不同音调的音乐,再利用延迟来控制发音世间的长短。对单片机和音乐爱好者有一定借鉴价值。
2设计的主要内容和要求
本设计是基于51系列单片机,蜂鸣器,现实数码管LED的数字音乐盒设计,通过利用I/O一定频率的方波,驱动蜂鸣器发出不同的音调,从而演奏各种乐曲(本设计为三首,若有必要,可以增加),通过LCD可以现实不同的信息,并且可以通过功能键来选择乐曲,暂停,播放,前进,后退等功能。具体如下:
1)利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(最少储存三首乐曲,每首不少于30秒)。
2)采用LCD显示信息。
3)开机时有英文欢迎提示字符,播放时显示歌曲序号(或名称)。
4)可通过功能键选择乐曲,暂停,播放。
5)选作内容:显示乐曲播放时间或剩余时间。
6)本设计中用AT89C52单片机,蜂鸣器,七段显示数
3 整体#设计
#
3
振荡器扬声器 (方波电(蜂鸣器)路)
AT89C52
LED数码管
(显示歌曲曲功能键盘
目)
图3.1设计方框图
由于计算器需要比较多的输入输出口,所以选择内部存储资源比较多的AT89C52单片机,8位LED。 扬声器可以用一个I/O口,采用AT89C52作为运算和控制单元完全满足系统的需求。
4 硬件电路的设计
方波电路:51核片内有一个反向放大器构成振荡器,本系统采用内部方式,在XTAL1和XTAL2端外接石英晶体作为定时元件,内部反向放大器自激振荡,产生时钟发生器对振荡脉冲二分频。电容采用22pF电容。音乐盒的电路设计过程在硬件和软件方面进行同步。其中,硬件方面选择内部分储存资源丰富的AT89C52单片机,时钟采用12MHz晶体振荡电路。
4
4.1整体设计原理图
5 软件设计
软件方面从分析电路各个功能子模块的功能、流程图设计,再到程序的编写设计均进行了综合考虑。编程语言从程序总体设计以及高效性和硬件要求方面考虑,采用汇编语言进行编写。本设计程序的流程如下:
先从主程序开始,接着初始化变量及LED接口,然后出示话方波发生器,晶体管,使LED显示信息,就进入了开机状态,等待动做选择按键,包括播放键,暂停键,停止键,当然也可以选择返回:加入选择的是播放键,LED上就会实现歌曲编号,与此同时演奏相应的乐曲,此时,你可以按上一曲获下一曲键,使其演奏上一个或者先一个乐曲
5
主程序开始开始
初始化变量及LCD接口初始化计数器T0,定时器T1LCD显示英文欢迎字符
N等待按键,是否有按键,包括等待按键,是否有按键,包括播放键,暂停键,停止键播放键,暂停键,停止键
Y
歌曲号及播放时间显示在LCD上依据按键码演奏对应的歌曲
图5.1主控制器程序流程图
6
6 系统仿真
在Proteus的ISIS 7.1sp2软件环境下画出电路原理图,接下来就是将设计的程序在Keil C51 μVision2开发集成环境上编译成机器语言,进入Proteus的ISIS,鼠标左键点击菜单“Debug”, 选中“use romote debuger monitor”,便可实现KeilC与Proteus连接调试。首先在Proteus中双击单片机AT89C51,将KeilC下编程生成的 .HEX文件导入到AT89C51中,可在Proteus中单击全速仿真运行按钮,进行现象的查看,能清楚地观察到芯片上每一个引脚的电平变化,红色代表高电平,蓝色代表低电平;如果现象不正确,则在KeilC中单步调试程序,并在Proteus观察现象,那一步不正确则对该段的程序进行修改,调试直到仿真完全成功为止。
如图6.1所示,该仿真验证的过程为,首先按开始按,然后按下键盘的开始/暂停键,蜂鸣器开始播放音乐。
播放第一首曲目如图所示:
图6.1 键盘扫描LED显示仿真图
7使用说明
7
课程设计采用Protues软件仿真。首先设计数字音乐盒的源程序,源程序经过软件Keil uVision2汇编后,生成的目标文件经过仿真调试。在Proteus中单击全速仿真运行按钮,依次按下扫描键盘上的三个按钮,待三个按钮全部输入后,会在数码管上显数字音乐盒的的曲目编号由七段显示器显示如图6.2所示。
图7.1 数码管动态显示地址仿真图
例如播放曲目三:
图7.2播放曲目三
8设计总结
程序调试中出现的问题及解决的办法:
有时会出现程序一点错误也没有,但就是不能正常运行的现象,最后我们发行是因为程序中有的指令书写得不规范导致的。
编程时要注意,在程序开始时,要写入各定时器中断的入口地址。
编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不
8
便于查找或更改。
程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化。
编程前要加流程图,这样会使思路清晰,例如数字音乐盒的设计思路完全可以按着MP3的工作方式列写流程图。
本文通过对基于单片机音乐演奏控制设计的研究和设计,分析了设计的实现的意义和可行性。单片机AT89C52是一种非常小巧但功能非常多,应用非常广的一种芯片,功率也非常的小,采用AT89C52作为系统核心制作音乐演奏控制设计电路简单了很多,由于可以反复烧写,为学习降低成本。本设计外部采用单片机的复位电路设计、单片机的震荡电路设计、LED数码管显示正在播放的音乐序号,按键控制等,但由于AT89C52分辨率不是太高,音乐有点单调,另外,由于时间关系具体电路还有的地方不尽完善之处。
参考文献
[1] 李炳宇,萧蕴诗,李永东.AT89C51单片机在多层楼宇对讲系统中的应用[J].自动化与仪
表,2001,38(04):23-25.
[2] 李强华,张根宝,段力(基于单片机控制的楼宇对讲系统的设计[J].电气应用,2007,
12(01):04-06.
[3] 吴庆元,卢益民.智能小区系统通信
的设计[J].通信技术,2003,19(7):98-99. [4] 赵建东,陈小乐.基于Internet的智能家庭网络控制器的实现[J].电子技术应用,
2002,34(12) :23-25.
[5] 李建忠.单片机原理及应用[M].西安:西安电子科技大学出版,2002:63-78. [6] 张俊谟.单片机中级教程[M].北京:北京航空航天大学出版,2000:36-45. 附录程序设计
OUT BIT P2.0 ;定义音频输出端口,p2.0
N EQU 3 ;歌曲总数
OUT_NUM EQU P1 ;数码管显视当前所放歌曲曲数
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP LAST_SONG ;外部中断0用于接上一曲歌按键
9
ORG 000BH
AJMP F_T0 ;定时器0用于定时,作音符发生器用
ORG 0013H
q4: AJMP NEXT_SONG ;外部中断1接下一曲歌按键
ORG 001BH
AJMP START_PAUSE ;定时器1用计数,这里用作中断,接开始/暂停键,初值为
0ffH,方式2
ORG 0030H
MAIN: MOV SP,#60H
MOV DPTR,#TABLE ;DPRT指向每首歌曲的入口地址的地址。
MOV R0,#30H ;R0中存入数据30H,这里在以30H开始的单元存放每
首歌曲的入口地址,其中30H,31H存放
;歌曲的节拍入口地址,32H,33H存放歌曲音符入口地
址,每首歌占用四个存储存单元。
MOV R5,#00H ;R5中存放表TABLE中正在执行操作的序号
MOV R6,#1 ;R6存放正在设置入口信息的歌曲数
SET_TAB: MOV A,R5 ;设置每首歌曲的入口信息,存放在以30H开始的存储
单元中。
MOVC A,@A+DPTR
MOV @R0,A
INC R5
INC R0
MOV A,R5
MOVC A,@A+DPTR
MOV @R0,A
INC R5
INC R0
MOV A,R5
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC R5
MOV A,R5
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC R5
INC R6 ;设置完一首歌曲后,歌曲数加一
10
CJNE R6,#N+1,SET_TAB ;是否设置完,没有便继续,否则进行下面的操作
;*********************************** 对中断,计数器的相关参数进行设置
MOV TMOD, #61H ;计数器0工作方式1,计数器1工作方式2
MOV TH1,#0FFH ;给计数器1置初值0FFH,又由于是工作方式2,所以
MOV TL1,#0FFH ;计数器计数为1,相当于一外部中断。
SETB ET1 ;允许计数器1中断
SETB ET0 ;允许计数器具0中断
CLR PT0 ;计数器0为低优先级
SETB PT1 ;计数器1为高优先级
SETB IT0 ;外部中断0为跳沿触发
SETB PX0 ;高优先级
SETB IT1 ;外部中断1为跳沿触发
SETB PX1 ;高优先级
SETB EX1 ;允许外部中断1中断
SETB EX0 ;允许外部中断定0中断
SETB EA ;开中断总开关
SETB TR1 ;定时器1开始工作,作中断用
SETB OUT ;音频输出端口初始化
;*********************************** ;设置结束
CLR F0 ;设置F0=0,用来作暂停/播放的标置位用
MOV 22H,#01H ;22H单元中存放正在播放的歌曲编号
MOV DPTR,#OUT_TAB ;将正在播放的歌曲编号送数码管显视
MOV A,22H
MOVC A,@A+DPTR
MOV OUT_NUM,A
MOV R7,#00H ;R7中存放歌曲总信息的入口地址
START0:MOV R4,#00H ;R4存放当前正在播放歌曲的第几个节拍数
MOV R0,#30H ;30H开始的单元中存放歌曲的入口信息
MOV A,R7 ;将歌曲的节拍表的入口地址送到DPTR
ADD A,R0
MOV R0,A
MOV DPH,@R0
11
INC R0
MOV DPL,@R0
INC R0
MOV A,R4
INC R4
MOVC A,@A+DPTR ;取出第一节拍数,其实第一个节拍不是歌曲的第一个节拍,而是表示几分音符
;****************************************************
MOV 26H,A ;将取出的音符数+节拍数保存在职26H单元中
NEXT: MOV R0,#30H ;开始取出歌曲的第一个数据
MOV A,R7
ADD A,R0
MOV R0,A
MOV DPH,@R0
INC R0
MOV DPL,@R0
INC R0
MOV A,R4
INC R4
MOVC A,@A+DPTR ;放在A中
;****************************************************
JZ END0 ;若为0,则表示为休止符,不唱,本次音符不唱,
MOV R1,A ;不为0,取出节拍数
ANL A,#0FH
MOV R2,A
MOV A,R1
SWAP A
ANL A,#0FH
JNZ SING ;音符不为0,唱
CLR TR0 ;为0,不唱,关频率发生器
SJMP SING1
SING: DEC A ;开始唱,进行相应的数据处理
MOV R3,A
RL A
MOV DPH,@R0
INC R0
MOV DPL,@R0
INC R0
12
MOVC A,@A+DPTR
MOV 21H,A
MOV TH0,A
MOV A,R3
RL A
INC A
MOVC A,@A+DPTR
MOV 20H,A
MOV TL0,A
SETB TR0 ;开唱
SING1:LCALL DELAY ;每个音符唱多久
JB F0,FOR ;是否暂停,
AJMP NEXT ;没有暂停,继续
FOR: CLR TR0 ;暂停,不唱
JB F0,$ ;等待播放
AJMP NEXT ;开始播放
END0: CLR TR0 ;不唱
MOV A,22H ;唱完处理
CJNE A,#N,WW ;是不是全部歌曲都唱完
MOV 22H,#01H ;全部唱完,则从第一首开始再唱
MOV R7,#00H
MOV OUT_NUM,#06H ;数码管显视第一首歌曲编号
AJMP WWW
WW: MOV A,R7 ;没有全部唱完,唱下一首,歌曲的入口信息调整
ADD A,#4
MOV R7,A
INC 22H
CLR EA
PUSH DPH
PUSH DPL
MOV A,22H
MOV DPTR,#OUT_TAB
MOVC A,@A+DPTR
MOV OUT_NUM,A ;数码管显视相应的歌曲编号
POP DPL
POP DPH
WWW: SETB EA
AJMP START0 ;开始下一首的演唱
13
F_T0: MOV TH0,21H ;定时器0置初值
MOV TL0,20H
CPL OUT ;频率产生
RETI
NEXT_SONG: PUSH ACC ;下一曲中断程序处理,保护现场
PUSH DPH
PUSH DPL
CLR EA ;关中断
MOV A,22H
CJNE A,#N,Q ;是最后一首吗,
MOV R7,#00H ;是最后一首,则R7指向第一首,演唱第一首
MOV 22H,#01H
AJMP BACK
Q: INC 22H ;不是最后一首,唱下一首,R7内容加4,歌曲数加1
MOV A,R7
ADD A,#4
MOV R7,A
BACK: MOV R4,#00H ;数码管显视相应的歌曲编号
MOV A,22H
MOV DPTR,#OUT_TAB
MOVC A,@A+DPTR
MOV OUT_NUM,A
;********************************************
MOV B,R0 ;对下首要演唱的歌曲的几分拍进行调整,同时对R0中的
内容进行保护
MOV R4,#00H
MOV R0,#30H
MOV A,R7
ADD A,R0
MOV R0,A
MOV DPH,@R0
INC R0
MOV DPL,@R0
INC R0
MOV A,R4
INC R4
MOVC A,@A+DPTR
MOV 26H,A ;结果存入26H单元中
14
DEC R4
MOV R0,B ;恢复R0中的内容
;********************************************
POP DPL ;恢复现场
POP DPH
POP ACC
SETB EA
RETI ;中断返回
LAST_SONG: PUSH ACC ;上一曲中断程序处理开始,保护现场
PUSH DPH
PUSH DPL
CLR EA ;关中断
MOV A,22H ;曲目数送A
CJNE A,#1,QQ ;是否是第一首
MOV 22H,#N ;是第一首歌曲
MOV B,#4 ;将R7指向最后一首歌曲
MOV A,#N-1
MUL AB
MOV R7,A
AJMP BACK2 ;处理结束
QQ: DEC 22H
MOV A,R7 ;R7减4
SUBB A,#4
MOV R7,A
BACK2: MOV R4,#00H
MOV A,22H
MOV DPTR,#OUT_TAB
MOVC A,@A+DPTR
MOV OUT_NUM,A ;数码管显视相应歌曲的编号
;********************************************
MOV B,R0 ;对下首要演唱的歌曲的几分拍进行调整,同时对R0中的内容进
行保护
MOV R4,#00H
MOV R0,#30H
MOV A,R7
ADD A,R0
MOV R0,A
MOV DPH,@R0
15
INC R0
MOV DPL,@R0
INC R0
MOV A,R4
INC R4
MOVC A,@A+DPTR
MOV 26H,A ;结果存入26H单元中
DEC R4
MOV R0,B ;R0中的内容恢复
;********************************************
POP DPL ;恢复现场
POP DPH
POP ACC
SETB EA
RETI ;中断返回
START_PAUSE:CPL F0 ;开始/暂停中断处理程序,将标置位取反
JB F0,RETURN ;为1返回
SETB TR0 ;为0则播放
RETURN: RETI ;中断返回
DELAY: MOV 27H,26H ;音符演奏时间控制
D2: MOV 28H,#125
D3: MOV 29H,#248
DJNZ 29H,$
DJNZ 28H,D3
DJNZ 27H,D2
DJNZ R2,DELAY
RET
OUT_TAB: DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,73H ;
共阴数码管显视用
;OUT_TAB: DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
;共阳
TABLE: DW SONG1,TABLE1,SONG2,TABLE2,SONG3,TABLE3
TABLE1:DW 64580,64684,64777,64820,64898,64968,65030
DW 63628,63835,64021,64103,64260,64400,64524
SONG1: DB 04H ;1=C 2/4 军港之夜
DB
16
32H,54H,52H,32H,54H,52H,32H,12H,12H,32H,32H,54H,52H,32H,52H,52H,32H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H
DB
0C2H,32H,32H,12H,21H,31H,24H,32H,34H,0D2H,0C2H,14H,14H,32H,52H,52H,32H,52H,54H,32H,34H,31H,21H,12H,24H,24H
DB
34H,0E2H,0C2H,0D1H,0E1H,0D4H,12H,0E2H,32H,32H,0E2H,0D1H,0E1H,0D4H,0D2H,0E2H,32H,32H,0E2H,0E2H,0D1H,0E1H,0D4H
DB
22H,0D1H,11H,0E2H,0D2H,0C4H,0C4H,32H,52H,52H,32H,62H,5H,61H,54H,31H,52H,31H,12H,31H,31H,32H,54H,52H,32H,52H,52H,32H
DB
32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,34H,34H,32H,52H,52,32H,62H,51H,61H,54H,31H,52H,31H,12H,32H,12H,32H,32H,54H,52H
DB 32H,52H,52H,31H,31H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H
DB 32H,52H,52H,32H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H
DB
0C2H,32H,32H,12H,21H,31H,24H,32H,34H,0D2H,0C2H,14H,14H,32H,52H,52H,32H,52H,54H,32H,34H,31H,21H,12H,24H,24H
DB
34H,0E2H,0C2H,0D1H,0E1H,0D4H,12H,0E2H,32H,32H,0E2H,0D1H,0E1H,0D4H,0D2H,0E2H,32H,32H,0E2H,0E2H,0D1H,0E1H,0D4H
DB
22H,0D1H,11H,0E2H,0D2H,0C4H,0C4H,32H,52H,52H,32H,62H,5H,61H,54H,31H,52H,31H,12H,31H,31H,32H,54H,52H,32H,52H,52H,32H
DB
32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,34H,34H,32H,52H,52,32H,62H,51H,61H,54H,31H,52H,31H,12H,32H,12H,32H,32H,54H,52H
DB 32H,52H,52H,31H,31H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H
DB 32H,52H,52H,32H,32H,21H,31H,24H,74H,0D2H,0C2H,14H,14H,14H,14H
DB 00H
TABLE2:DW 63835,64021,64103,64260,64400,64524,64580,64684,64777
DW 64820,64898,64968,65030,65058,65110,65157,65178
SONG2: DB 02H ;1=C 4/4 死了都要爱
DB 04H,94H
DB 0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02H
DB 0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H
DB 04H,0C2H,0C2H,0D4H,0C2H,0D2H,0D8H,0D4H,0D2H,92H
17
DB 0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02H
DB 0A4H,0A2H,0B2H,0B4H,0C4H,0E8H,0D8H
DB 0C8H,0C8H,08H,08H,78H,28H,38H,34H,24H
DB
24H,64H,64H,24H,64H,72H,72H,78H,58H,54H,44H,38H,34H,14H,34H,84H,74H,74H,62H,62H,0D8H,78H,28H,38H,34H,24H
DB 24H,64H,64H,24H,64H,72H,72H,72H,94H,92H,94H,0A4H,58H,58H,54H,44H ;#音不准
DB 58H,58H,58H,58H,0A8H,0A8H,0A4H,0B4H,0A4H,84H,0A4H,94H,98H,98H,08H
DB
84H,82H,82H,82H,82H,94H,0A2H,94H,92H,82H,74H,72H,74H,72H,72H,72H,72H,92H,91H,91H,94H,54H,74H,94H
;;*************************************************
DB
0A8H,0A4H,0A2H,0B2H,0C4H,0B4H,0A4H,0A4H,0A4H,92H,92H,98H,82H,72H,78H,04H,0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H
DB 04H,0C4H,0D4H,0C4H,0C8H,04H,94H
DB 0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02
DB
0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H,04H,0C2H,0C2H,0D4H,0D8H,0D4H,0D2H,92H
DB 0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02
DB
0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H,04H,0C2H,0C2H,0D4H,0D8H,0D4H,0D2H,92H
;*************
DB 0A4H,0A2H,0B2H,0B3H,0C4H,0E8H,0D8H
DB 0C8H,0C8H,0C8H,08H
DB 00H
TABLE3: DW
64898,64968,65030,65086,65135,65158,65199,64260,64400,64524,64580,64684,64777,64862
SONG3: DB 03H ;G=2/4 中华人民共和国国歌
DB
04H,04H,0C2H,14H,12H,12H,12H,11H,11H,0C2H,0D1H,0E1H,14H,14H,02H,32H,12H,21H,31H,52H,51H,51H,54H
DB
32H,31H,31H,12H,11H,31H,52H,51H,31H,24H,24H,24H,64H,54H,24H,34H,52H,34H,52H,32H,21H,31H,12H,11H,21H,34H,04H
DB
18
52H,51H,0D1H,12H,12H,32H,31H,31H,52H,51H,51H,22H,22H,22H,0D2H,0D1H,0D1H,24H,22H,0C2H,14H,12H,12H,34H,32H,32H,54H,54H,54H,54H
DB
12H,11H,31H,52H,51H,51H,64H,54H,32H,31H,11H,52H,52H,52H,32H,02H,12H,02H,0C4H,14H
DB
0A2H,0A1H,11H,52H,52H,52H,32H,02H,12H,02H,0C4H,14H,0C4H,14H,0C4H,14H,14H,04H
DB 04H,04H,04H,04H
DB 00H
END;
19