📄 main.c
字号:
//=======================================================================
//
//The information contained herein is the exclusive property of
//Sunplus Technology Co. And shall not be distributed, reproduced,
//or disclosed in whole in part without prior written permission.
//
// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
//
//The entire notice above must be reproduced on all authorized copies.
//
//======================================================================
//*****************************************************************//
// 工程名称: Recognise_SD.scs
// 作 者: huali
// 联系方式: huali@sunnorth.com.cn
// 适应芯片: SPCE061A
// 功能描述: 实现特定人识别
// 可以用61板来完成:
// 1、KEY1--训练命令
// 2、KEY2--识别
// 3、KEY3--将训练的命令存在外扩的flas4096中
// 最多可以识别25条命令其中5条为触发命令,该程序只做了10条命令
// 的识别,用户自己也可以扩展
// 硬件连接:flas SPR4096和SPCE061A的连接请参考网站SPR4096的应用,按键分别
// 连接的是IOA0(KEY1)、IOA1(KEY2)和IOA2(KEY3)
// 日期:2003/9/4
//
// 涉及的库:
// (a) C-Lib: CMacro.lib
// (b) Recogition-Lib: bsrv222SDL.lib
// (c) voic-Lib:sacmv26e.lib
// 组成文件:
// main.c/ISR.asm/system.asm/hardware.asm/key.asm
// s480.h/bsrsd.h/hardware.inc
// 完成日期: 2003-09-04
//*****************************************************************//
#include "bsrsd.h"
#define NAME_ID 0x100
#define COMMAND_ONE_ID 0x101
#define COMMAND_TWO_ID 0x102
#define COMMAND_THREE_ID 0x103
#define COMMAND_FOUR_ID 0x104
#define C_Commond_Start 0
#define C_GroupOne_Start 600
#define C_GroupTwo_Start 1600
#define C_PageOne 0
#define C_PagTwo 1
#define Recognise 1
#define Train 2
#define NO_Re_Tr 0
#define C_Recognise 1
//***************************全程变量******************************//
void g_Recognise(void);
void Add_Group(void);
void Export_Group(void);
void Add_Commond_Group(void);
void Export_Commond_Group(void);
extern void ClearWatchDog();
extern unsigned int BSR_SDModel[100];
unsigned int Key;
unsigned int commandID;
unsigned int res,Ret;
unsigned int timeCnt=0;
unsigned int g_status;
unsigned int k,i,j;
unsigned int g_Ret;
unsigned int uiflag=0;
unsigned int g_Commond_Train=0;
unsigned int g_Commond_ImportGroupNum=0;
unsigned int g_Commond_EmportGroupNum=0;
unsigned long int ulAddr=0;
unsigned int gActivated = 0; //该变量用于检测是否有触发命令,当有识别出语句
//为触发名称则该位置1
//***************语音播放******************************************//
//函数:PlayRespond(int Result)
//描述:识别或提示音的播放
//参数:语音播放序号
//返回:无
//*****************************************************************//
void PlayRespond(int Result)
{
BSR_StopRecognizer();
SACM_S480_Initial(1);
SACM_S480_Play(Result, 3, 3);
while((SACM_S480_Status()&0x0001) != 0)
{
SACM_S480_ServiceLoop();
ClearWatchDog();
}
SACM_S480_Stop();
BSR_InitRecognizer(BSR_MIC);
// BSR_EnableCPUIndicator();
}
//***************训练命令******************************************//
//函数:TrainWord(int WordID, int RespondID)
//描述:命令的训练
//参数:int WordID:ID序号;int RespondID:语音播放序号
//返回:
// 0:训练成功;
// -1:没有检测到声音;
// -2:重新训练;
// -3:环境太吵;
// -4:buffer满;
// -5:两次训练内容不同;
// -6:ID超出范围;
//*****************************************************************//
int TrainWord(int WordID, int RespondID)
{
PlayRespond(RespondID);
while(1)
{
res = BSR_Train(WordID,BSR_TRAIN_TWICE);
if(res == 0)
break;
switch(res)
{
case -1: //没有检测出声音
PlayRespond(10);
return -1;
case -2: //需要重新训练一遍
PlayRespond(9);
break;
case -3: //环境太吵
PlayRespond(11);
return -1;
case -4: //数据库满
return -1;
case -5: //检测出声音不同
if(WordID == NAME_ID) PlayRespond(11);//两次输入名称不同
else PlayRespond(11);//两次输入命令不同
return -1;
case -6: //序号错误
return -1;
}
}
return 0;
}
//*****************************************************************//
// 文件名称: main.c
// 描 述: 主程序通过三个按键来分别控制:命令的训练、命令存入flash
// 和从flash中读出命令进行识别
// 完成日期: 2003/09/04
//*****************************************************************//
int main()
{
System_Initial();
while(1)
{
Key = SP_GetCh(); //获取键值
switch(Key)
{
case 0x0001: //Train
g_Commond_Train++;
BSR_DeleteSDGroup(0); //初始化存储器RAM
PlayRespond(0);
while(TrainWord(NAME_ID,0) != 0) ;
while(TrainWord(COMMAND_ONE_ID,16) != 0) ;
while(TrainWord(COMMAND_TWO_ID,17) != 0) ;
if(g_Commond_Train!=1)
{
while(TrainWord(COMMAND_THREE_ID,18) != 0) ;
while(TrainWord(COMMAND_FOUR_ID,19) != 0) ;
}
break;
case 0x0002:
Add_Commond_Group(); //从flash中读出三条命令的数据加入RAM
g_status=C_Recognise;
BSR_InitRecognizer(BSR_MIC); //识别初始化
// BSR_EnableCPUIndicator();
PlayRespond(15); //语音播放"教您学英语"
g_Recognise();
break;
case 0x0004: //将训练好的命令存入flash
g_Commond_EmportGroupNum++;
if(g_Commond_EmportGroupNum==1)
{
SP_SIOSectorErase(C_PageOne); //擦除flash的第一页
ulAddr=C_Commond_Start;
Export_Commond_Group(); //将训练的三条命令写入flash
}
else
{
if(g_Commond_EmportGroupNum==2)
{
SP_SIOSectorErase(C_PagTwo); //擦除flash第二页
ulAddr=C_GroupOne_Start;
}
else
if(g_Commond_EmportGroupNum==3)
ulAddr=C_GroupTwo_Start;
Export_Group();
}
break;
default:
break;
}
System_ServiceLoop();
}
}
//***************识别命令******************************************//
//函数:TrainWord(int WordID, int RespondID)
//描述:识别分两组,分别由两条命令来控制。首先程序会先调入第一组命令
// 根据这两条命令再分别识别5条命令
//涉及到的函数:BSR_GetResult()--该函数主要用来进行识别的
//参数:无
//返回:无
//*****************************************************************//
void g_Recognise()
{
while(g_status == C_Recognise)
{
res = BSR_GetResult(); //识别
if(res > 0)
{
if(gActivated)
{
timeCnt = 0;
switch(res)
{
case NAME_ID:
PlayRespond(14); //语音播放"yea"
break;
case COMMAND_ONE_ID:
PlayRespond(12); //语音播放"汉语"
gActivated = 0;
uiflag=1;
BSR_StopRecognizer(); //停止识别
ulAddr=C_GroupOne_Start;
Add_Group(); //将第一组5条命令加入RAM
BSR_InitRecognizer(BSR_MIC); //识别初始化
// BSR_EnableCPUIndicator();
while(uiflag)
{
res = BSR_GetResult(); //识别
switch(res)
{
case NAME_ID:
PlayRespond(14); //语音播放"yea"
Add_Commond_Group(); //重新将三条命令加入RAM
uiflag=0;
BSR_InitRecognizer(BSR_MIC);//识别初始化
// BSR_EnableCPUIndicator();
break;
case COMMAND_ONE_ID:
PlayRespond(1); //"圣诞快乐"
break;
case COMMAND_TWO_ID:
PlayRespond(2); //"新年快乐"
break;
case COMMAND_THREE_ID:
PlayRespond(3); //"生日快乐"
break;
case COMMAND_FOUR_ID:
PlayRespond(4); //快乐每一天
break;
}
}
break;
case COMMAND_TWO_ID:
PlayRespond(13); //语音播放"英语"
gActivated = 0;
uiflag=1;
BSR_StopRecognizer(); //停止识别
ulAddr=C_GroupTwo_Start;
Add_Group(); //将第二组5条命令加入RAM
BSR_InitRecognizer(BSR_MIC); //识别初始化
// BSR_EnableCPUIndicator();
while(uiflag)
{
res = BSR_GetResult(); //识别
switch(res)
{
case NAME_ID:
PlayRespond(14); //语音播放"yea"
Add_Commond_Group(); //重新将三条命令加入RAM
uiflag=0;
BSR_InitRecognizer(BSR_MIC);//识别初始化
// BSR_EnableCPUIndicator();
break;
case COMMAND_ONE_ID:
PlayRespond(5); //"merry christmas"
break;
case COMMAND_TWO_ID:
PlayRespond(6); //"Happy new year"
break;
case COMMAND_THREE_ID:
PlayRespond(7); //"Happy birthDay"
break;
case COMMAND_FOUR_ID:
PlayRespond(8); //"Happy everyday"
break;
}
}
break;
}
}
else
{
if(res == NAME_ID)
{
PlayRespond(14);
gActivated = 1;
timeCnt = 0;
}
}
}//end of (res > 0)
else if (gActivated)
{
if (++timeCnt > 450) //超出时间
{
PlayRespond(10); //在规定的时间内没有识别到声音
gActivated = 0;
timeCnt = 0;
}
}
}
}
//***************将训练好的三条命令存入flash***********************//
//函数:Export_Commond_Group()
//描述:将训练好的三条命令存入flash
//参数:无
//返回:无
//*****************************************************************//
void Export_Commond_Group()
{
for(commandID=0x100;commandID<0x103;commandID++)
{
g_Ret=BSR_ExportSDWord(commandID); //将训练好的命令存入BSR_SDModel[]buffer中
while(g_Ret!=0)
g_Ret=BSR_ExportSDWord(commandID); //Export faild
for(i=0;i<100;i++)
{
SP_SIOSendAWord(ulAddr,BSR_SDModel[i]);
ulAddr+=2;
}
}
}
//**********************将训练好的5条命令存入flash*****************//
//函数:Export_Group()
//描述:将训练好的5条命令存入flash
//参数:无
//返回:无
//*****************************************************************//
void Export_Group()
{
for(commandID=0x100;commandID<0x105;commandID++)
{
g_Ret=BSR_ExportSDWord(commandID);
while(g_Ret!=0)
g_Ret=BSR_ExportSDWord(commandID);//
for(i=0;i<100;i++)
{
SP_SIOSendAWord(ulAddr,BSR_SDModel[i]);
ulAddr+=2;
}
}
}
//**********************从flash中取出三组数据存入SRAM中***************//
//函数:Add_Commond_Group()
//描述:从flash中取出三组数据存入SRAM中
//参数:无
//返回:无
//********************************************************************//
void Add_Commond_Group()
{
BSR_DeleteSDGroup(0);
ulAddr=C_Commond_Start;
for(j=0;j<3;j++)
{
for(k=0;k<100;k++)
{
Ret=SP_SIOReadAWord(ulAddr);
BSR_SDModel[k]=Ret; //将flash中读到的数据存入BSR_SDModel[]buffer中
ulAddr+=2;
}
g_Ret=BSR_ImportSDWord(); //将buffer BSR_SDModel[]中的数存入RAM中
while(g_Ret!=0)
g_Ret=BSR_ImportSDWord();
}
}
//**********************从flash中取出5组数据存入RAM*************//
//函数:Add_Group()
//描述:从flash中取出5组数据存入RAM
//参数:无
//返回:无
//*****************************************************************//
void Add_Group()
{
BSR_DeleteSDGroup(0);
for(j=0;j<5;j++)
{
for(k=0;k<100;k++)
{
Ret=SP_SIOReadAWord(ulAddr);
BSR_SDModel[k]=Ret;
ulAddr+=2;
}
g_Ret=BSR_ImportSDWord();
while(g_Ret!=0)
g_Ret=BSR_ImportSDWord();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -