基于51单片机的音乐播放器设计.docx
《基于51单片机的音乐播放器设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的音乐播放器设计.docx(30页珍藏版)》请在冰点文库上搜索。
基于51单片机的音乐播放器设计
题目:
音乐播放器
课程设计(论文)任务书
课程设计(论文)题目:
音乐播发器
基本内容:
利用单片机的定时器产生各种频率的方波,信号经过放大后送到喇叭从而产生各种音调。
自行定义键盘,每按一键,可选择一首歌曲进行演奏,至少能够存储并播放十首歌曲,在LCD上显示演奏歌曲的名称并滚动显示歌词,单片机可连续播放这首歌曲,演奏可通过按键停止。
课程设计(论文)专题部分:
题目:
音乐播放器
基本内容:
通过单片机设计可以播放十首歌曲的音乐播放器,同步显示歌曲名称和歌词。
学生接受毕业设计(论文)题目日期
第19周
指导教师签字:
2009年7月
摘要
随着电子技术的发展和计算机越来越普遍的使用,单片机作为这两项技术的有机结合也得到了广泛的应用,在某些领域具有不可替代的作用。
音乐播放功能随处都会用到,如,在开发儿童智力的玩具中,等等。
目前,基于单片机实现音乐播放,其体积小、价格低、编程灵活等特点在这一领域独领风骚。
单片机的英文名称为singlechipmicrocomputer,最早出现在20世纪70年代,国际上现在已逐渐被微控制器(MicrocontrollerUnit或MCU)一词所取代。
它体积小,集成度高,运算速度快,运行可靠,功耗低,价格廉,因此在数据采集、智能化仪表、通讯设备等方面得到了广泛应用。
而8051单片机在小到中型应用场合很常见,已成为单片机领域的实际标准。
随着硬件的发展,8051单片机系列的软件工具也有了C级编译器和实时多任务操作系统RTOS,为单片机编程使用C语言提供了便利的条件;并针对单片机常用的接口芯片编制通用的驱动函数,可针对常用的功能模块,算法等编制相应的函数;C语言模块化程序结构特点,可以使程序模块大家共享,不断丰富,这样就使得单片机的的程序设计更简单可靠,实时性强,效率高。
作为测控技术与仪器的学生,掌握8051单片机硬件基础及其相关软件操作,将其应用于现代电子产品中是必要而且重要的,这次课程设计我们的题目是用单片机实验箱系统制作音乐播放器。
本次课程设计主要内容是通过单片机C51语言进行编程,以产生乐曲音符和节拍,把乐谱翻译成计算机语言(音符转换诚成相对应的方波频率即定时器装载初值,节拍转换成相对应的延长时间),并将其预先存储到单片机里,然后根据按键调用再由单片机进行信息处理,在经过信号放大,由喇叭放出乐曲声,实现音乐播放的功能。
其主要表现在可以播放十首歌曲,可以用十个数字键控制播放的歌曲,并且能在LCD液晶屏显示器上显示相应播放歌曲的曲名和滚动歌词。
再加上一个开关键来控制歌曲的播放停止。
本设计的目的是培养理论联系实际的学习方法以及独立解决工程实际问题的能力。
能够熟识单片机C51语言的编程特性,及其应用。
能够用C51语言进行编程,能成功的编出较为简单的程序。
关键词:
单片机,音乐,蜂鸣器,同步显示
第一章绪论
1.1课程设计目的
应用单片机,利用它的原理组成一个音乐播放器。
1.2课程设计任务
1)以单片机为核心部件组成一个音乐播放器;
2)利用单片机的定时器产生乐谱的各种频率方波,信号经过放大后由蜂鸣器发出声音;
3)自行定义按键盘,当有键按下时,能相应的播放出歌曲。
有一个停止键能控制音乐的播放;
4)在LCD液晶显示屏上同步显示演奏歌曲的曲名;
5)附加要求:
在LCD上滚动显示演奏歌曲的歌词。
1.3课程设计要求
1)用Protel画出硬件原理图;
2)画出软件流程图,采用单片机C语言或汇编语言进行编程;
3)完成硬件与软件调试综合调试,实现预定功能,并写出课程设计报告。
1.4课程设计的意义
通过自己动手设计单片及组成的器件,在软件及硬件上进一步了解单片机的原理,深入了解了单片机C51语言的实际应用,能更深地理解课堂上所学的内容,巩固C语言程序编写,亲身体会作为一名设计人员所需要具备的各种能力,学会理论知识联系实际,提高我们发现问题,分析问题,解决问题和实践动手的能力。
第二章设计原理及总体方案选择
2.1设计原理
2.1.1基本原理简述
声音是通过振动产生的。
单片机对某一引脚以一定的频率循环置1置0,该引脚便产生一定频率的方波,方波通过放大,作用于一定的物理实件(蜂鸣器),就产生了一定频率的声音。
若改变输出方波的频率,产生的声音随之改变。
通过控制输出方波的时间长短,声音的长短也可以得到控制,因此,根据乐谱,以类似的音及同样的节拍,单片机就可以产生电子音乐。
音乐的播放选择可以通过按键的输入得以实现。
为简便起见,以一定的频率方波产生的音在其每个周期内高低幅值得时间各占一半因此,输出引脚在每个方波周期内要动作两次:
一次升高,一次降低。
即输出引脚的频率是原音频率的两倍。
方波的产生由定时器控制。
定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。
必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。
一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。
另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。
这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。
音乐播放器的基本硬件电路有六部分组成:
单片机、时钟与复位电路、选择按键输入电路、音频发生器、音频放大器和扬声器。
音乐播放器硬件电路设计框图如图2.1所示。
LCD液晶显示屏显示
时钟与复位
电路
单片机
音频发生器
按键输入
歌曲选择电路
蜂鸣器
音频放大器
图2.1音乐播放器硬件电路设计框图
利用单片机内部定时器/计数器T0与P1.1引脚配合,构成音频发生器,与外置电路组成音频放大器,驱动扬声器输出。
LCD液晶模块以并行方式与微控制器相连,15脚接高电平为并行方式,通过送入指令和数据,可对显示方式和显示内容做出选择。
2.1.2关于音乐的原理知识
在音乐中使用的各个固定频率的音叫音级[1]。
常用符号C、D、E、F、G、A、B、c、d、e、……a1、b1、c2、d2……表示,它们对应于钢琴上的白键。
两音之间音高的距离叫音程。
在上述音级中,E与F、B与C之间音高的距离仅为其它相邻音级之间距离的一半,称它们之间的音程为半音音程,而称其它相邻各音之间的距离为全音音程。
在这些全音音程之间又加入新的半音音级,用符号﹟C、﹟D、﹟F、﹟G、﹟A、﹟c、﹟d、﹟f、……表示,对应于钢琴上的黑键。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
表2.1各音符及对应频率
音符
低DO
低#DO
低RE
低#RE
低MI
低EA
简谱码
DO_L
DO#_L
RE_L
RE#_L
MI_L
FA_L
频率
262HZ
277HZ
294HZ
311HZ
330HZ
349HZ
音符
低#FA
低SO
低#SO
低LA
低#LA
低SI
简谱码
FA#_L
SO_L
SO#_L
LA_L
LA#_L
SI_L
频率
370HZ
393HZ
415HZ
440HZ
466HZ
494HZ
音符
中DO
中#DO
中RE
中#RE
中MI
中EA
简谱码
DO
DO#
RE
RE#
MI
FA
频率
523HZ
554HZ
587HZ
622HZ
659HZ
698HZ
音符
中#FA
中SO
中#SO
中LA
中#LA
中SI
简谱码
FA#
SO
SO#
LA
LA#
SI
频率
740HZ
785HZ
831HZ
880HZ
932HZ
988HZ
音符
高DO
高#DO
高RE
高#RE
高MI
高EA
简谱码
DO_H
DO#_H
RE_H
RE#_H
MI_H
FA_H
频率
1047HZ
1109HZ
1174HZ
1245HZ
1318HZ
1397HZ
音符
高#FA
高SO
高#SO
高LA
高#LA
高SI
简谱码
FA#_H
SO_H
SO#_H
LA_H
LA#_H
SI_H
频率
1480HZ
1568HZ
1661HZ
1760HZ
1865HZ
1976HZ
每个音符分为简谱码和节拍码。
简谱码为D0-L到SI-H,节拍码为1到16。
对应的节拍表如表2.2所示。
对应的拍子:
2/2。
。
。
。
。
。
。
。
。
。
。
以二分音符为一拍,每小节有两拍(二分音符代表一拍)
2/4。
。
。
。
。
。
。
。
。
。
。
以四分音符为一拍,每小节有两拍(四分音符代表一拍)
3/4。
。
。
。
。
。
。
。
。
。
。
以四分音符为一拍,每小节有三拍(四分音符代表一拍)
4/4。
。
。
。
。
。
。
。
。
。
。
以四分音符为一拍,每小节有四拍(四分音符代表一拍)
表2.2节拍表
拍数
字符
拍数
字符
1/8
00H
2
08H
1/4
01H
5/2
09H
1/2
02H
3
0AH
3/4
03H
7/2
0BH
1
04H
4
0CH
5/4
05H
5
0DH
3/2
06H
6
0EH
7/4
07H
8
0FH
2.2设计方案的拟定和选择
2.2.1.基本方案
实现四10个按键选择10首歌曲,能够实现音乐播放。
演奏通过按键来停止,在LCD上显示演奏歌曲的名称。
简单说明:
采用8279芯片来控制键盘,使其IRQ引脚接单片机的外部中断0,一旦有键按下就对应一首曲播放目。
停止按键可以使用外部中断1来实现。
关于LCD采用的是并行接法传输数据,查找汉字码表找出各首歌名的对应数码,软件中用数组存储即可,一个歌名用一个数组,根据按键可以把存储各首歌名数码的数组首地址传给全局指针,调用显示函数即可显示相应的歌名。
各音调对应的定时器初始装载表也以数组的形式按升调顺序存储,并按前面所述将各歌曲的对应音调和节拍存储在数组中,有按键按下时,将对应歌曲的数组首地址传给全局指针,利用相应的处理函数调出音调对应的定时器装载值表,给定时器装载初值并启动,产生控制扬声器的方波,根据低半字节控制延时时间,即音调的发音长短。
2.2.2.附加方案
能够在播放音乐得同时,实现LCD同步显示歌曲的歌名和歌词内容。
第三章音乐播放器硬件电路的设计和调试
3.1硬件原理电路的设计
由设计原理框图2.1,分别设计相应模块,构成原理图。
3.1.1时钟与复位模块
由电容,电位器,按键组成复位电路部分,该电路接于单片机的RESET端可以通过按键达到手动复位的效果,也可以通过电位器和电容组成上电复位电路。
通过复位电路使单片机回到初始状态。
图3.1复位电路和晶振时钟电路
3.1.2按键选择模块
图3.3按键选择模块
通过74LS138与P3.0口、按键公共端及按键和P1口相连,构成按键选择模块。
P3.0口输出0时,选择左边8个键,P3.0口输出1时,选择右边8八个键。
是某个键按下可由P1口读取。
3.1.3音频发生及放大器模块
由非门(74LS04),三极管(9014),蜂鸣器,电阻组成的外部驱动发音电路。
该电路部分接于P3.1口,经过外部非门和三极管的驱动,通过扬声器发出音乐。
图3.3音频发生与放大电路
3.1.4LCD显示模块
由RT12864,按键和保护电阻组成的外部扩展电路。
其工作过程是通过单片机P3.6/WR和P3.7/RD接于RT12864,使其接收单片机由使用者通过按键发来的信息,显示歌曲名称,在没有设备启动没有按键工作时显示“按键选择歌曲”,当有按键工作后,设备播放歌曲同时显示歌曲序号及歌曲名称。
3.1.5电路原理图
综合以上功能模块,连接于单片机,绘制原理图如图3.4所示。
图3.4音乐播放器电路原理图
3.2ATMEL89C51简介
3.2.1AT89C51单片机
AT89C51是美国ATMEL公司推出的系列单片机,将多种功能的8位CPU与FPEROM(快闪可编程/擦除只读存储器)结合在一个芯片上,是一种低功耗、高性能的CMOS控制器,为很多嵌入式控制应用提供了非常灵活而又价格适宜的方案,其性能价格比远高于同类芯片。
它与MCS-51指令系统兼容,片内FPEROM允许对程序存储器在线重复编程,也可用常规的EPROM编程器编程,可循环写入/擦除1000次。
89C51内含4KB的FPEROM,一般的EEPROM的字节擦除时间和写入时间基本上均为10ms,对于任一个实时控制系统来说,这样长的时间是不可能在线修改程序的。
3.2.2单片机CPU结构
图3.6单片机CPU结构
3.2.3AT89C51用户系统
●CPU为Atmel公司生产的89C51/89C52/89C55等。
出厂所配晶振频率为11.0592MH,每个机器周期为1.085us,用户更换晶振以提高速度;
●存贮器为64K,前4K/8K20K在CPU内部,其它程序在EPR0M27512中;
●数据存贮器为32K(62256),地址为8000—FFFFH;
●Ⅰ/O扩展8155,片内RAM地址∶200O-20FFH;
●8155命令口地址为∶2100H;
●A口地址∶21O1HB口地址:
2102HC口地址:
2103H;
●T低八位∶2104HT高八位∶2105H;
●多路模拟开关的使用∶
IN0∶P1=0F8HIN4:
P1=0FCHIN1∶P1=0F9HIN5:
P1=OFDH
IN2∶P1=0FAHIN5:
P1=0FEHIN3∶P1=0FBHIN7:
P1=0FFH
●不掉电数据存贮器为∶500EH-507FH;
●控制板∶160x1O9(mm)供电∶+5V300mA+12V100mA-12V100mA;
●AT89C51是一种低功耗、高性能的片内含有4KB快闪可编程/擦除只读存储器(FPEROM-FlashProgrammableandEraseableReadOnlyMemory)的8位CMOS微控制器,使用高密度、非易失存储技术制造,并且与80C51引脚和指令系统完全兼容;
●主要性能:
与MCS-51微控制器产品系列兼容;
片内有4KB可在线重复编程的快闪擦写存储器。
3.2.4引脚介绍
图3.789C51引脚图
第四章软件编程设计与综合测试
4.1编程思路简述
要产生音频信号,只要算出某一音频的周期(频率的倒数),将此周期除以2即为半周期的时间,利用定时器计时此半周期时间,计时到后取反输出,重复此过程即得到此频率的声音信号。
此信号从P3.0脚输出。
定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。
必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。
一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表2.1中所给的定时初值就是考虑中断响应后的定时常数。
另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。
这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。
本设计中单片机晶振频率为11.0592MHz。
每个音符使用两个字节。
低位字节(偶地址)代表音级,00H表示不发音(休止符),01H~30H依次表示的音级为c、﹟c、d、﹟d、e、f、……a3、﹟a3、b3,详见表2.1。
高位字节(奇地址)代表音符的时值(拍数),00H~0FH依次表示拍数为1/8拍(0.10s)~8拍(6.40s),见表2.2。
乐曲的结束标志是两个字节:
0FFH,0FFH。
设计延时程序125ms,来控制节拍,并在延时中判断是否有停止键按下,以便随时停止音乐。
改变延时程序的延迟时间,即可实现歌曲的快慢演奏。
主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和演唱子程序,启动定时器T0;通过延时控制节拍,并循环回音级子程序,等待演唱完毕。
要编写的乐谱按要求以音符字节数据表的形式存放在程序中,改变乐曲就是通过改变该数据表的内容来实现的。
主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和音长子程序,启动定时器T0;根据定时器T1应中断的次数,启动定时器T1。
数据表读完后,根据所设置的循环演奏次数决定是否结束程序。
音级子程序的任务是取出字节中的音级部分,分析TH0和TL0中应送入何值,送给33H,34H。
演唱子程序的任务是取出对应频率值,并乘以2,启动T0,实现发音。
之后执行延时程序,体现节拍,依此循环,直到音乐结束。
定时器T0的中断服务程序任务是取反P3.0输出产生方波,重新为TH0,TL0送初值。
定时器T1的中断服务程序任务是:
判断计数完成否,给373的控制端高或低电平,从而实现数据输出或禁止,达到二极管亮灭闪烁的效果。
当乐曲较长时(超过254个字节),数据表指针溢出,应及时修改基址寄存器DPTR内容,即数据表的表头指针。
4.2编程方案的设计
4.2.1软件功能选择
1)对于11个按键的功能设计,除一个停止键,其余十个键分别对应十首歌。
演奏过程中,按停止键可使乐曲停止,LCD上出现欢迎界面,此时可以继续按其他键继续选择其他歌曲演奏。
选歌的按键使用8279键盘扫描以获得键值。
停止键使用的单片机的外部中断1实现其功能的。
2)对于LCD,首先启动时出现“请按键选择播放曲目”的字样提示使用者,获得键值后开始播放歌曲的同时在LCD上显示歌曲名,当按下停止键后,歌曲停止播放,同时LCD上又出现提示界面,依次循环。
4.2.2综合调试
在实验箱上进行调试,先是进行单个模块调试,键盘与LCD显示器一起进行调试,调试成功后,再在实验箱上进行播放歌曲的调试,使其能单曲循环播放,当有开关键按下时,就停止播放歌曲,再按下时,又重新播放歌曲。
最终实现当有数字键按下时,演奏对应的歌曲,并在显示屏上显示出曲目。
当停止键按下时,停止播放歌曲。
4.2.3程序流程图
图4.1音乐播放器程序流程图
4.2.4程序清单
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definew_c_addXBYTE[0x2070]/*写命令字地址*/
#definew_d_addXBYTE[0x2071]/*写数据地址*/
#definer_s_addXBYTE[0x2072]/*读状态字地址*/
#definer_d_addXBYTE[0x2073]/*读数据地址*/
ucharcode*song;
ucharcode*song_name;
ucharcode*song_lrc;
ucharcodetab[]={0xf8,0x94,0xf9,0x5c,0xfa,0x1a,0xfa,0x6a,0xfb,0x00,0xfb,0x8c,0xfc,0x0e,
0xfc,0x4a,0xfc,0xae,0xfd,0x08,0xfd,0x30,0xfd,0x80,0xfd,0xc6,0xfe,0x02,
0xfe,0x2a,0xfe,0x5c,0xfe,0x84,0xfe,0x98,0xfe,0xc0,0xfe,0xe8,0xfe,0x06};
ucharcodesong_name1[18]={0xc7,0xfa,0xc4,0xbf,0xd2,0xbb,0xa1,0xc3,0xc1,0xbd,0xd6,0xbb,0xc0,0xcf,0xbb,0xa2,0xef,0xff};//两只老虎
ucharcodesong1[]={0x44,0x54,0x64,0x44,0x44,0x54,0x64,0x44,0x64,0x74,0x88,0x64,
0x74,0x88,0x82,0x92,0x82,0x72,0x64,0x44,0x82,0x92,0x82,0x72,
0x64,0x44,0x54,0x14,0x48,0x54,0x14,0x48,0xff};
ucharcodesong_lrc1[]={"两只老虎两只老虎跑的快跑的快一只没有眼睛一只没有尾巴真奇怪真奇怪"};
ucharcodesong_name2[18]={0xc7,0xfa,0xc4,0xbf,0xb6,0xfe,0xa1,0xc3,0xd0,0xc2,0xc4,0xea,0xbf,0xec,0xc0,0xd6,0x20,0xff};//新年快乐
ucharcodesong2[]={0x42,0x42,0x44,0x14,0x02,0x62,0x62,0x64,0x44,0x04,0x42,0x62,
0x84,0x84,0x02,0x72,0x62,0x54,0x04,0x52,0x62,0x74,0x74,0x02,
0x62,0x52,0x64,0x44,0x04,0x42,0x62,0x54,0x14,0x02,0x32,0x52,
0x44,0x04,0xff};
ucharcodesong_lrc2[]={"新年好呀新年好呀祝贺大家新年好我们歌唱我们跳舞祝贺大家新年好"};
ucharcodesong_name3[18]={0xc7,0xfa,0xc4,0xbf,0xc8,0xfd,0xa1,0xc3,0xc9,0xfa,0xc8,0xd5,0xbf,0xec,0xc0,0xd6,0xff};//生日快乐
ucharcodesong3[]={0xC4,0x12,0x32,0x44,0x42,0x52,0x52,0x44,0x32,0x32,0x12,0x14,
0x12,0x12,0x32,0x42,0x54,0x44,0x4F,0xC4,0x12,0x32,0x44,0x42,
0x72,0x58,0x42,0x32,0x34,0x14,0x12,0x32,0x34,0x12,0x1F,0xff};
ucharcodesong_lrc3[]={"祝你生日快乐祝你生日快乐HAPPYBIRTHDAYTOYOU祝你生日快乐"};
ucharcodesong_name4[18]={0xc7,0xfa,0xc4,0xbf,0xcb,0xc4,0xa1,0xc3,0xD0,0xC7,0xD0,0xC7,0xCB,0xF7,0xff};//星星索
ucharcodesong4[]={0x82,0x01,0x81,0x94,0x84,0xB4,0x04,0x04,0x82,0x01,0x81,0x94,
0x84,0xC4,0xB4,0x04,0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0x04,0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,0xff};
ucharcodesong_lrc4[]={"呜喂风儿呀