51单片机STC89C52与LD3320语音模块通信源码:
/************************************************************************************/
#include "config.h"
# include <stdio.h>
# include <stdlib.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;
extern void _nop_ (void);
void MCU_init();
uint8 RunASR();
#if 1//按键
sbit key2=P3^4;
sbit key3=P3^5;
sbit key4=P3^6;
sbit key5=P3^7;
#endif
#if 1//led灯
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
#endif
#if 1//串口相关
#define jingzhen 11059200UL /*使用22.1184M晶体*/
#define botelv 9600UL /*波特率定义为9600*/
volatile unsigned char sending;
#endif//串口相关
void ProcessInt0(); //识别处理函数
void delay(unsigned long uldata);
void UartIni();
#if 1//串口相关
void UartIni()
{
EA=0; //暂时关闭中断
TMOD&=0x0F; //定时器1模式控制在高4位
TMOD|=0x20; //定时器1工作在模式2,自动重装模式
SCON=0x50; //串口工作在模式1
TH1=256-jingzhen/(botelv*12*16); //计算定时器重装值
TL1=256-jingzhen/(botelv*12*16);
PCON|=0x80; //串口波特率加倍
ES=1; //串行中断允许
TR1=1; //启动定时器1
REN=1; //允许接收
EA=1; //允许中断
}
void send(unsigned char d) //发送一个字节的数据,形参d即为待发送数据。
{
SBUF=d; //将数据写入到串口缓冲
sending=1; //设置发送标志
while(sending); //等待发送完毕
}
//重写putchar函数
char putchar(char c)
{
send(c);
return c;
}
void PrintCom(unsigned char * pd)
{
while((*pd)!='\0') //发送字符串,直到遇到0才结束
{
send(*pd); //发送一个字符
pd++; //移动到下一个字符
}
}
void uart(void) interrupt 4 //串口发送中断
{
if(RI) //收到数据
{
RI=0; //清中断请求
}
else //发送完一字节数据
{
TI=0;
sending=0; //清正在发送标志
}
}
void delay_ms(unsigned int x) //延时 x ms
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
#endif//串口相关
#if 1
void delay10ms() //延时,软件去干扰
{
delay_ms(10);
}
char key2_scan() //按键判断程序
{
if(key2==0) //判断是否按下键盘
{
delay10ms(); //延时,软件去干扰
if(key2==0) //确认按键按下
{
while(key2==0);
return 1;
}
}
return 0;
}
char key3_scan() //按键判断程序
{
if(key3==0) //判断是否按下键盘
{
delay10ms(); //延时,软件去干扰
if(key3==0) //确认按键按下
{
while(key3==0);
return 1;
}
}
return 0;
}
char key4_scan() //按键判断程序
{
if(key4==0) //判断是否按下键盘
{
delay10ms(); //延时,软件去干扰
if(key4==0) //确认按键按下
{
while(key4==0);
return 1;
}
}
return 0;
}
char key5_scan() //按键判断程序
{
if(key5==0) //判断是否按下键盘
{
delay10ms(); //延时,软件去干扰
if(key5==0) //确认按键按下
{
while(key5==0);
return 1;
}
}
return 0;
}
#endif
void test_data()
{
LD_WriteReg(0xba, 0xf0);
P1=0xff;//全灭
delay_ms(1000);
P1=LD_ReadReg(0xba);
}
/************************************************************************
功能描述: 主函数程序入口
入口参数: none
返 回 值: none
其他说明: none
**************************************************************************/
void main()
{
uint8 idata nAsrRes;
uint8 i=0;
uint8 temp=0;
MCU_init();
LD_Reset();
UartIni(); /*串口初始化*/
nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR
PrintCom("串口运行中....\n"); /*text.....*/
PrintCom("口令:1、代码测试\n"); /*text.....*/
PrintCom(" 2、开发板验证\n"); /*text.....*/
PrintCom(" 3、检查完毕\n"); /*text.....*/
#if 0//串口测试
while(1)
{
PrintCom("hello world\r\n");
delay_ms(500);
if(key2_scan())PrintCom("key2_scan\r\n");
if(key3_scan())PrintCom("key3_scan\r\n");
if(key4_scan())PrintCom("key4_scan\r\n");
if(key5_scan())PrintCom("key5_scan\r\n");
}
#endif
#if 1
P1=0xff;
while(1)
{
//if(key3_scan())test_data();
switch(nAsrStatus)
{
case LD_ASR_RUNING:led7=~led7;delay_ms(300);break;//运行时,led闪烁
case LD_ASR_ERROR:PrintCom("LD_ASR_ERROR\r\n");break;
break;
case LD_ASR_NONE:
//if(key2_scan()==1)
// {
//PrintCom("启动运行语音识别\r\n");
//delay_ms(1000);
nAsrStatus=LD_ASR_RUNING;
if (RunASR()==0) /* 启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
{
nAsrStatus = LD_ASR_ERROR;
}
break;
// }
break;
case LD_ASR_FOUNDOK: /* 一次ASR识别流程结束,去取ASR识别结果*/
{
//delay_ms(1000);
nAsrRes = LD_GetResult(); /*获取结果*/
//PrintCom("\n识别码:"); /*text.....*/
//UARTSendByte(nAsrRes+0x30); /*text.....*/
switch(nAsrRes) /*对结果执行相关操作,客户修改*/
{
case CODE_QJ:
// led1=0;
PrintCom("CODE_QJ"); /*text.....*/
break;
case CODE_HT:
// led2=0;
PrintCom("CODE_HT"); /*text.....*/
break;
case CODE_ZZ:
// led3=0;
PrintCom("CODE_ZZ"); /*text.....*/
break;
case CODE_YZ:
// led4=0;
PrintCom("CODE_YZ"); /*text.....*/
break;
case CODE_TZ:
// led5=0;
PrintCom("CODE_TZ"); /*text.....*/
break;
default:
led6=0;
PrintCom("未识别\r\n");break;
}
nAsrStatus = LD_ASR_NONE;
break;
}
case LD_ASR_FOUNDZERO://匹配失败
nAsrStatus = LD_ASR_NONE;
PrintCom("speech_fail\r\n");
break;
default:
{
nAsrStatus = LD_ASR_NONE;
break;
}
}// switch
}// while
#endif
}
/************************************************************************
功能描述: 单片机初始化
入口参数:
返 回 值:
其他说明:
**************************************************************************/
void MCU_init()
{
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xf7;
IE0=1;
EX0=1;
EA=1;
}
/************************************************************************
功能描述: 延时函数
调用函数:
入口参数:
返回函数:
**************************************************************************/
void delay(unsigned long uldata)
{
unsigned int j = 0;
unsigned int g = 0;
for (j=0;j<5;j++)
{
for (g=0;g<uldata;g++)
{
_nop_();
_nop_();
_nop_();
}
}
}
/************************************************************************
功能描述: 运行ASR识别流程
入口参数: none
返 回 值: asrflag:1->启动成功, 0—>启动失败
其他说明: 识别顺序如下:
1、RunASR()函数实现了一次完整的ASR语音识别流程
2、LD_AsrStart() 函数实现了ASR初始化
3、LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中
4、LD_AsrRun() 函数启动了一次ASR语音识别流程
任何一次ASR识别流程,都需要按照这个顺序,从初始化开始??
**************************************************************************/
uint8 RunASR()
{
uint8 i=0;
uint8 asrflag=0;
for (i=0; i<5; i++) // 防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
{
LD_AsrStart();
delay(100);
if (LD_AsrAddFixed()==0)
{
LD_Reset(); // LD3320芯片内部出现不正常,立即重启LD3320芯片
delay(100); // 并从初始化开始重新ASR识别流程
//PrintCom("LD_AsrAddFixed芯片内部出现不正常\r\n");
}
delay(10);
if (LD_AsrRun() == 0)
{
LD_Reset(); // LD3320芯片内部出现不正常,立即重启LD3320芯片
delay(100); // 并从初始化开始重新ASR识别流程
//PrintCom("LD_AsrRun芯片内部出现不正常\r\n");
continue;
}
asrflag=1;
break; // ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
}
return asrflag;
}
/************************************************************************
功能描述: 中断处理函数
调用函数:
入口参数:
返回函数:
**************************************************************************/
void ExtInt0Handler(void) interrupt 0
{
led8=0;//进入中断用led8指示,观察状态
ProcessInt0(); // LD3320 送出中断信号,包括ASR和播放MP3的中断,需要在中断处理函数中分别处理
led8=1;
}
完整源码下载:
STC89C52与LD3320语音模块.zip: https://url83.ctfile.com/f/45573183-1269764597-c479e5?p=7526 (访问密码: 7526)