搜索
您的当前位置:首页正文

音乐播放系统设计

来源:爱够旅游网
音乐播放器的研究和设计 第 1 页 ,共 25 页

音乐播放系统的设计

秦伟龙(安庆师范大学物理与电气工程学院 安徽 安庆 246011)

指导老师:张朝龙

摘要:在如今这个快速发展时代里,生活节奏的加快让人们长期处于一种工作、学习的压力状态,人们更需要一种简单方式调节生活和排解压力,对于调节心理压力而言音乐对于每一个人都十分重要,由此音乐播放器在国内已经开始普及。本文介绍了一种以STC89C52RC型单片机为基础元件设计的智能音乐播放器。该设计利用单片机编成技术对芯片进行功能设定,实现音乐的播放。同时,利用单片机的定时器中断,在单片机内部产生所需要的音乐频率,并通过LM386音频功率放大器将音频信号放大,再通过扬声器连续播放一段音乐.而且还可以通过调节蓝白电位器控制音乐的音量。本设计还增加了LCD1602液晶屏显示每一首歌曲和歌曲顺序。该系统设计结构简单,音乐声清晰响亮,节拍正常。

关键词:单片机,音乐播放器,LCD1602液晶屏,音频功率放大器。 1 引言:

在当今快节奏的生活下,人们都有着各种各样的工作和学习压力,每天都在忙碌于各种各样的事物当中。在身体和心理上都处于一种疲惫状态。在这种状态下,为了调节这种疲惫,一种简单而又享受的方式就尤为重要了。音乐自古以来都是一种陶冶情操、排解压力的好方式。在身心疲惫的时候听上一曲美妙的音乐,可以让人们的身体放松,大脑得到休息,工作,学习的效率大大增加。而且音乐播放器系统结构设计简单,元器件价格低廉非常容易获得,可以批量生产。因此在国内,音乐播放器已经推广到各个领域,并应用于生活中的各个方面。本文介绍一种以STC89C52RC型单片机为基础元件设计的音乐播放系统。以单片机为基础,具有操作简单,环节较少,实现功能多样等优点。利用单片机编成技术产生一定频率方波信号,经音频电路放大并变换成正弦信号驱动扬声器,实现音乐的播放。而且通过多次测试,音乐声音清晰响亮,节拍正常,无任何杂音。学校的铃声,宿舍里早晨的闹钟,都将会由美妙的音乐代替。公共场所中的计时报警装置也逐渐开始采用音乐来充当铃声。该音乐播放系统不仅方便人们日常生活,而且为目前快节奏的生活增添了乐趣。

2 音乐播放器发音原理

单片机不能演奏出多种音色的声音,更没有相应幅度的谐振频率。单片机音乐播放器所能演奏的都是单音节频率。所以单片机演奏出音乐声音是比较简单的音乐调调。所以只要弄明白“音调”和“节拍”两个基本概念就可以了。不同频率的方波信号在单片机内部的定时器产生后,经音频放大电路驱动扬声器发出不同音调的音乐,发音时间的长短可用延迟来控制。把音乐的乐谱翻译成相应的定时常数后,再经发音设备中演奏出美妙的音乐。音调代表一个音符的频率高度,节拍代表一个音符的时间长短。音阶

音乐播放器的研究和设计 第 2 页 ,共 25 页

表示音调的高低,不同的音阶对应不同的频率。因此,不同频率的方波信号就可以产生音阶,音阶与频率的关系见表1所示。由于周期是频率的倒数,因此方波的周期可由单片机内部的定时器控制。当定时器计数溢出时产生中断。获取与扬声器连接的单片机P1.0口输出的方波信号的周期,取反后得到所需音乐频率,即得到控制音阶的目的。

表1音阶与频率的关系及方式1下定时器的初值

音阶

频率(Hz)

定时器初值 音阶

频率(Hz)

定时器初值 音阶

频率(Hz)

定时器初值

1 2 3 4 5 6 7 0

131 147 165 175 196 220 247 0

0F85EH 0F933H 0F9F0H 0FA49H 0FAE6H 0FB74H, 0FBF4H 0100H

1 2 3 4 5 6 7 0

262 294 330 349 392 440 494 0

0FC2FH 0FC99H 0FCF8H 0FD22H 0FD73H 0FDBAH 0FDFAH 0100H

1 2 3 4 5 6 7 0

523 587 659 698 784 880 988 0

0FE17H 0FE4CH 0FE7CH 0FE91H 0FEB9H 0FEDDH 0FEFDH 0100H

注:0表示简谱中的空拍

获取一个音符的频率后,相应频率的方波信号便可以由单片机产生,从而产生相应的音符声音。再有单片机的定时器进行定时中断,在中断服务程序中,将单片机上完结单片机I/O口来回置高电平或者是低电平的,从而让扬声器发出声音。通过节拍计算出每个音符所需要的时间,采用循环延时的方法来实现控制一个音符唱多长的时间,从而构成一首完整的音乐。当晶体振荡频率为12MHz,定时器工作在方式1下时,若各音阶相对应的定时器计数初值为X,则可根据下式计算X:

1/(f×2) =(216 -X) ×12/(12×106) (1)

音调的长短用节拍数表示(例如1/4拍、2/4拍、……),不同节拍数的不同音符的组合形成乐谱。程序中,音的节拍可由延时子程序实现。以标准高音A的频率F=440HZ,其对应的周期为:

T=1/F=1/440=2272us (2)

因此需要在单片机I/O端口输出周期为T=2272us的方波脉冲,也就是

t=T/2=2272/2=1136us (3)

也就是说,单片机上定时器的中断出发时间为1136us。如果单片机采用定时器为工作方式1,它以振荡器的十二分频信号为计数脉冲。设外接晶振的振荡器频率为f,则定时器的预置初始值为:

音乐播放器的研究和设计 第 3 页 ,共 25 页

Temp=65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC) (4)

TH=Temp/256 (5) TL=Temp%256 (6)

3 硬件电路设计 3.1 系统的方案设计

图 1 系统组成框图

本文设计是基于STC89C52RC型单片机为基础元件设计的音乐播放器。分别由复位电路、按键电路、晶振电路、音频电路、显示电路、电源电路以及单片机核心电路组成。单片机核心电路以STC89C52RC单片机为核心,兼有复位电路、晶振电路。具有容量适中、功能丰富、性能可靠、价格低等优点。电源电路具有指示正常上电和供电的作用,为每一个基础模块进行供电。按键电路可实现切换上一首,下一首和暂停/播放的功能;操作简单,使用方便。音频电路主要以LM386功率放大器为核心,驱动扬声器播放美妙的音乐,并且可以实现对音量大小的调控。显示电路是选用LCD1602液晶作为显示播放的音乐名称和音乐序号,同时也能够对液晶显示的清晰度进行调节。

3.2 单片机简介

STC89C52RC单片机引脚如图2所示。STC89C52RC单片机拥有4KB的片内ROM和128B的片内

图 2 STC89C52RC引脚

音乐播放器的研究和设计 第 4 页 ,共 25 页

RAM。ROM和RAM的片外寻址范围都为64KB。单片机拥有32个并行口和1个串行口。在STC89C52RC单片机中存在5个中断源,其中有两个外部中断源、两个内部中断源和一个串行中断源。STC89C52RC是标准的40引脚双列直插式集成电路芯片。

XTAL1和XTAL2:晶振外接引脚符。当使用芯片内部时钟时,此二引脚端用于外接晶振和30PF电容;当使用外部时钟时,则用于接外部时钟脉冲信号。

RST/VPD:复位信号。用以完成单片机的复位初始化操作;当单片机掉电时,此引脚上可接备用电源,由VPD向片内RAM提供备用电源,保持片内RAM中的数据不丢失。

P3口线的第二功能。P3的8条口线都定义有第二功能,如表2所示。

表 2 P3口各引脚与第二功能表

引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7

3.3 晶振电路

单片机的晶振电路,如图3所示,在STC89C52RC芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。

第二功能 RXD TXD INT0 INT1 T0 T1 WR RD

信号名称 串行数据接收 串行数据发送 外部中断0申请 外部中断1申请 定时/计数器0的外部输入 定时/计数器1的外部输入

外部RAM写选通 外部RAM读选通

图 3 晶振电路

音乐播放器的研究和设计 第 5 页 ,共 25 页

时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。一般地,电容C1和C2取30pF左右,晶体的振荡频率范围是1.2~12MHz。晶体振荡频率高,则系统的时钟频率也高,单片机运行速度也就快。STC89C52RC在通常应用情况下,使用振荡频率为6MHz或12MHz。

3.4按键电路

图 4 按键电路

每个按键的功能分别为:AJ3播放\\暂停, AJ2上一首歌,AJ4下一首歌。其中AJ2接入单片机的P1.3引脚,AJ3接入单片机的P3.2引脚,AJ4接入单片机的P3.5引脚。

3.5音频发生及放大电路

图 5 LM386功率放大电路

LM386功率放大电路如图5所示。LM386具有静态功耗低,约为4mA,可用于电池供电。工作电压范围宽,4-12V或5-18V。外围元件少,电压增益可调范围为20-200,低失真度等优点。本设计音频放大电路为使外围元件最少,选用放大增益为20倍LM386功率放大器。且电压增益20为LM386的内置电压增益。经LM386放大的正弦波信号再经一定的容值的电容改变成正弦波驱动扬声器。

音乐播放器的研究和设计 第 6 页 ,共 25 页

图 6音频发声及放大电路

音频发声及放大电路如图6所示。利用STC89C52RC的I/O口产生一定频率的方波脉冲,由STC89C52RC单片机的P1.0输出,与音频放大电路的R6 10K电阻相连接。通过LM386功率放大电路驱动扬声器发出不同的音调从而演凑乐曲。其中RT1 104为阻值范围为10k的可调蓝白电位器,接入LM386 3号引脚同相输入端。通过调节RT1接入阻值可改变LM386同相电压输入值,使得LM386功率放大器在放大倍数不变的情况下,进而增大或减小LM386的电压输出值,由此即可调节音乐的音量大小。

3.6 液晶显示电路

LCD1602的接口信号说明如表7所示

图 7液晶显示电路

LCD1602显示当前播放的音乐名,音乐序号。3号引脚为液晶屏驱动电源。该管脚的电平决定了液液晶屏的对比度,接正电时对比度最弱,接地时对比度最高,可用W1 103为阻值范围为1k的可调蓝白电位器,可用于调整液晶屏对比度。从而控制LCD1602液晶显示屏的清晰度。

3.7 整体电路

整体电路原理图如图 8所示。本设计整体电路由电源电路,液晶显示电路,按键电路,显示电路,

音乐播放器的研究和设计 第 7 页 ,共 25 页

音频放大电路和单片机核心电路组成。

图8整体电路

单片机核心电路以STC89C52RC单片机为核心,兼有复位电路和晶振电路。电源电路具有指示正常上电和供电的作用。STC89C52RC单片机P1.3,P3.2,P3.5引脚与按键电路的AJ3播放\\暂停, AJ2上一首歌,AJ4下一首歌相连接。实现暂停/播放,上一首和下一首功能。音频放大电路主要以LM386功率放大器为核心,单片机P1.0引脚与音频放大电路的R6相连接,使音频放大电路接收并放大单片机P1.0发出的信号,进而驱动扬声器播放美妙的音乐。显示电路是选用LCD1602液晶作为显示音乐的名称,音乐序号。单片机P0口与LCD1602 7—14引脚相连接,作为数据接收端,读取单片机P0口发出的数据,显示相应的数字,字母等字符。单片机P2.5口与LCD1602的4号引脚相连接,作为数据/命令选择端 ,单片机P2.6口与LCD16025号引脚相连接,作为读/写选择,P2.7与LCD1602的6号引脚相连接,作为使能信号。

4 软件程序设计 4.1程序流程图

(1)程序设计流程图如图 9所示。首先要对音乐的输出口及按键进行初始化。

(2)控制电路中,AJ2与P1.3相连、AJ3与P3.2相连、AJ4与P3.5相连。当按键按下时输入为低电

音乐播放器的研究和设计 第 8 页 ,共 25 页

平,从而实现对音乐播放器的控制。

图9程序流程图

音乐播放器的研究和设计 第 9 页 ,共 25 页

AJ4与P3.5相连,实现下一曲更换,AJ2与P1.3相连,实现上一曲更换,AJ3与P3.2相连实现开始/暂停操作。按键控制子程序主要由下一曲子程序、上一曲子程序、播放/暂停子程序组成,分别由一个计数器中断和两个外部中断实现。

(3)查找歌曲数据表的地址,根据当前状态播放相应歌曲,判断播放/暂停按键是否按键,若判断为‘是’进行播放处理,音频放大电路中的扬声器播放第1首音乐,LCD1602液晶显示第一首歌曲名称Yan Hua Yi Leng。

(3)若本次判断为‘否’则继续判断上一曲键是否按下,若判断为‘是’,则进行上一曲音乐播放。 (4)若本次判断为‘否’则继续判断下一曲键是否按下,若判断为‘是’,则进行下一曲音乐播放。 (5)本次判断为‘否’则继续判断是否按下暂停/播放键,若判断为‘否’则进行循环判断上一曲,下一曲按键是否按下,直至有上一曲、下一曲按键按下。

(6) 若本次判断为‘是’则进行暂停播放处理。再进行判断是否按下暂停/播放键,本次判断为‘否’,则循环判断是否有暂停/播放按键按下,直至暂停/播放按键按下。本次判断为‘是’,则继续播放当前音乐,按键判断到此为一个循环,此时要返回最初按键判断,循环执行以上程序流程。

5 测试

开机后,电源电路指示灯亮起,电路正常供电,液晶屏上电进入welcome界面。此时如图10所示

图10初始界面

按下播放按键,扬声器播放第1首音乐Yan Hua Yi Leng.LCD1602液晶显示如图11所示。

音乐播放器的研究和设计 第 10 页 ,共 25 页

图11第1首音乐播放

连续按下下一首按键3次,播放第4首音乐 Zhi You Ma Ma Hao。LCD1602液晶显示如图12所示

图12第4首音乐播放

按下复位按键后,单片机进行重启,音频放大电路中的扬声器暂停播放,LCD1602液晶显示屏进

音乐播放器的研究和设计 第 11 页 ,共 25 页

入WELCOME界面,此时等待播放按键按下。如图13所示。

图13初始界面

播放按键按下后,播放第一首音乐的基础上,按下上一首按键可播放最后一首音乐,第8首音乐 Lang Man De Shi。如图13所示

图13第8首音乐播放

音乐播放器的研究和设计 第 12 页 ,共 25 页

6 总结

通过本系统设计,更深层次的学习了单片机的知识。对单片机的基本原理、内部结构、各引脚功能、定时器和中断的应用都有了更深刻的理解。对STC89C52RC单片机的性能和应用进一步充分了解和学习。并且,我能够用单片机为核心设计一个简单的系统,实现自动控制。在显示电路的清晰度调节设计中,我查找LCD1602显示屏的基本原理,引脚特性,最终将显示模块的液晶屏变为可调。在音频放大电路中,我对LM386功率放大器的基本原理也做了进一步学习,设计出可调节音量的音乐播放系统。本设计中还有改进的空间。例如:可以外接USB储存。一方面可以增大歌曲的储存量,另一方面可以更换不同的歌曲,使用更加方便。可以使用触屏操作系统,按键模块和显示模块都在触屏上完成。使得整个音乐播放系统朝着智能化,美观化,操作简单化方向发展。

参考文献

[1]王亭亭, 葛熠, 李峰,基于AT89S52单片机的音乐播放器[J],科技信息, 2012(25),96-97。 [2]常书惠,基于单片机控制的音乐播放器[J],电子商务, 2013(9),70-71。

[3]田媛,单片机音乐播放器功能多样性的设计与实现[J],湖南工业职业技术学院学报, 2013(4),1-3。 [4]罗卫星,单片机音乐播放器设计[J],科学之友, 2010(21),137-138。

[5]汪本慧,基于单片机控制的多功能音乐播放器的设计与制作[J], 智能计算机与应用, 2010(5),33-35。

[6]远飞, 基于单片机的音乐播放器的仿真与制作[J], 电子元器件应用, 2010(12),47-49。 [7]黄振杰, 卢小冰, 基于AT89S52单片机的多功能音乐播放器[J], 电子设计工程, 2009, 17(2),17-18。

[8] Liao F C, Chen S, The microphone array speech enhancement system designe base on DS beamformer and AT89C52 singlechip[C]//Wavelet Active Media Technology and Information Processing (ICWAMTIP), 2012 International Conference on. IEEE, 2012: 207-211。

音乐播放器的研究和设计 第 13 页 ,共 25 页

The Design of music player

Qin Weilong

(School of Physics and Electrical Engineering, Anqing Normal College, Anqing 246011)

Abstract:In today's rapid development era, the accelerating rhythm of life makes people in a long-term state of work and study pressures. People need a simple way to adjust the life stress. Music is very important to everyone for adjusting psychological pressure, and music players have begun to spread in China. This paper introduces an intelligent music player based on STC89C52RC MCU. The single chip microcomputer is used in the design for the purpose of setting of the function of the chip, and realizes of playing the music. The needed music frequency is generated in the microcontroller by using time interrupt, and audio signal is amplified by the LM386 audio power, and the music is played by the speaker. The volume of the music can be controlled by adjusting the blue and white potentiometer. LCD1602 is used in the design to display the order of each song and the name of each song. The system has the merits of simple structure, clear and loud sound, and normal rhythm.

Key words: Single chip microcomputer, Music player, LCD1602 LCD screen, Audio power amplifier

音乐播放器的研究和设计 第 14 页 ,共 25 页

附录A

////////////////////////////////////////////// //51单片机音乐播放器程序

//AT89S52+11.0592MHz+无源蜂鸣器

//共三个按键:上一曲、一下曲、播放\\暂停

//注意:按键必须按下约1S才有相应动作,播放完一首歌曲无按键按下时顺序播放

////////////////////////////////////////////// #include

sbit play_up=P1^3; //上一首歌 sbit play_down=P3^5; //下一首歌 sbit pause=P3^2; //播放\\暂停 sbit speaker=P1^0; //无源蜂鸣器 sbit RS=P2^7; sbit RW=P2^6; sbit EN=P2^5;

//////////////////////////////////////////////

unsigned char timer0h,timer0l,time;//timer0h,timer0l为定时器T0的高低位初值,time为对应的节拍时间

unsigned char music_num; //music_num为歌曲编号,music_num=0表示刚开机时的状态,num是查找歌曲数据表的地址 unsigned int num;

unsigned char code list[8][16]={ \"Yan Hua Yi Leng \ \" Fa Ru Xue \ \" Jian Dan Ai \ \"Zhi You Mama Hao\ \" Dang Ni Gu Dan \ \"XiangJian XiaoLu\ \" Song Bie \ \"Lang Man De Shi \signed int fre; //对应频率数据表的地址

bit play_enable; //歌曲播放的使能标志位,用于播放\\暂停 void delay(unsigned char t); //延时子函数,控制发音的时间长度 void delayms(unsigned int t); //普通延时子程序,可用于按键消抖 void song(void); //演奏一个音符 void music_play(void); //播放歌曲 ////////////////////////////////////////////// //每三个数字,代表一个音符

//第一个数字是音符的数值1234567之一(第几个音),代表哆来咪发... //第二个数字是0123之一,代表低音\\中音\\高音\\超高音(第几个八度) //第三个数字是时间长度,以半拍为单位,乐曲数据表的结尾是三个0 //////////////////////////////////////////////

//《烟花易冷》

unsigned char code song1[]={

音乐播放器的研究和设计 第 15 页 ,共 25 页

5,2,1, 3,2,1, 2,2,2, 2,2,4, 3,2,1, 1,2,1, 2,2,1, 3,2,4, 5,2,1, 3,2,1, 2,2,2, 2,2,2, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1, 7,2,1, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,1, 5,1,1, 6,1,6, 5,2,1, 3,2,1, 2,2,2, 2,2,1, 2,2,1, 3,2,1, 1,2,1, 2,2,1, 3,2,4, 5,2,1, 3,2,1, 2,2,2, 2,2,1, 2,2,1, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1, 7,2,3, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,2, 5,1,2, 6,1,6, 0,0,0 };

//《发如雪》

unsigned char code song2[]={

5,1,1, 2,2,1, 3,2,2, 2,2,1, 3,2,1, 5,2,1, 6,2,1, 5,2,3, 1,2,1, 2,2,1, 3,2,1, 6,2,1, 5,2,1, 3,2,1, 5,2,3, 5,2,1, 6,2,1, 1,3,2, 6,2,1, 5,2,1, 3,2,1, 5,2,1, 3,2,2, 1,2,1, 2,2,1, 3,2,1, 1,2,1, 6,1,1, 3,2,1, 2,2,1, 5,1,1, 2,2,1, 3,2,2, 2,2,1, 3,2,1, 5,2,1, 6,2,1, 5,2,3, 1,2,1, 2,2,1, 3,2,1, 6,2,1, 5,2,3, 5,2,1, 6,2,1, 1,3,2, 6,2,1,

5,2,1, 3,2,1, 5,2,1, 3,2,2, 1,2,1, 6,1,1, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 1,2,1, 2,2,1, 2,2,1, 1,2,4, 0,0,0 };

//《简单爱》

unsigned char code song3[]={

5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1, 4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1,

3,2,1, 3,2,1, 1,2,1, 5,2,1, 1,2,1, 5,2,1, 1,2,1, 7,1,1, 1,2,1, 1,2,1, 6,1,1, 2,2,1, 2,2,1, 3,2,1, 3,2,1, 5,2,1, 5,2,1, 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2,

5,1,1, 1,2,1, 2,1,2, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1, 4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1, 3,2,1, 3,2,1, 1,2,2, 5,2,1, 1,2,1, 5,2,1, 5,2,1, 7,1,1, 1,2,1, 0,0,0 };

//《世上只有妈妈好》

unsigned char code song4[]={

6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, //6,2,3代表6,中音,3个半拍; //5,2,1代表5,中音,1个半拍; //3,2,2代表3,中音,2个半拍; //5,2,2代表5,中音,2个半拍; //1,3,2代表1,高音,2个半拍; //...

5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1, 6,2,1, 3,2,2, 2,2,2,

音乐播放器的研究和设计 第 16 页 ,共 25 页

1,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0};

//《当你孤单你会想起谁》 unsigned char code song5[]={

3,2,2, 3,2,1, 4,2,1, 3,2,2, 2,2,1, 1,2,1, 2,2,2, 5,2,2, 2,2,2, 2,2,3, 1,2,2, 1,2,1, 2,2,1, 1,2,2, 7,1,1, 6,1,1, 7,1,2, 3,2,2, 7,1,2, 7,1,3, 6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,2, 5,1,2, 2,2,1, 3,2,1, 2,2,1,

1,2,1, 6,1,2, 6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 7,1,1, 1,2,6, 0,0,0 };

//《乡间小路》

unsigned char code song6[]={

3,1,2, 3,1,1, 3,1,1, 6,0,1, 6,0,1, 1,1,2,

6,0,1, 5,0,1, 6,0,4, 6,0,2, 6,0,1 ,6,0,1, 6,0,2, 6,0,1, 1,1,1, 2,1,2, 2,1,1, 3,1,1, 2,1,4, 3,1,1, 3,1,1, 3,1,1, 2,1,1, 4,1,2, 4,1,2, 3,1,2, 2,1,1, 1,1,1, 2,1,4, 7,0,1, 7,0,1, 7,0,1, 6,0,1, 5,0,1, 5,0,1, 6,0,1, 7,0,1, 7,0,1, 6,0,1, 5,0,1, 6,0,4, 6,1,2, 3,1,1, 6,1,1, 7,1,1, 6,1,1, 5,1,1, 5,1,2, 5,1,1, 2,1,1, 5,1,1, 6,1,1, 5,1,1, 4,1,1, 4,1,2, 4,1,1, 3,1,1, 2,1,2, 1,1,1, 2,1,1, 3,1,1, 2,1,1, 1,1,1, 2,1,1, 3,1,4, 6,1,2, 3,1,1, 6,1,1, 7,1,1,

6,1,1, 5,1,1, 5,1,2, 2,1,1, 5,1,1, 6,1,1, 5,1,1, 4,1,1, 0,0,0};

//《送别》

unsigned char code song7[]={

5,1,2, 3,1,3, 5,1,1, 1,2,3, 6,1,2, 1,2,2,

5,1,4, 5,1,2, 1,1,1, 2,1,1, 3,1,2, 2,1,1, 1,1,1, 2,1,4, 5,1,2, 3,1,1, 5,1,1, 1,2,2, 7,1,1, 6,1,2, 1,2,2, 5,1,4, 5,1,2, 2,1,1, 3,1,1, 4,1,2, 7,0,1, 1,1,4, 6,1,2, 1,2,2, 1,2,4, 7,1,2, 6,1,1, 7,1,1, 1,2,4, 6,1,1, 7,1,1, 1,2,1, 6,1,1, 6,1,1, 5,1,1, 3,1,1, 1,1,1, 2,1,8, 5,1,2, 3,1,1, 5,1,1, 1,2,2, 7,1,1, 6,1,2, 1,2,2, 5,1,4, 5,1,2, 2,1,1, 3,1,1, 4,1,2, 7,0,2, 1,1,4, 0,0,0};

//《最浪漫的事》

unsigned char code song8[]={

5,1,1, 6,1,1, 1,2,1, 6,1,2, 6,1,1, 5,1,1, 6,1,1, 5,1,1, 3,1,1, 5,1,5, 5,1,1, 6,1,1, 1,2,1, 6,1,2, 6,1,1, 5,1,1, 6,1,1, 5,1,1, 6,1,1, 1,1,5, 1,1,1, 2,1,1, 3,1,1, 2,1,1, 2,1,1, 2,1,1, 1,1,1, 2,1,1, 1,1,1, 6,1,1, 3,1,2, 2,1,3, 5,1,1, 6,1,1, 1,2,1, 6,1,2, 6,1,1, 5,1,1, 6,1,1, 5,1,1, 6,1,1, 1,1,5, 1,1,1, 2,1,1, 3,1,1, 4,1,2, 4,1,1, 5,1,1, 6,1,1, 6,1,1, 5,1,1, 6,1,2, 1,2,1, 6,1,3, 1,2,1, 6,1,1, 5,1,1, 5,1,4, 1,1,1, 6,1,1, 5,1,5, 5,1,1, 6,1,1, 1,2,1, 3,1,1, 2,1,1, 3,1,1, 1,1,6, 0,0,0};

// 频率-半周期数据表 高八位 共保存了四个八度的28个频率数据 unsigned char code FREQH[]={

0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567

0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i

音乐播放器的研究和设计 第 17 页 ,共 25 页

0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567

// 频率-半周期数据表 低八位 unsigned char code FREQL[]={

0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567

0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567

/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的) {unsigned int i,j; for(i=0;ivoid wr_com(unsigned char com)//写指令// { delay1ms(1); RS=0; RW=0; EN=0; P0=com;

delay1ms(1); EN=1;

delay1ms(1); EN=0; }

void wr_dat(unsigned char dat)//写数据// { delay1ms(1);; RS=1; RW=0; EN=0; P0=dat;

delay1ms(1); EN=1;

delay1ms(1); EN=0; }

void lcd_init()//初始化设置// {delay1ms(15);

wr_com(0x38);delay1ms(5); wr_com(0x0c);

音乐播放器的研究和设计 第 18 页 ,共 25 页

wr_com(0x06); wr_com(0x01); }

void init_play() {

wr_com(0xc4); wr_dat('W'); wr_dat('E'); wr_dat('L'); wr_dat('C'); wr_dat('O'); wr_dat('M'); wr_dat('E'); wr_dat('!'); }

void display(unsigned char i) {

unsigned char j; wr_com(0x80); wr_dat(i+0x30); wr_dat(':'); wr_com(0xc0); for(j=0;j<16;j++) {

wr_dat(list[i-1][j]); } }

void main(void) {

TMOD=0x11; //T0 T1 均在工作方式1 ET0=1; //T0开中断 EA=1; //CPU开中断 lcd_init(); init_play(); while(1) {

music_play(); //根据当前状态播放相应歌曲的某个音符

if(!pause) //暂停键处理 {

delayms(5); if(!pause) {

if(music_num==0) //music_num=0只有在刚开机,且未按下暂停键时存在,表示刚开

音乐播放器的研究和设计 第 19 页 ,共 25 页

机时的状态,按下后从第一首开始播放 {

music_num=1; //歌曲序号置1 num=0; //从头播放 play_enable=1; //允许播放 display(1);

if(play_enable)

{wr_com(0x86);wr_dat('P'); wr_dat('L');wr_dat('A');wr_dat('Y');wr_dat(' '); }

} else {

play_enable=~play_enable; speaker=1;

if(play_enable)

{wr_com(0x86);wr_dat('P'); wr_dat('L');wr_dat('A');wr_dat('Y');wr_dat(' '); }

if(!play_enable)

{wr_com(0x86);wr_dat('P');

wr_dat('A');wr_dat('U');wr_dat('S');wr_dat('E'); }

}

while(!pause) //若按着暂停键不放手时的处理 {

if(play_enable==0){} //如果是暂停,则显示时间不变//(暂停时play_enable==0) }

}//暂停键处理结束 }//while结束

if((!play_up)&&(music_num!=0)) //上一首按键 {

delayms(5);

if((!play_up)&&(music_num!=0)) { speaker=1;

music_num-=1;//歌曲编号减一 if(music_num<=0) music_num=8;

num=0; //从头开始播放 display(music_num);

delayms(500);//歌曲切换时延时0.5S } }

音乐播放器的研究和设计 第 20 页 ,共 25 页

if((!play_down)&&(music_num!=0)) {

delayms(5);

if((!play_down)&&(music_num!=0)) { speaker=1;

music_num+=1;//歌曲编号加一 if(music_num>=9) music_num=1;

num=0; //从头开始播放 display(music_num);

delayms(500);//歌曲切换时延时0.5S } }

} }

void delayms(unsigned int t) //MS延时子程序 {

unsigned int i,j; for(i=0;ifor(j=0;j<123;j++) ; } }

void delay(unsigned char t) //延时子函数,控制发音的时间长度,每个节拍0.4S {

unsigned char t1; unsigned long t2;

for(t1=0;t1for(t2=0;t2<8000;t2++) //延时期间, 可进入T0中断去发音 { ; } }

TR0=0; //关闭T0, 停止发音 }

void timer0(void) interrupt 1 //T0中断程序,控制发音的音调 {

speaker=!speaker;//输出方波, 发音

TH0=timer0h; //下次的中断时间,这个时间控制音调高低

音乐播放器的研究和设计 第 21 页 ,共 25 页

TL0=timer0l; }

void song(void) //演奏一个音符 {

TH0=timer0h; //控制音调 TL0=timer0l;

TR0=1; //启动T0, 由T0输出方波发音 delay(time); //每个音符的演奏时间 }

//////////////////////////////////////////////////////////////////////////////////// void music_play(void)//播放相应歌曲的某个音符 {

if((music_num==1)&&(play_enable==1)) {

fre=song1[num]+7*song1[num+1]-1;//第i个是音符,第i+1个是第几个八度

timer0h=FREQH[fre]; //从数据表中读出频率数值,实际上是定时的时间长度 timer0l=FREQL[fre];

time=song1[num+2]; //读出时间长度数值 num+=3;

if(fre<0) //判断歌曲的结束位,结束后转到下一首 {

num=0; //下一首从头播放 music_num=2; display(2); }

song(); //发出一个音符 }

//////////////////////////////////////////////////////////////////////////////////// if((music_num==2)&&(play_enable==1)) {

fre=song2[num]+7*song2[num+1]-1; timer0h=FREQH[fre]; timer0l=FREQL[fre]; time=song2[num+2]; num+=3; if(fre<0) {

num=0;

music_num=3; display(3); }

song(); }

////////////////////////////////////////////////////////////////////////////////////

音乐播放器的研究和设计 第 22 页 ,共 25 页

if((music_num==3)&&(play_enable==1)) {

fre=song3[num]+7*song3[num+1]-1; timer0h=FREQH[fre]; timer0l=FREQL[fre]; time=song3[num+2]; num+=3; if(fre<0) {

num=0;

music_num=4; display(4); }

song(); }

//////////////////////////////////////////////////////////////////////////////////// if((music_num==4)&&(play_enable==1)) {

fre=song4[num]+7*song4[num+1]-1; timer0h=FREQH[fre]; timer0l=FREQL[fre]; time=song4[num+2]; num+=3; if(fre<0) {

num=0;

music_num=5; display(5); }

song(); }

//////////////////////////////////////////////////////////////////////////////////// if((music_num==5)&&(play_enable==1)) {

fre=song5[num]+7*song5[num+1]-1; timer0h=FREQH[fre]; timer0l=FREQL[fre]; time=song5[num+2]; num+=3; if(fre<0) {

num=0;

music_num=6; display(6); }

音乐播放器的研究和设计 第 23 页 ,共 25 页

song(); }

//////////////////////////////////////////////////////////////////////////////////// if((music_num==6)&&(play_enable==1)) {

fre=song6[num]+7*song6[num+1]-1; timer0h=FREQH[fre]; timer0l=FREQL[fre]; time=song6[num+2]; num+=3; if(fre<0) {

num=0;

music_num=7; display(7); }

song(); }

//////////////////////////////////////////////////////////////////////////////////// if((music_num==7)&&(play_enable==1)) {

fre=song7[num]+7*song7[num+1]-1; timer0h=FREQH[fre]; timer0l=FREQL[fre]; time=song7[num+2]; num+=3; if(fre<0) {

num=0;

music_num=8; display(8); }

song(); }

//////////////////////////////////////////////////////////////////////////////////// if((music_num==8)&&(play_enable==1)) {

fre=song8[num]+7*song8[num+1]-1; timer0h=FREQH[fre]; timer0l=FREQL[fre]; time=song8[num+2]; num+=3; if(fre<0) {

num=0;

音乐播放器的研究和设计 第 24 页 ,共 25 页

music_num=1; display(1); }

song(); }

//////////////////////////////////////////////////////////////////////////////////// }

//程序结束

音乐播放器的研究和设计 第 25 页 ,共 25 页

附录B

因篇幅问题不能全部显示,请点此查看更多更全内容

Top