实验名称:LD3320A语音识别控制设计接线说明:
SG90舵机模块-->单片机IO
MOTOR-->P21
VCC-->5V
GND-->GND
LD3320A语音识别模块-->单片机IO
5V-->5V
GND-->GND
TXD-->P30
RXD-->P31
JQ8900-16P语音模块-->单片机IO
VPP-->P11
GND-->GND
VCC-->5V
SPK-/SPK+-->喇叭
实验现象:系统运行后,当对语音模块说出“小芳小芳”时,收到回复信息后,开始说出控制指令,项目中已设计:
开门、关门、开灯、关灯、晚安指令,每当说控制指令前,必须先说“小芳小芳”,等待回复后才能继续。
如果没有回复,系统会提示要说对应的指令。对应指令可控制舵机和LED的开关。
注意事项:本程序适用于51全系列开发板。
首先将相应的程序烧录到LD3320,注意芯片型号,我的是STC11L48XE。
有些LD3320没有一键下载按钮,需要自己拔下VCC来再插上
然后打开串口调试助手试试吧,对着咪头说:“小芳小芳”
然后将JQ8900-16P通过USB线连接到电脑,把mp3文件复制进去。
最后把51的程序烧录到51单片机里,连接好线,就大功告成了!
制作出来的实物图如下:
单片机源程序如下:
/* 说明:口令模式: 即每次识别时都需要说“小芳小芳”这个口令 ,才能够进行下一级的识别,注释仅供参考!*/#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 Delay200ms(); void Led_test(void);//单片机工作指示 uint8_t G0_flag=DISABLE;//运行标志,ENABLE:运行。DISABLE:禁止运行 sbit LED=P4^2;//信号指示灯 sbit RELAY=P1^0; //+++ typedef unsigned char BYTE; typedef unsigned int WORD; //----------------------------------------------- /* define constants */ #define FOSC 22118400L //#define MODE1T //Timer clock mode, comment this line is 12T mode, uncomment is 1T mode #ifdef MODE1T #define T1MS (65536-FOSC/1000) //1ms timer calculation method in 1T mode A99A #else #define T1MS (65536-FOSC/12/1000) //1ms timer calculation method in 12T mode #endif #ifdef MODE1T #define T100US (65536-FOSC/10/1000) //1ms timer calculation method in 1T mode #else #define T100US (65536-FOSC/10/12/1000) //1ms timer calculation method in 12T mode #endif /* define SFR */ sbit SG90 = P1^7; /* define variables */ WORD count; //1000 times counter WORD nCount1 = 0; WORD nCount2 = 0; int bOpenDoor = 0; int nT0Count = 0; //----------------------------------------------- /* Timer0 interrupt routine */ void tm0_isr() interrupt 1 { TL0 = T100US; //reload timer0 low byte TH0 = T100US >> 8; //reload timer0 high byte nT0Count++; if(nT0Count >= 200) //20ms { nT0Count = 0; } if(bOpenDoor) { if(nT0Count >= 20) { SG90 = 0; } else { SG90 = 1; } } else { if(nT0Count >= 5) { SG90 = 0; } else { SG90 = 1; } } } /*********************************************************** * 名 称: void main(void) * 功 能: 主函数 程序入口 * 入口参数: * 出口参数: * 说 明: * 调用方法: **********************************************************/ void main(void) { uint8 idata nAsrRes; uint8 i=0; //+++ #ifdef MODE1T AUXR = 0x80; //timer0 work in 1T mode #endif TMOD = 0x21; //set timer0 as mode1 (16-bit) TL0 = T100US; //initial timer0 low byte TH0 = T100US >> 8; //initial timer0 high byte TR0 = 1; //timer0 start running ET0 = 1; //enable timer0 interrupt EA = 1; //open global interrupt switch count = 0; //initial counter Led_test(); MCU_init(); LD_Reset(); UartIni(); /*串口初始化*/ nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR // PrintCom("Test demo by Xiao Ha .\r\n"); #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) { nCount1++; // if(nCount1%10000==0) // { // nCount2++; // if(nCount2%50 == 0) // { // bOpenDoor = !bOpenDoor; // } // } 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 = 0xff; 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(); } /*********************************************************** * 名 称:用户执行函数 * 功 能:识别成功后,执行动作可在此进行修改 * 入口参数: 无 * 出口参数:无 * 说 明: **********************************************************/ void User_handle(uint8 dat) { //UARTSendByte(dat);//串口识别码(十六进制) if(0==dat) { G0_flag=ENABLE; LED=0; PrintCom("收到\r\n"); /*text.....*/ } else if(ENABLE==G0_flag) { G0_flag=DISABLE; LED=1; switch(dat) /*对结果执行相关操作,客户可删除Printcom 串口输出语句替换为其他需要控制的代码*/ { case CODE_DMCS: PrintCom("开门\r\n"); /*text.....*/ break; case CODE_KFBYZ: PrintCom("关门\r\n"); /*text.....*/ break; case CODE_KD: PrintCom("报警开\r\n"); /*text.....*/ break; case CODE_GD: PrintCom("报警关\r\n"); /*text.....*/ break; case CODE_BJ: PrintCom("开灯\r\n"); /*text.....*/ break; case CODE_SH: PrintCom("关灯\r\n"); /*text.....*/ break; case CODE_GZ: PrintCom("晚安\r\n"); /*text.....*/ break; default:PrintCom("没听清\r\n"); /*text.....*/break; } } else { PrintCom("请叫小芳小芳\r\n"); /*text.....*/ } }
复制代码