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

📄 mp3_player.c

📁 AT89C51SND1C是AT89C51核心的处理器
💻 C
字号:
/*  Copyright (C) 1996-2005 Brilliant Ideal Electronics. All rights reserved.
	MP3_Player+USB_Disk V3.0 Edit by JMBIE STUDIO 2005.07
*/


#include "AT89C51SND1_REG.H"
#include "MP3_PLAYER.H"
#include "UDISK_DEF.H"
#include "FILE_SYS.H"
#include "MCU_UART.H"
#include "LCD.H"



int RDCOUNT = 0;
unsigned char data MP3_Framehead[4]; 

unsigned char SONG[88];	 //Not more than 8 songs
unsigned char data CurrentFun = SELECTSONG;
unsigned char data PlayState = STOP;
unsigned char data NowPlaying = 0;
unsigned char data NumofSong = 0;
unsigned char data MP3InitFlag= 1;
unsigned char data ChangeSong = 0; 

unsigned char data KeyState = 0,KeyState1 = 0; 



static void PllInit(void);
static void MP3Init(void);
static void AudioInit();



void MP3FsInit(unsigned char NDIV, unsigned int RDIV, unsigned char MPCD, unsigned char AUCD)
{
	PLLNDIV = 0;
	PLLRDIV = 0;
	MP3CLK = 0;
	AUDCLK = 0;
//PLLclk=(OSCclk*(RDIV+1))/(int)(NDIV+1)
	PLLNDIV	= 0x7f&NDIV;           //set NDIV                  
	PLLCON	|= (0x3&RDIV) << 6;    //set RDIV                  
	PLLRDIV	= (0x3ff&RDIV) >> 2;   

//MP3CLK=PLLCLK/(int)(MPCD+1)
	MP3CLK |= MPCD;

//AUDCLK=PLLCLK/(int)(AUCD+1)
	AUDCLK  |= AUCD;             

}

void PllInit(void)
{
	CKCON |= X2;
	PLLCON &= (~PLLRES);                             //Enable PLL
	PLLCON |= PLLEN;
}

void MP3Init(void)
{
	MP3VOR = 0x0a;
	MP3VOL = 0x0a;
	MP3BAS = 0x10;
	MP3MED = 0x10;
	MP3TRE = 0x10;

	MP3CON &= (~MSKREQ);	                          //Clear to allow the 
	                                                  //MPREQ flag to generate a MP3 interrupt.
	MP3CON |= MPEN;	                                  //enable the MP3 decoder.
}

void AudioInit()
{	
    unsigned char i = 10;
	AUDCON0 = 0x77;                                    //0111 0110
	AUDCON1 &= (~0xB0);                                //SRC=0,MSREQ=0,MUDRN=0
	AUDCON1 |= 0x01;
	while (i)i--;
	AUDCON1 |= 0x40;
}

void MP3_Init(void)
{
	PllInit();
	MP3Init();
	AudioInit();
}

char PlayInit(unsigned char *SongName)
{
		int i = 0, j = 0, f = 0;
		int k = 0;
		unsigned int total_size;
		DataRead = 0;
		RDCOUNT = ReadSector(SongName, Page_Buf);      //Read 512 Bytes at first
        if(RDCOUNT==0) 
		   return 0;
/*		when the first 3 bytes are 49 44 33 the next can be 03,this means ID3 V2.3  */
			if (Page_Buf[0] == 0x49)
				if ((Page_Buf[1] == 0x44) && (Page_Buf[2] == 0x33))
				{
/**********		 search the 7th-10th bytes,use the formular to calculate ***********/
					total_size = (Page_Buf[6] & 0x7F) * 0x200000 + (Page_Buf[7] & 0x7F) * 0x4000 + (Page_Buf[8] & 0x7F) * 0x80 + (Page_Buf[9] & 0x7F);

					while (total_size > 512)
					{
						ReadSector(SongName, Page_Buf);
						total_size -=512;
					}

					i = total_size;
				}


			if (Page_Buf[i] != 0xFF)	 //if not 0xFF,there is not the Frame head, but extend label 
				i += 10;				 //then add 10 Bytes

			                                                                 
			if ((Page_Buf[i] == 0xFF) && (Page_Buf[i + 1] & 0xF0 == 0xF0))//get MP3 information from FF FX XX XX 4bytes,
			{
				MP3_Framehead[0] = Page_Buf[i];
				MP3_Framehead[1] = Page_Buf[i + 1];
				MP3_Framehead[2] = Page_Buf[i + 2];
				MP3_Framehead[3] = Page_Buf[i + 3];
			}

			if (MP3_Framehead[1] & 0x08) 
			{
				switch ((MP3_Framehead[2] & 0x0C) >> 2) 
				{
					case 0x00 : MP3FsInit(24, 126, 3, 5); break;          //Fs=44.1kHz
					case 0x01 : MP3FsInit(124, 575, 3, 4); break;         //Fs=48kHz
					case 0x02 : MP3FsInit(124, 511, 3, 9); AUDCON0 = 0x76; break;//Fs=32kHz
					default : break;
				}
			} 
			else 
			{
				switch ((MP3_Framehead[2] & 0x0C) >> 2)
				{
					case 0x00 : MP3FsInit(24, 126, 3, 11); break;         //Fs=22.05kHz
					case 0x01 : MP3FsInit(124, 575, 3, 9); break;         //Fs=24kHz
					case 0x02 : MP3FsInit(124, 511, 3, 19); AUDCON0 = 0x76; break;  //Fs=16kHz
					default : break;
				}
			}
							
			
			return 1; 
}

void PlayMP3(unsigned char *SongName)
{
	int i =0,m =0;

	while (1)
		{   
 			RDCOUNT = ReadSector(SongName, Page_Buf); 
			for (i=0; i<RDCOUNT; i++) 
			{
				while (!(MP3STA1 & MPBREQ)); 
				MP3DAT = Page_Buf[i]; 
			}
			

		
//////////////////////////////////////////for LCD display					
			KeyState1=KeyState;		
		    do{
			    switch(KeyState)
				 {  case 0: break;
				    case 1: LCD_printen(72,2,"VOLUME");break;
				    case 2: LCD_printen(72,2,"TONE  ");break;
					case 3: LCD_printen(72,2,LCD_chstr);
							if(PlayState)
							   LCD_printen(72,3,"PLAY..");
							  else
							   LCD_printen(72,3,"STOP..");
							break;
					case 4: LCD_printen(72,3,"Down 1");break;
					case 5: LCD_printen(72,3,"Down 2");break;
					case 6:	LCD_printen(72,3,"Up 1  ");break;
				   	case 7:	LCD_printen(72,3,"Up 2  ");break;
				   	case 8:	LCD_printen(72,3,"STOP..");break;
				   	case 9:	LCD_printen(72,3,"PLAY..");break;
				   
				  }
				//
			   
			   }while (!PlayState);	  //Pause control
//////////////////////////////////////////			
			if(KeyState==KeyState1) KeyState = 0;
			
			if (ChangeSong) 
			{ 
				DataRead = 0;
				ChangeSong = 0;
				m =1;
			}

			if (RDCOUNT < 512) 
			{
				NowPlaying++;
				MP3InitFlag = 1;
				m =1;
			}

			if(m)
 			 {  
			    while(MP3STA1 & MPFREQ)
			      MP3DAT = 0x00;
				return;
			  }
		}
	
}




void Func()
{
		if (CurrentFun < 3)
 			CurrentFun++;
		else if (CurrentFun == 3)
			CurrentFun = 1;

        switch(CurrentFun)
		{case VOLUME:     KeyState = 1;
		                  //LCD_printen(72,2,"VOLUME");
		                  break;
		 case EFFECTION:  KeyState = 2;
		                  //LCD_printen(72,2,"TONE  ");
		 				  break;
		 case SELECTSONG: KeyState = 3;
		                  //LCD_printen(72,2,"      ");
		 				  break;
		}

 

}


void Next()
{
	switch (CurrentFun)
	{
		case VOLUME	:
			   	if (MP3VOR > 0x00) 
				{
					MP3VOR -= 0x01;
					MP3VOL -= 0x01;
					KeyState = 4; 
					//LCD_printen(72,3,"Down 1");
				}
				break;
			
		case EFFECTION : 
			    if (MP3BAS > 2)
				{
					MP3BAS -= 2;
					MP3TRE += 2;
					KeyState = 5;
					//LCD_printen(72,3,"Down 2");
				}
				break;
			
		case SELECTSONG	:
			  	if (NowPlaying == (NumofSong - 1))
					NowPlaying = 0; 
				else 
					NowPlaying++;	
			    MP3InitFlag = 1;
				ChangeSong = 1;	
				break;
	   default: break;
	}
		
}


void Previous()
{
	switch (CurrentFun)
	{
		case VOLUME :
			          if (MP3VOR < 0x1f)
				       {
					     MP3VOR += 0x01; 
					     MP3VOL += 0x01;
						 KeyState = 6; 
				       	 //LCD_printen(72,3,"Up 1  ");
					   }
					  break;
	
		case EFFECTION : 
			          if (MP3BAS < 0x1e)
				       {
					     MP3BAS += 2;
					     MP3TRE -= 2;
						 KeyState = 7;
						 //LCD_printen(72,3,"Up 2  ");
				       }
				      break;

		case SELECTSONG	: 
			    	  if (NowPlaying > 0)
					     NowPlaying--; 
				      else 
					     NowPlaying = NumofSong - 1;

				      MP3InitFlag = 1;
					  ChangeSong = 1;	
				      break;
	    default:      break;
	}
	
}


void PlayPause()
{
	PlayState = !PlayState;
	//Mute(!PlayState);	
    if (PlayState==0)
	   {printu("STOP..\n");
	    KeyState = 8;
		//LCD_printen(72,3,"STOP..");
		}
	   else 
	    {printu("PLAY.....\n"); 
		 KeyState = 9;  
		 //LCD_printen(72,3,"PLAY..");
		 }
}

void Mute(unsigned char sw)
{ 
    static char volume;	
    
	if(sw)
	    { 
		  volume = MP3VOL;
		  MP3VOR = 0x00;
	      MP3VOL = 0x00;
		  AUDCON1 &= (~0x01);
		  MP3CON &= (~MPEN);
    	 }
    else
	    { 
		  MP3VOR = volume;
	      MP3VOL = volume;
		  AUDCON1 |= 0x01;
		  MP3CON |= MPEN;
		 }
}

⌨️ 快捷键说明

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