找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4508|回复: 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 单片机教程网

快速回复 返回顶部 返回列表