新型MP3播放器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简易模拟MP3播放器功能
一.目的:
1.通过学习,尝试编写歌曲简谱,加深对PWM音乐输出控制原理的认识和理解。
2.实验通过7段数码管显示播放曲目,提高对SPI接口的应用能力。
3.通过修改和添加《深入浅出ARM7》中的相关程序,控制歌曲的快进、快退、暂停、
循环播放、停止等实现简易模拟MP3播放器功能,增强对ARM的程序读写能力。
二.仪器:
ARM开发板一块、
装有ADS1.2及EasyJTAG仿真器的电脑一台
三.原理:
1.SPI接口控制7段数码管显示:
(1)SPI数据和时钟的相位关系:
(2)SPI寄存器描述:
①SPI控制寄存器SPCR:
②SPI状态寄存器SPSR:
通过对相关寄存器的读写操作,即可控制主从机的数据传输。
2.PWM控制音乐输出:
(1)两个匹配寄存器可用控制单边沿PWM输出。PWMMR0控制PWM周期速率,另一个匹配寄存器(PWMMR1~PWMMR6)控制PWM边沿的位置。
每个额外的单边沿PWM输出只需要一个匹配寄存器,因为所有PWM输
出的重复速率是相同的。多个单边控制PWM周期的开始,当PWMMR0
发生匹配时,都有一个上升沿。
(2)PWM管脚汇总:
(3)PWM定时器控制寄存器PWMMTCR:
(4)PWM匹配寄存器PWMMR0—PWMMR6:
PWM匹配寄存器值连续与PWM定时器计数TC值比较。当两个值相等时自动触发相应动作(产生中断、复位计数器或停止定时器)。具体执行什么动作油PWMMCR 寄存器控制。
(5)PWM锁存使能寄存器PWMLER:
四.实验程序:
1.实验流程图:
2.实验程序:(见附录)
五.调试结果:
(跳线连接:PWMMR3,4,5,6输出口连接LED1~4; PWMMR1连接BEEP;)
当烧录程序后,数码管先显示0,然后按KEY3或KEY4可播放下一首或上一首歌曲,同时数码管更新显示曲目;放音过程中,按一次KEY5可实现放音暂停,再按KEY5继续放音;放音过程中,按KEY1键可复位播放当前歌曲,并实现重复播放。按KEY2键复位并停止播放音乐。放音过程中LED1~4伴随播放音调明暗变化。
六.调试总结及体会:
通过不断调试,终于实现了简易模拟MP3播放功能,调试过程是自己不断学习进步的过程,从中收获了很多。
通过对课本中关于“虹彩妹妹”音乐编程的分析,以及通过网络学习了相关的音乐简谱常识,掌握了用蜂鸣器实现播放音乐的编程方法。实验中“倩女幽魂”、“沉默是金”、“当年情”都是自己通过歌曲简谱编写的音乐程序。事物都是相互联系的。通过对音乐程序的编写,加深了对用PWM播放音乐原理的认识。
通过反复的调试,对AXD调试环境更加的熟悉,更加熟练了对其基本功能的应用。
同时,提高了ARM编程应用能力。能够对一些基本的错误快速识别,为今后的编程奠定一定基础。
附录:
//跳线连接:PWMMR3,4,5,6输出口连接LED1~4; PWMMR1连接BEEP;
#include "config.h"
#include "music.h"
#define HC595_CS (1 << 29) // P0.29口为74HC595的片选
#define AA 1<<12
// 歌曲曲谱-倩女幽魂
const uint32 HCMM1[] =
{
_LA, _SO, _MI, _MI,
_MI, _RE, _DO, _SO,
_LA, _DO, _LA, _LA,
_DO1, _DO1,_LA, _LA,
_MI,
_DO1,_DO, _1TI, _DO, _1TI,
_1LA,
_DO1, _DO1,_MI,_SO,
_DO,_DO,_LA,
_RE,
_DO1, _DO1,_RE, _RE, _RE,
_FA,
_DO1, _FA, _MI, _FA, _LA,
_MI,_RE, _DO,
_DO1,_FA, _MI, _RE,
_1TI, _1TI, _FA,
_MI, _RE,_DO,
_1LA, _1SO, _1LA, _1LA,
_1LA,
};
// 歌曲节拍
const uint32 HCMM_L1[] =
{
_16, _16,_8, _2d,
_4d, _4, _4, _8,
_16, _16,_8, _2d,
_4, _4,_4d, _8,
_1,
_4,_8, _8, _4d, _8,
_1,
_4, _4,_4, _4,
_4, _2, _4,
_8, _4,_8,_4, _4,
_1,
_4, _4,_8, _4, _8,
_1,
_4, _8, _8, _4, _4,
_4d,_8, _2,
_4d, _8, _4, _4,
_4, _2, _4,
_4d, _8, _2,
_4d, _8,_4, _4,
_1,
};
//歌曲曲谱-虹彩妹妹
const uint32 HCMM2[] =
{
_LA, _LA, _SO, _LA,
_LA, _SO, _MI, _LA, _SO, _MI,
_RE, _RE, _DO, _RE,
_MI, _MI, _SO, _LA, _DO1, _LA, _SO,
_MI, _MI, _SO, _DO,
_MI, _MI, _MI, _MI, _MI,
_1LA,_1LA,_1SO,_1LA,
};
// 歌曲节拍
const uint32 HCMM_L2[] =
{
_4, _8, _8, _4, _8, _8,
_8, _4, _8, _2,
_4, _8, _8, _4, _8, _8,
_8, _4, _8, _2,
_4, _8, _8, _8, _8, _8, _8,
_8, _4, _8, _2,
_4, _4, _4, _8, _8,
_8, _4, _8, _2,
};
//当年情
const uint32 HCMM3[] =
{
_MI, _MI, _RE, _MI, _MI,_RE,
_MI, _SO, _SO, _LA,_SO,_FA, _MI,
_FA, _FA, _MI, _FA,_RE,_DO,
_TI,_LA, _TI,_MI, _RE,
_MI,_MI, _RE, _MI, _MI,_RE,
_MI, _LA,_LA,_TI,_LA, _LA,_RE, _MI,_RE, _DO, _RE, _RE,_MI,_RE, _DO, _1LA,_DO,
_DO,
_MI,_MI,_RE,_MI,_MI,_RE,
_MI,_SO,_SO,_LA,_SO,_SO,_MI,_MI,
_FA,_MI,_MI,_FA,_MI,_DO,
_RE, _DO1,_DO1,
_MI,_MI,_RE,_MI,_MI,_RE,
_MI,_LA,_LA,_TI,_LA,_LA,_RE,_DO,
_RE,_RE,_DO,_MI,_RE,_DO,
_SO, _DO1,_SO, _SO,_FA,
_MI,_MI,_RE,_MI,_MI,_RE,