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

📄 music.h

📁 在基于avr内核的单片机上实现MP3播放器的功能
💻 H
字号:

//=======================
uint8 WAVTICKsp=84; 
#define pang_buf_size  256
uint8 pang_buf[pang_buf_size]; 
uint8 pang_buf_sw=off;
uint8 copy_sd_buf_sw=off;
uint8 next_music_sw ;
//=====================
typedef struct 
{
    uint8     riff[4];
    uint32   file_len;
    uint8     wave[4];
    uint8      fmt[4];
    uint8      unknow1[4];
	//20====================
    uint16   format_tag;
    uint16   channels;
    uint32   sample_rate;
	//28====================
    uint32   avg_bytes_per_sec;
    uint16   block_align; 
    uint16   bits_per_sample;
	//36==================
    uint8     data[4];
    uint32   data_len;
	//44
	uint8     data_block[468];
 
} WAV_RIFF;

typedef struct
{
DATA_POSIT DirPosit;
uint16 sample_rate;

} WAVFILEHANDLE;   

WAVFILEHANDLE WavFileHd={{dir_org_clusId,0,0,ok},16000};

//读取BPB数据结构
void ReadWavInf(uint8 * inf)
//********************************************************************************************
{  uint8 i;
   uint16 j;
	WAV_RIFF* RIFF = (WAV_RIFF*)inf; //1
	
	//获取参数
	/*i=(RIFF->sample_rate)/1000;
	j=255-((164*8)/i);
	sp=j;*/
	WavFileHd.sample_rate=RIFF->sample_rate;
	
	if(RIFF->sample_rate==8000) WAVTICKsp=86;
	else if(RIFF->sample_rate==16000) WAVTICKsp=173;
	else  {i=(RIFF->sample_rate)/1000;//2.75us差
	       j=255-((166*8)/i);
	      WAVTICKsp=j;}
}

//======================
volatile uint16 ic=0; 
SIGNAL(SIG_OVERFLOW2)
{
//uint8 i;
TCNT2=WAVTICKsp;
if(ic<(512-pang_buf_size)) {OCR1AL=sd_buf[ic];ic++;/**/if(pang_buf_sw==off) {OSRdyTbl |= (0x01<<1);}}
else {
OCR1AL=pang_buf[ic-(512-pang_buf_size)];ic++;
/**/if(copy_sd_buf_sw==off) {OSRdyTbl |= (0x01<<1);}if(ic>=512) {ic=0;pang_buf_sw=off;copy_sd_buf_sw=off;}
     }
}

#define  stop         0
#define  ck           1  
#define  ck_8         2
#define  ck_64        3
#define  ck_256       4
#define  ck_1024      5
#define  cnt_down     6
#define  cnt_up       7
//=====================

#define music_off()  TCCR2=stop
#define music_on()   TCCR2=ck_8
//easy but it is urgl
void init_t2(void)
{
TCCR2=ck_8;
TIMSK|=(1<<6);//SREG|=0x80;
TCNT0=84;
} 



void MusicPlayerSev(DATA_POSIT * dir_posit)
 {              WavFileHd.DirPosit=* dir_posit;
		       music_off(); F_handle=Dir_play_next(&(BmpFileHd.DirPosit),"?.BMP");draw1pic(1,1);music_on();
		       F_handle=Dir_play_next(&(WavFileHd.DirPosit),"?.WAV");
		       Read_current_File_one_sec(&F_handle);ReadWavInf(sd_buf);
	                      next_music_sw=off;
 while(1)
    {
	  if(MouseMsg){ 
	              if(MouseMsg&(1<<RightBtn)) {Key1SW=off;}
				  else next_music_sw=on;//have a mouse mesage
		 MouseMsg=0;}//always do it  clr the msg 
      if(Key0SW) {next_music_sw=on;Key0SW=off;}
      if(Key1SW==off) {music_off();break;}	
   //=========================================
	//================================
	  cli();  
uint16	  j=ic;
	  sei();
	if(j<(512-pang_buf_size-10) && pang_buf_sw==off) 
	{CopyBytes(&sd_buf[512-pang_buf_size],&pang_buf[0],pang_buf_size);
				  pang_buf_sw=on;}
	 
        	if(j>(512-pang_buf_size)   && copy_sd_buf_sw==off )
                   {
	              clr(LedSDRd);
		       uint8 i= Read_current_File_one_sec(&F_handle);copy_sd_buf_sw=on;
		          set(LedSDRd);
	       if(i==error || next_music_sw==on) {
		       music_off(); F_handle=Dir_play_next(&(BmpFileHd.DirPosit),"?.BMP");draw1pic(1,1);music_on();
		       F_handle=Dir_play_next(&(WavFileHd.DirPosit),"?.WAV");
		       Read_current_File_one_sec(&F_handle);ReadWavInf(sd_buf);
	                      next_music_sw=off;}//end one sing ,next 
                    }
	//==========================
	OSTaskSuspend(1);			
    }
}

⌨️ 快捷键说明

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