?? 硬盤mp3源碼.txt
字號:
unsigned int i;
LBA=current_dir.current_cluster_number-(dbr[driver_number].root_cluster_num);
LBA=LBA*(dbr[driver_number].sectors_per_cluster)+DATA_start_sector[driver_number];
LBA2=(current_dir.current_cluster_number)/((dbr[driver_number].bytes_per_sectors)/4); //計算扇區(qū)地址
i=(current_dir.current_cluster_number)*4-LBA2*dbr[driver_number].bytes_per_sectors; //計算偏移地址
LBA2=LBA2+FAT_start_sector[driver_number];
read_IDE_sector(LBA2);
((unsigned char *)&(current_dir.current_cluster_number))[3]=buffer[i];
i++;
((unsigned char *)&(current_dir.current_cluster_number))[2]=buffer[i];
i++;
((unsigned char *)&(current_dir.current_cluster_number))[1]=buffer[i];
i++;
((unsigned char *)&(current_dir.current_cluster_number))[0]=buffer[i]; //獲取下一簇號
return LBA;
}
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
void get_nst_file(void) //獲取第n個MP3文件
{
unsigned int i,j,k,temp_count;
unsigned long int LBA;
// LBA=DATA_start_sector[driver_number];
temp_count=0;
current_dir.current_cluster_number=current_dir.first_cluster_number;
do
{
LBA=get_dir_next_sector();
for(i=0;i<dbr[driver_number].sectors_per_cluster;i++)
{
read_IDE_sector(LBA);
for(j=0;j<dbr[driver_number].bytes_per_sectors/32;j++)
{
for(k=0;k<11;k++)file.name[k]=buffer[j*32+k];
file.attribute=buffer[j*32+11];
if(is_a_mp3_file())
{
temp_count++;
if(temp_count==play_count)
{
((unsigned char *)&(file.first_cluster_number))[0]=buffer[j*32+0x15];
((unsigned char *)&(file.first_cluster_number))[1]=buffer[j*32+0x14];
((unsigned char *)&(file.first_cluster_number))[2]=buffer[j*32+0x1B];
((unsigned char *)&(file.first_cluster_number))[3]=buffer[j*32+0x1A];
((unsigned char *)&(file.length))[3]=buffer[j*32+0x1C];
((unsigned char *)&(file.length))[2]=buffer[j*32+0x1D];
((unsigned char *)&(file.length))[1]=buffer[j*32+0x1E];
((unsigned char *)&(file.length))[0]=buffer[j*32+0x1F];
file.next_cluster_number=file.first_cluster_number;
return;
}
}
}
LBA++;
}
}while(!(current_dir.current_cluster_number>=0xFFFFFFF8)); //直到文件夾結(jié)束
}
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
void get_pre_file(void) //打開上一個MP3文件,文件信息保存在file結(jié)構(gòu)中
{
if(play_count>=2)play_count--;
else {file.next_cluster_number=file.first_cluster_number;return;} //如果已到達該文件夾最前一個文件,則播放原文件
get_nst_file();
}
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
void get_next_file(void) //打開下一個MP3文件
{
play_count++;
get_nst_file();
}
////////////////////////////////////////////////////////////////////////////////////////////////
DIR xdata current_dir;
/*
Initial.c file
Created by Computer-lov Date: 2005.3.19
Copyright (c) 2005 Computer-lov
version 1.0
*/
#include "Initial.h"
#include "IDE.h"
#include "AT89C51SND1C.H"
#include "keyboard.h"
#include "hardware.h"
//////////////////////////////////////////////////
void PLL_initial(void) //PLL初始化
{
// PLLRDIV=0x02; //使用16M晶振,產(chǎn)生192M頻率
// PLLNDIV=0x00;
PLLRDIV=(0x5F)>>2; //使用20M晶振,產(chǎn)生192M頻率
PLLNDIV=0x09;
PLLCON=0xC8; //復(fù)位PLL
PLLCON=0xC2; //使能PLL
CKCON=0x01;
while(!PLOCK); //等待PLL鎖定
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void RAM_initial(void) //RAM初始化
{
AUXR=0x0C; //禁止外部RAM,使用內(nèi)部2KRAM
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void interrupt_initial(void) //中斷初始化
{
EA=0;
EAUD=0;
EMP3=0;
ES=0;
ET1=0;
EX1=0;
ET0=0;
EX0=0;
IEN1=0x10; //允許鍵盤中斷
IPH0=0x00; //優(yōu)先級設(shè)置為默認
IPH1=0x00;
IPL0=0x00;
IPL1=0x00;
EA=1;
}
//////////////////////////////////////////////////
/*void timer_initial(void)
{
}*/
//////////////////////////////////////////////////
void MP3_decoder_initial(void) //MP3解碼器初始化
{
MP3CON=0x3F;
MP3CLK=0x07; //MP3解碼時鐘為32MHz
MP3_decoder_disen(); //先停止MP3解碼器
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void DAC_initial(void) //DAC初始化
{
AUDCON0=0x72; // 256Fs
// AUDCON0=0x73; //384Fs
AUDCON1=0x00;
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void keyboard_initial(void) //鍵盤初始化
{
KBCON=0x00; //低電平觸發(fā),允許中斷
KBSTA=0x80; //允許鍵盤從休眠模式喚醒
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void system_initial(void) //系統(tǒng)開機初始化
{
IDE_DATA_L=IDE_Bus_Not_Use;
IDE_ALE=1;
IDE_ALE=0; //IDE數(shù)據(jù)總線初始化為高阻狀態(tài)
PLL_initial();
MP3_decoder_initial();
RAM_initial();
DAC_initial();
keyboard_initial();
IDE_initial();
interrupt_initial();
}
//////////////////////////////////////////////////
/* keyboard.c file
Created by Computer-lov Date: 2005.3.19
Copyright (c) 2005 Computer-lov
*/
#include "keyboard.h"
#include "AT89C51SND1C.H"
//////////////////////////////////////////////////
unsigned char key=0;
void ISR_keyboard(void) interrupt 11 //鍵盤中斷處理
{
unsigned char key_press_status;
key_press_status=KBSTA; //保存按鍵狀態(tài)
if(key)return; //如果上一次按鍵未處理,等待處理完后,再響應(yīng)新的按鍵
if(key_press_status&0x01){key=KEY_UP;} //散轉(zhuǎn)
if(key_press_status&0x02){key=KEY_FUN;}
if(key_press_status&0x04){key=KEY_DOWN;}
if(key_press_status&0x08){key=KEY_OK;}
}
//////////////////////////////////////////////////
/* MP3.C File
The MP3 play file
Created by Computer-lov date: 2005.3.19
Copyright (c) 2005 Computer-lov
version 1.0
*/
#include "AT89C51SND1C.H"
#include "Initial.h"
#include "file_system.h"
#include "IDE.H"
#include "keyboard.h"
#include "hardware.h"
#include "MP3.H"
unsigned char status; //程序運行狀態(tài)
extern unsigned char mp3_file_exist;
void DAC_start(unsigned char clk) //DAC開始工作
{
set_DAC_CLK(clk); //根據(jù)MP3文件,設(shè)置相應(yīng)的DAC時鐘頻率
DAC_interface_en();
DAC_data_request_en();
}
unsigned char function,vol,bas,med,tre; //保存音量等設(shè)置
code unsigned char MPEGVer[2][7]={"MPEG-2","MPEG-1"}; //版本顯示信息
code unsigned char Fs[8]={22,44,24,48,16,32,22,44}; //采樣率
code unsigned char DACFs[8]={33,16,30,15,46,22,33,16}; //256Fs
//code unsigned char DACFs[8]={22,10,20,9,30,15,0,0}; //384Fs
/////////////////////////// MP3 play /////////////////////////////////////////
void play(void)
{
unsigned long int LBA;
unsigned int i;
unsigned char sectors_count;
signed long int file_length;
unsigned char MPEG_inf; //用來保存MP3版本和采樣率
/*
bit0=0 vertion 2
bit0=1 bertion 1
*/
file_length=file.length;
LBA=file.next_cluster_number-(dbr[driver_number].root_cluster_num);
LBA=LBA*(dbr[driver_number].sectors_per_cluster)+DATA_start_sector[driver_number];
MP3_CRC_disen();
sectors_count = dbr[driver_number].sectors_per_cluster;
read_IDE_sector(LBA);
if(buffer[0]!=0xFF){pause();MP3_decoder_disen();DAC_interface_disen();get_next_file();key=0;return;}
//////////////////////// 從MP3偵頭中獲取采樣率和壓縮版本信息 //////////////
MPEG_inf=buffer[2]&0x0C; //采樣率
MPEG_inf>>=1;
if((buffer[1]&0x18)==0x18)MPEG_inf=MPEG_inf | 0x01; //版本1
if((buffer[1]&0x18)==0x10)MPEG_inf=MPEG_inf & (~0x01); //版本2
///////////////////////////////////////////////////////////////////////////
//////////////////////// 填充1K數(shù)據(jù) ////////////////////////////////////
for(i=0;i<512;i++)MP3DAT=buffer[i];
LBA++;
sectors_count--;
if(file_length>512)file_length-=512;
else {pause();MP3_decoder_disen();DAC_interface_disen();get_next_file();key=0;return;}
if(sectors_count==0){LBA=get_next_sector();sectors_count=dbr[driver_number].sectors_per_cluster;}
read_IDE_sector(LBA);
for(i=0;i<512;i++)MP3DAT=buffer[i];
LBA++;
sectors_count--;
if(file_length>512)file_length-=512;
else {pause();MP3_decoder_disen();DAC_interface_disen();get_next_file();key=0;return;}
if(sectors_count==0){LBA=get_next_sector();sectors_count=dbr[driver_number].sectors_per_cluster;}
MP3_decoder_en(); //啟動解碼器
DAC_start(DACFs[MPEG_inf]); //初始化DAC接口
byte_offset=512;
while(1)
{
if(key) //如果有鍵按下
{
switch (key)
{
case KEY_FUN: //功能鍵按下
{
function++;
if(function>=FUN_MAX)function=FUN_SEL;
switch (function)
{
case FUN_SEL:LED1=1;LED2=1;LED3=1;break;
case FUN_VOL:LED1=0;LED2=1;LED3=0;break;
case FUN_BAS:LED1=1;LED2=1;LED3=0;break;
case FUN_MED:LED1=1;LED2=0;LED3=1;break;
case FUN_TRE:LED1=0;LED2=1;LED3=1;break;
case FUN_BOOT:LED1=0;LED2=0;LED3=0;break;
}
key=0;break;
}
case KEY_UP: //上翻鍵按下
{
switch (function)
{
case FUN_SEL:{MP3_decoder_disen();DAC_interface_disen();get_pre_file();key=0;return;}
case FUN_VOL:{if(vol<31)vol++;set_vol(vol);set_vor(vol);break;}
case FUN_BAS:{if(bas<31)bas++;set_bas(bas);break;}
case FUN_MED:{if(med<31)med++;set_med(med);break;}
case FUN_TRE:{if(tre<31)tre++;set_tre(tre);break;}
case FUN_BOOT:{MP3_bass_boost();break;}
}
key=0;break;
}
case KEY_DOWN: //下翻鍵按下
{
switch (function)
{
case FUN_SEL:{MP3_decoder_disen();DAC_interface_disen();get_next_file();key=0;return;}
case FUN_VOL:{if(vol>0)vol--;set_vol(vol);set_vor(vol);break;}
case FUN_BAS:{if(bas>0)bas--;set_bas(bas);break;}
case FUN_MED:{if(med>0)med--;set_med(med);break;}
case FUN_TRE:{if(tre>0)tre--;set_tre(tre);break;}
case FUN_BOOT:{MP3_no_bass_boost();break;}
}
key=0;break;
}
case KEY_OK:
{
MP3_decoder_disen();
DAC_interface_disen();
status=STOP;
key=0;
return;
}
}
}
// if(MPREQ)
{
while(MPFREQ)
{
MP3DAT=buffer[byte_offset];
byte_offset++;
if((((unsigned char *)&byte_offset)[0])&0xFE)
{
read_IDE_sector(LBA);
LBA++;
byte_offset=0;
sectors_count--;
file_length-=512;
while(MPFREQ)
{
MP3DAT=buffer[byte_offset];
byte_offset++;
// if(byte_offset>=512)break;
if((((unsigned char *)&byte_offset)[0])&0xFE)break;
}
if(file_length<=0) {pause();MP3_decoder_disen();DAC_interface_disen();get_next_file();key=0;return;}
if(sectors_count==0){LBA=get_next_sector();sectors_count=(dbr[driver_number].sectors_per_cluster);}
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////
頭文件
/*H**************************************************************************
* NAME: regsnd1.h
*----------------------------------------------------------------------------
* Copyright (c) 2003 Atmel.
*----------------------------------------------------------------------------
* RELEASE: snd1c-refd-nf-4_0_3
* REVISION: 1.6
*----------------------------------------------------------------------------
* PURPOSE:
* This file defines the T8xC51SND1 component:
* - Register SFRs
* - Bit SFRs
*****************************************************************************/
/////////////////////////////////////////////////////////////////////////////
// Edited by Computer-lov 2005.3.19
// AT89C51SND1C.H FILE
////////////////////////////////////////////////////////////////////////////
#ifndef __AT89C51SND1C_H__
#define __AT89C51SND1C_H__
#define Sfr(name,address) sfr name = address
#define Sfr16(name,address) sfr16 name = address
#define Sbit(name,reg,bit_address) sbit name = reg ^ bit_address
/*_____ I N C L U D E S ____________________________________________________*/
/*_____ M A C R O S ________________________________________________________*/
/* C51 CORE */
Sfr (A , 0xE0);
Sfr (ACC , 0xE0);
Sfr (B , 0xF0);
Sfr (PSW , 0xD0);
Sfr (SP , 0x81);
Sfr (DPL , 0x82);
Sfr (DPH , 0x83);
Sfr16 (DPTR , 0x82);
Sbit (CY , PSW , 7);
Sbit (AC , PSW , 6);
Sbit (F0 , PSW , 5);
Sbit (RS1 , PSW , 4);
Sbit (RS0 , PSW , 3);
Sbit (OV , PSW , 2);
Sbit (F1 , PSW , 1);
Sbit (P , PSW , 0);
/* SYSTEM MANAGEMENT */
Sfr (PCON , 0x87);
Sfr (AUXR , 0x8E);
Sfr (AUXR1 , 0xA2);
Sfr (NVERS , 0xFB);
/* PLL & CLOCK */
Sfr (CKCON , 0x8F);
Sfr (PLLCON , 0xE9);
Sfr (PLLDIV0 , 0xEE);
Sfr (PLLNDIV , 0xEE);
Sfr (PLLDIV1 , 0xEF);
Sfr (PLLRDIV , 0xEF);
/* INTERRUPT */
Sfr (IEN0 , 0xA8);
Sfr (IPL0 , 0xB8);
Sfr (IPH0 , 0xB7);
Sfr (IEN1 , 0xB1);
Sfr (IPL1 , 0xB2);
Sfr (IPH1 , 0xB3);
Sbit (EA , IEN0 , 7);
Sbit (EAUD , IEN0 , 6);
Sbit (EMP3 , IEN0 , 5);
Sbit (ES , IEN0 , 4);
Sbit (ET1 , IEN0 , 3);
Sbit (EX1 , IEN0 , 2);
Sbit (ET0 , IEN0 , 1);
Sbit (EX0 , IEN0 , 0);
Sbit (IPLAUD , IPL0 , 6);
Sbit (IPLMP3 , IPL0 , 5);
Sbit (IPLS , IPL0 , 4);
Sbit (IPLT1 , IPL0 , 3);
Sbit (IPLX1 , IPL0 , 2);
Sbit (IPLT0 , IPL0 , 1);
Sbit (IPLX0 , IPL0 , 0);
/* PORTS */
Sfr (P0 , 0x80);
Sfr (P1 , 0x90);
Sfr (P2 , 0xA0);
Sfr (P3 , 0xB0);
Sfr (P4 , 0xC0);
Sfr (P5 , 0xD8);
Sbit (P0_7 , P0 , 7);
Sbit (P0_6 , P0 , 6);
Sbit (P0_5 , P0 , 5);
Sbit (P0_4 , P0 , 4);
Sbit (P0_3 , P0 , 3);
Sbit (P0_2 , P0 , 2);
Sbit (P0_1 , P0 , 1);
Sbit (P0_0 , P0 , 0);
Sbit (P1_7 , P1 , 7);
Sbit (P1_6 , P1 , 6);
Sbit (P1_5 , P1 , 5);
Sbit (P1_4 , P1 , 4);
Sbit (P1_3 , P1 , 3);
Sbit (P1_2 , P1 , 2);
Sbit (P1_1 , P1 , 1);
Sbit (P1_0 , P1 , 0);
Sbit (SDA , P1 , 7);
Sbit (SCL , P1 , 6);
Sbit (KIN3 , P1 , 3);
Sbit (KIN2 , P1 , 2);
Sbit (KIN1 , P1 , 1);
Sbit (KIN0 , P1 , 0);
Sbit (P2_7 , P2 , 7);
Sbit (P2_6 , P2 , 6);
Sbit (P2_5 , P2 , 5);
Sbit (P2_4 , P2 , 4);
Sbit (P2_3 , P2 , 3);
Sbit (P2_2 , P2 , 2);
Sbit (P2_1 , P2 , 1);
Sbit (P2_0 , P2 , 0);
Sbit (P3_7 , P3 , 7);
Sbit (P3_6 , P3 , 6);
Sbit (P3_5 , P3 , 5);
Sbit (P3_4 , P3 , 4);
Sbit (P3_3 , P3 , 3);
Sbit (P3_2 , P3 , 2);
Sbit (P3_1 , P3 , 1);
Sbit (P3_0 , P3 , 0);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -