利用LD3320语音识别模块可以实现非特定人声语音控制单片机io口动作,而加入MP3-TF-16P语音播放模块,可以让语音识别富有灵魂的动感。
原理就是利用两个模块进行串口收发数据,实现我们想要的功能。
MP3-TF-16P模块:
LD3320语音识别模块:
/******************************************************
** 工程名称:UNV-01语音识别模块驱动程序
** CPU: STC11L08XE
** 晶振:22.1184MHZ
** 波特率:9600 bit/S
** 配套产品信息:UNV-LD3320+STC11语音识别开发板
** 修改日期:2018.5.13
** 说明:口令模式: 即每次识别时都需要说“小鹰”这个口令 ,才能够进行下一级的识别
***************************/
#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 Uart_SendCMD(int CMD ,int feedback , int dat);
void Delay200ms();
void Led_test(void);//单片机工作指示
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
sbit PA9=P4^1; //对应板上标号 P4.1
sbit PA10=P4^7; //对应板上标号 P2.7
sbit PA11=P2^6; //对应板上标号 P2.6
sbit PA12=P2^5; //对应板上标号 P2.5
sbit PA13=P2^4; //对应板上标号 P2.4
sbit PA14=P2^3; //对应板上标号 P2.3
sbit PA15=P3^3; //对应板上标号 P3.3
sbit PA16=P3^4; //对应板上标号 P3.4
/***********************************************************
* 名 称: void main(void)
* 功 能: 主函数 程序入口
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
**********************************************************/
void main(void)
{
uint8 idata nAsrRes;
uint8 i=0;
Led_test();
MCU_init();
LD_Reset();
UartIni(); /*串口初始化*/
nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR
//复位所有io为低电平
PA1 &=0x00;
PA2 &=0x00;
PA3 &=0x00;
PA4 &=0x00;
PA5 &=0x00;
PA6 &=0x00;
PA7 &=0x00;
PA8 &=0x00;
PA9 &=0x00;
PA10 &=0x00;
PA11 &=0x00;
PA12 &=0x00;
PA13 &=0x00;
PA14 &=0x00;
PA15 &=0x00;
PA16 &=0x00;
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;
}
/***********************************************************
* 名 称: void MCU_init()
* 功 能:
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
**********************************************************/
void MCU_init()
{
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
P4 = 0xff;
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;
delay(10);
Uart_SendCMD(0x03 , 0, 0x01); //播放第一首
delay(10);
}
else if(ENABLE==G0_flag)
{
G0_flag=DISABLE;
LED=1;
switch(dat)
{
case CODE_KFBYZ: /*命令“开发板验证”*/
PA1 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x02); //播放第17首
delay(50);
break;
case CODE_DKJDQ: /*命令“打开继电器”*/
PA2 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x03); //播放第3首
Delay200ms();
break;
case CODE_GBJDQ: /*命令“关闭继电器”*/
PA2 &=0x00;
delay(50);
Uart_SendCMD(0x03,0,0x04); //播放第4首
delay(50);
break;
case CODE_KD: /*命令“开灯”*/
PA3 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x08); //播放第8首
delay(50);
break;
case CODE_GD: /*命令“关灯”*/
PA3 &=0x00;
delay(50);
Uart_SendCMD(0x03,0,0x07); //播放第7首
delay(50);
break;
case CODE_DKFS: /*命令“打开风扇”*/
PA4 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x05); //播放第5首
delay(50);
break;
case CODE_GBFS: /*命令“关闭风扇”*/
PA4 &=0x00;
delay(50);
Uart_SendCMD(0x03,0,0x06); //播放第6首
delay(50);
break;
case CODE_BB: /*命令“拜拜”*/
PA5 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x09); //播放第9首
delay(50);
break;
case CODE_BFYY: /*命令“播放歌曲”*/
PA6 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x0a); //播放第9首
delay(50);
break;
case CODE_XYS: /*命令“下一曲”*/
PA7 &=0x01;
delay(50);
Uart_SendCMD(0x17,0,0x01); //循环播放01文件夹下的曲目
delay(50);
break;
case CODE_PFZL: /*命令“播放曲目”*/
PA8 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x0c); //播放平凡之路
delay(50);
break;
case CODE_MZ: /*命令“播放曲目”*/
PA9 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x10); //播放芒种
delay(50);
break;
case CODE_SN: /*命令“播放曲目”*/
PA9 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x0d); //播放少年
delay(50);
break;
case CODE_NDDA: /*命令“播放曲目”*/
PA9 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x0e); //播放你的答案
delay(50);
break;
case CODE_JL: /*命令“播放曲目”*/
PA9 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x0f); //播放惊雷
delay(50);
break;
case CODE_QYS: /*命令“播放曲目”*/
PA1 &=0x01;
delay(50);
Uart_SendCMD(0x03,0,0x11); //播放七月上
delay(50);
break;
default:
break;
}
}
else
{
}
}
最主要的功能,实现串口之间数据收发的是usart.c文件:
#include "config.h"
#define FOSC 22118400L //System frequency
uint32_t baud=9600; //UART baudrate
static int Send_buf[10] = {0} ;
/************************************************************************
函 数 名: 串口初始化
功能描述: STC10L08XE 单片机串口初始化函数
返回函数: none
其他说明: none
**************************************************************************/
void UartIni(void)
{
SCON = 0x50; //8-bit variable UART
TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode
TH1 = TL1 = -(FOSC/12/32/baud); //Set auto-reload vaule
TR1 = 1; //Timer1 start run
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
}
/************************************************************************
功能描述: 串口发送一字节数据
入口参数: DAT:带发送的数据
返 回 值: none
其他说明: none
**************************************************************************/
void UARTSendByte(uint8_t DAT)
{
ES = 0;
TI = 0;
SBUF = DAT;
while(TI==0);
TI=0;
ES = 1;
}
/*****************************************************************************************************
- 功能描述: 串口发送一帧数据
- 隶属模块: 内部
- 参数说明:
- 返回说明:
- 注:无
*****************************************************************************************************/
void SendCmd(int len)
{
int i = 0 ;
UARTSendByte(0x7E); //起始
for(i=0; i<len; i++)//数据
{
UARTSendByte(Send_buf[i]) ;
}
UARTSendByte(0xEF) ;//结束
}
/********************************************************************************************
- 功能描述:求和校验
- 隶属模块:
- 参数说明:
- 返回说明:
- 注: 和校验的思路如下
发送的指令,去掉起始和结束。将中间的6个字节进行累加,最后取反码
接收端就将接收到的一帧数据,去掉起始和结束。将中间的数据累加,再加上接收到的校验
字节。刚好为0.这样就代表接收到的数据完全正确。
********************************************************************************************/
void DoSum( int *Str, int len)
{
int xorsum = 0;
int i;
for(i=0; i<len; i++)
{
xorsum = xorsum + Str[i];
}
xorsum = 0 -xorsum;
*(Str+i) = (int)(xorsum >>8);
*(Str+i+1) = (int)(xorsum & 0x00ff);
}
/********************************************************************************************
- 功能描述: 串口向外发送命令[包括控制和查询]
- 隶属模块: 外部
- 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令
feedback:是否需要应答[0:不需要应答,1:需要应答]
data:传送的参数
- 返回说明:
- 注:
********************************************************************************************/
void Uart_SendCMD(int CMD ,int feedback , int dat)
{
Send_buf[0] = 0xff; //保留字节
Send_buf[1] = 0x06; //长度
Send_buf[2] = CMD; //控制指令
Send_buf[3] = feedback;//是否需要反馈
Send_buf[4] = (int)(dat >> 8);//datah
Send_buf[5] = (int)(dat); //datal
DoSum(&Send_buf[0],6); //校验
SendCmd(8); //发送此帧数据
}
```c
LDCChip.c:
```c
/***************************飞音云电子****************************
** 工程名称:YS-V0.7语音识别模块驱动程序
** CPU: STC11L08XE
** 晶振:22.1184MHZ
** 波特率:9600 bit/S
** 配套产品信息:YS-V0.7语音识别开发板
** http://yuesheng001.taobao.com
** 作者:zdings
** 联系:[email protected]
** 修改日期:2013.9.13
** 说明:口令模式: 即每次识别时都需要说“小杰”这个口令 ,才能够进行下一级的识别
/***************************飞音云电子******************************/
//#include
#include "config.h"
extern void delay(unsigned long uldata);
uint8 idata ucRegVal;
extern uint8 idata nAsrStatus;
void ProcessInt0(void);
/************************************************************************
功能描述: 复位LD模块
入口参数: none
返 回 值: none
其他说明: none
**************************************************************************/
void LD_Reset()
{
RSTB=1;
delay(1);
RSTB=0;
delay(1);
RSTB=1;
delay(1);
CSB=0;
delay(1);
CSB=1;
delay(1);
}
/************************************************************************
功能描述: LD模块命令初始化
入口参数: none
返 回 值: none
其他说明: 该函数为出厂配置,一般不需要修改;
有兴趣的客户可对照开发手册根据需要自行修改。
**************************************************************************/
void LD_Init_Common()
{
LD_ReadReg(0x06);
LD_WriteReg(0x17, 0x35);
delay(10);
LD_ReadReg(0x06);
LD_WriteReg(0x89, 0x03);
delay(5);
LD_WriteReg(0xCF, 0x43);
delay(5);
LD_WriteReg(0xCB, 0x02);
/*PLL setting*/
LD_WriteReg(0x11, LD_PLL_11);
LD_WriteReg(0x1E,0x00);
LD_WriteReg(0x19, LD_PLL_ASR_19);
LD_WriteReg(0x1B, LD_PLL_ASR_1B);
LD_WriteReg(0x1D, LD_PLL_ASR_1D);
delay(10);
LD_WriteReg(0xCD, 0x04);
// LD_WriteReg(0x17, 0x4c);
delay(5);
LD_WriteReg(0xB9, 0x00);
LD_WriteReg(0xCF, 0x4F);
LD_WriteReg(0x6F, 0xFF);
}
/************************************************************************
功能描述: LD模块 ASR功能初始化
入口参数: none
返 回 值: none
其他说明: 该函数为出厂配置,一般不需要修改;
有兴趣的客户可对照开发手册根据需要自行修改。
**************************************************************************/
void LD_Init_ASR()
{
LD_Init_Common();
LD_WriteReg(0xBD, 0x00);
LD_WriteReg(0x17, 0x48);
delay( 10 );
LD_WriteReg(0x3C, 0x80);
LD_WriteReg(0x3E, 0x07);
LD_WriteReg(0x38, 0xff);
LD_WriteReg(0x3A, 0x07);
LD_WriteReg(0x40, 0);
LD_WriteReg(0x42, 8);
LD_WriteReg(0x44, 0);
LD_WriteReg(0x46, 8);
delay( 1 );
}
/************************************************************************
功能描述: 中断处理函数
入口参数: none
返 回 值: none
其他说明: 当LD模块接收到音频信号时,将进入该函数,
判断识别是否有结果,如果没有从新配置寄
存器准备下一次的识别。
**************************************************************************/
void ProcessInt0(void)
{
uint8 nAsrResCount=0;
EX0=0;
ucRegVal = LD_ReadReg(0x2B);
LD_WriteReg(0x29,0) ;
LD_WriteReg(0x02,0) ;
if((ucRegVal & 0x10) &&
LD_ReadReg(0xb2)==0x21 &&
LD_ReadReg(0xbf)==0x35) /*识别成功*/
{
nAsrResCount = LD_ReadReg(0xba);
if(nAsrResCount>0 && nAsrResCount<=4)
{
nAsrStatus=LD_ASR_FOUNDOK;
}
else
{
nAsrStatus=LD_ASR_FOUNDZERO;
}
} /*没有识别结果*/
else
{
nAsrStatus=LD_ASR_FOUNDZERO;
}
LD_WriteReg(0x2b, 0);
LD_WriteReg(0x1C,0);/*写0:ADC不可用*/
LD_WriteReg(0x29,0) ;
LD_WriteReg(0x02,0) ;
LD_WriteReg(0x2B, 0);
LD_WriteReg(0xBA, 0);
LD_WriteReg(0xBC,0);
LD_WriteReg(0x08,1); /*清除FIFO_DATA*/
LD_WriteReg(0x08,0); /*清除FIFO_DATA后 再次写0*/
EX0=1;
}
/************************************************************************
功能描述: 运行ASR识别流程
入口参数: none
返 回 值: asrflag:1->启动成功, 0—>启动失败
其他说明: 识别顺序如下:
1、RunASR()函数实现了一次完整的ASR语音识别流程
2、LD_AsrStart() 函数实现了ASR初始化
3、LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中
4、LD_AsrRun() 函数启动了一次ASR语音识别流程
任何一次ASR识别流程,都需要按照这个顺序,从初始化开始
**************************************************************************/
uint8 RunASR(void)
{
uint8 i=0;
uint8 asrflag=0;
for (i=0; i<5; i++) // 防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
{
LD_AsrStart();
delay(50);
if (LD_AsrAddFixed()==0)
{
LD_Reset(); // LD3320芯片内部出现不正常,立即重启LD3320芯片
delay(50); // 并从初始化开始重新ASR识别流程
continue;
}
delay(10);
if (LD_AsrRun() == 0)
{
LD_Reset(); // LD3320芯片内部出现不正常,立即重启LD3320芯片
delay(50); // 并从初始化开始重新ASR识别流程
continue;
}
asrflag=1;
break; // ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
}
return asrflag;
}
/************************************************************************
功能描述: 检测LD模块是否空闲
入口参数: none
返 回 值: flag:1-> 空闲
其他说明: none
**************************************************************************/
uint8 LD_Check_ASRBusyFlag_b2()
{
uint8 j;
uint8 flag = 0;
for (j=0; j<10; j++)
{
if (LD_ReadReg(0xb2) == 0x21)
{
flag = 1;
break;
}
delay(10);
}
return flag;
}
/************************************************************************
功能描述: 启动ASR
入口参数: none
返 回 值: none
其他说明: none
**************************************************************************/
void LD_AsrStart()
{
LD_Init_ASR();
}
/************************************************************************
功能描述: 运行ASR
入口参数: none
返 回 值: 1:启动成功
其他说明: none
**************************************************************************/
uint8 LD_AsrRun()
{
EX0=0;
LD_WriteReg(0x35, MIC_VOL);
LD_WriteReg(0x1C, 0x09);
LD_WriteReg(0xBD, 0x20);
LD_WriteReg(0x08, 0x01);
delay( 10 );
LD_WriteReg(0x08, 0x00);
delay( 10 );
if(LD_Check_ASRBusyFlag_b2() == 0)
{
return 0;
}
// LD_WriteReg(0xB6, 0xa); //识别时间 1S
// LD_WriteReg(0xB5, 0x1E); //背景音段时间 300ms
// LD_WriteReg(0xB8, 10); //结束时间
// LD_WriteReg(0x1C, 0x07); //配置双通道音频信号做为输入信号
LD_WriteReg(0x1C, 0x0b); //配置麦克风做为输入信号
LD_WriteReg(0xB2, 0xff);
delay( 10);
LD_WriteReg(0x37, 0x06);
delay( 10 );
LD_WriteReg(0x37, 0x06);
delay( 5 );
LD_WriteReg(0x29, 0x10);
LD_WriteReg(0xBD, 0x00);
EX0=1;
return 1;
}
/************************************************************************
功能描述: 向LD模块添加关键词
入口参数: none
返 回 值: flag:1->添加成功
其他说明: 用户修改.
1、根据如下格式添加拼音关键词,同时注意修改sRecog 和pCode 数组的长度
和对应变了k的循环置。拼音串和识别码是一一对应的。
2、开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中
关于垃圾词语吸收错误的用法,来提供识别效果。
3、”xiao jie “ 为口令,故在每次识别时,必须先发一级口令“小捷”
**************************************************************************/
uint8 LD_AsrAddFixed()
{
uint8 k, flag;
uint8 nAsrAddLength;
#define DATE_A 18 /*数组二维数值*/
#define DATE_B 20 /*数组一维数值*/
uint8 code sRecog[DATE_A][DATE_B] = {
"xiao xin",\
"kai fa ban yan zheng",\
"da kai ji dian qi",\
"guan bi ji dian qi",\
"kai deng",\
"guan deng",\
"zai jian",\
"bo fang yin yue",\
"da kai feng shan",\
"guan bi feng shan",\
"bai bai",\
"xia yi shou",\
"ping fan zhi lu",\
"mang zhong",\
"shao nian",\
"ni de da an",\
"jing lei",\
"qi yue shang",\
}; /*添加关键词,用户修改*/
uint8 code pCode[DATE_A] = {
CODE_CMD,\
CODE_KFBYZ,\
CODE_DKJDQ,\
CODE_GBJDQ,\
CODE_KD,\
CODE_GD,\
CODE_ZJ,\
CODE_BFYY,\
CODE_DKFS,\
CODE_GBFS,\
CODE_BB,\
CODE_XYS,\
CODE_PFZL,\
CODE_MZ,\
CODE_SN,\
CODE_NDDA,\
CODE_JL,\
CODE_QYS,\
};
/*添加识别码,用户修改*/
flag = 1;
for (k=0; k<DATE_A; k++)
{
if(LD_Check_ASRBusyFlag_b2() == 0)
{
flag = 0;
break;
}
LD_WriteReg(0xc1, pCode[k] );
LD_WriteReg(0xc3, 0 );
LD_WriteReg(0x08, 0x04);
delay(10);
LD_WriteReg(0x08, 0x00);
delay(10);
for (nAsrAddLength=0; nAsrAddLength<DATE_B; nAsrAddLength++)
{
if (sRecog[k][nAsrAddLength] == 0)
break;
LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
}
LD_WriteReg(0xb9, nAsrAddLength);
LD_WriteReg(0xb2, 0xff);
LD_WriteReg(0x37, 0x04);
}
return flag;
}
/************************************************************************
功能描述: 获取识别结果
入口参数: none
返 回 值: LD_ReadReg(0xc5 ); 读取内部寄存器返回识别码。
其他说明: none
**************************************************************************/
uint8 LD_GetResult()
{
return LD_ReadReg(0xc5 );
}
LDChip.h:
#ifndef LD_CHIP_H
#define LD_CHIP_H
#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long
// 以下五个状态定义用来记录程序是在运行ASR识别过程中的哪个状态
#define LD_ASR_NONE 0x00 /* 表示没有在作ASR识别*/
#define LD_ASR_RUNING 0x01 /* 表示LD3320正在作ASR识别中*/
#define LD_ASR_FOUNDOK 0x10 /*表示一次识别流程结束后,有一个识别结果*/
#define LD_ASR_FOUNDZERO 0x11 /*表示一次识别流程结束后,没有识别结果*/
#define LD_ASR_ERROR 0x31 /*表示一次识别流程中LD3320芯片内部出现不正确的状态*/
#define CLK_IN 22.1184 /* 用户注意修改输入的晶振时钟大小 */
#define LD_PLL_11 (uint8)((CLK_IN/2.0)-1)
#define LD_PLL_MP3_19 0x0f
#define LD_PLL_MP3_1B 0x18
#define LD_PLL_MP3_1D (uint8)(((90.0*((LD_PLL_11)+1))/(CLK_IN))-1)
#define LD_PLL_ASR_19 (uint8)(CLK_IN*32.0/(LD_PLL_11+1) - 0.51)
#define LD_PLL_ASR_1B 0x48
#define LD_PLL_ASR_1D 0x1f
//函数声明
void LD_Reset();
void LD_Init_Common();
void LD_Init_ASR();
uint8 RunASR(void);
void LD_AsrStart();
uint8 LD_AsrRun();
uint8 LD_AsrAddFixed();
uint8 LD_GetResult();
//识别码客户修改处
#define CODE_CMD 0x00 //该命令码0x00用户不可进行修改。
#define CODE_KFBYZ 0x01 //开发板验证
#define CODE_DKJDQ 0x02 //打开继电器
#define CODE_GBJDQ 0x03 //关闭继电器
#define CODE_KD 0x04 //开灯
#define CODE_GD 0x05 //关灯
#define CODE_ZJ 0x09 //再见
#define CODE_BFYY 0x06 //播放歌曲
#define CODE_DKFS 0x07 //打开风扇
#define CODE_GBFS 0x08 //关闭风扇
#define CODE_BB 0x09 //拜拜
#define CODE_XYS 0x10 //循环播放01文件夹下的曲目
#define CODE_PFZL 0x0a //平凡之路
#define CODE_SN 0x0b //曲目少年
#define CODE_NDDA 0x0c //曲目你的答案
#define CODE_MZ 0x0e //曲目芒种
#define CODE_JL 0x0f //曲目惊雷
#define CODE_QYS 0x11 //曲目七月上
//调节识别距离,数值越大越远,但误识别概率越大
#define MIC_VOL 0x42 //咪头增益(灵敏度调节)范围:0X00-0X7f 越大越灵敏,
#endif
这是几个主要 程序文件内容,我会将完整的资料全部附上。
百度网盘:(资料收集和整理不容易,对于有帮助的人希望点个赞,开源不容易,分享很难得,谢谢大家支持)
链接:https://pan.baidu.com/s/1L-kCb3w71FydvwWSvZAQUw
提取码:mkc5