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

📄 mp3.c

📁 这是5按键读U盘MP3的程序.采用ATmega32芯片.
💻 C
字号:
#include <iom32v.h>
#include <macros.h>
#include <string.h>
#include <stdio.h>
#include "1011.h"
#include "12232.h"
#include "mp3.h"
#include "375interface.h"

unsigned int  vol=0X2020;            //音量变量
unsigned int  c;              //歌曲INDEX
unsigned char  flag=0;          //停止按键开关量

/* 以下定义的详细说明请看CH375HF9.H文件 */
#define LIB_CFG_FILE_IO			1	/* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */
#define LIB_CFG_INT_EN			0		/* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */

/* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */
#define FILE_DATA_BUF_LEN		0x0200	/* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
/* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#define CH375_INT_WIR		( PINC & 0x08 )	/* PINC.3, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */

#include "CH375HFB.H"

void mp3_pause(void)
{
while(1);
}
void	mDelaymS( UINT32 ms )
{
	UINT16	i;
	while ( ms -- ) for ( i = 2600; i != 0; i -- );
}

void test_1011(void) ;void mp3_play(char *s);
void main()
{
uint i;uchar t0,data,t1,t2;  

spi_init();
mp3_port_init();vs1011_init();vs1011_init();
SPCR = 0x50; //提速
SPSR = 0x01; //setup SPI

CH375_PORT_INIT( );	 
//lcd_init();lcd_init();lcd_display(1,1,"章英永的郭能");   
DDRD=0x00;                   //按键输入
 /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
   i=CH375LibInit( );  
   //if(i==0) test_1011();
   while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘插入 */
   mDelaymS( 200 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
	 	
/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
   for ( i = 0; i < 5; i ++ )  /* 有的U盘总是返回未准备好,不过可以被忽略 */
   { 
   if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好 */
	}
		
/* 查询磁盘物理容量 */
	//LCD_write_english_string(0,0,"DiskSize" );
	i = CH375DiskSize( );  
	data= (unsigned char)(mCmdParam.DiskSize.mDiskSizeSec >> 11);
	t1=data/100;
	//LCD_set_XY(56,0);
	//LCD_write_char(t1+48);
	data=data%100;
	t1=data/10;
	//LCD_write_char(t1+48);
	t2=data%10;
	//LCD_write_char(t2+48);
	//LCD_write_english_string(76,0,"M" );
	
/*枚举根目寻下的MP3文件*/
	while(1)
	{
	for ( c = 0; c < 255; c ++ )
	 {  /* 最多搜索前255个文件 */
				strcpy( mCmdParam.Open.mPathName,"\\*" );  /* 搜索根目录下文件名*/
				i = strlen( (char *)mCmdParam.Open.mPathName );  /* 计算文件名长度,以处理文件名结束符 */
				mCmdParam.Open.mPathName[ i ] =0xFF;  /* 将结束符替换为255说明序号在变量中 */
				CH375vFileSize=c;       /*指定搜索的序号,几乎没有上限*/
				i = CH375FileEnumer( );  /* 文件名中含有通配符*,则为搜索文件而不打开 */
				if ( i == ERR_MISS_FILE ) break;  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
				if ( i != ERR_SUCCESS ) break; /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
				if(CH375vFileSize!=0xFFFFFFFF)   /*枚举到MP3文件*/
				{
				//else LCD_write_english_string(0,5,"this is mp3file" );
				mp3_play( (char *)mCmdParam.Open.mPathName );
				}
				//else LCD_write_english_string(0,5,"directory" );
			
		}
	  }
    //播放MP3程序  
	/*mp3_play("\\神话.MP3");
	mp3_play("\\一往情深.MP3");
	mp3_play("\\温光.MP3");
	mp3_play("\\学友.MP3");
	mp3_play("\\C51\\SXY.MP3");
	test_1011();*/
}

//1011测试
  void test_1011() 
  {
   UINT16 data_pointer;UINT8 i;
   while ( 1)
    {
	data_pointer=0; 
    while(data_pointer<4800)
        { 
      if(PINB&MP3_DATA_REQ)
            {
        for(i=0;i<32;i++)
               {
         vs1011_data_write(vsBeepMP3[data_pointer]);
         data_pointer++;
                }
		if(data_pointer==4799) break;   //如果现在的数据不够了,则跳出来
            }
        }
	 }
   }
   
 //播放MP3程序  
void mp3_play(char *s)
{
uint i;uchar t0,data,t1,t2;UINT16 data_pointer;
/* 播放MP3 */
	strcpy( (char *)mCmdParam.Open.mPathName, s); 
	 /* 打开文件 */
	i=CH375FileOpen( );
	//查询当前文件的信息
	CH375FileQuery( );
	//LCD_write_english_string(0,1,"SongSize" );
	data=(unsigned char)(CH375vFileSize/102400);
	t1=data/10;
	//LCD_set_XY(56,1);
	//LCD_write_char(t1+48);
	//LCD_write_english_string(64,1,"." );	
	//LCD_set_XY(68,1);
	t2=data%10;
	//LCD_write_char(t2+48);
    //LCD_write_english_string(76,1,"M" );
    //显示开始播放
	//LCD_write_english_string(0,2,"Playing" );	
  while ( 1 )
	{	
	mCmdParam.Read.mSectorCount =1;  // 指定读取的扇区数	
	if(flag==0) CH375FileRead();       //读完后文件指针自动后移
	
	
	//按键处理程序
	    //ST/PS键按下
	  if(!(PIND&STOP))
	   {
	    delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
		if(!(PIND&STOP))
		{
		 flag^=0x01;
		 }
	   }
	  //VOLUP键按下
	  if(!(PIND&VOLDOWN))  
	   {
	    delay_nus(250);delay_nus(250);delay_nus(250);
	    if(!(PIND&VOLDOWN))  
		  {
		  vol=vol+((uint)(2<<8)+2);
		   if(vol>=0xF0F0) vol=0xF0F0; 
	       else vs1011_cmd_write(0x0b,vol);    //每次左右声道VOL减2
		  }
	   }
	  //VOLDOWN键按下
	  if(!(PIND&VOLUP)) 
	    {
		delay_nus(250);delay_nus(250);delay_nus(250);
		if(!(PIND&VOLUP)) 
		  {
		   vol=vol-((uint)(2<<8)+2);
		   if(vol<=0x0505) vol=0x0505;
		   else vs1011_cmd_write(0x0b,vol);   //每次左右声道VOL加2
	      }
		}
	   //NEXT键按下
	  if(!(PIND&NEXTSONG)) 
	    {
		delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
		
		if(!(PIND&NEXTSONG))  goto NEXT;       //跳到下一首歌曲
	    }
	    //PREV键按下
	  if(!(PIND&PREVSONG)) 
	    {
		delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
		if(!(PIND&PREVSONG))
		  {
		  c=c-2;goto NEXT;  //返回前一首歌曲
	      }
		}
	
	//处理数据
	data_pointer=0; 
    while(data_pointer<512)
        {    
            if(PINB&MP3_DATA_REQ)      //加载数据
               {
                 for(i=0;i<32;i++)
		           {
                    vs1011_data_write(FILE_DATA_BUF[data_pointer]);
                    data_pointer++;   
   	               }
				}
	  if (data_pointer==511) break;   //如果现在的数据不够了,则跳出来
	     }
	 if (mCmdParam.Read.mSectorCount<1 ) break; // 实际读出的扇区数较小则说明文件已经结束
     }
	
	NEXT: CH375FileClose( );  /* 关闭文件 */
}

⌨️ 快捷键说明

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