STC11L08XE驱动LD3320A进行语音识别
模块已板载STC11L08XE单片机,可以直接串口下载程序进行驱动使用。购买时可以看到已经提供了对应的USB转TTL模块可以供我们直接下载使用了。规格: 43*29.7MM供电电压: DC5VI0口输出:高电平3.3V通信方式:串口通信(3.3v TTL电平,,不支持max232,RS485)单片机: STC11L08XE 、flash–>8k、 SRAM–>1280、 eeprom–>32k。
模块简介
模块已板载STC11L08XE单片机,可以直接串口下载程序进行驱动使用。购买时可以看到已经提供了对应的USB转TTL模块可以供我们直接下载使用了。
规格: 43*29.7MM
供电电压: DC5V
I0口输出:高电平3.3V
通信方式:串口通信(3.3v TTL电平,,不支持max232,RS485)
单片机: STC11L08XE 、flash–>8k、 SRAM–>1280、 eeprom–>32k
LD3320A语音识别芯片简介
LD3320A 是一颗基于非特定人语音识别(SI-ASR:Speaker-Independent Automatic Speech Recognition)技术的语音识别/声控芯片。提供了真正的单芯片语音识别解决方案。
LD3320A 芯片上集成了高精度的 A/D 和 D/A 接口,不再需要外接辅助的Flash 和 RAM,即可以实现语音识别/声控/人机对话功能。并且,识别的关键词语列表是可以动态编辑的。 基于LD3320A,可以在任何的电子产品中,甚至包括最简单的 51 作为主控芯片的系统中,轻松实现语音识别/声控/人机对话功能。
非特定人语音识别技术:不需要用户进行录音训练
可动态编辑的识别关键词语列表:只需要把识别的关键词语以字符串的形式传送进芯片,即可以在下次识别中立即生效。比如,用户在 51 等 MCU 的编程中,简单地通过设置芯片的寄存器,把诸如“你好”这样的识别关键词的内容动态地传入芯片中,芯片就可以识别这样设定的关键词语了。
真正单芯片解决方案:不需要任何外接的辅助 Flash 和 RAM,真正降低系统成本。
内置高精度 A/D和D/A 通道通道:不需要外接 AD 芯片,只需要把麦克风接在芯片的AD 引脚上;可以播放声音文件,并提供 550mW 的内置放大器。
高准确度和实用的语音识别效果:支持用户自由编辑 50 条关键词语。在同一时刻,最多在 50 条关键词语中进行识别,终端用户可以根据场景需要,随时编辑和更新这 50 条关键词语的内容。
测试语音识别
把模块和USB转TTL对应的接线接好,然后通过stc-isp软件把程序烧录进去单片机中。
USB转TTL和模块的接线:5V-5V,TXD-RXD,RXD-TXD,GND-GND。
代码主要使用一级口令识别(“你好小优”)+二级指令("开灯"等指令)形式来控制IO口的输出和串口输出。
主函数代码:
/*** 说明:口令模式+IO控制: 即每次识别时都需要说“你好小优”这个口令 ,才能够进行下一级的识别*/
#include "config.h"
/************************************************************************************/
// nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
// LD_ASR_NONE: 表示没有在作ASR识别
// LD_ASR_RUNING: 表示LD3320正在作ASR识别中
// LD_ASR_FOUNDOK: 表示一次识别流程结束后,有一个识别结果
// LD_ASR_FOUNDZERO: 表示一次识别流程结束后,没有识别结果
// LD_ASR_ERROR: 表示一次识别流程中LD3320芯片内部出现不正确的状态
/***********************************************************************************/
uint8 idata nAsrStatus=0;
void MCU_init();
void ProcessInt0(); //识别处理函数
void delay(unsigned long uldata);
void User_handle(uint8 dat);//用户执行操作函数
void Led_test(void);//单片机工作指示
void Delay200ms();
uint8_t G0_flag=DISABLE;//运行标志,ENABLE:运行。DISABLE:禁止运行
sbit LED=P4^2;//信号指示灯
//应用IO口定义 (模块标注 P2)
sbit PA1=P1^0; //对应板上标号 P1.0
sbit PA2=P1^1; //对应板上标号 P1.1
sbit PA3=P1^2; //.....
sbit PA4=P1^3; //.....
sbit PA5=P1^4; //.....
sbit PA6=P1^5; //.....
sbit PA7=P1^6; //对应板上标号 P1.6
sbit PA8=P1^7; //对应板上标号 P1.7
void main(void)
{
uint8 idata nAsrRes;
uint8 i=0;
Led_test();
MCU_init();
LD_Reset();
UartIni(); /*串口初始化*/
nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR
#ifdef TEST
PrintCom("一级口令:你好小优\r\n"); /*text.....*/
PrintCom("二级口令:1、代码测试\r\n"); /*text.....*/
PrintCom(" 2、开发板验证\r\n"); /*text.....*/
PrintCom(" 3、开灯\r\n"); /*text.....*/
PrintCom(" 4、关灯\r\n"); /*text.....*/
PrintCom(" 5、北京\r\n"); /*text.....*/
PrintCom(" 6、上海\r\n"); /*text.....*/
PrintCom(" 7、广州\r\n"); /*text.....*/
#endif
while(1)
{
switch(nAsrStatus)
{
case LD_ASR_RUNING:
case LD_ASR_ERROR:
break;
case LD_ASR_NONE:
{
nAsrStatus=LD_ASR_RUNING;
if (RunASR()==0) /* 启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
{
nAsrStatus = LD_ASR_ERROR;
}
break;
}
case LD_ASR_FOUNDOK: /* 一次ASR识别流程结束,去取ASR识别结果*/
{
nAsrRes = LD_GetResult(); /*获取结果*/
User_handle(nAsrRes);//用户执行函数
nAsrStatus = LD_ASR_NONE;
break;
}
case LD_ASR_FOUNDZERO:
default:
{
nAsrStatus = LD_ASR_NONE;
break;
}
}// switch
}// while
}
/* 名 称: LED灯测试*/
void Led_test(void)
{
LED=~ LED;
Delay200ms();
LED=~ LED;
Delay200ms();
LED=~ LED;
Delay200ms();
LED=~ LED;
Delay200ms();
LED=~ LED;
Delay200ms();
LED=~ LED;
}
/** 名 称: void MCU_init()
* 功 能: 单片机初始化 */
void MCU_init()
{
P0 = 0xff;
P1 = 0x00;
P2 = 0xff;
P3 = 0xff;
P4 = 0xff;
P1M0=0XFF; //P1端口设置为推挽输出功能,即提高IO口驱动能力,从驱动继电器模块工作
P1M1=0X00;
LD_MODE = 0; // 设置MD管脚为低,并行模式读写
IE0=1;
EX0=1;
EA=1;
}
/* 名 称: 延时函数*/
void Delay200us() //@22.1184MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 5;
j = 73;
do
{
while (--j);
} while (--i);
}
void delay(unsigned long uldata)
{
unsigned int j = 0;
unsigned int g = 0;
while(uldata--)
Delay200us();
}
void Delay200ms() //@22.1184MHz
{
unsigned char i, j, k;
i = 17;
j = 208;
k = 27;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/* 名 称: 中断处理函数*/
void ExtInt0Handler(void) interrupt 0
{
ProcessInt0();
}
/* 名 称:用户执行函数
* 功 能:识别成功后,执行动作可在此进行修改
* 说 明: 通过控制PAx端口的高低电平,从而控制外部设备的通断*/
void User_handle(uint8 dat)
{
//UARTSendByte(dat);//串口识别码(十六进制)
if(0==dat)
{
G0_flag=ENABLE;
LED=0;
}
else if(ENABLE==G0_flag)
{
G0_flag=DISABLE;
LED=1;
switch(dat) /*对结果执行相关操作/
{
case CODE_DMCS: /*命令“测试”*/
PrintCom("“代码测试”命令识别成功\r\n"); //串口输出提示信息(可删除)
PA1=1;//让PA1端口为高电平
break;
case CODE_KFBYZ: /*命令“全开”*/
PrintCom("“开发板验证”命令识别成功\r\n");//串口输出提示信息(可删除)
PA2=1;//让PA2端口为高电平
break;
case CODE_KD: /*命令“复位”*/
PrintCom("“开灯”命令识别成功\r\n"); //串口输出提示信息(可删除)
PA3=1;//让PA3端口为高电平
break;
case CODE_GD: /*命令“复位”*/
PrintCom("“关灯”命令识别成功\r\n"); //串口输出提示信息(可删除)
PA3=0;//让PA3端口为低电平
break;
case CODE_BJ: /*命令“复位”*/
PrintCom("“北京”命令识别成功\r\n"); //串口输出提示信息(可删除)
PA4=1;//让PA4端口为高电平
break;
case CODE_SH: /*命令“复位”*/
PrintCom("“上海”命令识别成功\r\n"); //串口输出提示信息(可删除)
PA5=1;//让PA5端口为高电平
break;
case CODE_GZ: /*命令“复位”*/
PrintCom("“广州”命令识别成功\r\n"); //串口输出提示信息(可删除)
PA6=1;//让PA6端口为高电平
break;
default:PrintCom("请重新识别发口令\r\n"); //串口输出提示信息(可删除)
break;
}
}
else
{
PrintCom("请说出一级口令\r\n"); //串口输出提示信息(可删除)
}
}
测试现象
对着麦克风说一级口令"你好小优",后面再说对应的二级命令即可看到串口输出对应的字符串以及对应的IO口输出相应的高低电平(高低电平取决于程序中配置输出的为高还是低)。
(这里只放了串口的输出,IO口的输出可以评论留言获取代码自行测试哦)
更多推荐
所有评论(0)