?? 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 + -