常州信息职业技术学院
学生毕业设计(论文)报告
系 别:电子与电气工程学院
专 业: 电子信息工程技术
班 号: 电子093
学 生 姓 名: 俞亚南
学 生 学 号: 0906013337
设计(论文)题目: 基于C51单片机MP3的设计
指 导 教 师: 梅奕
设 计 地 点: 常州信息职业技术学院
起 迄 日 期: 2011.09.06~ 2011.10.20
毕业设计(论文)任务书
专业 电子信息工程技术 班级电子093 姓名俞亚南
一、课题名称: 基于C51单片机MP3的设计
二、主要技术指标:
(1) 至少支持USB2.0协议
(2) 取样频率为44.1KHZ
(3) 能够完成对8~320kbps基本数据流的解码
(4) 频响:20HZ~20KHZ
(5) 信噪比:≥80DB(±3DB)
三、工作内容和要求:
(1) 认真分析MP3的工作原理,并能熟练画出其方框图;
(2) 分析出各部分的所需程序,参考资料写出程序,并调试与仿真;
(3) 采用电路仿真软件进行仿真实验,得到理想结果后,再画pcb图;
(4) 对pcb进行改善直至达到满意为止;
(5) 分析与总结MP3,并同时思考在此基础上增加新的功能。
四、主要参考文献:_(1)_博创科技《MP3播放器与u盘的设计》 北京 清华大学出版社;_
(2)陈宜建 杨全会 《便携式数码产品调测与维修》 2011.1 常州信息学院印刷室;
(3)王宇炎 李明伟 《基于C51单片机的MP3的设计》 2009.12.16 电子科技.
学 生(签名) 俞亚南 2011 年09月14日
指 导 教师(签名) 年 月 日
教研室主任(签名) 年 月 日
系 主 任(签名) 年 月 日
毕业设计(论文)开题报告
第二篇:毕业设计:C语言的应用(MP3的设计过程)
MP3程序设计过程
MP3(U盘)程序由两在部分组成:MP3播放功能和USB通信功能。本部分介绍程序的整体结构。
MP3播放器部分的设计
MP3播放器程序要与键盘配合起来设计。下面是MP3部分的主程序。
printu(“Entering MP3…\n”);
Flash_Reset(); // Flash复位 MP3Init(); //MP3初始化 KeyBoadInit(); //键盘初始化
EA=1; //开中断,键盘可以开始工作 NumofSong=GetMP3List(); //得到U盘中的MP3歌曲列表 printuf(“Song:%x\n”,NumofSong); //输出歌曲总数信息 P3_5=0; //USB灯亮,此灯亮后,可以按Play键开始播放MP3歌曲 While(1){
if(PlayState==PLAY) PlayMP3(&SONG[11*NowPlaying]);
//如果处于播放状态,则播放当前歌曲
if(NowPlaying==NumofSong) PlayState=STOP;
//全部歌曲播放完了,播放器停止 }
在主程序时,如果处于播放状态,则调用PlayMP3程序播放歌曲,直至播放到最后一首。在PlayMP3里面,MP3解码器一旦开始工作以后,就会一直向CPU请求数据,直至歌曲结束。程序进入此函数以后,只有改变当前歌曲的键盘操作才会使此函数提前结束,进入下一首歌的播放。
void PlayMP3(unsigned char *SongName)
{
int i=0,j=0;
//First 1024 Byte MP3 Data
m=ReadSector(SongName,Page_Buf); //从当前歌曲中读取512字节 if(MP3STA1&MPFREQ) //解码器数据请求中断产生时 {
for(i=0;i<1024;i++) //第一次要向解码器缓存中置入1024字节 {
if(j==512) //当用完512字节时 {
m=ReadSecror(SongName,Page_Buf);
//读取当前歌曲的下一个512字节
j=0;
}
MP3DAT=Page_Buf[j++]; //向MP3解码器数据寄存器送入一个数 while(!PlayState); //如果是暂停状态则等待 while(ChangeSong){DateRead=0;ChangeSong=0;return;}
//如果选曲时,则重新播放当前曲目
while(!(MP3STA1&MPBREQ)); //等待中断再次产生
} }
while(1){
while(MP3STA1&MPFREQ) //解码器数据请求中断产生时 if(j==512){ //当用完512字节时 j=0;
if(m<512){NowPlaying++;return;}
//如果上一次从歌曲中读出的数据不足512时,则结束本歌曲播放
m=ReadSecter(SongName,Page_Buf);
//读取当前歌曲的下一个512字节
}
MP3DAT=Page_Buf[j++]; //向MP3解码器数据寄存器送入一个数
while(!PlayState); //如果是暂停状态则等待 while(ChangeSong){DateRead=0;ChangeSong=0;return;}
//如果选曲时,则重新播放当前曲目
while(!(MP3STA1&MPBREQ)); //等待中断再次产生
}
MP3播放函数的工作分两部分进行,第一部分是播放一首新的MP3歌曲时,要做一些初始化工作。第二部分则一直在等待中断发生。第二部分是与键盘结合起来,以实现MP3播放过程中的用户操作。其流程如图: }
MP3与U盘功能的整合
MP3与U盘功能的整合,主要是实现当插入到USB接口时,执行U盘功能;当没有插入到USB时,执行MP3功能,这个状态是通过P3_3的状态来判断的。以下是两个功能的整合部分的代码。
printu(“UP-TECH MP3 Player USB Disk Begin!\n”);
P3_5 = 0x01; //USBLED off P3_5 = 0; //P3_3=0 LCD Power off,P3_3=1 LCD Power on if(!P3_4){
…
//如果没有插入到USB接口中,则执行MP3程序
}
else{
…
//如果有插入到USB接口中,则执行U盘程序
}
使用这种方式,使得在设计U盘和设计MP3两部分的代码时,可以分开同时进行,这样,可以简化设计的复杂性,并且使工作可以由不同设计者同时进行。
MP3功能按钮设计
当执行MP3程序的时候,需要通过按键操作来控制MP3歌曲的播放,键盘响应流程图如图:
每个键对应了一个键盘响应函数。
(1)Func,功能切换。功能切换的作用是设置功能状态。每按下一次此键,则功能状态计数器在1~3之间轮换。源代码如下:
void Func()
{
if(CurrentFun<3) CurrentFun++; //在选曲/音量调节/音效调节三者间切换 else if(CurrentFun==3) CurrentFun=1;
}
(2)Next,向后。根据所处功能状态不同,按下此键时,将进行不同的操作,进而可以实现不不的功能。当处于“音量控制(VOLUME)”状态时,则改变音量寄存器的值,从而控制音乐音量。当处于“音效(EFFECTION)”状态时,则改变音效寄存器的值。面如果处于“选曲(SELECTSONG)” 状态时,则切换到当前MP3歌曲列表中的下一首。源代码如下:
void Next() //按下“下一首/音量减小”键时的处理 {
switch(CurrentFun){ //如果当前处于音量调节功能 case VOLUME: { } if(MP3VOR>0x01) //当前音量没有达到最小时 { } break; MP3VOR-=0x01; //右声道音量增大一档 MP3VOL-=0x01; //左声道音量增大一档 case EFFECTION: //如果处于音效调节功能 { } if(MP3BAS>7){ //降低重音效果 } break; MP3BAS-=7; MP3MED=0x0f; MP3TRE+=7; case SELECTSONG: //如果处理MP3选取功能 { if(NowPlaying==(NumfSong-1)) NowPlaying=0;
//如果已经处于最后一首了,则指向第一首
} } else NowPlaying++; //否则,指向下一首 ChangeSong=1; //置选曲标志位 break; default:break; }
(3)Previous,向前。此键的功能与Next正好相对应。源代码如下:
void Previous() //按下“上一首/音量增大”键时的处理 {
} break; switch(CurrentFun){ case VOLUME: //如果当前处于音量调节功能 { MP3VOR+=0x01; //右声道音量增大一档 MP3VOL+=0x01; //左声道音量增大一档 } if(MP3VOR<0x01f) //当前音量没有达到最大时 { case EFFECYION: //如果处于音效调节功能 { if(MP3BAS<0x1d){ //增加重音效果
} } MP3BAS+=7; MP3MED=0x0f; MP3TRE-=7; break; case SELECTSONG: //如果处理MP3选取功能 { if(NowPlaying>0)NowPlaying--;
//如果当前播放歌曲不为第一首,则指向上一首
else NowPlaying=NumofSong-1;
//如果当前已经到达第一首,则指向最后一首
} } ChangeSong=1; //置选曲标志位 break; default:break; }
(4)PlayPause,播放/暂停。每当按下此键时,改变一下播放状态,配合在MP3播放函数中对此状态的判断,可以实现MP3播放过程中的暂停。源代码如下:
void PlayPause()
{
}
PlayState=!PlayState; //按一下播放键时,改变播放状态