找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10196|回复: 4
收起左侧

LD3320语音识别源码(51单片机+STM32)资料下载

[复制链接]
ID:224412 发表于 2018-11-15 15:49 | 显示全部楼层 |阅读模式
史上最全!!!LD3320语音识别模块资料,经测试,本资料是没问题,压缩包里包含原理图,接线图,以及LD3320芯片手册和PCB库参考文件等诸多资料

模块外形2

模块外形2

模块外形1

模块外形1

目录1

目录1

目录2

目录2


1、本程序工程采用keil4编译通过,如打不开或出现错误,请按照keil 4编译器。

电路原理图如下:
0.png

stm32单片机程序源程序如下:
  1. /***************************飞音云电子****************************
  2. **  文件名称:LDV4语音识别开发板 基础版驱动程序
  3. **        CPU: STM32f103RCT6
  4. **        晶振:8MHZ
  5. **        波特率:9600 bit/S
  6. **  说明:本程序 具备语音识别、串口通信、开发板基本功能演示。
  7. ** 说明:本程序修改于 ICRoute公司 配套的源程序,版权归其所有。
  8. ***************************飞音云电子******************************/
  9. #include "includes.h"

  10. /*************端口信息********************
  11. * 接线说明
  12. LD3320接口           STM32接口
  13. * RST              PB6
  14. * CS                   PB8
  15. * WR/SPIS          PB9
  16. * P2/SDCK          PB3
  17. * P1/SDO           PB4
  18. * P0/SDI           PB5
  19. * IRQ              PC1
  20. * A0                        PB7
  21. * RD               PA0
  22. --------------------------
  23. * K1               RST (复位键)
  24. * K2               PA1 (U盘处罚按键)
  25. * K3               PA2 (未定义功能)

  26. * LED1             PC4 (流水灯)
  27. * LED2             PC2 (流水灯)
  28. * LED3             PC3 (流水灯)
  29. * LED4             PC0 (流水灯)
  30. *****************************************/



  31. /************************************************************************************
  32. //        nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
  33. //        LD_ASR_NONE:                表示没有在作ASR识别
  34. //        LD_ASR_RUNING:                表示LD3320正在作ASR识别中
  35. //        LD_ASR_FOUNDOK:                表示一次识别流程结束后,有一个识别结果
  36. //        LD_ASR_FOUNDZERO:        表示一次识别流程结束后,没有识别结果
  37. //        LD_ASR_ERROR:                表示一次识别流程中LD3320芯片内部出现不正确的状态
  38. *********************************************************************************/

  39. uint8 nAsrStatus=0;        
  40. void LD3320_Init(void);
  41. uint8 RunASR(void);
  42. void ProcessInt0(void);
  43. void LD3320_EXTI_Cfg(void);
  44. void LD3320_Spi_cfg(void);
  45. void LD3320_GPIO_Cfg(void);
  46. void LED_gpio_cfg(void);
  47. extern void PrintComBit(USART_TypeDef* USARTx, uint8_t Data);
  48. /***********************************************************
  49. * 名    称: LD3320_main(void)
  50. * 功    能: 主函数LD3320程序入口
  51. * 入口参数:  
  52. * 出口参数:
  53. * 说    明:
  54. * 调用方法:
  55. **********************************************************/
  56. void  LD3320_main(void)
  57. {
  58.         uint8 nAsrRes=0;
  59.         LD3320_Init();         
  60.         Glide_LED();
  61.         while(1)
  62.         {
  63.             switch(nAsrStatus)
  64.                 {
  65.                         case LD_ASR_RUNING:
  66.                         case LD_ASR_ERROR:               
  67.                                                           break;
  68.                         case LD_ASR_NONE:
  69.                                                                 nAsrStatus=LD_ASR_RUNING;
  70.                                                                 if (RunASR()==0)        //        启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算
  71.                                                                 {               
  72.                                                                         nAsrStatus = LD_ASR_ERROR;
  73.                                                                 }
  74.                                                                 break;

  75.                         case LD_ASR_FOUNDOK:
  76.                                                                  nAsrRes = LD_GetResult( );        //识别成功自动 获取识别码,识别码在LDChip.h文件中,自行定义的数据                                                                                                                                                         
  77.                                                                  PrintComBit(USART1,nAsrRes ); //串口输出识别码                                                               
  78.                                                                  Board_text(nAsrRes );//开发板测试演示部分---对识别码的进行判断做出动作 (用户亦可以添加自己的功能,例如控制IO口输出,串口数据输出等)               
  79.                                                                  nAsrStatus = LD_ASR_NONE;
  80.                                                                 break;
  81.                         
  82.                         case LD_ASR_FOUNDZERO:
  83.                         default: nAsrStatus = LD_ASR_NONE;
  84.                                          break;
  85.                         }//switch        
  86.         }// while

  87. }
  88. /***********************************************************
  89. * 名    称:LD3320_Init(void)
  90. * 功    能:模块驱动端口初始配置
  91. * 入口参数:  
  92. * 出口参数:
  93. * 说    明:
  94. * 调用方法:
  95. **********************************************************/
  96. void LD3320_Init(void)
  97. {
  98.         LD3320_GPIO_Cfg();        
  99.         LD3320_EXTI_Cfg();
  100.         LD3320_Spi_cfg();         
  101.         LED_gpio_cfg();
  102.         LD_reset();
  103.         
  104. }
  105. /***********************************************************
  106. * 名    称:        RunASR(void)
  107. * 功    能:        运行ASR
  108. * 入口参数:  
  109. * 出口参数:
  110. * 说    明:
  111. * 调用方法:
  112. **********************************************************/
  113. uint8 RunASR(void)
  114. {
  115.         uint8 i=0;
  116.         uint8 asrflag=0;
  117.         for (i=0; i<5; i++)                        //        防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
  118.         {
  119.                 LD_AsrStart();                        //初始化ASR
  120.                 LD3320_delay(100);
  121.                 if (LD_AsrAddFixed()==0)        //添加关键词语到LD3320芯片中
  122.                 {
  123.                         LD_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  124.                         LD3320_delay(50);                        //        并从初始化开始重新ASR识别流程
  125.                         continue;
  126.                 }

  127.                 LD3320_delay(10);

  128.                 if (LD_AsrRun() == 0)
  129.                 {
  130.                         LD_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  131.                         LD3320_delay(50);                        //        并从初始化开始重新ASR识别流程
  132.                         continue;
  133.                 }

  134.                 asrflag=1;
  135.                 break;                                        //        ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
  136.         }

  137.         return asrflag;
  138. }

  139. /***********************************************************
  140. * 名    称: void Delay_( int i)
  141. * 功    能: 短延时
  142. * 入口参数:  
  143. * 出口参数:
  144. * 说    明:
  145. * 调用方法:
  146. **********************************************************/
  147. void Delay_( int i)
  148. {     
  149.     while( i--)
  150.        {        

  151.         }
  152. }        
  153. /***********************************************************
  154. * 名    称:        LD3320_delay(unsigned long uldata)
  155. * 功    能:        长延时函数
  156. * 入口参数:  
  157. * 出口参数:
  158. * 说    明:
  159. * 调用方法:
  160. **********************************************************/
  161. void  LD3320_delay(unsigned long uldata)
  162. {
  163.         unsigned int j  =  0;
  164.         unsigned int g  =  0;
  165.         for (j=0;j<5;j++)
  166.         {
  167.                 for (g=0;g<uldata;g++)
  168.                 {
  169.                         Delay_(120);
  170.                 }
  171.         }
  172. }


  173. /***********************************************************
  174. * 名    称:LD3320_GPIO_Cfg(void)
  175. * 功    能:初始化需要用到的IO口
  176. * 入口参数:  
  177. * 出口参数:
  178. * 说    明:
  179. * 调用方法:
  180. **********************************************************/
  181. void LD3320_GPIO_Cfg(void)
  182. {        
  183.             GPIO_InitTypeDef GPIO_InitStructure;
  184.                 // 配置PA8 输出         8M 波形        
  185.                 //定义RST/A0/CS端口
  186.          {
  187.                  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);
  188.                 //LD_CS        /RSET
  189.                 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
  190.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  191.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  192.                 GPIO_Init(GPIOB,&GPIO_InitStructure);
  193.                 GPIO_SetBits(GPIOB,GPIO_Pin_7);        /*A0默认拉高*/
  194.          }
  195. }
  196. /***********************************************************
  197. * 名    称:LD3320_Spi_cfg(void)
  198. * 功    能:配置SPI功能和端口初始化
  199. * 入口参数:  
  200. * 出口参数:
  201. * 说    明:
  202. * 调用方法:
  203. **********************************************************/
  204. void LD3320_Spi_cfg(void)
  205. {
  206.         SPI_InitTypeDef  SPI_InitStructure;
  207.         GPIO_InitTypeDef GPIO_InitStructure;
  208.   //spi端口配置
  209.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3 | RCC_APB2Periph_GPIOB,ENABLE);           //使能SPI3外设时钟
  210.   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

  211.         //P0/P1/P2
  212.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3;
  213.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  214.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  215.         GPIO_Init(GPIOB,&GPIO_InitStructure);

  216.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                        //spis 片选        WR
  217.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  218.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  219.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  220.   
  221.         LD_CS_H();
  222.         
  223.         //spi功能配置
  224.         SPI_Cmd(SPI3, DISABLE);
  225.         /* SPI3 配置 */
  226.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   //全双工
  227.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                   //主模式
  228.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                           //8位
  229.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                                   //时钟极性 空闲状态时,SCK保持低电平
  230.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                                                   //时钟相位 数据采样从第一个时钟边沿开始
  231.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                           //软件产生NSS
  232.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;   //波特率控制 SYSCLK/128
  233.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                   //数据高位在前
  234.         SPI_InitStructure.SPI_CRCPolynomial = 7;                                                           //CRC多项式寄存器初始值为7
  235.         SPI_Init(SPI3, &SPI_InitStructure);
  236.         /* 使能SPI3 */
  237.         SPI_Cmd(SPI3, ENABLE);
  238. }
  239. /***********************************************************
  240. * 名    称: LD3320_EXTI_Cfg(void)
  241. * 功    能: 外部中断功能配置和相关端口配置
  242. * 入口参数:  
  243. * 出口参数:
  244. * 说    明:
  245. * 调用方法:
  246. **********************************************************/
  247. void LD3320_EXTI_Cfg(void)
  248. {
  249.   EXTI_InitTypeDef EXTI_InitStructure;
  250.         NVIC_InitTypeDef NVIC_InitStructure;
  251.   GPIO_InitTypeDef GPIO_InitStructure;

  252.   //定义IRQ中断引脚配置
  253.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  254.   GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
  255.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  256.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  257.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  258.         //外部中断线配置
  259.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);
  260.   EXTI_InitStructure.EXTI_Line = EXTI_Line1;
  261.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  262.   EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
  263.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  264.   EXTI_Init(&EXTI_InitStructure);
  265.   EXTI_GenerateSWInterrupt(EXTI_Line1);
  266.                
  267.         GPIO_SetBits(GPIOC,GPIO_Pin_1);         //默认拉高中断引脚

  268.         EXTI_ClearFlag(EXTI_Line1);
  269.         EXTI_ClearITPendingBit(EXTI_Line1);
  270.         //中断嵌套配置
  271.   NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  272.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  273.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  274.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  275.   NVIC_Init(&NVIC_InitStructure);
  276. }


  277. /***********************************************************
  278. * 名    称:  EXTI1_IRQHandler(void)
  279. * 功    能: 外部中断函数
  280. * 入口参数:  
  281. * 出口参数:
  282. * 说    明:
  283. * 调用方法:
  284. **********************************************************/
  285. void EXTI1_IRQHandler(void)
  286. {
  287.         if(EXTI_GetITStatus(EXTI_Line1)!= RESET )
  288.         {
  289.                  ProcessInt0();
  290.                 EXTI_ClearFlag(EXTI_Line1);
  291.                 EXTI_ClearITPendingBit(EXTI_Line1);
  292.         }
  293. }
复制代码

51单片机程序:
  1. /*************************飞音云电子******************************************
  2. **        版权所有:Copyright (c) 2005 - 2010 ICRoute INC.
  3. **        CPU: STC89LE52
  4. **        晶振:22.1184MHZ
  5. **        波特率:9600 bit/S
  6. **  说明:本工程只具有 语音识别功能。属基本驱动代码,
  7.                                         附加串口、如不需要用到可
  8.                                         屏蔽删除,根据需要自行移植到相关的单片机上。
  9. 本程序中带/*text.....*///为串口打印输出提示内容,查看工作状态使用的,可以全部删除

  10. /************************************************************************************/
  11. #include "config.h"

  12. /************************************************************************************/
  13. //        nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
  14. //        LD_ASR_NONE:                表示没有在作ASR识别
  15. //        LD_ASR_RUNING:                表示LD3320正在作ASR识别中
  16. //        LD_ASR_FOUNDOK:                表示一次识别流程结束后,有一个识别结果
  17. //        LD_ASR_FOUNDZERO:        表示一次识别流程结束后,没有识别结果
  18. //        LD_ASR_ERROR:                表示一次识别流程中LD3320芯片内部出现不正确的状态
  19. /***********************************************************************************/
  20. uint8 idata nAsrStatus=0;        
  21. extern void   _nop_     (void);
  22. void MCU_init();
  23. uint8 RunASR();
  24. void ProcessInt0(); //识别处理函数
  25. void  delay(unsigned long uldata);
  26. /************************************************************************
  27. 功能描述: 主函数程序入口
  28. 入口参数:        none
  29. 返 回 值:         none
  30. 其他说明:        none
  31. **************************************************************************/
  32. void  main()
  33. {
  34.         uint8 idata nAsrRes;
  35.         uint8 i=0;

  36.         MCU_init();
  37.         LD_Reset();
  38.         UartIni(); /*串口初始化*/
  39.         nAsrStatus = LD_ASR_NONE;                //        初始状态:没有在作ASR
  40.         PrintCom("串口运行中....\n"); /*text.....*/
  41.         PrintCom("口令:1、代码测试\n"); /*text.....*/
  42.         PrintCom("        2、开发板验证\n"); /*text.....*/
  43.         PrintCom("        3、检查完毕\n"); /*text.....*/

  44.         while(1)
  45.         {
  46.                 switch(nAsrStatus)
  47.                 {
  48.                         case LD_ASR_RUNING:
  49.                         case LD_ASR_ERROR:               
  50.                                 break;
  51.                         case LD_ASR_NONE:
  52.                         {
  53.                                 nAsrStatus=LD_ASR_RUNING;
  54.                                 if (RunASR()==0)        /*        启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
  55.                                 {
  56.                                         nAsrStatus = LD_ASR_ERROR;
  57.                                 }
  58.                                 break;
  59.                         }

  60.                         case LD_ASR_FOUNDOK: /*        一次ASR识别流程结束,去取ASR识别结果*/
  61.                         {
  62.                                 
  63.                                 nAsrRes = LD_GetResult();                /*获取结果*/
  64.                                 PrintCom("\n识别码:"); /*text.....*/
  65.                                 UARTSendByte(nAsrRes+0x30); /*text.....*/                                
  66.                                  switch(nAsrRes)                   /*对结果执行相关操作,客户修改*/
  67.                                   {
  68.                                           case CODE_DMCS:                        /*命令“测试”*/
  69.                                                         PrintCom("“代码测试”命令识别成功\n"); /*text.....*/
  70.                                                                                                                  break;
  71.                                                 case CODE_KFBYZ:         /*命令“全开”*/
  72.                                                         PrintCom("“开发板验证”命令识别成功\n"); /*text.....*/
  73.                                                                                                                  break;
  74.                                                 case CODE_JCWB:                /*命令“复位”*/
  75.                                 
  76.                                                         PrintCom("“检查完毕”命令识别成功\n"); /*text.....*/
  77.                                                                                                                 break;
  78.                                                 default:break;
  79.                                         }                                

  80.                                 nAsrStatus = LD_ASR_NONE;
  81.                                 break;
  82.                         }
  83.                         case LD_ASR_FOUNDZERO:
  84.                         default:
  85.                         {
  86.                                 nAsrStatus = LD_ASR_NONE;
  87.                                 break;
  88.                         }
  89.                 }// switch         
  90.         }// while

  91. }
  92. /************************************************************************
  93. 功能描述:         单片机初始化
  94. 入口参数:
  95. 返 回 值:
  96. 其他说明:
  97. **************************************************************************/
  98. void MCU_init()
  99. {
  100.         P0 = 0xff;
  101.         P1 = 0xff;
  102.         P2 = 0xff;
  103.         P3 = 0xf7;
  104.         IE0=1;
  105.         EX0=1;
  106.         EA=1;
  107. }

  108. /************************************************************************
  109. 功能描述: 延时函数
  110. 调用函数:
  111. 入口参数:
  112. 返回函数:
  113. **************************************************************************/
  114. void  delay(unsigned long uldata)
  115. {
  116.         unsigned int j  =  0;
  117.         unsigned int g  =  0;
  118.         for (j=0;j<5;j++)
  119.         {
  120.                 for (g=0;g<uldata;g++)
  121.                 {
  122.                         _nop_();
  123.                         _nop_();
  124.                         _nop_();
  125.                 }
  126.         }
  127. }
  128. /************************************************************************
  129. 功能描述:         运行ASR识别流程
  130. 入口参数:        none
  131. 返 回 值:  asrflag:1->启动成功, 0—>启动失败
  132. 其他说明:        识别顺序如下:
  133.                                                 1、RunASR()函数实现了一次完整的ASR语音识别流程
  134.                                                 2、LD_AsrStart() 函数实现了ASR初始化
  135.                                                 3、LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中
  136.                                                 4、LD_AsrRun()        函数启动了一次ASR语音识别流程                                       
  137.                                                 任何一次ASR识别流程,都需要按照这个顺序,从初始化开始
  138. **************************************************************************/
  139. uint8 RunASR()
  140. {
  141.         uint8 i=0;
  142.         uint8 asrflag=0;
  143.         for (i=0; i<5; i++)                        //        防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
  144.         {
  145.                 LD_AsrStart();
  146.                 delay(100);
  147.                 if (LD_AsrAddFixed()==0)
  148.                 {
  149.                         LD_Reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  150.                         delay(100);                        //        并从初始化开始重新ASR识别流程
  151.                         continue;
  152.                 }
  153.                 delay(10);
  154.                 if (LD_AsrRun() == 0)
  155.                 {
  156.                         LD_Reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  157.                         delay(100);                        //        并从初始化开始重新ASR识别流程
  158.                         continue;
  159.                 }
  160.                 asrflag=1;
  161.                 break;                                        //        ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
  162.         }

  163.         return asrflag;
  164. }
  165. /************************************************************************
  166. 功能描述: 中断处理函数
  167. 调用函数:
  168. 入口参数:
  169. 返回函数:
  170. **************************************************************************/
  171. void ExtInt0Handler(void) interrupt 0  
  172. {         
  173.         ProcessInt0();                                //        LD3320 送出中断信号,包括ASR和播放MP3的中断,需要在中断处理函数中分别处理
  174.         PrintCom("进入中断/n"); /*text.....*/
  175. }
复制代码


所有资料51hei提供下载:
LD3320模块开发首选资料.zip (5.04 MB, 下载次数: 312)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:636032 发表于 2019-11-5 15:04 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:642991 发表于 2019-11-16 08:39 | 显示全部楼层
Great Post!!!
回复

使用道具 举报

ID:742468 发表于 2020-5-1 19:09 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:742468 发表于 2020-5-2 11:06 | 显示全部楼层
感谢楼主分享 非常有用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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