找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6063|回复: 8
打印 上一主题 下一主题
收起左侧

YS-V0.7语音识别模块的STC11L08XE单片机驱动程序

  [复制链接]
跳转到指定楼层
楼主
ID:63146 发表于 2018-5-25 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. /***************************飞音云电子****************************
  2. **  工程名称:YS-V0.7语音识别模块驱动程序
  3. **        CPU: STC11L08XE
  4. **        晶振:22.1184MHZ
  5. **        波特率:9600 bit/S
  6. **        配套产品信息:YS-V0.7语音识别开发板
  7. **  修改日期:2013.9.13
  8. **  说明:口令模式: 即每次识别时都需要说“小杰”这个口令 ,才能够进行下一级的识别
  9. /***************************飞音云电子******************************/
  10. #include "config.h"

  11. extern void  delay(unsigned long uldata);

  12. uint8 idata ucRegVal;
  13. extern uint8 idata nAsrStatus;

  14. void ProcessInt0(void);

  15. /************************************************************************
  16. 功能描述:          复位LD模块
  17. 入口参数:         none
  18. 返 回 值:          none
  19. 其他说明:         none
  20. **************************************************************************/
  21. void LD_Reset()
  22. {
  23.         RSTB=1;
  24.         delay(5);
  25.         RSTB=0;
  26.         delay(5);
  27.         RSTB=1;

  28.         delay(5);
  29.         CSB=0;
  30.         delay(5);
  31.         CSB=1;
  32.         delay(5);
  33. }
  34. /************************************************************************
  35. 功能描述: LD模块命令初始化
  36. 入口参数: none
  37. 返 回 值: none
  38. 其他说明: 该函数为出厂配置,一般不需要修改;
  39.                                          有兴趣的客户可对照开发手册根据需要自行修改。
  40. **************************************************************************/
  41. void LD_Init_Common()
  42. {
  43.         LD_ReadReg(0x06);  
  44.         LD_WriteReg(0x17, 0x35);
  45.         delay(10);
  46.         LD_ReadReg(0x06);  

  47.         LD_WriteReg(0x89, 0x03);  
  48.         delay(5);
  49.         LD_WriteReg(0xCF, 0x43);   
  50.         delay(5);
  51.         LD_WriteReg(0xCB, 0x02);
  52.         
  53.         /*PLL setting*/
  54.         LD_WriteReg(0x11, LD_PLL_11);      

  55.         LD_WriteReg(0x1E,0x00);
  56.         LD_WriteReg(0x19, LD_PLL_ASR_19);
  57.         LD_WriteReg(0x1B, LD_PLL_ASR_1B);               
  58.   LD_WriteReg(0x1D, LD_PLL_ASR_1D);
  59.         delay(10);
  60.         
  61.     LD_WriteReg(0xCD, 0x04);
  62. //        LD_WriteReg(0x17, 0x4c);
  63.         delay(5);
  64.         LD_WriteReg(0xB9, 0x00);
  65.         LD_WriteReg(0xCF, 0x4F);
  66.         LD_WriteReg(0x6F, 0xFF);
  67. }

  68. /************************************************************************
  69. 功能描述:          LD模块 ASR功能初始化
  70. 入口参数:         none
  71. 返 回 值:          none
  72. 其他说明:         该函数为出厂配置,一般不需要修改;
  73.                                          有兴趣的客户可对照开发手册根据需要自行修改。
  74. **************************************************************************/
  75. void LD_Init_ASR()
  76. {
  77.         LD_Init_Common();
  78.         LD_WriteReg(0xBD, 0x00);
  79.         LD_WriteReg(0x17, 0x48);
  80.         delay( 10 );
  81.         LD_WriteReg(0x3C, 0x80);   
  82.         LD_WriteReg(0x3E, 0x07);
  83.         LD_WriteReg(0x38, 0xff);   
  84.         LD_WriteReg(0x3A, 0x07);
  85.   LD_WriteReg(0x40, 0);         
  86.         LD_WriteReg(0x42, 8);
  87.         LD_WriteReg(0x44, 0);   
  88.         LD_WriteReg(0x46, 8);
  89.         delay( 1 );
  90. }

  91. /************************************************************************
  92. 功能描述:         中断处理函数
  93. 入口参数:         none
  94. 返 回 值:          none
  95. 其他说明:        当LD模块接收到音频信号时,将进入该函数,
  96.                                                 判断识别是否有结果,如果没有从新配置寄
  97.             存器准备下一次的识别。
  98. **************************************************************************/
  99. void ProcessInt0(void)
  100. {
  101.         uint8 nAsrResCount=0;

  102.         EX0=0;
  103.         ucRegVal = LD_ReadReg(0x2B);
  104.         LD_WriteReg(0x29,0) ;
  105.         LD_WriteReg(0x02,0) ;
  106.         if((ucRegVal & 0x10) &&
  107.                 LD_ReadReg(0xb2)==0x21 &&
  108.                 LD_ReadReg(0xbf)==0x35)                        /*识别成功*/
  109.         {        
  110.                 nAsrResCount = LD_ReadReg(0xba);
  111.                 if(nAsrResCount>0 && nAsrResCount<=4)
  112.                 {
  113.                         nAsrStatus=LD_ASR_FOUNDOK;
  114.                 }
  115.                 else
  116.             {
  117.                         nAsrStatus=LD_ASR_FOUNDZERO;
  118.                 }        
  119.         }                                                                                                                         /*没有识别结果*/
  120.         else
  121.         {         
  122.                 nAsrStatus=LD_ASR_FOUNDZERO;
  123.         }
  124.                
  125.   LD_WriteReg(0x2b, 0);
  126.   LD_WriteReg(0x1C,0);/*写0:ADC不可用*/

  127.         LD_WriteReg(0x29,0) ;
  128.         LD_WriteReg(0x02,0) ;
  129.         LD_WriteReg(0x2B,  0);
  130.         LD_WriteReg(0xBA, 0);        
  131.         LD_WriteReg(0xBC,0);        
  132.         LD_WriteReg(0x08,1);         /*清除FIFO_DATA*/
  133.         LD_WriteReg(0x08,0);        /*清除FIFO_DATA后 再次写0*/


  134.         EX0=1;
  135. }

  136. /************************************************************************
  137. 功能描述:         运行ASR识别流程
  138. 入口参数:        none
  139. 返 回 值:  asrflag:1->启动成功, 0—>启动失败
  140. 其他说明:        识别顺序如下:
  141.                                                 1、RunASR()函数实现了一次完整的ASR语音识别流程
  142.                                                 2、LD_AsrStart() 函数实现了ASR初始化
  143.                                                 3、LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中
  144.                                                 4、LD_AsrRun()        函数启动了一次ASR语音识别流程                                       
  145.                                                 任何一次ASR识别流程,都需要按照这个顺序,从初始化开始
  146. **************************************************************************/
  147. uint8 RunASR(void)
  148. {
  149.         uint8 i=0;
  150.         uint8 asrflag=0;
  151.         for (i=0; i<5; i++)                        //        防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
  152.         {
  153.                 LD_AsrStart();
  154.                 delay(50);
  155.                 if (LD_AsrAddFixed()==0)
  156.                 {
  157.                         LD_Reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  158.                         delay(50);                        //        并从初始化开始重新ASR识别流程
  159.                         continue;
  160.                 }
  161.                 delay(10);
  162.                 if (LD_AsrRun() == 0)
  163.                 {
  164.                         LD_Reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  165.                         delay(50);                        //        并从初始化开始重新ASR识别流程
  166.                         continue;
  167.                 }
  168.                 asrflag=1;
  169.                 break;                                        //        ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
  170.         }

  171.         return asrflag;
  172. }
  173. /************************************************************************
  174. 功能描述:  检测LD模块是否空闲
  175. 入口参数:        none
  176. 返 回 值:         flag:1-> 空闲
  177. 其他说明:        none
  178. **************************************************************************/
  179. uint8 LD_Check_ASRBusyFlag_b2()
  180. {
  181.         uint8 j;
  182.         uint8 flag = 0;
  183.         for (j=0; j<10; j++)
  184.         {
  185.                 if (LD_ReadReg(0xb2) == 0x21)
  186.                 {
  187.                         flag = 1;
  188.                         break;
  189.                 }
  190.                 delay(10);               
  191.         }
  192.         return flag;
  193. }
  194. /************************************************************************
  195. 功能描述:         启动ASR
  196. 入口参数:        none
  197. 返 回 值:         none
  198. 其他说明:        none
  199. **************************************************************************/
  200. void LD_AsrStart()
  201. {
  202.         LD_Init_ASR();
  203. }
  204. /************************************************************************
  205. 功能描述:         运行ASR
  206. 入口参数:        none
  207. 返 回 值:         1:启动成功
  208. 其他说明:        none
  209. **************************************************************************/
  210. uint8 LD_AsrRun()
  211. {
  212.         EX0=0;
  213.         LD_WriteReg(0x35, MIC_VOL);
  214.         LD_WriteReg(0x1C, 0x09);
  215.         LD_WriteReg(0xBD, 0x20);
  216.         LD_WriteReg(0x08, 0x01);
  217.         delay( 1 );
  218.         LD_WriteReg(0x08, 0x00);
  219.         delay( 1 );

  220.         if(LD_Check_ASRBusyFlag_b2() == 0)
  221.         {
  222.                 return 0;
  223.         }
  224. //        LD_WriteReg(0xB6, 0xa); //识别时间         1S
  225. //        LD_WriteReg(0xB5, 0x1E); //背景音段时间 300ms
  226. //        LD_WriteReg(0xB8, 10); //结束时间

  227. //        LD_WriteReg(0x1C, 0x07); //配置双通道音频信号做为输入信号
  228.         LD_WriteReg(0x1C, 0x0b); //配置麦克风做为输入信号


  229.         LD_WriteReg(0xB2, 0xff);
  230.         delay( 1);        
  231.         LD_WriteReg(0x37, 0x06);
  232.         delay( 1 );
  233.     LD_WriteReg(0x37, 0x06);
  234.                 delay( 5 );
  235.         LD_WriteReg(0x29, 0x10);
  236.         
  237.         LD_WriteReg(0xBD, 0x00);
  238.         EX0=1;
  239.         return 1;
  240. }
  241. /************************************************************************
  242. 功能描述: 向LD模块添加关键词
  243. 入口参数: none
  244. 返 回 值: flag:1->添加成功
  245. 其他说明: 用户修改.
  246.                                          1、根据如下格式添加拼音关键词,同时注意修改sRecog 和pCode 数组的长度
  247.                                          和对应变了k的循环置。拼音串和识别码是一一对应的。
  248.                                          2、开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中
  249.            关于垃圾词语吸收错误的用法,来提供识别效果。
  250.                                          3、”xiao jie “ 为口令,故在每次识别时,必须先发一级口令“小捷”
  251. **************************************************************************/
  252. uint8 LD_AsrAddFixed()
  253. {
  254.         uint8 k, flag;
  255.         uint8 nAsrAddLength;
  256.         #define DATE_A 8   /*数组二维数值*/
  257.         #define DATE_B 20                /*数组一维数值*/
  258.         uint8 code sRecog[DATE_A][DATE_B] = {
  259.                                                                                                                                                                 "xiao jie",\               
  260.                                                                                                                                                                 "kai fa ban yan zheng",\
  261.                                                                                                                                                                  "dai ma ce shi",\
  262.                                                                                                                                                                  "kai deng",\
  263.                                                                                                                                                                  "guan deng",\
  264.                                                                                                                                                                  "bei jing",\
  265.                                                                                                                                                                  "shang hai",\
  266.                                                                                                                                                                  "guang zhou"
  267.                                                                                                                                                         };        /*添加关键词,用户修改*/
  268.         uint8 code pCode[DATE_A] = {
  269.                                                                                                                         CODE_CMD,\
  270.                                                                                                                         CODE_KFBYZ,\
  271.                                                                                                                         CODE_DMCS,\
  272.                                                                                                                         CODE_KD,\
  273.                                                                                                                         CODE_GD,\
  274.                                                                                                                         CODE_BJ,\
  275.                                                                                                                         CODE_SH,\
  276.                                                                                                                         CODE_GZ
  277.                                                                                                                  };        /*添加识别码,用户修改*/        
  278.         flag = 1;
  279.         for (k=0; k<DATE_A; k++)
  280.         {
  281.                         
  282.                 if(LD_Check_ASRBusyFlag_b2() == 0)
  283.                 {
  284.                         flag = 0;
  285.                         break;
  286.                 }
  287.                
  288.                 LD_WriteReg(0xc1, pCode[k] );
  289.                 LD_WriteReg(0xc3, 0 );
  290.                 LD_WriteReg(0x08, 0x04);
  291.                 delay(1);
  292.                 LD_WriteReg(0x08, 0x00);
  293.                 delay(1);

  294.                 for (nAsrAddLength=0; nAsrAddLength<DATE_B; nAsrAddLength++)
  295.                 {
  296.                         if (sRecog[k][nAsrAddLength] == 0)
  297.                                 break;
  298.                         LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
  299.                 }
  300.                 LD_WriteReg(0xb9, nAsrAddLength);
  301.                 LD_WriteReg(0xb2, 0xff);
  302.                 LD_WriteReg(0x37, 0x04);
  303.         }
  304.     return flag;
  305. }
  306. /************************************************************************
  307. 功能描述:         获取识别结果
  308. 入口参数:        none
  309. 返 回 值:         LD_ReadReg(0xc5 );  读取内部寄存器返回识别码。
  310. 其他说明:        none
  311. **************************************************************************/
  312. uint8 LD_GetResult()
  313. {               
  314.         return LD_ReadReg(0xc5 );
  315. }




复制代码


评分

参与人数 2黑币 +10 收起 理由
收藏傢 + 5 很给力!
569930571 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:193104 发表于 2018-10-9 17:07 | 只看该作者
可以,很好。
回复

使用道具 举报

板凳
ID:420097 发表于 2019-5-16 16:45 | 只看该作者
没有主函数的么?
回复

使用道具 举报

地板
ID:538511 发表于 2019-5-18 12:35 | 只看该作者
功能很全面!
回复

使用道具 举报

5#
ID:742468 发表于 2020-5-2 12:19 | 只看该作者
很好的分享
回复

使用道具 举报

6#
ID:766917 发表于 2020-6-6 16:53 | 只看该作者
这个很nice
回复

使用道具 举报

7#
ID:650169 发表于 2020-9-16 17:24 | 只看该作者
请问楼主有这个语音模块的开发手册吗?
回复

使用道具 举报

8#
ID:249957 发表于 2020-9-17 09:13 | 只看该作者
写的挺好!
回复

使用道具 举报

9#
ID:545457 发表于 2021-2-13 17:54 | 只看该作者
请问楼主有YS-V0.7语音识别模块的文档资料吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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