简单数字音乐播放器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

音乐播放器
一、设计目的
熟悉并掌握单片机的原理及基本应用,掌握单片机基本外设的使用方法,掌握汇编语言编程方法,熟悉PROTEUS仿真的使用,可以应用电子工艺的基础知识连接硬件实现设计功能。

二、设计要求
(1)利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演乐曲。

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

(3)可通过功能键选择乐曲,上一曲,下一曲。

三、发音原理
3.1播放音乐的原理
发音原理:播放一段音乐需要的是两个元素,一个是音调,另一个是音符。

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

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

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

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

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

利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,然后控制P3.2引脚的输出音乐。

只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

3.2音符频率的产生
音符及定时器初始值:
例如:中音1(do)的音频=523HZ,周期T=1/523s=1912sμ
定时器/计数器0的定时时间为:T/2=1912/2sμ=956sμ
定时器956sμ的计数值=定时时间/机器周期=956sμ/1sμ=956(时钟频率=12MHZ)
装入T0计数器初值为65536-956=64580
将64580装入T0寄存器中,启动T0工作后,每计数956次时将产生溢出中断,进入中断服务时,每次对P3.1引脚的输出值进行取反,就可得到中音DO(523HZ)的音符音频。

将51单片机内部定时器工作在计数器模式1下,改变计数初值TH0,TL0以产生不同的频率。

下表1是C调各音符频率与计数初值T的对照表:
表1 C调各音符频率与计数初值T的对照表
音符
频率(Hz)/初值
(sμ) 音符
频率(Hz)/初
值(sμ)
低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 音符编码表 3.3节拍频率的产生 音乐中的节拍用延时时间产生。

例如,1拍=0.4s,1/4拍=0.1s ,以此类推。

假设1/4拍执行一次延时程序,则1/2拍就执行两次延时
程序,所以只要求出
1/4拍的延时时间,其
余节拍就是它的倍数。

为了方便,将节拍数也
进行了编码,并且计算了乐谱节拍编程时的延时时间,如表3和表4所示
表3 节拍数编码表
音符 音符编码 音符 音符编码 不发音 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
按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
表4 乐谱节拍编程时的时间延时表
乐谱节拍1/4拍的延时时
间乐谱节拍1/8拍的延时时

4/4 125 ms 4/4 62 ms
3/4 187 ms 3/4 94 ms
2/4 250 ms 2/4 125 ms
音符编码和节拍编码完成后,在编程时,每个音符占一个字节,高四位是音符编码,低四位是节拍编码。

四、电路原理 4.1 电路图
本设计中用到89C52单片机,喇叭,七段显示数码管LED 。

D02D13D24D35D46D57D68D79Q019Q118Q217Q316Q415Q514Q613Q7
12
LE 11OE 1
U2
74HC573
XTAL2
18
XTAL1
19
ALE 30EA
31
PSEN 29RST
9
P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX 2P1.23P1.34P1.45P1.56P1.67P1.7
8
P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
17
P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1
AT89C52
SRCFILE=很重要,勿删!!!!贺龙\课程设计\新建文本文档.hex
X1
CRYSTAL
C1
10p
C2
10p
C3
1nF
LS2
SPEAKER
vcc
R1
100R
R2
1k
vcc
4.2 连接说明
当键盘有键按下时,识别中断,记录键值,显示歌曲号,同时启动定时器T0,显示歌曲号产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。

(1) 硬件电路中用0INT 、1INT 分别接S1、S2作为下、上一曲的功能键 (2) 用P3.0-P3.6控制七段码a,b,c,d,e,f 。

(3) 用P2.3口控制喇叭。

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

五、软件设计 5.1软件流程图
本程序可以实现课程设计的基本要求,并可以通过按键播放四首歌曲,当没有按键时程序
将自动循环播放歌曲,程序流程图如下:
5.2 仿真、安装和调试
1、Proteus 软件仿真
按照上面设计的电路在proteus 软件内画图, 打开单片机软件开发系统Keil,选择89c52单片机,在其中编写程序,运行生成一个后缀名为.hex 的文件,然后将该文件下载到proteus 中的AT89c52单片机中进行仿真,观察实验现象。

如图9 Proteus 仿真电路图所示。

仿真时S1按键选择下一曲歌,S2按键选择上一曲歌功能,S3按键实现复位功能。

仿真成功后,安装好实验板,然后将音乐程序下载到电路板内 ,观察结果。

能实现播放音乐,按键换曲等功能。

2、程序调试中应注意的问题
开始 设置音节起始位置设置节拍间距 读取相应歌曲的音阶,音符 显示当前播放歌曲序号
初始化 外中断按键选下一首 外中断按键选上一首
(1)有时程序没有语法错误或逻辑错误后仍不能正常运行,这可能是由于指令书写不规范,例如不要用太长的前缀,RET返回指令前不留空行。

(2)为保证程序顺利运行都用LJMP,LCALL。

(3)编程时要注意,在程序开始时,要写入各中断的入口地址,而且要跳转到中断。

(4)调试时会出现一些自定义的表头无法找到,这时可以尝试将找不到的列表向前移,但其各种参数均不变。

六、设计体会
本学期学习单片机理论知识的时候,对于书本中的知识感到十分的枯燥,但是经历过这次的课程设计,自己亲自动手做东西,运用所学的原理,使我对书本知识的认识更加到位更加深刻,也让我在其中体会到了无限的乐趣,不但激发了我的学习兴趣也增强了我的动手能力,听着自己设计的东西在软件模拟时发出自己设定的音乐声,我感到了前所未有的成就感。

我切切实实感觉到自己学到了东西,并能将其转化到现实生活中来,而不像以前一样感到自己好像就学了一点“虚无缥缈”的理论,坚定了我学习的信心,这次设计是在一个良好的氛围里踏下心来认认做东西,在这一段时间里,周围的很多同学都认真对待这次课程设计,除了自己做好自己的课题外,在遇到不懂的地方互相讨论,互相帮助,查阅资料,互助解决问题。

另外在编程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误。

参考文献
[1] 单片机微型计算机原理及应用张毅坤西安电子科技大学出版社,
[2] 数字电子技术基础阎石高等教育出版社
[3] 单片机技术实验实训教程周越中国水利水电出版社
附录1汇编程序
PUTOUT BIT P2.3 定义输出音响端口
NEXTSONG BIT P3.2 定义中断口LASTSONG BIT P3.3
SNB EQU 40H 存放歌曲序列号 ORG 0000H
LJMP START
ORG 0003H
LJMP ZD0
ORG 000BH
LJMP TIME
ORG 0013H
LJMP ZD1
ORG 0100H
START:SETB P2.3 输出端口预先置位
MOV SNB,#0 从第零首开始
MOV 50H,#0
MOV TMOD,#01H 设定定时器工作方式
SETB EA 开中断并设定中断优先级
SETB ET0
SETB IT0
SETB IT1
SETB EX0
SETB EX1
SETB PX0
SETB PX1
START0: MOV 30H,#0 读取简谱码
NEXT: LCALL SON 扫描歌曲序号存放单元
MOV A,30H
MOVC A,@A+DPTR
MOV R2,A
JZ START0
ANL A,#0FH
MOV R5,A 简谱码的低半字节节拍码送R5 MOV A,R2
SWAP A
ANL A,#0FH 取简谱码高半字节
JNZ SING 若音符为0隔过不唱 CLR TR0
LJMP SING1
SING: DEC A
MOV 60H,A
MOV A,SNB
CJNE A,#0,SHIJIAN
MOV 50H,#2
LJMP JK
SHIJIAN: MOV 50H,#4
JK: MOV A,60H
ADD A,50H
MOV 22H,A
RL A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV TH0,A 读取定时计数值高八位
MOV 21H,A
MOV A,22H
RL A
MOVC A,@A+DPTR 读取定时计数值低八位 MOV TL0,A
MOV 20H,A
SETB TR0
SING1: LCALL DELAY
INC 30H
JMP NEXT
SON: MOV A,SNB 判断歌曲序号并依据序号选定歌曲 SON0: CJNE A,#0,SON1 若是0演唱SONG0
MOV DPTR,#SONG0
RET
SON1: CJNE A,#1,SON2
MOV DPTR,#SONG1
RET
SON2: CJNE A,#2,SON3
MOV DPTR,#SONG2
RET
SON3: CJNE A,#3,SON4
MOV DPTR,#SONG3
SON4: MOV DPTR,#SONG4
RET
ZD0: CLR EX0 中断0控制下一首歌的播放
PUSH ACC
PUSH PSW
LCALL DELAY0
JB NEXTSONG,TO1
K1: MOV A,SNB
INC A
MOV SNB,A
CJNE A,#5,TOE0 若此时播放的是第四首则下一 MOV SNB,#0 首是第零首
TOE0: LCALL DISP 调用显示子程序
MOV 30H,#0
TO1: POP PSW
POP ACC
SETB EX0
RETI
ZD1: CLR EX1 中断1控制上一首歌的播放
PUSH ACC
PUSH PSW
LCALL DELAY0
JB LASTSONG,TO2
K2: MOV A,SNB
DEC A
MOV SNB,A
CJNE A,#0FFH,TOE1 若此时播放的是第零首歌,则 MOV SNB,#4 播放第四首
TOE1: LCALL DISP
MOV 30H,#0
TO2: POP PSW
POP ACC
SETB EX1
RETI
TIME: PUSH ACC 定时中断控制发音符的频率 PUSH PSW
MOV TL0,20H
MOV TH0,21H
CPL PUTOUT 使音响输出口定时翻转以 POP PSW 产生特定频率的方波
POP ACC
RETI
DISP: PUSH DPL 显示子程序
PUSH DPH
MOV A,SNB
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A 显示字符送段码口
MOV P2,#07H 选择一个LED
POP DPH
POP DPL
RET
DELAY0: MOV R6,#200 消抖延时
H2: MOV R1,#250
H1: DJNZ R1,H1
DJNZ R6,H2
RET
DELAY: MOV R7,#2 控制一个音符持续的时间 D2: MOV R4,#155
D3: MOV R3,#248
D1: DJNZ R3,D1
DJNZ R4,D3
DJNZ R7, D2
DJNZ R5,DELAY
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 共阴极LED TABLE1:DW 63628,63835,64021,64103,64260,64400,64524,64580 DW 64684,64777,64820,64898
DW 64968,65030,65058,65110
DW 65157,65178,65217,65252,65282
兰花草
SONG0:DB 42H,82H,82H,82H,86H,72H,63H,71H,62H,52H,48H
DB 0B2H,0B2H,0B2H,0B2H,0B6H,0A2H
DB 83H,0A1H,0A2H,92H,88H,92H,0B2H,0B2H,0A2H,86H,72H DB 63H,71H,62H,52H,44H,12H,02H
DB 12H,62H,62H,52H,46H,82,73H,61H,52H,32H,48H
DB 00H
绿岛小夜曲
SONG4: DB 0A2H,0B2H,0D2H,0B2H,0A4H,0B2H,0D2H
DB 0B2H,0A2H,82H,72H,88H
DB 72H,82H,0A2H,82H,72H,62H,42H,62H
DB 38H,38H
DB 0A4H,02H,0B2H,0A4H,84H
DB 72H,82H,72H,62H,72H,84H,72H
DB 64H,62H,12H,34H,02H,42H
DB 38H,38H
DB 44H,02H,32H,44H,64H
DB 72H,82H,72H,62H,72H,84H,0A2H
DB 72H,74H,82H,0A4H,02H,062H
DB 0A8H,0A8H
DB 0B2H,0B4H,0A2H,84H,82H,72H
DB 62H,72H,82H,0A2H,88H
DB 72H,74H,62H,42H,32H,32H,62H
DB 78H,78H
DB 82H,84H,72H,82H,0A2H,84H
DB 72H,82H,72H,62H,48H
DB 32H,0A2H,82H,0F2H,0A2H,0B2H,82H,72H DB 68H,68H
DB 0B2H,0B2H,0B2H,0A2H,82H,84H,02H
DB 72H,74H,62H,42H,32H,42H,62H
DB 78H,78H
DB 0A2H,0B2H,0A2H,72H,82H,84H,82H
DB 72H,74H,62H,44H,64H
DB 0A8H,0A4H,02H,0A2H
DB 0A2H,0B1H,0A1H,82H,0A2H,0B4H,0B2H,0C2H DB 0A2H,0B2H,0A2H,82H,78H
DB 84H,72H,62H,44H,02H,62H
DB 72H,81H,71H,62H,72H,84H,02H,0A2H
DB 0B4H,02H,82H,74H,82H,72H
DB 68H,68H
DB 00H
两只老虎
SONG1: DB 44H,54H,64H,44H
DB 44H,54H,64H,44H
DB 64H,74H,88H
DB 64H,74H,88H
DB 82H,92H,82H,72H,64H,44H
DB 82H,92H,82H,72H,64H,44H
DB 54H,14H,48H
DB 54H,14H,48H
生日快乐
SONG2:DB 82H,01H,81H,94H,84H
DB 0B4H,0A4H,04H
DB 82H,01H,81H,94H,84H
DB 0C4H,0B4H,04H
DB 82H,01H,81H,0F4H,0D4H DB 0B4H,0A4H,94H,04H
DB 0E2H,01H,0E1H,0D4H,0B4H DB 0C4H,0B4H,04H
DB 00H
新年快乐
SONG3:DB 42H,42H,44H,14H,02H
DB 62H,62H,64H,44H,04H
DB 42H,62H,84H,84H,02H
DB 72H,62H,54H,04H
DB 52H,62H,74H,74H,02H
DB 62H,52H,64H,44H,04H
DB 42H,62H,54H,14H,02H
DB 32H,52H,44H,04H
DB 00H
END。

相关文档
最新文档