LPC1768 MP3資料2個程序,一個實現錄音 一個實現循環播放
** 實驗名:MP3
** KEIL MDK-ARM Standard Version:4.6
** 使用外設: 3.2寸LCD
**********************************************************************************/
/**********************************************************************************
測試說明:
此程序為MP3測試例程將MP3文件拷入到2G內存卡后,插上3.2寸液晶屏,插入耳機,下載程
序上電,開始播放歌曲并且在液晶屏上顯示MP3文件名稱(這里并不支持中文顯示),調節
滑動變阻器可以改變播放聲音
***********************************
單片機源程序如下:
- /*******************************************************************************
- * 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);//設置字體為紅色
- LCD_SetBackColor(Black); //設置背景色為黑色
- ReFresh(""); //刷新屏幕
- USER_ADC_Init();
-
- SD_Init(); //初始化SD卡
- f_mount(0,&fs); //掛載文件系統
- 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轉換值
- 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); //設音量 高八位為左聲道 第八位為右聲道,這里相同
- }
- }
- 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:
** 使用外設: 3.2寸LCD mic頭 耳機
**********************************************************************************/
/**********************************************************************************
測試說明:
此程序為VS1003 MP3播放錄音測試例程,將1.mp3文件拷入到2G SD卡根目錄下面,將SD卡
插在開發板上面,插上3.2寸彩屏模塊,下載程序到開發板,彩屏顯示按鍵功能信息,
SD卡初始化成功后彩屏顯示對應信息,按下INT0鍵開始錄音,按下Key1鍵結束錄音并播放錄音
文件,按下Key2鍵播放1.mp3文件
注意:這里錄音使用外接麥克風,開發板默認沒有配置該麥克風,需要用戶另行購買焊接。
- /*******************************************************************************
- * 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, //從下一個地址開始到文件尾總字節數 (calculate after rec!)
- 'W' , 'A' , 'V' , 'E' , //wav文件格式
- 'f' , 'm' , 't' , ' ' , //波形格式標志(fmt )
- 0x14, 0x00, 0x00, 0x00, //量化結果 (0x14 = 20 bytes)
- 0x11, 0x00, // 有無壓縮編碼 (IMA ADPCM)
- 0x01, 0x00, // 通道數 單聲道 (1)
- 0x40, 0x1f, 0x00, 0x00, //采樣頻率, 0x1f40 = 8.0kHz
- 0xd7, 0x0f, 0x00, 0x00, //比特率
- 0x00, 0x01, //塊數據大小(256 bytes)
- 0x04, 0x00, //樣本數據位數(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: 外部中斷函數
- ** 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); //設置采樣率,設置為8Khz
- Vs1003_CMD_Write(SPI_AICTRL1,agc); //設置增益,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);//寫入頭數據
- ReFresh("Recode");
- while(status == 1)
- {
- idx=Vs1003_REG_Read(SPI_HDAT1);
- if((idx>=256)&&(idx<896))
- {
- idx=0;
- while(idx<512) //一次讀取512字節
- {
- 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; //真實錄音數據大小,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);//寫入頭數據
- f_close(&fsrc);
- sectorsize=0;
- }
- /*********************************************************************************************************
- ** Function name: Fatfs_test
- ** Descriptions: 文件系統寫測試
- ** 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);//設置字體為紅色
- LCD_SetBackColor(Black); //設置背景色為黑色
- 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); //掛載文件系統
- res=f_opendir(&dirs, "/");
- // VsSineTest(); //正弦波測試 ,會聽到滴答聲 ,說明VS1003 初始化通過
- // Fatfs_test(); //文件系統讀寫測試
- 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轉換值
- 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); //設音量 高八位為左聲道 第八位為右聲道,這里相同
- }
- }
- datasize+=512; //要放到上面
- bw = f_read(&fsrc,buffer,512,&br); //讀取512字節
- 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, 下載次數: 18)
2017-5-18 14:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
【21】寶馬1768_mp3循環播放(2014.05.10).rar
(236.28 KB, 下載次數: 12)
2017-5-18 14:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|