標題:
LPC1768 MP3錄音和循環(huán)播放源碼等資料
[打印本頁]
作者:
9825e4w
時間:
2017-5-18 14:52
標題:
LPC1768 MP3錄音和循環(huán)播放源碼等資料
LPC1768 MP3資料2個程序,一個實現(xiàn)錄音 一個實現(xiàn)循環(huán)播放
** 實驗名:MP3
** KEIL MDK-ARM Standard Version:4.6
** 使用外設(shè): 3.2寸LCD
**********************************************************************************/
/**********************************************************************************
測試說明:
此程序為MP3測試例程將MP3文件拷入到2G內(nèi)存卡后,插上3.2寸液晶屏,插入耳機,下載程
序上電,開始播放歌曲并且在液晶屏上顯示MP3文件名稱(這里并不支持中文顯示),調(diào)節(jié)
滑動變阻器可以改變播放聲音
***********************************
單片機源程序如下:
/*******************************************************************************
* Company: Wang Electronic Technology Co., Ltd.
******************************************************************************
* 文件名稱:main.c
* 功能說明:mp3播放
* 版 本:V1.1
* 作 者:jeansonm
* 日 期:2014-4-22
********************************************************************************
* 文件名稱:
* 功能說明:
* 版 本:
* 更新作者:
* 日 期:
* 更新原因:
********************************************************************************/
#include <LPC17xx.H>
#include "LCD.h"
#include "string.h"
#include "sys.h"
#include "lcd.h"
#include "ff.h"
#include "config.h"
#include "vs1003.h"
#include "mp3.h"
#include "MMC_SD.h"
#include "delay.h"
#include "ssp0.h"
#include "adc.h"
u8 MusicNumber;
u8 temp;
u8 count=0;
u32 datasize=0;
FATFS fs; // Work area (file system object) for logical drive
FIL fsrc, fdst,fap,file; // file objects
FRESULT res,re; // FatFs function common result code
UINT br, bw,bt;; // File R/W count
FILINFO finfo,fno;
DIR dirs;
u8 buffer[1024]; // file copy buffer
u8 flag=0;
void ReFresh(u8 *p)
{
LCD_Clear(Black); //清屏
LCD_DisplayString(60,30,"www#openmcu#com");
LCD_DisplayString(60,50,"bbs.openmcu.com");
LCD_DisplayString(60,70,"MP3 Test");
LCD_DisplayString(60,90,"Play:");
LCD_DisplayString(100,90,p);
}
/*****************************************************************************
** Main Function main()
******************************************************************************/
int main (void)
{
u8 i;
u16 AD_value,AD_Old_value;
SystemInit();
Vs1003_Init(); //vs1003引腳初始化
Vs1003SoftReset(); //vs1003軟件復位
LCD_Init(); //LCD初始化
LCD_SetTextColor(Red);//設(shè)置字體為紅色
LCD_SetBackColor(Black); //設(shè)置背景色為黑色
ReFresh(""); //刷新屏幕
USER_ADC_Init();
SD_Init(); //初始化SD卡
f_mount(0,&fs); //掛載文件系統(tǒng)
temp= FindMusic(); //音樂查找
MusicNumber=temp;
bw = f_open(&fsrc,filename[0],FA_OPEN_EXISTING | FA_READ); //打開第一個文件
ReFresh((u8 *)(filename[0]));
// VsSineTest(); //正弦波測試 ,會聽到滴答聲 ,說明VS1003 初始化通過
while(1)
{
if(datasize>=fsrc.fsize) //到達文件尾播放完成
flag=1;
if(count++==10)
{
count=0;
AD_value=USER_ADC_Get(); //獲取AD轉(zhuǎn)換值
if(abs(AD_value-AD_Old_value)>30) {
AD_Old_value = AD_value;
AD_value=((AD_value*255)/4096);
AD_value<<=8;
AD_value+=((AD_Old_value*255)/4096);
Vs1003_CMD_Write(SPI_VOL,AD_value); //設(shè)音量 高八位為左聲道 第八位為右聲道,這里相同
}
}
if(flag==1) //文件播放完了
{
flag=0;
if(MusicNumber--) //下一個文件
{
if(MusicNumber==0) //所有文件播放完了
{
MusicNumber=temp; //從頭開始播放
}
bw = f_open(&fsrc,filename[temp-MusicNumber],FA_OPEN_EXISTING | FA_READ);
ReFresh((u8 *)filename[temp-MusicNumber]); //更新顯示
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
** 實驗名:MP3錄音
** KEIL MDK-ARM Standard Version:
** 使用外設(shè): 3.2寸LCD mic頭 耳機
**********************************************************************************/
/**********************************************************************************
測試說明:
此程序為VS1003 MP3播放錄音測試例程,將1.mp3文件拷入到2G SD卡根目錄下面,將SD卡
插在開發(fā)板上面,插上3.2寸彩屏模塊,下載程序到開發(fā)板,彩屏顯示按鍵功能信息,
SD卡初始化成功后彩屏顯示對應信息,按下INT0鍵開始錄音,按下Key1鍵結(jié)束錄音并播放錄音
文件,按下Key2鍵播放1.mp3文件
注意:這里錄音使用外接麥克風,開發(fā)板默認沒有配置該麥克風,需要用戶另行購買焊接。
/*******************************************************************************
* Company: Wang Electronic Technology Co., Ltd.
******************************************************************************
* 文件名稱:main.c
* 功能說明:mp3播放錄音
* 版 本:V1.1
* 作 者:jeansonm
* 日 期:2014-4-26
********************************************************************************
* 文件名稱:
* 功能說明:
* 版 本:
* 更新作者:
* 日 期:
* 更新原因:
********************************************************************************/
#include <LPC17xx.H>
#include "LCD.h"
#include "string.h"
#include "sys.h"
#include "lcd.h"
#include "ff.h"
#include "config.h"
#include "vs1003.h"
#include "mp3.h"
#include "MMC_SD.h"
#include "delay.h"
#include "ssp0.h"
#include "adc.h"
u8 MusicNumber;
u8 temp;
u8 count=0;
u32 datasize=0;
FATFS fs; // Work area (file system object) for logical drive
FIL fsrc, fdst,fap,file; // file objects
FRESULT res,re; // FatFs function common result code
UINT br, bw,bt;; // File R/W count
FILINFO finfo,fno;
DIR dirs;
u8 buffer[1024]; // file copy buffer
u8 flag=0;
uint8_t wav_dat[512]={0};
static u8 status=0;
/** first part of RIFF Header, insert 444 zeroes after this */
unsigned char RIFFHeader0[52] = {'R' , 'I' , 'F' , 'F' , //資源交換文件標志(RIFF)
0x70, 0x70, 0x70, 0x70, //從下一個地址開始到文件尾總字節(jié)數(shù) (calculate after rec!)
'W' , 'A' , 'V' , 'E' , //wav文件格式
'f' , 'm' , 't' , ' ' , //波形格式標志(fmt )
0x14, 0x00, 0x00, 0x00, //量化結(jié)果 (0x14 = 20 bytes)
0x11, 0x00, // 有無壓縮編碼 (IMA ADPCM)
0x01, 0x00, // 通道數(shù) 單聲道 (1)
0x40, 0x1f, 0x00, 0x00, //采樣頻率, 0x1f40 = 8.0kHz
0xd7, 0x0f, 0x00, 0x00, //比特率
0x00, 0x01, //塊數(shù)據(jù)大小(256 bytes)
0x04, 0x00, //樣本數(shù)據(jù)位數(shù)(4 bits)
0x02, 0x00, // Extra data (2 bytes)
0xf9, 0x01, // Samples per Block (505 samples)
'f' , 'a' , 'c' , 't' , // Chunk ID (fact)
0xc8, 0x01, 0x00, 0x00, // Chunk payload size (456 bytes (zeropad!))
0xff, 0xff, 0xff, 0xff // Number of Samples (calculate after rec!)
}; // Insert 448 zeroes here!
//add 452 zeros after
unsigned char RIFFHeader504[8] = {'d' , 'a' , 't' , 'a' , // Chunk ID (data)
0x70, 0x70, 0x70, 0x70 // Chunk payload size (calculate after rec!)
};
/*********************************************************************************************************
** Function name: ReFresh
** Descriptions: 屏幕更新
** input parameters: p 顯示信息字符串
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void ReFresh(u8 *p)
{
LCD_Clear(Black); //清屏
LCD_DisplayString(60,30,"WB-Beemer Record");
LCD_DisplayString(60,50,"INT0:Start Record");
LCD_DisplayString(60,70,"Key1:Save & Paly");
LCD_DisplayString(60,90,"Key2:Paly 1.mp3");
LCD_DisplayString(60,110,p);
}
/*********************************************************************************************************
** Function name: BUTTON_init
** Descriptions: 按鍵初始化
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void BUTTON_init(void)
{
LPC_GPIO2->FIODIR &= ~(1 << 10); //初始化端口P2.10為輸入
LPC_GPIOINT->IO2IntEnF |= (1 << 10); //使能下降沿中斷
LPC_GPIO2->FIODIR &= ~(1 << 11); //初始化端口P2.10為輸入
LPC_GPIOINT->IO2IntEnF |= (1 << 11); //使能下降沿中斷
LPC_GPIO2->FIODIR &= ~(1 << 12); //初始化端口P2.10為輸入
LPC_GPIOINT->IO2IntEnF |= (1 << 12); //使能下降沿中斷
NVIC_EnableIRQ(EINT3_IRQn); //利用IO口來做中斷,這種與EINT3通道相同
}
/*********************************************************************************************************
** Function name: EINT3_IRQHandler
** Descriptions: 外部中斷函數(shù)
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void EINT3_IRQHandler()
{
u32 Int_status=0;
Int_status=LPC_GPIOINT->IO2IntStatF;
if(Int_status & (1<<10))
{
LPC_GPIOINT->IO2IntClr |= (1 << 10); //清除中斷標志位
status=1;
}
else if(Int_status & (1<<11))
{
LPC_GPIOINT->IO2IntClr |= (1 << 11); //清除中斷標志位
status=2;
}
else if(Int_status & (1<<12))
{
LPC_GPIOINT->IO2IntClr |= (1 << 12); //清除中斷標志位
status=3;
}
}
/*********************************************************************************************************
** Function name: recoder_enter_rec_mode
** Descriptions: 進入錄音模式
** input parameters: agc 增益
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void recoder_enter_rec_mode(u16 agc)
{
Vs1003_CMD_Write(SPI_AICTRL0,0x0012); //設(shè)置采樣率,設(shè)置為8Khz
Vs1003_CMD_Write(SPI_AICTRL1,agc); //設(shè)置增益,0,自動增益.1024相當于1倍,512相當于0.5倍,最大值65535=64倍
Vs1003_CMD_Write(SPI_MODE,0x3804); //MIC,錄音激活
Vs1003_CMD_Write(SPI_BASS,0x0000);
Vs1003_CMD_Write(SPI_CLOCKF,0X9800);
delay_ms(200);
}
/*********************************************************************************************************
** Function name: recoder_play
** Descriptions: 開始錄音
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
u8 recbuf[512]={0};
void recoder_play(void)
{
u8 res;
u8 key;
u32 sectorsize=0,CAL=0;
u32 sectorCount=1;
int i=0;
u16 w;
u16 idx=0;
recoder_enter_rec_mode(0x1000);
while(Vs1003_REG_Read(SPI_HDAT1)>>8);
res=f_open(&fsrc,"test.wav", FA_CREATE_ALWAYS | FA_WRITE);
f_write(&fsrc,(const void*)wav_dat,sizeof(wav_dat),&bw);//寫入頭數(shù)據(jù)
ReFresh("Recode");
while(status == 1)
{
idx=Vs1003_REG_Read(SPI_HDAT1);
if((idx>=256)&&(idx<896))
{
idx=0;
while(idx<512) //一次讀取512字節(jié)
{
w=Vs1003_REG_Read(SPI_HDAT0);
recbuf[idx++]=w>>8;
recbuf[idx++]=w&0xFF;
}
res=f_write(&fsrc,recbuf,512,&bw);//寫入文件
if(res)
{
ReFresh("write error");
}
sectorsize++;
}
}
Vs1003SoftReset();
for(i=0;i<56;i++)
{
wav_dat[i]=RIFFHeader0[i];
}
for(i=52;i<504;i++)
{
wav_dat[i]=0;
}
for(i=504;i<512;i++)
{
wav_dat[i]=RIFFHeader504[i-504];
}
CAL=(sectorsize-1)*1010;
wav_dat[48]=(CAL&0xff);
wav_dat[49]=((CAL>>8)&0xff);
wav_dat[50]=((CAL>>16)&0xff);
wav_dat[51]=((CAL>>24)&0xff);
CAL=(sectorsize*512)-8; //總長度,RIFF塊后(整個wav文件大小-8)
wav_dat[4]=(CAL&0xff);
wav_dat[5]=((CAL>>8)&0xff);
wav_dat[6]=((CAL>>16)&0xff);
wav_dat[7]=((CAL>>24)&0xff);
CAL = (sectorsize-1)*512; //真實錄音數(shù)據(jù)大小,Data塊后
wav_dat[508]=(CAL&0xff);
wav_dat[509]=((CAL>>8)&0xff);
wav_dat[510]=((CAL>>16)&0xff);
wav_dat[511]=((CAL>>24)&0xff);
f_lseek(&fsrc,0); //偏移到文件頭.
f_write(&fsrc,(const void*)wav_dat,sizeof(wav_dat),&bw);//寫入頭數(shù)據(jù)
f_close(&fsrc);
sectorsize=0;
}
/*********************************************************************************************************
** Function name: Fatfs_test
** Descriptions: 文件系統(tǒng)寫測試
** input parameters: 無
** output parameters: 無
** Returned value: 無
*********************************************************************************************************/
void Fatfs_test(void)
{
u16 i;
for(i=0;i<=512;i++)
recbuf[i]=i;
res=f_open(&fsrc,"321.txt", FA_OPEN_ALWAYS | FA_WRITE );
if(res)
{
ReFresh("open error");
f_close(&fsrc);
while(1);
}
for(i=0;i<512;i++)
{
res=f_write(&fsrc,recbuf,512,&bw);//寫入文件
if(res)
{
ReFresh("test error");
f_close(&fsrc);
while(1);
}
}
f_close(&fsrc);
ReFresh("test ok");
}
/*****************************************************************************
** Main Function main()
******************************************************************************/
int main (void)
{
u8 i;
u16 AD_value,AD_Old_value;
SystemInit();
LCD_Init(); //LCD初始化
LCD_SetTextColor(Red);//設(shè)置字體為紅色
LCD_SetBackColor(Black); //設(shè)置背景色為黑色
Vs1003_Init(); //vs1003引腳初始化
Vs1003SoftReset(); //vs1003軟件復位
ReFresh(""); //刷新屏幕
USER_ADC_Init();
BUTTON_init();
res=SD_Init(); //初始化SD卡
if(res==0)
ReFresh("SD Init OK!!");
f_mount(0,&fs); //掛載文件系統(tǒng)
res=f_opendir(&dirs, "/");
// VsSineTest(); //正弦波測試 ,會聽到滴答聲 ,說明VS1003 初始化通過
// Fatfs_test(); //文件系統(tǒng)讀寫測試
while(1)
{
if(status == 1)
{
recoder_play();
}
else if(status == 2)
{
ReFresh("Save and Play");
bw = f_open(&fsrc,"test.wav",FA_OPEN_EXISTING | FA_READ);
datasize=0;
while(status == 2)
{
if(datasize>=fsrc.fsize) //到達文件尾播放完成
break;
if(count++==10)
{
count=0;
AD_value=USER_ADC_Get(); //獲取AD轉(zhuǎn)換值
if(abs(AD_value-AD_Old_value)>30)
{
AD_Old_value = AD_value;
AD_value=((AD_value*255)/4096);
AD_value<<=8;
AD_value+=((AD_Old_value*255)/4096);
Vs1003_CMD_Write(SPI_VOL,AD_value); //設(shè)音量 高八位為左聲道 第八位為右聲道,這里相同
}
}
datasize+=512; //要放到上面
bw = f_read(&fsrc,buffer,512,&br); //讀取512字節(jié)
for(i=0;i<16;i++)
{
while(!(LPC_GPIO0->FIOPIN&MP3_DREQ));
Vs1003_DATA_Write(buffer+i*32);
}
}
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
【22】寶馬1768_mp3播放錄音(2014.05.10).rar
(924.28 KB, 下載次數(shù): 18)
2017-5-18 14:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
【21】寶馬1768_mp3循環(huán)播放(2014.05.10).rar
(236.28 KB, 下載次數(shù): 12)
2017-5-18 14:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
bodasister
時間:
2017-9-9 15:30
樓主 vs1003的波特率如何設(shè)置 我這邊讀取寄存器一直是0
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1