LD3320链接51示例程序

请问有人玩过用51控制LD3320的吗?本人初次玩,水平有限,求助大家,望助

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("“左转”命令识别成功\r\n");   
                    Turn_left();
                    break;
                case CODE_YZ:    /*命令“右转”*/
                    PrintCom("“右转”命令识别成功\r\n"); 
                    Turn_right();
                    break;
                case CODE_QJ:       /*命令“前进”*/              
                    PrintCom("“前进”命令识别成功\r\n"); 
                    Go();
                    break;
                case CODE_HT:       /*命令“后退”*/              
                     PrintCom("“后退”命令识别成功\r\n"); 
                     Back();
                    break;
                case CODE_T:        /*命令“停”*/             
                     PrintCom("“停”命令识别成功\r\n");
                     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

http://download.csdn.net/download/zlm867953489/8007009