久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5106|回復: 1
打印 上一主題 下一主題
收起左側

LPC1768 MP3錄音和循環播放源碼等資料

[復制鏈接]
跳轉到指定樓層
樓主
ID:202201 發表于 2017-5-18 14:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
LPC1768  MP3資料2個程序,一個實現錄音 一個實現循環播放
** 實驗名:MP3
** KEIL MDK-ARM Standard Version:4.6
** 使用外設: 3.2寸LCD
**********************************************************************************/
/**********************************************************************************
測試說明:
    此程序為MP3測試例程將MP3文件拷入到2G內存卡后,插上3.2寸液晶屏,插入耳機,下載程
    序上電,開始播放歌曲并且在液晶屏上顯示MP3文件名稱(這里并不支持中文顯示),調節
    滑動變阻器可以改變播放聲音
***********************************

單片機源程序如下:
  1. /*******************************************************************************
  2.   * Company: Wang Electronic Technology Co., Ltd.
  3.   ******************************************************************************
  4.   * 文件名稱:main.c
  5.   * 功能說明:mp3播放
  6.   * 版    本:V1.1
  7.         * 作    者:jeansonm        
  8.   * 日    期:2014-4-22
  9. ********************************************************************************
  10.   * 文件名稱:
  11.   * 功能說明:
  12.   * 版    本:
  13.         * 更新作者:        
  14.   * 日    期:
  15.         * 更新原因:
  16. ********************************************************************************/           
  17. #include <LPC17xx.H>                                            
  18. #include "LCD.h"
  19. #include "string.h"
  20. #include "sys.h"
  21. #include "lcd.h"
  22. #include "ff.h"
  23. #include "config.h"
  24. #include "vs1003.h"
  25. #include "mp3.h"
  26. #include "MMC_SD.h"
  27. #include "delay.h"
  28. #include "ssp0.h"
  29. #include "adc.h"

  30. u8 MusicNumber;
  31. u8 temp;
  32. u8 count=0;

  33. u32 datasize=0;           

  34. FATFS fs;            // Work area (file system object) for logical drive
  35. FIL fsrc, fdst,fap,file;      // file objects
  36. FRESULT res,re;         // FatFs function common result code
  37. UINT br, bw,bt;;         // File R/W count
  38. FILINFO finfo,fno;
  39. DIR dirs;

  40. u8 buffer[1024]; // file copy buffer
  41. u8 flag=0;

  42. void ReFresh(u8 *p)
  43. {
  44.         LCD_Clear(Black);                        //清屏
  45.         LCD_DisplayString(60,30,"www#openmcu#com");
  46.         LCD_DisplayString(60,50,"bbs.openmcu.com");
  47.         LCD_DisplayString(60,70,"MP3 Test");
  48.         LCD_DisplayString(60,90,"Play:");
  49.         LCD_DisplayString(100,90,p);
  50. }
  51. /*****************************************************************************
  52. **   Main Function  main()
  53. ******************************************************************************/
  54. int main (void)                       
  55. {                  
  56.         u8 i;
  57.         u16 AD_value,AD_Old_value;
  58.         SystemInit();
  59.         Vs1003_Init();                                //vs1003引腳初始化
  60.         Vs1003SoftReset();                //vs1003軟件復位
  61.         LCD_Init();                                                //LCD初始化
  62.         LCD_SetTextColor(Red);//設置字體為紅色
  63.         LCD_SetBackColor(Black);        //設置背景色為黑色        
  64.         ReFresh("");                                        //刷新屏幕
  65.         USER_ADC_Init();
  66.                      
  67.         SD_Init();                                                 //初始化SD卡
  68.         f_mount(0,&fs);                                //掛載文件系統
  69.   temp= FindMusic();                //音樂查找
  70.         MusicNumber=temp;
  71.         bw = f_open(&fsrc,filename[0],FA_OPEN_EXISTING | FA_READ);                //打開第一個文件
  72.         ReFresh((u8 *)(filename[0]));

  73. //        VsSineTest(); //正弦波測試  ,會聽到滴答聲 ,說明VS1003 初始化通過
  74.   while(1)
  75.   {         
  76.                 if(datasize>=fsrc.fsize)                //到達文件尾播放完成
  77.                         flag=1;
  78.                 if(count++==10)
  79.                 {
  80.                          count=0;
  81.                          AD_value=USER_ADC_Get();        //獲取AD轉換值
  82.                         if(abs(AD_value-AD_Old_value)>30) {
  83.                                         AD_Old_value = AD_value;
  84.                                         AD_value=((AD_value*255)/4096);
  85.                                         AD_value<<=8;               
  86.                                         AD_value+=((AD_Old_value*255)/4096);         
  87.                                         Vs1003_CMD_Write(SPI_VOL,AD_value); //設音量 高八位為左聲道 第八位為右聲道,這里相同
  88.                         }
  89.                  }
  90.                  if(flag==1)  //文件播放完了
  91.                 {
  92.                         flag=0;
  93.                         if(MusicNumber--)         //下一個文件
  94.                         {
  95.                                 if(MusicNumber==0)                 //所有文件播放完了
  96.                                 {
  97.                                         MusicNumber=temp;                        //從頭開始播放
  98.                                 }
  99.                                 bw = f_open(&fsrc,filename[temp-MusicNumber],FA_OPEN_EXISTING | FA_READ);
  100.                                 ReFresh((u8 *)filename[temp-MusicNumber]);        //更新顯示
  101. ……………………

  102. …………限于本文篇幅 余下代碼請從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文件
   
    注意:這里錄音使用外接麥克風,開發板默認沒有配置該麥克風,需要用戶另行購買焊接。


  1. /*******************************************************************************
  2.   * Company: Wang Electronic Technology Co., Ltd.
  3.   ******************************************************************************
  4.   * 文件名稱:main.c
  5.   * 功能說明:mp3播放錄音
  6.   * 版    本:V1.1
  7.         * 作    者:jeansonm       
  8.   * 日    期:2014-4-26
  9. ********************************************************************************
  10.   * 文件名稱:
  11.   * 功能說明:
  12.   * 版    本:
  13.         * 更新作者:       
  14.   * 日    期:
  15.         * 更新原因:
  16. ********************************************************************************/           
  17. #include <LPC17xx.H>                                           
  18. #include "LCD.h"
  19. #include "string.h"
  20. #include "sys.h"
  21. #include "lcd.h"
  22. #include "ff.h"
  23. #include "config.h"
  24. #include "vs1003.h"
  25. #include "mp3.h"
  26. #include "MMC_SD.h"
  27. #include "delay.h"
  28. #include "ssp0.h"
  29. #include "adc.h"

  30. u8 MusicNumber;
  31. u8 temp;
  32. u8 count=0;

  33. u32 datasize=0;          

  34. FATFS fs;            // Work area (file system object) for logical drive
  35. FIL fsrc, fdst,fap,file;      // file objects
  36. FRESULT res,re;         // FatFs function common result code
  37. UINT br, bw,bt;;         // File R/W count
  38. FILINFO finfo,fno;
  39. DIR dirs;

  40. u8 buffer[1024]; // file copy buffer
  41. u8 flag=0;

  42. uint8_t wav_dat[512]={0};
  43. static u8 status=0;
  44. /** first part of RIFF Header, insert 444 zeroes after this */
  45. unsigned char RIFFHeader0[52] = {'R' , 'I' , 'F' , 'F' , //資源交換文件標志(RIFF)
  46.                                       0x70, 0x70, 0x70, 0x70, //從下一個地址開始到文件尾總字節數 (calculate after rec!)
  47.                                       'W' , 'A' , 'V' , 'E' , //wav文件格式
  48.                                       'f' , 'm' , 't' , ' ' , //波形格式標志(fmt )
  49.                                       0x14, 0x00, 0x00, 0x00, //量化結果 (0x14 = 20 bytes)
  50.                                       0x11, 0x00,             // 有無壓縮編碼 (IMA ADPCM)
  51.                                       0x01, 0x00,             // 通道數 單聲道 (1)
  52.                                       0x40, 0x1f, 0x00, 0x00, //采樣頻率, 0x1f40 = 8.0kHz
  53.                                       0xd7, 0x0f, 0x00, 0x00, //比特率
  54.                                       0x00, 0x01,             //塊數據大小(256 bytes)
  55.                                       0x04, 0x00,             //樣本數據位數(4 bits)
  56.                                       0x02, 0x00,             // Extra data (2 bytes)
  57.                                       0xf9, 0x01,             // Samples per Block (505 samples)
  58.                                       'f' , 'a' , 'c' , 't' , // Chunk ID (fact)
  59.                                       0xc8, 0x01, 0x00, 0x00, // Chunk payload size (456 bytes (zeropad!))
  60.                                       0xff, 0xff, 0xff, 0xff  // Number of Samples (calculate after rec!)
  61.                                      };                       // Insert 448 zeroes here!

  62.                                      //add 452 zeros after

  63. unsigned char RIFFHeader504[8] = {'d' , 'a' , 't' , 'a' , // Chunk ID (data)
  64.                                        0x70, 0x70, 0x70, 0x70  // Chunk payload size (calculate after rec!)
  65.                                       };
  66. /*********************************************************************************************************
  67. ** Function name:       ReFresh
  68. ** Descriptions:        屏幕更新
  69. ** input parameters:    p 顯示信息字符串
  70. ** output parameters:   無
  71. ** Returned value:      無
  72. *********************************************************************************************************/
  73. void ReFresh(u8 *p)
  74. {
  75.         LCD_Clear(Black);                        //清屏
  76.         LCD_DisplayString(60,30,"WB-Beemer Record");
  77.         LCD_DisplayString(60,50,"INT0:Start Record");
  78.         LCD_DisplayString(60,70,"Key1:Save & Paly");
  79.         LCD_DisplayString(60,90,"Key2:Paly 1.mp3");
  80.         LCD_DisplayString(60,110,p);
  81. }
  82. /*********************************************************************************************************
  83. ** Function name:       BUTTON_init
  84. ** Descriptions:        按鍵初始化
  85. ** input parameters:    無
  86. ** output parameters:   無
  87. ** Returned value:      無
  88. *********************************************************************************************************/
  89. void BUTTON_init(void)
  90. {
  91.   LPC_GPIO2->FIODIR      &= ~(1 << 10);    //初始化端口P2.10為輸入
  92.   LPC_GPIOINT->IO2IntEnF |=  (1 << 10);    //使能下降沿中斷
  93.        
  94.         LPC_GPIO2->FIODIR      &= ~(1 << 11);    //初始化端口P2.10為輸入
  95.   LPC_GPIOINT->IO2IntEnF |=  (1 << 11);    //使能下降沿中斷
  96.        
  97.         LPC_GPIO2->FIODIR      &= ~(1 << 12);    //初始化端口P2.10為輸入
  98.   LPC_GPIOINT->IO2IntEnF |=  (1 << 12);    //使能下降沿中斷

  99.   NVIC_EnableIRQ(EINT3_IRQn);              //利用IO口來做中斷,這種與EINT3通道相同
  100. }
  101. /*********************************************************************************************************
  102. ** Function name:       EINT3_IRQHandler
  103. ** Descriptions:        外部中斷函數
  104. ** input parameters:    無
  105. ** output parameters:   無
  106. ** Returned value:      無
  107. *********************************************************************************************************/
  108. void EINT3_IRQHandler()                                          
  109. {
  110.         u32 Int_status=0;
  111.         Int_status=LPC_GPIOINT->IO2IntStatF;
  112.         if(Int_status & (1<<10))
  113.         {
  114.                 LPC_GPIOINT->IO2IntClr |= (1 << 10);     //清除中斷標志位         
  115.                 status=1;
  116.         }
  117.         else if(Int_status & (1<<11))
  118.         {
  119.                 LPC_GPIOINT->IO2IntClr |= (1 << 11);     //清除中斷標志位   
  120.                 status=2;
  121.         }
  122.         else if(Int_status & (1<<12))
  123.         {
  124.                 LPC_GPIOINT->IO2IntClr |= (1 << 12);     //清除中斷標志位   
  125.                 status=3;
  126.         }
  127. }
  128. /*********************************************************************************************************
  129. ** Function name:       recoder_enter_rec_mode
  130. ** Descriptions:        進入錄音模式
  131. ** input parameters:    agc 增益
  132. ** output parameters:   無
  133. ** Returned value:      無
  134. *********************************************************************************************************/
  135. void recoder_enter_rec_mode(u16 agc)
  136. {               
  137.                 Vs1003_CMD_Write(SPI_AICTRL0,0x0012);        //設置采樣率,設置為8Khz
  138.                 Vs1003_CMD_Write(SPI_AICTRL1,agc);                //設置增益,0,自動增益.1024相當于1倍,512相當于0.5倍,最大值65535=64倍               
  139.                 Vs1003_CMD_Write(SPI_MODE,0x3804);                //MIC,錄音激活
  140.                 Vs1003_CMD_Write(SPI_BASS,0x0000);
  141.                 Vs1003_CMD_Write(SPI_CLOCKF,0X9800);
  142.                 delay_ms(200);       
  143. }
  144. /*********************************************************************************************************
  145. ** Function name:       recoder_play
  146. ** Descriptions:        開始錄音
  147. ** input parameters:    無
  148. ** output parameters:   無
  149. ** Returned value:      無
  150. *********************************************************************************************************/
  151. u8 recbuf[512]={0};       
  152. void recoder_play(void)
  153. {
  154.                 u8 res;
  155.                 u8 key;
  156.                 u32 sectorsize=0,CAL=0;
  157.                 u32 sectorCount=1;
  158.                 int i=0;
  159.                  
  160.                 u16 w;
  161.                 u16 idx=0;            
  162.                 recoder_enter_rec_mode(0x1000);
  163.                 while(Vs1003_REG_Read(SPI_HDAT1)>>8);                               

  164.                 res=f_open(&fsrc,"test.wav", FA_CREATE_ALWAYS | FA_WRITE);
  165.                 f_write(&fsrc,(const void*)wav_dat,sizeof(wav_dat),&bw);//寫入頭數據

  166.                 ReFresh("Recode");
  167.                 while(status == 1)
  168.                 {         
  169.                                 idx=Vs1003_REG_Read(SPI_HDAT1);
  170.                                 if((idx>=256)&&(idx<896))
  171.                                 {               
  172.                                         idx=0;                                       
  173.                                         while(idx<512)         //一次讀取512字節
  174.                                         {         
  175.                                                 w=Vs1003_REG_Read(SPI_HDAT0);                                               
  176.                                                 recbuf[idx++]=w>>8;
  177.                                                 recbuf[idx++]=w&0xFF;
  178.                                         }                       
  179.                                         res=f_write(&fsrc,recbuf,512,&bw);//寫入文件
  180.                                         if(res)
  181.                                         {                               
  182.                                                 ReFresh("write error");                                       
  183.                                         }               
  184.                                         sectorsize++;
  185.                                 }
  186.                 }
  187.                 Vs1003SoftReset();
  188.                 for(i=0;i<56;i++)
  189.                 {
  190.                         wav_dat[i]=RIFFHeader0[i];
  191.                 }

  192.                 for(i=52;i<504;i++)
  193.                 {
  194.                         wav_dat[i]=0;
  195.                 }

  196.                 for(i=504;i<512;i++)
  197.                 {
  198.                         wav_dat[i]=RIFFHeader504[i-504];
  199.                 }
  200.                
  201.                 CAL=(sectorsize-1)*1010;                 
  202.                 wav_dat[48]=(CAL&0xff);
  203.                 wav_dat[49]=((CAL>>8)&0xff);
  204.                 wav_dat[50]=((CAL>>16)&0xff);
  205.                 wav_dat[51]=((CAL>>24)&0xff);

  206.                 CAL=(sectorsize*512)-8;   //總長度,RIFF塊后(整個wav文件大小-8)
  207.                 wav_dat[4]=(CAL&0xff);
  208.                 wav_dat[5]=((CAL>>8)&0xff);
  209.                 wav_dat[6]=((CAL>>16)&0xff);
  210.                 wav_dat[7]=((CAL>>24)&0xff);

  211.                 CAL = (sectorsize-1)*512; //真實錄音數據大小,Data塊后
  212.                 wav_dat[508]=(CAL&0xff);
  213.                 wav_dat[509]=((CAL>>8)&0xff);
  214.                 wav_dat[510]=((CAL>>16)&0xff);
  215.                 wav_dat[511]=((CAL>>24)&0xff);
  216.                 f_lseek(&fsrc,0);                                                        //偏移到文件頭.
  217.                 f_write(&fsrc,(const void*)wav_dat,sizeof(wav_dat),&bw);//寫入頭數據
  218.                 f_close(&fsrc);
  219.                 sectorsize=0;
  220. }

  221. /*********************************************************************************************************
  222. ** Function name:       Fatfs_test
  223. ** Descriptions:        文件系統寫測試
  224. ** input parameters:    無
  225. ** output parameters:   無
  226. ** Returned value:      無
  227. *********************************************************************************************************/
  228. void Fatfs_test(void)
  229. {
  230.                 u16 i;
  231.                 for(i=0;i<=512;i++)
  232.                         recbuf[i]=i;
  233.                 res=f_open(&fsrc,"321.txt", FA_OPEN_ALWAYS | FA_WRITE );
  234.                 if(res)
  235.                 {                               
  236.                         ReFresh("open error");       
  237.                         f_close(&fsrc);                               
  238.                         while(1);
  239.                 }
  240.                 for(i=0;i<512;i++)
  241.                 {
  242.                         res=f_write(&fsrc,recbuf,512,&bw);//寫入文件
  243.                         if(res)
  244.                         {                               
  245.                                 ReFresh("test error");               
  246.                                 f_close(&fsrc);                               
  247.                                 while(1);
  248.                         }
  249.                 }
  250.                 f_close(&fsrc);
  251.                 ReFresh("test ok");
  252. }
  253.        
  254. /*****************************************************************************
  255. **   Main Function  main()
  256. ******************************************************************************/
  257. int main (void)                       
  258. {                  
  259.         u8 i;
  260.         u16 AD_value,AD_Old_value;
  261.         SystemInit();
  262.         LCD_Init();                                                //LCD初始化
  263.         LCD_SetTextColor(Red);//設置字體為紅色
  264.         LCD_SetBackColor(Black);        //設置背景色為黑色       
  265.         Vs1003_Init();                                //vs1003引腳初始化
  266.         Vs1003SoftReset();                //vs1003軟件復位
  267.        
  268.         ReFresh("");                                        //刷新屏幕
  269.         USER_ADC_Init();
  270.         BUTTON_init();
  271.                      
  272.         res=SD_Init();                                                 //初始化SD卡
  273.         if(res==0)
  274.                 ReFresh("SD Init OK!!");
  275.         f_mount(0,&fs);                                //掛載文件系統
  276.         res=f_opendir(&dirs, "/");

  277. //        VsSineTest(); //正弦波測試  ,會聽到滴答聲 ,說明VS1003 初始化通過

  278. //        Fatfs_test();        //文件系統讀寫測試
  279.   while(1)
  280.   {                        
  281.                 if(status == 1)
  282.                 {
  283.                                 recoder_play();                       
  284.                 }
  285.                 else if(status == 2)
  286.                 {
  287.                                 ReFresh("Save and Play");       
  288.                                 bw = f_open(&fsrc,"test.wav",FA_OPEN_EXISTING | FA_READ);
  289.                                 datasize=0;
  290.                                 while(status == 2)
  291.                                 {
  292.                                         if(datasize>=fsrc.fsize)                //到達文件尾播放完成
  293.                                                 break;
  294.                                         if(count++==10)
  295.                                         {
  296.                                                 count=0;
  297.                                                 AD_value=USER_ADC_Get();        //獲取AD轉換值
  298.                                                 if(abs(AD_value-AD_Old_value)>30)
  299.                                                 {
  300.                                                                 AD_Old_value = AD_value;
  301.                                                                 AD_value=((AD_value*255)/4096);
  302.                                                                 AD_value<<=8;               
  303.                                                                 AD_value+=((AD_Old_value*255)/4096);         
  304.                                                                 Vs1003_CMD_Write(SPI_VOL,AD_value); //設音量 高八位為左聲道 第八位為右聲道,這里相同
  305.                                                 }
  306.                                         }
  307.                                         datasize+=512;                                                                         //要放到上面
  308.                                         bw = f_read(&fsrc,buffer,512,&br);                //讀取512字節
  309.                                         for(i=0;i<16;i++)
  310.                                         {         
  311.                                                 while(!(LPC_GPIO0->FIOPIN&MP3_DREQ));
  312.                                                 Vs1003_DATA_Write(buffer+i*32);
  313.                                         }               
  314.                                 }
  315. ……………………

  316. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
【22】寶馬1768_mp3播放錄音(2014.05.10).rar (924.28 KB, 下載次數: 18)
【21】寶馬1768_mp3循環播放(2014.05.10).rar (236.28 KB, 下載次數: 12)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:130183 發表于 2017-9-9 15:30 | 只看該作者
樓主 vs1003的波特率如何設置 我這邊讀取寄存器一直是0
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色吧久久 | 午夜男人视频 | 久久久xx | 精品国产一区二区三区免费 | 久久国产成人午夜av影院武则天 | av网站在线播放 | 一区二区三区四区电影 | 日韩一区在线播放 | 亚洲精品9999 | 米奇7777狠狠狠狠视频 | 久久久精品国产 | 亚洲色图综合 | 久久久久久99| 精品国产乱码久久久久久影片 | 91在线成人 | 99爱国产 | 国产精品一区二区av | 亚洲精品一区二区三区中文字幕 | 成人午夜性成交 | 亚洲天堂日韩精品 | 日本精品久久 | 日韩毛片在线视频 | 亚洲视频在线播放 | 久久99精品久久久久久国产越南 | 日韩av视屏| 亚洲精品中文字幕在线 | 国产综合久久 | 综合久久久久久久 | 中文在线观看视频 | 日本黄色激情视频 | 91 中文字幕| 日韩中文一区二区三区 | 久久精品一二三影院 | 成年网站在线观看 | 欧美片网站免费 | 365夜爽爽欧美性午夜免费视频 | 成人欧美一区二区三区在线观看 | www.操.com | 毛片av免费在线观看 | 亚洲国产成人一区二区 | 不卡的av在线 |