问题描述
- LD3320链接51示例程序
-
请问有人玩过用51控制LD3320的吗?本人初次玩,水平有限,求助大家,望助
解决方案
http://download.csdn.net/download/zlm867953489/8007009
解决方案二:
http://download.csdn.net/download/zlm867953489/8007009
解决方案三:
源代码,编译时前两个头文件找不到,还有后面怎么会有P4口的?
#include"LE52.h"
#include "config.h"
sbit ENA=P2^3;
sbit ENB=P2^4;
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
** 工程名称:YS-语音识别模块底层驱动程序
** CPU: STC89LE52
** 晶振:22.1184MHZ
** 波特率:9600 bit/S
** 配套产品信息:YS-V0.7语音识别开发板
** http://yuesheng001.taobao.com
** 作者:zdings
** 联系:751956552@qq.com
** 修改日期:2012.4.1
** 说明:根据不同的单片机需要配置不同的延时。
extern void delay(unsigned long uldata);
uint8 idata ucRegVal;
extern uint8 idata nAsrStatus;
void ProcessInt0(void);
#define LD_INDEX_PORT (*((volatile unsigned char xdata*)(0x8100)))
#define LD_DATA_PORT (*((volatile unsigned char xdata*)(0x8000)))
//评估板上 MCU的A8 连接到 LD芯片的AD
// MCU的A14 连接到 LD芯片的CSB
// MCU的RD、WR 连接 LD芯片的RD、WR (xdata 读写时自动产生低信号)
//
//0x8100的二进制是10000001 00000000 CSB=0 AD=1
// ^ ^
//0x8000的二进制是10000000 00000000 CSB=0 AD=0
// ^ ^
void LD_WriteReg( unsigned char address, unsigned char dataout )
{
LD_INDEX_PORT = address;
LD_DATA_PORT = dataout;
}
unsigned char LD_ReadReg( unsigned char address )
{
LD_INDEX_PORT = address;
return (unsigned char)LD_DATA_PORT;
}
/************************************************************************
功能描述: 复位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( 1 );
LD_WriteReg(0x08, 0x00);
delay( 1 );
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( 1);
LD_WriteReg(0x37, 0x06);
delay( 1 );
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 6 /*数组二维数值*/
#define DATE_B 20 /*数组一维数值*/
uint8 code sRecog[DATE_A][DATE_B] = {
"xiao jie",
"zuo zhaun",
"you zhuan",
"qian jin",
"hou tui",
"ting"
};
uint8 code pCode[DATE_A] = {
CODE_CMD,
CODE_ZZ,
CODE_YZ,
CODE_QJ,
CODE_HT,
CODE_T
};
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(1);
LD_WriteReg(0x08, 0x00);
delay(1);
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 );
}
/***************************乐声电子科技有限公司****************************
** 工程名称:YS-V0.7语音识别开发板程序
** CPU: STC89LE52
** 晶振:22.1184MHZ
** 波特率:9600 bit/S
** 配套产品信息:YS-V0.7语音识别开发板
** http://yuesheng001.taobao.com
** 作者:zdings
** 联系:751956552@qq.com
** 修改日期:2012.11.21
** 说明:本程序 具备语音口令识别、串口通信。。
/***************************乐声电子科技有限公司******************************/
/************************************************************************************/
// 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);//单片机工作指示
uint8_t G0_flag=DISABLE;//运行标志,ENABLE:运行。DISABLE:禁止运行
sbit LED=P4^2;//信号指示灯
/************************************************************************************
小车左转
*************************************************************************************/
void Turn_left()
{ ENA=1;
ENB=0;
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
/**********************************************************************************
小车右转
***********************************************************************************/
void Turn_right()
{ ENA=0;
ENB=1;
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
/**********************************************************************************
小车前进
***********************************************************************************/
void Go()
{
ENA=1;
ENB=1;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
/*******************************************************************************
小车后退
********************************************************************************/
void Back()
{ ENA=1;
ENB=1;
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
/*******************************************************************************
小车停
********************************************************************************/
void Stop()
{ ENA=1;
ENB=1;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
/************************************************************************
函 数 名: 串口初始化
功能描述: STC10L08XE 单片机串口初始化函数
返回函数: none
其他说明: none
**************************************************************************/
void UartIni(void)
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xF4 ; //Baud:9600 fosc=22.1148MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
ES=1;
EA=1;
}
/************************************************************************
功能描述: 串口发送一字节数据
入口参数: DAT:带发送的数据
返 回 值: none
其他说明: none
**************************************************************************/
void UARTSendByte(uint8_t DAT)
{
ES = 0;
TI=0;
SBUF = DAT;
while(TI==0);
TI=0;
ES = 1;
}
/************************************************************************
功能描述: 串口发送字符串数据
入口参数: DAT:字符串指针
返 回 值: none
其他说明: API 供外部使用,直观!
*************************************************************************/
void PrintCom(uint8_t *DAT)
{
while(*DAT)
{
UARTSendByte(*DAT++);
}
}
/***********************************************************
- 名 称: void MCU_init()
- 功 能: 单片机初始化
- 入口参数:
- 出口参数:
- 说 明:
- 调用方法:
**********************************************************/
void MCU_init()
{
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
LD_MODE = 0; // 设置MD管脚为低,并行模式读写
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();
}
}
}
/*********************************************************** - 名 称: 中断处理函数
- 功 能:
- 入口参数:
- 出口参数:
- 说 明:
- 调用方法:
**********************************************************/
void ExtInt0Handler(void) interrupt 0
{
ProcessInt0(); /* LD3320 送出中断信号,包括ASR和播放MP3的中断,需要在中断处理函数中分别处理*/
}
/*********************************************************** - 名 称:用户执行函数
- 功 能:识别成功后,执行动作可在此进行修改
- 入口参数: 无
- 出口参数:无
- 说 明:
**********************************************************/
void User_handle(uint8 dat)
{
UARTSendByte(dat);//串口识别码(十六进制)switch(dat) { case CODE_ZZ: /*命令“左转”*/ PrintCom("“左转”命令识别成功rn"); Turn_left(); break; case CODE_YZ: /*命令“右转”*/ PrintCom("“右转”命令识别成功rn"); Turn_right(); break; case CODE_QJ: /*命令“前进”*/ PrintCom("“前进”命令识别成功rn"); Go(); break; case CODE_HT: /*命令“后退”*/ PrintCom("“后退”命令识别成功rn"); Back(); break; case CODE_T: /*命令“停”*/ PrintCom("“停”命令识别成功rn"); Stop(); break; default: break; }
}
/*********************************************************** - 名 称: void main(void)
- 功 能: 主函数 程序入口
- 入口参数:
- 出口参数:
- 说 明:
- 调用方法:
**********************************************************/
void main(void)
{
uint8 idata nAsrRes;
uint8 i=0;
MCU_init();
LD_Reset();
UartIni(); /*串口初始化*/
nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR
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