音乐播放器课程设计报告
音乐播放器课程设计报告

课程设计报告之水城攒孽创作课程设计名称:音乐播放器院系:信息工程学院学生姓名:班级:学号:成绩:指导教师:开课时间:2016-2017学年 2 学期音乐播放器一、实践的内容和要求学习WAV格式音频播放原理、数字音频接口及的相关知识。
了解模拟音频信号和数字音频信号的概念。
掌握编写音频播主要内容放器的方法。
实现音频播放,小键盘输入操纵。
本系统要做一个音乐播放器,使用通用定时器定时,用比较输出功能,输出乐谱频率的方波发生声音,对 3 首歌曲编码,其支持 WAV 格式音频播放(上键:暂停;左键:上一首;右键:下一首)。
利用硬件ARM 嵌入式开发平台、用于ARM7TDMI 的 JTAG 仿真器、PC 机 Pentium100开发实现实现音频播放。
主要实现:上一首按键:当点击上一首按键时,当前播放歌曲的上一首歌首被播放。
下一首按键:当点击下一首按键时,当前播放歌曲的下一首歌曲即被播放。
当点击停止键时,当前歌曲即会被停止。
播放界面设计:在歌曲进行播放时,界面应包含所有的按键,而且要歌曲的曲目单。
二、实践原理WAV播放器系统要求能够对mp3、wav格式的音频文件进行解码,处理起来速度是有要求的,尤其是对320Kbps的MP3格式数据流的处理,必须非常快,才干实现MP3的流畅播放,可供选择的八位机有AVR、PIC,可供选择的32位处理器有SAMSUNG、STM32、ATMEL等。
选择MCU优先考虑于拥有丰富的RAM,八位机RAM主要靠扩展,内部RAM一般在4Kbyte以内,32位机里面,SAMSUNG一般不内带RAM,也要外扩。
本实验使用了ARM7处理器,MP3解码可以有两种方法,一是通过ARM处理器软解码,通过对MP3数据格式的解析实现MP3播放,二是通过外部解码芯片直接解码。
第一种方法在解码高码率的MP3时,ARM7处理能力吃紧,而且STM32还需要外部DAC来做音频输出,所以采取第二种方法进行解码。
MP3罕见的解码芯片有VS100X系列和STA01系列,STA01需要外接DAC做音频输出,而VS1003自带DAC,且解码的文件格式包含mp3和wav,另外它还可以实现录音功能,方便以后进行功能的拓展应用。
音乐播放器Java专业课程设计方案报告

课程设计汇报课程设计题目: java音乐播放器学生姓名:专业: XXXXXXXXXXXXX班级:指导老师:20XX年X月X日一、课程设计目标1.编程设计音乐播放软件, 使之实现音乐播放功效。
2.培养学生用程序处理实际问题能力和爱好。
3.加深java中对多媒体编程应用。
二、课程设计要求利用学到编程知识和编程技巧, 要求学生:1.系统设计要能完成题目所要求功效, 设计软件能够进行简单播放及其它基础功效。
2、编程简练, 可用, 尽可能使系统功效愈加完善和全方面3.说明书、步骤图要清楚。
三、课程设计内容1.课程设计题目及介绍音乐播放软件要求:有图形界面, 能播放MP3歌曲, 有播放列表, 前一首、后一首等常见播放软件功效。
2.设计说明关键利用多媒体编程、图形界面、数组及循环进行设计, 从而实现简单音乐播放。
public MyMusicPlayer(): 实现窗口组员方法publi c void run(): 实现改变歌曲播放状态组员方法public AudioClip loadSound(String filename): 实现对声音加载public void mouseClicked(MouseEvent e): 实现对按钮监听public void itemStateChanged(ItemEvent arg0): 返回一个AudioClip对象3.程序步骤图4.程序清单import java.awt.*;import javax.swing.*; import java.applet.*; import java.awt.event.*; import .*;public class MyMusicPlayer extends Thread implements MouseListener,ItemListener{JFrame MainFrame=new JFrame("MyMusicPlayer"); //定义主窗体JLabel songname=new JLabel(); //用标签显示状态JButton last=new JButton();JButton play=new JButton();JButton next=new JButton();JButton loop=new JButton(); //定义上一曲,播放,下一曲,循环四个按钮JLabel list=new JLabel("播放列表");List songlist=new List(); //显示歌曲列表AudioClip[] song=new AudioClip[10]; //将音频文件放在数组中AudioClip playsong; //目前选定播放音频文件String[] name={"黄小琥 - 顺其自然.wav","陈奕迅-张氏情歌.wav","黄小琥 _没那么简单.wav","戚薇-假如爱忘了.wav","郭采洁 - 狠狠哭.wav","test.wav"};//将全部文件名存放在字符串数组name中String playname; //目前选定播放音频名int j=0; //统计目前选定播放是哪首歌曲, 默认为第一首boolean playbutton=true; //统计播放状态, 默认为暂停播放boolean loopbutton=false; //统计循环状态, 默认为没有循环Thread thread=new Thread("pl");static MyMusicPlayer Yu;public MyMusicPlayer(){MainFrame.setLayout(null);MainFrame.setBounds(300,50,310,500);MainFrame.setVisible(true);MainFrame.setDefaultCloseOperation(3);MainFrame.add(songname);Font sname=new Font("斜体",Font.ITALIC,18);songname.setFont(sname); //设置显示状态字体为斜体songname.setText("我音乐播放器");songname.setBounds(10,10,300,40);last.setBounds(10,70,50,40);play.setBounds(70,70,50,40); //设置四个功效键位置和大小next.setBounds(130,70,50,40);loop.setBounds(190,70,50,40);last.setIcon(new ImageIcon("1.png"));play.setIcon(new ImageIcon("2.png"));next.setIcon(new ImageIcon("3.png"));loop.setIcon(new ImageIcon("4.png")); //设置四个功效键图片last.addMouseListener(this);play.addMouseListener(this);next.addMouseListener(this);loop.addMouseListener(this); //添加按键鼠标监听器MainFrame.add(last);MainFrame.add(play);MainFrame.add(next);MainFrame.add(loop);list.setBounds(10,120,100,30);Font lis=new Font("宋",Font.BOLD,15);list.setFont(lis); //显示“播放列表”MainFrame.add(list);songlist.setBounds(10,150,250,300);songlist.setBackground(Color.GREEN); //设置播放列表背景色为绿色songlist.setVisible(true);songlist.addItemListener((ItemListener) this); //添加列表监听器MainFrame.add(songlist);for(int i=0;i<name.length;i++){song[i]=loadSound(name[i]); //逐一获取音频文件songlist.add(name[i]); //将歌曲名添加到播放列表}playsong=song[0];}public static void main(String[] args){Yu=new MyMusicPlayer();Yu.start();}public void mouseClicked(MouseEvent e) {JButton btn=(JButton)e.getSource();playsong.stop();if(btn==play){ if(playbutton==false)playbutton=true;elseplaybutton=false; //当按下play后改变播放状态}elseif(btn==last){ j-=1; //当按下last 后将上一曲选定if(j<0)j=name.length-1; //若之前选定为第一首, 则跳到最终一首playbutton=true;loopbutton=false;}elseif(btn==next){ j+=1; //当按下next后将下一曲选定if(j>=name.length)j=0; //若之前选定为最终一首, 则跳到第一首playbutton=true;loopbutton=false;}elseif(btn==loop){ if(loopbutton==false){loopbutton=true;playbutton=true;}else{ //按下loop 后, 改变循环状态和播放状态loopbutton=false;playbutton=false;}}if(playbutton==true)Yu.run();else{songname.setText("暂停播放: "+playname); //暂停播放歌曲play.setIcon(new ImageIcon("2.png"));}}public void mouseEntered(MouseEvent arg0) {// TODO Auto-generated method stub}public void mouseExited(MouseEvent arg0) {// TODO Auto-generated method stub}public void mousePressed(MouseEvent arg0) { // TODO Auto-generated method stub}public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub}public void itemStateChanged(ItemEvent arg0) { String str=songlist.getSelectedItem();playsong.stop();for(int i=0;i<name.length;i++)if(str==name[i]){j=i;break;}Yu.run();}public void run(){playsong=song[j]; //播放状态为播放时playsong.play(); //播放选定歌曲playname=name[j];if(loopbutton==true){playsong.loop(); //循环播放选定歌曲songname.setText("循环播放: "+playname);}elsesongname.setText("正在播放: "+playname);songlist.select(j); //播放列表中选定播放歌曲项目play.setIcon(new ImageIcon("5.png"));}public AudioClip loadSound(String filename){ //返回一个AudioClip对象URL url=null;try{url=new URL("file:"+filename);}catch(MalformedURLException e){ }return Applet.newAudioClip(url);}}5.程序运行结果四、课程设计总结经过这几天Java课程设计, 让我知道了做课程设计通常方法, 经过多种努力最终完成了设计要求.这次课程设计基础上含盖了大学十二个月学习到Java语言知识点, 课设题目要求不仅要求对书本知识有较深刻了解, 同时要求程序设计者有较强思维和动手能力。
c音乐播放器课程设计

c 音乐播放器课程设计一、课程目标知识目标:1. 学生理解音乐播放器的基本原理,掌握与其相关的电子元件功能;2. 学生掌握音乐播放器编程的基础知识,能够运用所学编程语言实现音乐播放功能;3. 学生了解音乐播放器在生活中的应用,认识不同类型的音乐播放器。
技能目标:1. 学生能够运用所学知识,设计并制作一个简易的音乐播放器;2. 学生能够通过编程解决音乐播放过程中遇到的问题,如播放、暂停、切换歌曲等;3. 学生能够进行团队协作,共同完成音乐播放器的设计与制作。
情感态度价值观目标:1. 学生培养对音乐的热爱,提高音乐审美能力;2. 学生通过实践操作,培养动手能力、创新意识和解决问题的能力;3. 学生在团队协作中,学会相互尊重、沟通与协作,培养集体荣誉感。
课程性质:本课程为实践性课程,结合课本知识,以学生动手操作为主,培养学生实际操作能力和创新能力。
学生特点:本年级学生具备一定的电子元件知识和编程基础,对新鲜事物充满好奇心,喜欢动手实践。
教学要求:教师应注重引导学生运用所学知识解决实际问题,关注学生的个体差异,鼓励学生创新思维,培养学生团队协作能力。
在教学过程中,将课程目标分解为具体的学习成果,以便进行有效的教学设计和评估。
二、教学内容1. 音乐播放器原理:介绍音乐播放器的基本工作原理,包括音频信号处理、放大电路、扬声器等组成部分。
相关教材章节:第三章“音频信号处理”及第四章“放大电路与扬声器”2. 编程知识:运用课本所学编程语言,如C语言,实现音乐播放器的控制程序。
相关教材章节:第五章“C语言基础”及第七章“C语言编程实例”3. 音乐播放器设计制作:结合电子元件知识与编程技能,设计并制作一个简易的音乐播放器。
相关教材章节:第八章“电子制作实践”及第十章“综合项目设计与制作”4. 实践操作:分组进行音乐播放器的设计与制作,包括硬件连接、编程调试等环节。
相关教材章节:第十一章“实践操作与团队协作”教学内容安排与进度:第一课时:回顾音频信号处理、放大电路及扬声器等基础知识,明确音乐播放器工作原理。
音乐播放器课程设计

音乐播放器课程设计一、课程目标知识目标:1. 学生能够理解音乐播放器的基本原理和功能。
2. 学生掌握音乐播放器界面设计的基本元素和布局。
3. 学生了解音乐播放器中不同音乐格式及其特点。
技能目标:1. 学生能够使用音乐播放器软件进行音乐播放、暂停、停止等基本操作。
2. 学生能够通过音乐播放器软件对音乐进行分类、排序和搜索。
3. 学生能够运用所学知识设计和制作简单的音乐播放器界面。
情感态度价值观目标:1. 培养学生对音乐的热爱和欣赏能力,提高审美情趣。
2. 培养学生团队协作和沟通能力,学会分享和交流音乐心得。
3. 增强学生对科技产品的认识,激发创新意识和探索精神。
课程性质:本课程为信息技术与音乐相结合的综合性课程,注重实践操作和实际应用。
学生特点:六年级学生具有一定的信息技术基础和音乐素养,对新事物充满好奇,喜欢动手实践。
教学要求:结合学生特点,采用任务驱动法,引导学生自主探究和合作学习,注重理论与实践相结合,提高学生的实际操作能力和创新能力。
通过本课程的学习,使学生能够将所学知识应用于实际生活,提升音乐欣赏和信息技术素养。
二、教学内容1. 音乐播放器原理与功能- 了解音乐播放器的基本构成和原理- 掌握音乐播放器的主要功能及操作方法2. 音乐播放器界面设计- 学习音乐播放器界面设计的基本原则- 分析并模仿经典音乐播放器界面布局3. 音乐格式及特点- 介绍常见音乐格式(如MP3、WAV等)及其特点- 了解音乐格式对播放效果和文件大小的影响4. 音乐播放器操作与使用- 学习使用音乐播放器软件进行基本操作(播放、暂停、停止等)- 掌握音乐播放器的高级功能(如音乐分类、排序、搜索等)5. 设计制作音乐播放器界面- 学习运用设计软件制作音乐播放器界面- 结合团队协作,设计并展示个性化的音乐播放器界面教学大纲安排:第一课时:音乐播放器原理与功能第二课时:音乐播放器界面设计第三课时:音乐格式及特点第四课时:音乐播放器操作与使用第五课时:设计制作音乐播放器界面教学内容关联教材章节:《信息技术》六年级上册:第五章 多媒体技术应用,第三节 音乐播放器原理与使用。
音乐播放器课程设计报告

课程设计报告课程名称PLD原理与应用设计题目音乐播放器专业通信工程四位抢答器摘要随着我国经济和文化事业的发展,在这个竞争激烈的社会中,知识竞赛、评选优胜,选拔人才之类的活动愈加频繁。
在很多竞争场要求有快速公正的竞争裁决,例如:证劵、股票交易及各种智力竞赛等。
在现代社会生活中,智力竞赛更是作为一种生动活泼的教育形式和方法能够引起观众极大的兴趣。
但是、在竞赛中往往是多个选手一起,分为几个小组参加比赛,针对主持人提出的问题各竞赛小组进行抢答,而抢答环节就要有一种逻辑电路抢答器作为裁判员功能、实现其比赛公平、公正的规则。
智能抢答器是一种应用十分广泛的设备,在各种竞赛、抢答场合中,它都能客观、迅速地判别出最先获得发言权的选手。
新增了许多功能,如选手号码显示,抢按后的计时,选手得分显示等功能。
随着科技的发展,现在的抢答器向着数字化、智能化的方向发展.本设计借助于QuartusⅡ软件仿真制作了四人抢答器。
通过选手按动按键的先后,判定由哪位选手回答问题,并且实现倒计时和对选手加分的功能。
本设计分为三个模块:控制模块、计时模块、计分模块,各个模块共同作用,以实现整个设计的总体功能。
关键词:QuartusⅡ,仿真,抢答器,控制模块,计时模块,计分模块Four-way responderABSTRACTWith the development of China's economic and cultural undertakings, in this competitive society, knowledge contests, selection of superior, talents such as activities more and more frequent. In many competitive games require fast fair competition award. In the modern society life, quiz is as a kind of lively education form and the method can cause the audience interest. But, in the competition is often several players together, divided into several groups to participate in the game, against the host question carries on the competition team vies to answer first, vies to answer first link will have a logic circuit buzzer as referee function, achieve the game rules of fairness and justice.Smart responder is a kind of equipment, they are widely used in various competitions, vies to answer first, it can be objective, quickly won the voice discriminant out first. Added many features, such as the contestant number display, rob after pressing time, players score shows, and other functions. With the development of science and technology, now the responder toward digital, intelligent direction.This design with the aid of Quartus Ⅱsoftware simulation produced four responder. Through the player has to press a button, decide which players to answer the question, and can realize the function of the countdown and the player points. This design is divided into three modules: control module, timing module, scoring module, each module combination, to achieve the over all function of the whole design.KEY WORDS: QuartusⅡ,Simulation ,Answer four device,Control,Timing,Scoring目录前言 (1)第1章绪论 (2)1.1 抢答器系统图 (2)1.2 抢答器设计要求 (2)1.3 基本功能 (3)第2章模块设计 (4)2.1 主控制模块 (4)2.1.1 主要功能 (4)2.1.2 代码编写 (4)2.1.3 仿真波形及其分析 (6)2.2计时模块 (7)2.2.1 主要功能 (7)2.2.2 代码编写 (7)2.2.3 仿真波形及其分析 (8)2.3 计分模块 (9)2.3.1 主要功能 (9)2.3.2 代码编写 (9)2.3.3 仿真波形及其分析 (12)第3章顶层电路 (13)3.1 电路图 (13)3.2 抢答器工作原理 (14)3.2.1 各个端口的含义 (14)3.2.2 操作流程及相应波形图 (14)结论 (16)谢辞 (17)参考文献 (18)前言关于这次设计的用于多人竞赛抢答的器件,在现实生活中很常见,尤其是在随着各种智益电视节目的不断发展,越来越多的竞赛抢答器被用在了其中,这种抢答器的好处是不仅能够锻炼参赛选手的反应能力,而且能增加节目现场的紧张、活跃气氛,让观众看得更有情趣。
MP3音乐播放器软件课程设计报告(MFC)

课程设计说明书课程设计名称:软件综合课程设计课程设计题目:音频播放器程序的设计与实现学院名称:信息工程学院电子信息工程专业课程设计任务书正文:目录引言 (5)一、设计程序的目的与要求 (6)目的 (6)要求 (6)二、方案实现与调试 (6)总体设计 (6)1、实现功能 (6)2、功能模块图 (7)详细设计 (7)1、界面布局 (7)2、各模块功能设计 (8)2.1处理“打开”按钮 (9)2.2处理“播放”按钮 (9)2.3处理“暂停”按钮 (9)2.4处理“停止”按钮 (9)2.5处理“音量”按钮 (10)2.6处理“退出”按钮 (10)3 操作步骤 (10)三、课程设计分析与总结 (11)分析 (11)总结 (11)附录 (13)关键程序清单 (13)参考文献 (20)引言MP3播放器的设计是利用MFC应用程序、媒体控制接口MIC 的基本知识而设计的。
1.1 MFC简介MFC是Visual C++是核心。
MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFC AppWizard 向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。
每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。
这些函数,必须通过类定义对象才能使用[1]。
1.2 MCI简介MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。
它所支持的媒体格式包括mp3、avi、wav、mpeg等等[2]。
音频技术发展较早,几年前一些技术已经成熟并产品化,音频技术主要包括四个方面:音频数字化、语音处理、语音合成及语音识别。
dsp课程设计音乐播放器

dsp课程设计音乐播放器一、课程目标知识目标:1. 学生能够理解数字信号处理(DSP)的基本概念,掌握音乐播放器中DSP 技术的应用原理。
2. 学生能够掌握音乐播放器中音频信号的采样、量化、编码等基本知识。
3. 学生能够了解不同音频格式对音乐播放效果的影响,并学会选择合适的音频格式。
技能目标:1. 学生能够运用所学知识,设计并实现一个简单的音乐播放器。
2. 学生能够熟练使用相关软件工具进行音频信号的处理和分析。
3. 学生能够通过编程实现音乐播放器的功能,如播放、暂停、停止等。
情感态度价值观目标:1. 培养学生对数字信号处理技术的兴趣,激发他们探索科学技术的热情。
2. 培养学生的团队协作意识和创新精神,使他们能够在项目实践中相互学习、共同进步。
3. 培养学生关注音乐播放器在实际生活中的应用,提高他们将所学知识应用于解决实际问题的能力。
课程性质:本课程为实践性较强的学科,以项目为导向,注重培养学生的动手能力和创新能力。
学生特点:学生具备一定的编程基础,对音乐播放器有一定的了解,但对DSP技术及其在音乐播放器中的应用尚不熟悉。
教学要求:教师应结合学生特点,采用理论教学与实践操作相结合的方式,引导学生主动探索、积极实践,确保课程目标的达成。
同时,注重分解课程目标为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 数字信号处理基础理论:- 介绍数字信号处理的基本概念,如采样、量化、编码等。
- 分析音乐播放器中音频信号的处理流程。
2. 音乐播放器原理与设计:- 讲解音乐播放器的基本工作原理,如播放、暂停、停止等功能实现。
- 引导学生了解不同音频格式及其特点,选择合适的音频格式。
3. 音频信号处理技术:- 介绍音频信号处理的相关算法,如数字滤波器、音量调节等。
- 指导学生运用相关软件工具进行音频信号的处理和分析。
4. 编程实践:- 制定详细的编程实践计划,分解音乐播放器的设计任务。
- 引导学生使用编程语言,如C/C++、Python等,实现音乐播放器的功能。
基于java的音乐播放器课程设计报告

基于java的音乐播放器课程设计报告第一篇:基于java的音乐播放器课程设计报告Java课程设计报告题目:java音乐播放器姓名学号院系班级专业任课教师1.设计内容及要求能够实现简单的音乐播放器功能,如:打开本地文件,播放,暂停,停止,背景播放,单曲循环等等,界面充实,交互友好,可以添加多首歌曲目录一个简单的基于java语言的音乐播放器,菜单栏:文件,播放控制和播放列表,文件菜单包含打开、循环和退出三个菜单项;播放控制菜单包含播放、暂停和停止三个菜单项,播放列表菜单则是当向里面添加歌曲之后才能够查看到里面所包含的歌曲目录。
当播放歌曲时,可以调节音量大小或者设置是否静音;可以查看当前播放音乐的相关属性,如:歌曲名,歌手,发布时间,所属专辑等等。
2.需求分析1、时间跟踪条:根据歌曲播放的进度,控制条自动进行追踪,用户可以随时了解歌曲的播放进度2、音量控制键:可以点击该控键进行音量大小的调节以及是否静音的设置3、属性查询键:通过该控键,用户可以查看当前播放音乐的相属性,获取关于该歌曲的用户所需的相关信息。
4、菜单栏:①文件:打开:用户通过该菜单项打开本地音乐文件,听任何用户想听的歌曲循环:通过循环设置,用户可以重复的播放一首喜欢的歌曲退出:退出音乐播放器,及退出该程序②播放控制:播放:选择歌曲之后,通过点击播放菜单项启动播放器播放音乐暂停:暂停当前正在播放的音乐停止:停止当前正在播放的音乐③播放列表:当用户通过文件打开本地音乐文件后,及相当于在播放列表里面添加了歌曲,及形成相应的歌曲播放目录3.总体设计结合需求分析来看,整个设计包含了简单的菜单栏,根据用户需求设置了三个简单的实现基本操作的菜单,分别是:文件,播放控制,播放列表;根据具体的操作每个菜单还包含了相应的菜单项,文件:打开,循环,退出;播放控制:播放,暂停,停止;播放列表则没有菜单项,该菜单就是用来显示或者查看相应的歌曲目录的。
该音乐播放器设置了两个窗口,运行程序时打开的初始化欢迎界面,用户可以根据自己的需求进行菜单栏里面的基本操作和相应的设置,当用户添加或者打开音乐播放文件的时候,程序将会显示出第二个音乐文件播放窗口,与此同时,第一个初始化窗口将会自动隐藏,在音乐播放窗口里面用户可以进行相关的音乐播放的控制操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告课程设计名称:音乐播放器院系:信息工程学院学生姓名:班级:学号:成绩:指导教师:开课时间:2016-2017 学年2 学期音乐播放器一、实践的内容和要求1.1实验内容学习WAV格式音频播放原理、数字音频接口及的相关知识。
了解模拟音频信号和数字音频信号的概念。
掌握编写音频播主要内容放器的方法。
实现音频播放,小键盘输入操作。
1.2实验要求本系统要做一个音乐播放器,使用通用定时器定时,用比较输出功能,输出乐谱频率的方波产生声音,对3 首歌曲编码,其支持WAV 格式音频播放(上键:暂停;左键:上一首;右键:下一首)。
利用硬件ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100开发实现实现音频播放。
主要实现:上一首按键:当点击上一首按键时,当前播放歌曲的上一首歌首被播放。
下一首按键:当点击下一首按键时,当前播放歌曲的下一首歌曲即被播放。
当点击停止键时,当前歌曲即会被停止。
播放界面设计:在歌曲进行播放时,界面应包含所有的按键,并且要歌曲的曲目单。
二、实践原理WAV播放器系统要求能够对mp3、wav格式的音频文件进行解码,处理起来速度是有要求的,尤其是对320Kbps的MP3格式数据流的处理,必须非常快,才能实现MP3的流畅播放,可供选择的八位机有AVR、PIC,可供选择的32位处理器有SAMSUNG、STM32、ATMEL等。
选择MCU优先考虑于拥有丰富的RAM,八位机RAM主要靠扩展,内部RAM一般在4Kbyte以内,32位机里面,SAMSUNG一般不内带RAM,也要外扩。
本实验使用了ARM7处理器,MP3解码可以有两种方法,一是通过ARM处理器软解码,通过对MP3数据格式的解析实现MP3播放,二是通过外部解码芯片直接解码。
第一种方法在解码高码率的MP3时,ARM7处理能力吃紧,而且STM32还需要外部DAC来做音频输出,所以采用第二种方法进行解码。
MP3常见的解码芯片有VS100X系列和STA01系列,STA01需要外接DAC做音频输出,而VS1003自带DAC,且解码的文件格式包含mp3和wav,另外它还可以实现录音功能,方便以后进行功能的拓展应用。
三、实践步骤3.1功能设计开机后,先初始化各外设,然后检测字库文件夹是否存在,如果有问题,则提示Error,如果检测无问题,则开始循环播放SD卡内MUSIC 文件夹里面的歌曲,在TFTLCD 上显示歌曲名字、播放时间、歌曲总时间、歌曲数目、当前歌曲的编号等信息。
KEY0选择下一首,KEY2 选择上一首,KEY_UP 控制暂停/继续播放。
3.2实验步骤1)初始化WM8978,这个过程包括软复位、DAC 设置、输出设置和音量设置等。
2)初始化I2S,此过程主要设置SPI_I2SCFGR 寄存器,设置I2S 模式、I2S 标准、时钟空闲电平和数据帧长等,最后开启I2S TX DMA,使能I2S 外设。
在库函数中初始化I2S 调用的函数为:void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef*I2S_InitStruct); 结构体I2S_InitTypeDef 的定义为:typedef struct{ uint16_t I2S_Mode;uint16_t I2S_Standard;uint16_t I2S_DataFormat;uint16_t I2S_MCLKOutput;uint32_t I2S_AudioFreq;uint16_t I2S_CPOL; }I2S_InitTypeDef;第一个参数用来设置I2S 的模式,也就是设置SPI_I2SCFGR 寄存器的I2SCFG 相关位。
可以配置为主模式发送I2S_Mode_MasterTx,主模式接受I2S_Mode_MasterRx,从模式发送I2S_Mode_SlaveTx 以及从模式接受I2S_Mode_SlaveRx 四种模式。
第二个参数I2S_Standard 用来设置I2S 标准,这个前面已经讲解过。
可以设置为:飞利浦标准I2S_Standard_Phillips,MSB 对齐标准I2S_Standard_MSB,LSB 对齐标准I2S_Standard_LSB 以及PCM 标准I2S_Standard_PCMShort。
第三个参数I2S_DataFormat 用来设置I2S 的数据通信格式。
这里实际包含设置SPI_I2SCFGR 寄存器的HCLEN 位(通道长度)以及DATLEN 位(传输的数据长度)。
当我们设置为16 位标准格式I2S_DataFormat_16b 的时候,实际上传输的数据长度为16 位,通道长度为16 位。
当我们设置为其他值的时候,通道长度都为32 位。
第四个参数I2S_MCLKOutput 用来设置是否使能主时钟输出。
我们实验会使能主时钟输出。
第五个参数I2S_AudioFreq 用来设置I2S频率。
实际根据输入的频率值,会来计算SPI 预分频寄存器SPI_I2SPR 的预分频奇数因子以及I2S 线性预分频器的值。
这里支持10 中频率:#define I2S_AudioFreq_192k ((uint32_t)192000)#define I2S_AudioFreq_96k ((uint32_t)96000)#define I2S_AudioFreq_48k ((uint32_t)48000)#define I2S_AudioFreq_44k ((uint32_t)44100)#define I2S_AudioFreq_32k ((uint32_t)32000)#define I2S_AudioFreq_22k ((uint32_t)22050)#define I2S_AudioFreq_16k ((uint32_t)16000)#define I2S_AudioFreq_11k ((uint32_t)11025)#define I2S_AudioFreq_8k ((uint32_t)8000)#define I2S_AudioFreq_Default ((uint32_t)2)第六个参数I2S_CPOL 用来设置空闲状态时钟电平,取值为高电平I2S_CPOL_High 以及低电平I2S_CPOL_Low。
3)解析WAV 文件,获取音频信号采样率和位数并设置I2S 时钟分频器这里,要先解析WAV 文件,取得音频信号的采样率(fs)和位数(16 位或32 位),根据这两个参数,来设置I2S 的时钟分频,这里我们用前面介绍的查表法来设置即可。
这是我们单独写了一个设置频率的函数为I2S2_SampleRate_Set。
4)设置DMA I2S 播放音频的时候,一般都是通过DMA 来传输数据的,所以必须配置DMA,本章我们用I2S2,其TX是使用的DMA1 数据流4 的通道0 来传输的。
并且STM32F4 的DMA 具有双缓冲机制,这样可以提高效率,大大方便了我们的数据传输,本章将DMA1 数据流4 设置为:双缓冲循环模式,外设和存储器都是16 位宽,并开启DMA 传输完成中断(方便填充数据)。
5)编写DMA 传输完成中断服务函数为了方便填充音频数据,我们使用DMA 传输完成中断,每当一个缓冲数据发送完后,硬件自动切换为下一个缓冲,同时进入中断服务函数,填充数据到发送完的这个缓冲。
6)开启DMA 传输,填充数据最后,我们就只需要开启DMA 传输,然后及时填充WAV 数据到DMA 的两个缓存区即可。
此时,就可以在WM8978 的耳机和喇叭通道听到所播放音乐了。
操作方法为:DMA_Cmd(DMA1_Stream4,ENABLE);//开启DMA TX 传输,开始播放。
3.3流程图3.4关键代码I2s.c代码:#include "i2s.h"#include "usart.h"void I2S2_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16I2S_DataFormat)I2S_InitTypeDef I2S_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); //复位SPI2RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//结束复位I2S_InitStructure.I2S_Mode=I2S_Mode;//IIS模式I2S_InitStructure.I2S_Standard=I2S_Standard;//IIS标准I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;//IIS数据长度I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;//主时钟输出禁止I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Default;//IIS频率设置I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;//空闲状态时钟电平I2S_Init(SPI2,&I2S_InitStructure);//初始化IISSPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);//SPI2 TX DMA请求使能.I2S_Cmd(SPI2,ENABLE);//SPI2 I2S EN使能.//采样率计算公式:Fs=I2SxCLK/[256*(2*I2SDIV+ODD)]//I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR//一般HSE=8Mhz//pllm:在Sys_Clock_Set设置的时候确定,一般是8//PLLI2SN:一般是192~432//PLLI2SR:2~7//I2SDIV:2~255//ODD:0/1//I2S分频系数表pllm=8,HSE=8Mhz,即vco输入频率为1Mhz //表格式:采样率/10,PLLI2SN,PLLI2SR,I2SDIV,ODDconst u16 I2S_PSC_TBL[][5]={{800 ,256,5,12,1}, //8Khz采样率{1102,429,4,19,0}, //11.025Khz采样率{1600,213,2,13,0}, //16Khz采样率{2205,429,4, 9,1}, //22.05Khz采样率{3200,213,2, 6,1}, //32Khz采样率{4410,271,2, 6,0}, //44.1Khz采样率{4800,258,3, 3,1}, //48Khz采样率{8820,316,2, 3,1}, //88.2Khz采样率{9600,344,2, 3,1}, //96Khz采样率{17640,361,2,2,0}, //176.4Khz采样率{19200,393,2,2,0}, //192Khz采样率};//设置IIS的采样率(MCKEN)//samplerate:采样率,单位:Hz//返回值:0,设置成功;1,无法设置.u8 I2S2_SampleRate_Set(u32 samplerate) {u8 i=0;u32 tempreg=0;samplerate/=10;//缩小10倍for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//看看改采样率是否可以支持{if(samplerate==I2S_PSC_TBL[i][0])break;}RCC_PLLI2SCmd(DISABLE);//先关闭PLLI2Sif(i==(sizeof(I2S_PSC_TBL)/10))return 1;//搜遍了也找不到RCC_PLLI2SConfig((u32)I2S_PSC_TBL[i][1],(u32)I2S_PSC_TBL[i][2]);//设置I2SxCLK的频率(x=2) 设置PLLI2SN PLLI2SRRCC->CR|=1<<26; //开启I2S时钟while((RCC->CR&1<<27)==0); //等待I2S时钟开启成功.tempreg=I2S_PSC_TBL[i][3]<<0; //设置I2SDIVtempreg|=I2S_PSC_TBL[i][4]<<8; //设置ODD位tempreg|=1<<9; //使能MCKOE位,输出MCKSPI2->I2SPR=tempreg; //设置I2SPR寄存器return 0;}//I2S2 TX DMA配置//设置为双缓冲模式,并开启DMA传输完成中断//buf0:M0AR地址.//buf1:M1AR地址.//num:每次传输数据量void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num){NVIC_InitTypeDef NVIC_InitStructure;DMA_InitTypeDef DMA_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能DMA_DeInit(DMA1_Stream4);while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){}//等待DMA1_Stream1可配置/* 配置DMA Stream */DMA_InitStructure.DMA_Channel = DMA_Channel_0; //通道0 SPI2_TX通道DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;//外设地址为:(u32)&SPI2->DRDMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;//DMA 存储器0地址DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式DMA_InitStructure.DMA_BufferSize = num;//数据传输量DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_HalfWord;//外设数据长度:16位DMA_InitStructure.DMA_MemoryDataSize =DMA_MemoryDataSize_HalfWord;//存储器数据长度:16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //不使用FIFO模式DMA_InitStructure.DMA_FIFOThreshold =DMA_FIFOThreshold_1QuarterFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//外设突发单次传输DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//存储器突发单次传输DMA_Init(DMA1_Stream4, &DMA_InitStructure);//初始化DMA StreamDMA_DoubleBufferModeConfig(DMA1_Stream4,(u32)buf1,DMA_Memory_ 0);//双缓冲模式配置DMA_DoubleBufferModeCmd(DMA1_Stream4,ENABLE);//双缓冲模式开启DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);//开启传输完成中断NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道NVIC_Init(&NVIC_InitStructure);//配置}//I2S DMA回调函数指针void (*i2s_tx_callback)(void); //TX回调函数//DMA1_Stream4中断服务函数void DMA1_Stream4_IRQHandler(void){if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4)==SET)////DMA1_Stre am4,传输完成标志{DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);i2s_tx_callback(); //执行回调函数,读取数据等操作在这里面处理}}//I2S开始播放void I2S_Play_Start(void){DMA_Cmd(DMA1_Stream4,ENABLE);//开启DMA TX传输,开始播放}//关闭I2S播放void I2S_Play_Stop(void){DMA_Cmd(DMA1_Stream4,DISABLE);//关闭DMA,结束播放}wm8978代码:#include "wm8978.h"#include "myiic.h"#include "delay.h"static u16 WM8978_REGVAL_TBL[58]={0X0000,0X0000,0X0000,0X0000,0X0050,0X0000,0X0140,0X0000, 0X0000,0X0000,0X0000,0X00FF,0X00FF,0X0000,0X0100,0X00FF, 0X00FF,0X0000,0X012C,0X002C,0X002C,0X002C,0X002C,0X0000, 0X0032,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000, 0X0038,0X000B,0X0032,0X0000,0X0008,0X000C,0X0093,0X00E9, 0X0000,0X0000,0X0000,0X0000,0X0003,0X0010,0X0010,0X0100, 0X0100,0X0002,0X0001,0X0001,0X0039,0X0039,0X0039,0X0039, 0X0001,0X0001};//WM8978初始化//返回值:0,初始化正常// 其他,错误代码u8 WM8978_Init(void){u8 res;GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GP IOC, ENABLE); //使能外设GPIOB,GPIOC时//PB12/13 复用功能输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化//PC2/PC3/PC6复用功能输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2); //PB12,AF5 I2S_LRCKGPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB13,AF5 I2S_SCLKGPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2); //PC3 ,AF5 I2S_DACDATAGPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_SPI2); //PC6 ,AF5 I2S_MCKGPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF6_SPI2); //PC2 ,AF6 I2S_ADCDATA I2S2ext_SD是AF6!!!IIC_Init();//初始化IIC接口res=WM8978_Write_Reg(0,0); //软复位WM8978if(res)return 1; //发送指令失败,WM8978异常//以下为通用设置WM8978_Write_Reg(1,0X1B); //R1,MICEN设置为1(MIC使能),BIASEN设置为1(模拟器工作),VMIDSEL[1:0]设置为:11(5K)WM8978_Write_Reg(2,0X1B0); //R2,ROUT1,LOUT1输出使能(耳机可以工作),BOOSTENR,BOOSTENL使能WM8978_Write_Reg(3,0X6C); //R3,LOUT2,ROUT2输出使能(喇叭工作),RMIX,LMIX使能WM8978_Write_Reg(6,0); //R6,MCLK由外部提供WM8978_Write_Reg(43,1<<4); //R43,INVROUT2反向,驱动喇叭WM8978_Write_Reg(47,1<<8); //R47设置,PGABOOSTL,左通道MIC获得20倍增益WM8978_Write_Reg(48,1<<8); //R48设置,PGABOOSTR,右通道MIC获得20倍增益WM8978_Write_Reg(49,1<<1); //R49,TSDEN,开启过热保护WM8978_Write_Reg(10,1<<3); //R10,SOFTMUTE关闭,128x采样,最佳SNRWM8978_Write_Reg(14,1<<3); //R14,ADC 128x采样率return 0;}//WM8978写寄存器//reg:寄存器地址//val:要写入寄存器的值//返回值:0,成功;// 其他,错误代码u8 WM8978_Write_Reg(u8 reg,u16 val){IIC_Start();IIC_Send_Byte((WM8978_ADDR<<1)|0);//发送器件地址+写命令if(IIC_Wait_Ack())return 1; //等待应答(成功?/失败?)IIC_Send_Byte((reg<<1)|((val>>8)&0X01));//写寄存器地址+数据的最高位if(IIC_Wait_Ack())return 2; //等待应答(成功?/失败?)IIC_Send_Byte(val&0XFF); //发送数据if(IIC_Wait_Ack())return 3; //等待应答(成功?/失败?) IIC_Stop();WM8978_REGVAL_TBL[reg]=val; //保存寄存器值到本地return 0;}//WM8978读寄存器//就是读取本地寄存器值缓冲区内的对应值//reg:寄存器地址//返回值:寄存器值u16 WM8978_Read_Reg(u8 reg){return WM8978_REGVAL_TBL[reg];}//WM8978 DAC/ADC配置//adcen:adc使能(1)/关闭(0)//dacen:dac使能(1)/关闭(0)void WM8978_ADDA_Cfg(u8 dacen,u8 adcen){u16 regval;regval=WM8978_Read_Reg(3); //读取R3if(dacen)regval|=3<<0; //R3最低2个位设置为1,开启DACR&DACL else regval&=~(3<<0); //R3最低2个位清零,关闭DACR&DACL.WM8978_Write_Reg(3,regval); //设置R3regval=WM8978_Read_Reg(2); //读取R2if(adcen)regval|=3<<0; //R2最低2个位设置为1,开启ADCR&ADCL else regval&=~(3<<0); //R2最低2个位清零,关闭ADCR&ADCL.WM8978_Write_Reg(2,regval); //设置R2}//WM8978 输入通道配置//micen:MIC开启(1)/关闭(0)//lineinen:Line In开启(1)/关闭(0)//auxen:aux开启(1)/关闭(0)void WM8978_Input_Cfg(u8 micen,u8 lineinen,u8 auxen){u16 regval;regval=WM8978_Read_Reg(2); //读取R2if(micen)regval|=3<<2; //开启INPPGAENR,INPPGAENL(MIC的PGA放大)else regval&=~(3<<2); //关闭INPPGAENR,INPPGAENL.WM8978_Write_Reg(2,regval); //设置R2regval=WM8978_Read_Reg(44); //读取R44if(micen)regval|=3<<4|3<<0; //开启LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA.else regval&=~(3<<4|3<<0); //关闭LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA.WM8978_Write_Reg(44,regval);//设置R44if(lineinen)WM8978_LINEIN_Gain(5);//LINE IN 0dB增益else WM8978_LINEIN_Gain(0); //关闭LINE INif(auxen)WM8978_AUX_Gain(7);//AUX 6dB增益else WM8978_AUX_Gain(0); //关闭AUX输入}//WM8978 输出配置//dacen:DAC输出(放音)开启(1)/关闭(0)//bpsen:Bypass输出(录音,包括MIC,LINE IN,AUX等)开启(1)/关闭(0) void WM8978_Output_Cfg(u8 dacen,u8 bpsen){u16 regval=0;if(dacen)regval|=1<<0; //DAC输出使能if(bpsen){regval|=1<<1; //BYPASS使能regval|=5<<2; //0dB增益}WM8978_Write_Reg(50,regval);//R50设置WM8978_Write_Reg(51,regval);//R51设置}//WM8978 MIC增益设置(不包括BOOST的20dB,MIC-->ADC输入部分的增益) //gain:0~63,对应-12dB~35.25dB,0.75dB/Stepvoid WM8978_MIC_Gain(u8 gain){gain&=0X3F;WM8978_Write_Reg(45,gain); //R45,左通道PGA设置WM8978_Write_Reg(46,gain|1<<8); //R46,右通道PGA设置}//WM8978 L2/R2(也就是Line In)增益设置(L2/R2-->ADC输入部分的增益)//gain:0~7,0表示通道禁止,1~7,对应-12dB~6dB,3dB/Stepvoid WM8978_LINEIN_Gain(u8 gain){u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47); //读取R47regval&=~(7<<4); //清除原来的设置WM8978_Write_Reg(47,regval|gain<<4);//设置R47regval=WM8978_Read_Reg(48); //读取R48regval&=~(7<<4); //清除原来的设置WM8978_Write_Reg(48,regval|gain<<4);//设置R48}//WM8978 AUXR,AUXL(PWM音频部分)增益设置(AUXR/L-->ADC输入部分的增益)//gain:0~7,0表示通道禁止,1~7,对应-12dB~6dB,3dB/Stepvoid WM8978_AUX_Gain(u8 gain){u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47); //读取R47regval&=~(7<<0); //清除原来的设置WM8978_Write_Reg(47,regval|gain<<0);//设置R47regval=WM8978_Read_Reg(48); //读取R48regval&=~(7<<0); //清除原来的设置WM8978_Write_Reg(48,regval|gain<<0);//设置R48}//设置I2S工作模式//fmt:0,LSB(右对齐);1,MSB(左对齐);2,飞利浦标准I2S;3,PCM/DSP; //len:0,16位;1,20位;2,24位;3,32位;void WM8978_I2S_Cfg(u8 fmt,u8 len){fmt&=0X03;len&=0X03;//限定范围WM8978_Write_Reg(4,(fmt<<3)|(len<<5)); //R4,WM8978工作模式设置}//设置耳机左右声道音量//voll:左声道音量(0~63)//volr:右声道音量(0~63)void WM8978_HPvol_Set(u8 voll,u8 volr){voll&=0X3F;volr&=0X3F;//限定范围if(voll==0)voll|=1<<6;//音量为0时,直接muteif(volr==0)volr|=1<<6;//音量为0时,直接muteWM8978_Write_Reg(52,voll); //R52,耳机左声道音量设置WM8978_Write_Reg(53,volr|(1<<8)); //R53,耳机右声道音量设置,同步更新(HPVU=1)}//设置喇叭音量//voll:左声道音量(0~63)void WM8978_SPKvol_Set(u8 volx){volx&=0X3F;//限定范围if(volx==0)volx|=1<<6;//音量为0时,直接muteWM8978_Write_Reg(54,volx); //R54,喇叭左声道音量设置WM8978_Write_Reg(55,volx|(1<<8)); //R55,喇叭右声道音量设置,同步更新(SPKVU=1)}//设置3D环绕声//depth:0~15(3D强度,0最弱,15最强)void WM8978_3D_Set(u8 depth){depth&=0XF;//限定范围WM8978_Write_Reg(41,depth); //R41,3D环绕设置}//设置EQ/3D作用方向//dir:0,在ADC起作用// 1,在DAC起作用(默认)void WM8978_EQ_3D_Dir(u8 dir){u16 regval;regval=WM8978_Read_Reg(0X12);if(dir)regval|=1<<8;else regval&=~(1<<8);WM8978_Write_Reg(18,regval);//R18,EQ1的第9位控制EQ/3D方向}//cfreq:截止频率,0~3,分别对应:80/105/135/175Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ1_Set(u8 cfreq,u8 gain){u16 regval;cfreq&=0X3;//限定范围if(gain>24)gain=24;gain=24-gain;regval=WM8978_Read_Reg(18);regval&=0X100;regval|=cfreq<<5; //设置截止频率regval|=gain; //设置增益WM8978_Write_Reg(18,regval);//R18,EQ1设置}//cfreq:中心频率,0~3,分别对应:230/300/385/500Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ2_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限定范围if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5; //设置截止频率regval|=gain; //设置增益WM8978_Write_Reg(19,regval);//R19,EQ2设置}//设置EQ3//cfreq:中心频率,0~3,分别对应:650/850/1100/1400Hz//gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ3_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限定范围if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5; //设置截止频率regval|=gain; //设置增益WM8978_Write_Reg(20,regval);//R20,EQ3设置}//设置EQ4//cfreq:中心频率,0~3,分别对应:1800/2400/3200/4100Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ4_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限定范围if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5; //设置截止频率regval|=gain; //设置增益WM8978_Write_Reg(21,regval);//R21,EQ4设置}//设置EQ5//cfreq:中心频率,0~3,分别对应:5300/6900/9000/11700Hz //gain:增益,0~24,对应-12~+12dBvoid WM8978_EQ5_Set(u8 cfreq,u8 gain){u16 regval=0;cfreq&=0X3;//限定范围if(gain>24)gain=24;gain=24-gain;regval|=cfreq<<5; //设置截止频率regval|=gain; //设置增益WM8978_Write_Reg(22,regval);//R22,EQ5设置}Main.c代码#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"#include "lcd.h"#include "key.h"#include "usmart.h"#include "malloc.h"#include "w25qxx.h"#include "sdio_sdcard.h"#include "ff.h"#include "exfuns.h"#include "fontupd.h"#include "text.h"#include "wm8978.h"#include "audioplay.h"//ALIENTEK 探索者STM32F407开发板实验43 //音乐播放器实验-库函数版本//技术支持:.openedv.//淘宝店铺:eboard.taobao.//广州市星翼电子科技有限公司//作者:正点原子ALIENTEKint main(void){delay_init(168);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 //初始化延时函数uart_init(115200); //初始化串口波特率为115200LED_Init(); //初始化LEDusmart_dev.init(84); //初始化USMARTLCD_Init(); //LCD初始化KEY_Init(); //按键初始化W25QXX_Init(); //初始化W25Q128WM8978_Init(); //初始化WM8978WM8978_HPvol_Set(40,40); //耳机音量设置WM8978_SPKvol_Set(60); //喇叭音量设置my_mem_init(SRAMIN); //初始化内部内存池my_mem_init(SRAMCCM); //初始化CCM内存池exfuns_init(); //为fatfs相关变量申请内存f_mount(fs[0],"0:",1); //挂载SD卡POINT_COLOR=BLACK;while(font_init()) //检查字库{LCD_ShowString(30,50,200,16,16,"Font Error!");delay_ms(200);LCD_Fill(30,50,240,66,WHITE);//清除显示delay_ms(200);}POINT_COLOR=BLACK;Show_Str(60,50,200,16,"Explorer STM32F4开发板",16,0); Show_Str(60,70,200,16,"MP3",16,0);Show_Str(60,90,200,16,"实验者:陈斌,蒋文娟",16,0);Show_Str(60,130,200,16,"KEY0:下一首KEY2:上一首",16,0);Show_Str(60,150,200,16,"KEY_UP:PAUSE/PLAY",16,0);while(1){audio_play();}}3.5下载验证. . word. .四、心得体会通过本次实验,主要学习了WAV 格式音频播放原理、数字音频接口及IIS 总线接口的相关知识。