qq_34902504
2016-05-06 04:53
采纳率: 50%
浏览 5.7k
已采纳

LD3320链接51示例程序

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • havedream_one 2016-05-06 05:19
    已采纳
    点赞 评论
  • qq_34902504 2016-05-06 12:07

    源代码,编译时前两个头文件找不到,还有后面怎么会有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
    
    点赞 3 评论
  • mazegong 2016-05-06 07:33
    点赞 1 评论

相关推荐 更多相似问题