⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp3player.c

📁 STM32不完全手册 例程源码 29个
💻 C
字号:
#include "text.h"
#include "lcd.h"
#include "fat.h"
#include "sys.h"
#include "usart.h"		
#include "delay.h"
#include "VS10XX.h"	 
#include "mp3player.h"	 
#include "key.h"	
#include "led.h" 
#include "spi.h"   

u16 f_kbps=0;//歌曲文件位率	
//显示播放时间,比特率 等事信息 
void MP3_Msg_Show(u32 lenth,u16 index,u16 total)
{	
	static u16 playtime=0;//播放时间标记	     
 	u16 time=0;// 时间变量
	u16 temp=0;

	if(f_kbps==0xffff)//未更新过
	{
		playtime=0;
		f_kbps=GetHeadInfo();	   //获得比特率
	}	 	 
	time=GetDecodeTime(); //得到解码时间	 								   	  
	if(time!=playtime)//1s时间到,更新显示数据
	{
		playtime=time;//更新时间 	 				    
		temp=GetHeadInfo(); //获得比特率	   				 
		if(temp!=f_kbps)
		{
			f_kbps=temp;//更新KBPS	
			time=((float)lenth/f_kbps)/125;//更新时间	 
		}			 
		//显示播放时间			 
		LCD_Show2Num(60,110,time/60,2,16,0);   //分钟
		LCD_ShowChar(60+16,110,':',16,0);
		LCD_Show2Num(60+24,110,time%60,2,16,0);//秒钟
		LCD_ShowChar(60+40,110,'/',16,0);	    	 
		//显示总时间
		if(f_kbps)time=(lenth/f_kbps)/125;//得到秒钟数   (文件长度(字节)/(1000/8)/比特率=持续秒钟数    	  
		else time=0;//非法位率	  
 		LCD_Show2Num(60+48,110,time/60,2,16,0);//分钟
		LCD_ShowChar(60+64,110,':',16,0);
		LCD_Show2Num(60+72,110,time%60,2,16,0);//秒钟		    
		//显示当前曲目的索引,及总曲目数
  		LCD_Show2Num(60+0,130,index,3,16,0);  //索引
		LCD_ShowChar(60+24,130,'/',16,0);
  		LCD_Show2Num(60+32,130,total,3,16,0); //总曲目		  
		//显示位率			   
 		LCD_ShowNum(60+60,130,f_kbps,3,16);//显示位率
		LCD_ShowString(60+84,130,"Kbps");	  	  
	}   		 
}			  		 

//播放音乐
void Play_Music(void)
{
	u16 i;
	u8 key;
 	FileInfoStruct FileInfo;		 						    
	u16 mus_total=0;//总音乐文件的个数
	if(FAT32_Enable)Cur_Dir_Cluster=FirstDirClust;//根目录簇号
 	else Cur_Dir_Cluster=0;	
	Get_File_Info(Cur_Dir_Cluster,&FileInfo,T_MP3|T_WMA|T_WAV|T_MID,&mus_total);//获取当前文件夹下面的目标文件个数 
	i=1;
	while(1)
	{	    
		key=Play_Song(i,mus_total); 
		if(key==1)
		{
			if(i<mus_total)i++;
			else i=1;
		}else if(key==2)
		{
			if(i>1)i--;
			else i=mus_total;
		}else
		{
			i++;
			if(i>mus_total)i=1;
		}	   
	}	 
}
////////////////////////////////////////////////////////
//播放音乐
//index:播放的歌曲编号
//返回值:0,成功;1,下一曲;2,上一曲;0xff 得到文件信息失败;0xfe,硬复位失败;	 
u8 MUSIC_BUFFER[512];
u8 Play_Song(u16 index,u16 total)
{	 
	u32 bfactor;
	u32 bcluster;
	u16 count;
	u8 key,n;
	u16 i;	 
	u8 pause=0;//不暂停  
 
  	FileInfoStruct FileInfo; 
	i=Get_File_Info(Cur_Dir_Cluster,&FileInfo,T_MP3|T_WMA|T_WAV|T_MID,&index);    
	if(i==0)return 0xff;//得到文件信息失败。
	if(VS_HD_Reset())return 0xfe;//硬复位	
						 				  		 	  
	VS_Soft_Reset();  //软复位VS1053    
	set1003();        //设置音量等信息 			 
	ResetDecodeTime();//复位解码时间	  
								 
	LCD_Fill(0,110,239,319,WHITE);			//整个屏幕清空
	Show_Str(60,150,FileInfo.F_Name,16,0); 	//显示歌曲名字
	bfactor=fatClustToSect(FileInfo.F_StartCluster);  //得到开始簇对应的扇区
	bcluster=FileInfo.F_StartCluster;			      //得到文件开始簇号	 
	count=0;	 	    				    		
	while(1)   //播放音乐的主循环
	{
	    if(SD_ReadSingleBlock(bfactor,MUSIC_BUFFER))break;//读取一个扇区的数据   
	 	SPIx_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M 

		count++;//扇区计数器 
		i=0;
		do      //主播放循环
	    {  	    
			if(VS_DQ!=0&&pause==0)  // 非暂停 送数据给VS1003 
			{			   	 
	    		VS_XDCS=0;   //MP3_DATA_CS=0;
	            for(n=0;n<32;n++)
				{
					SPIx_ReadWriteByte(MUSIC_BUFFER[i++]);	 			
				}
				VS_XDCS=1;   //MP3_DATA_CS=1;
				//VS_WR_Data(MUSIC_BUFFER[i++]);//发送音乐数据    
			}
			key=KEY_Scan();
			if(key)
			{
				switch(key)
				{
					case 1://下一首歌
						return 1;
					case 2://上一首歌
						return 2;
					case 3://暂停/播放
						pause=!pause;
				}
			} 	    
		}while(i<511);//循环发送512个字节 
		MP3_Msg_Show(FileInfo.F_Size,index,total);	    
	    bfactor++; //扇区加				  
	    if(count>=SectorsPerClust)//一个簇结束,换簇
	    {									  
	        count=0;  					 	   
	        bcluster=FAT_NextCluster(bcluster);	
			//printf("NEXT:%d\n",bcluster);
			LED1=!LED1;	   
			//文件结束 
			if((FAT32_Enable==0&&bcluster==0xffff)||bcluster==0x0ffffff8||bcluster==0x0fffffff)break;//error	
	        bfactor=fatClustToSect(bcluster);
	    } 
	}	 
	VS_HD_Reset();  //硬复位						 				  		 	  
	VS_Soft_Reset();//软复位 
	LED1=1;  //关闭DS1
	return 0;//返回按键的键值! 
}













⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -