中文语音识别-LD3320链接51示例程序

问题描述

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
时间: 2024-09-19 08:16:56

中文语音识别-LD3320链接51示例程序的相关文章

中英文语音合成与中文语音识别技术在c#中的应用(一)

中文 在.net中,对英文语音有较好的支持,但是对中文语音的支持还没有加入进来,我们要想实现中文发音或中文语音识别,必需先安装微软的Speech Application SDK(SASDK),它的最新版本是 SAPI 5.1 他能够识别中.日.英三种语言,你可以在这里下载:http://www.microsoft.com/speech/download/sdk51/,需要安装这两个文件Speech SDK 5.1和5.1 Language Pack,其中5.1 Language Pack可以选择

中英文语音合成与中文语音识别技术在c#中的应用(二)

中文 但是,这个方法本身并不知道你给的字符串是什么语言,所以需要我们它这个字符串用什么语言读出.SpVoiceClass 类的Voice 属性就是用来设置语种的,我们可以通过SpVoiceClass 的GetVoices方法得到所有的语种列表,然后在根据参数选择相应的语种,比如设置语种为汉语如下所示: private void SetChinaVoice() { voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ;

中文语音识别技术在c#中的应用(二)

中文 接上篇<中文语音识别技术在c#中的应用(一)>---但是,这个方法本身并不知道你给的字符串是什么语言,所以需要我们它这个字符串用什么语言读出.SpVoiceClass 类的Voice 属性就是用来设置语种的,我们可以通过SpVoiceClass 的GetVoices方法得到所有的语种列表,然后在根据参数选择相应的语种,比如设置语种为汉语如下所示: private void SetChinaVoice() { voice.Voice = voice.GetVoices(string.Emp

《R与Hadoop大数据分析实战》一2.4 编写Hadoop MapReduce示例程序

2.4 编写Hadoop MapReduce示例程序 现在要通过一个很简单且普通的单词统计(word count)来学习MapReduce.该例子的目标是统计每个单词在文章中出现的次数.这些文章作为MapReduce的输入文件. 在该例中,已经准备了一些文本文件,我们希望计算所有单词在这些文件中出现的频率.我们通过Hadoop MapReduce来进行设计. 本节中,将使用旧版API接口学习Hadoop MapReduce编程.假设读者已经配置了Hadoop的环境变量(请参考第1章的内容).同时

微软那个signalr-self-host的示例程序能否改成.NET Framework 4.0的版本?

问题描述 微软那个signalr-self-host的示例程序能否改成.NETFramework4.0的版本?以下链接是微软那个signalr-self-host的示例程序的详细教程和下载http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-hosthttps://code.msdn.microsoft.com/SignalR-Self-Host-Sample-6da0f383它的功能是符合我的开发要求的,但是有

oadRunner性能测试巧匠训练营》——2.2 LoadRunner组成与示例程序

2.2 LoadRunner组成与示例程序 完成LoadRunner的安装后,小白迫不及待地想试试这个软件的威力如何.下面就跟随小白继续学习吧. Loa dRunner的三大组件 LoadRunner由三大基本组件构成,分别是VuGen.Controller.Analysis.那这三个组件的作用如下. VuGen:是录制与编写脚本的地方,就是通过录制或编写脚本来模拟用户的行为,可以理解为用户行为模拟器,同时会打印出日志信息,方便调试脚本.VuGen也是一个集成开发调试环境,在这里完成脚本开发并调

关于继承内部类——java编程思想示例程序分析

编程|程序|继承|示例 关于继承内部类--java编程思想示例程序分析:class Egg2 { protected class Yolk { public Yolk() { System.out.println("Egg2.Yolk()"); } public void f() { System.out.println("Egg2.Yolk.f()"); } } private Yolk y = new Yolk(); public Egg2() { System

RapidWebDev框架 - 快速开发产品管理示例程序

首先,我们按照以往的思路,先将上一章中的t_product进行一定的扩展,如下图: 开发产品管理示例程序-net快速开发框架">在这里,我增加了一张T_PRODUCT_CATEGORY表,用于存放产品分类信息,分类为树型结构,另外增加了一个T_WAREHOUSE表,用于存放仓库信信息,然后在T_PRODUCT增加了相应的外键和一些扩展字段.有了数据表,就开始分别对分类和仓库建了对应的管理代码(CRUD, UI等),然后在产品页面对其调用.为了节约篇幅,这里就不贴这些代码了,反正是一大堆.

使用nodejs如何读取memcache的示例程序

 本人主要介绍了使用nodejs如何读取memcache的示例程序,大家参考使用吧 代码如下: var memcache = require('memcache')     , http = require('http')     , url = require('url')     , qs = require('querystring')     , memsettings = { port: 2000, host: '10.6.0.6' }     , httpsettings = { p