📄 main.c
字号:
#include"spce061a.h"
#include"bsrSD.h"
#include"s480.h"
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------------------------------------------
//-- 该程序是特定人辨识的一个范例:
//--
//-- 在程序中我们通过三条语句的训练演示特定人连续音识别,其中第一条语句为触发命令。
//--
//-- 在程序一开始为训练名称,即触发命令,然后提示训练两条命令,训练完毕开始辨识当识别
//出触发名称后,发布命令则会听到应答,具体命令如下:
//****************训练******************************************
// 提示音 输入语音
//--------------------------------------------------------
//"请输入触发名称" "警卫"
//"请输入第一条命令" "开枪"
//"请输入第二条命令" "你在干什么?"
//"请再说一遍"(以上提示音每说完一遍出现此命令)
//"没有听到任何声音"(当没有检测到声音时出现此命令)
//"两次输入名称不相同"(当两次输入的名称不同时出现此命令)
//"两次输入命令不相同"(当两次输入的命令有差异时出现此命令)
//"准备就绪,请开始辨识"(以上三条语句全部训练成功时,进入识别)
//*****************识别*****************************************
// 发布命令 应答
//---------------------------------------------------------
//"警卫" "在"/"长官"
//"开枪" "枪声"
//"你在干什么?" "我在巡逻"/"我在休息"/"我在等人"
//注意:在每次提示音结束后2-3秒再输入命令或当上次应答结束2-3秒后再发布命令
#define NAME_ID 0x100
#define RSP_INTR 0
#define RSP_NAME 1
#define RSP_FIRE 2
#define RSP_GUARD 3
#define RSP_AGAIN 4
#define RSP_NOVOICE 5
#define RSP_NAMEDIFF 6
#define RSP_CMDDIFF 7
#define RSP_STAR 8
#define RSP_MASTER 9
#define RSP_HERE 10
#define kai_deng 11
#define RSP_NOISY 12
#define guan_deng 13
extern unsigned int IsFirstDownLoad(void);
extern void TrainThreeCommand(void);
extern void SaveThreeCommand(void);
extern void ImportFlopCommand(unsigned int Command_ID);
extern void ImportSunCommand(unsigned int Name_ID);
extern void F_FlashWrite1Word(unsigned int,unsigned int);
extern void PlayRespond(int Result);
extern void F_FlashErase(int);
extern void F_FlashWrite1Word(unsigned int,unsigned int);
void key_ctrl(void);
void led_off(void); uchar led_flag;
void led_on(void);
void varbile_exprot(void);
void varbile_inprot(void);
void IOA_init(void);
void IOB_init(void);
int TrainWord(int WordID, int RespondID);
extern uint Rec_fma_hao;
extern uint Command_ID;
int Frist_flag;
int gActivated = 0; //用于检测是否有触发命令,当有识别出语句为触发名称则该位置1
uchar key_state=0x00ff,key_value=0,led_flag=0;
int gTriggerRespond[] = {RSP_MASTER, RSP_HERE, RSP_MASTER};//第一条命令应答
int PlayFlag = 0;
int main()
{
int res, timeCnt=0, random_no=0;
uchar Flop_flag=1;
// Frist_flag=IsFirstDownLoad(); //is frist download :yes train and save command
varbile_exprot();
if(Frist_flag!=0xaaaa)
{
Rec_fma_hao=0; //已经保存的命令条数
Command_ID=0; //已训练条数
Frist_flag=0; //有无训练命令的标志
varbile_inprot();
}
IOA_init();
if(Frist_flag!=0xaaaa) // no improt command from flash
{
writeflash:
TrainThreeCommand();
SaveThreeCommand();
Frist_flag=0xaaaa;
varbile_inprot();
ImportFlopCommand(Command_ID);
}
else
{
ImportFlopCommand(Command_ID);
}
//..........开始识别命令.........................
BSR_InitRecognizer(BSR_MIC); //辨识器初始化
BSR_EnableCPUIndicator();
PlayRespond(RSP_STAR); // 播放开始辨识的提示音
while(1)
{
random_no ++;
if(random_no >= 3) random_no = 0;
*(unsigned int *)0x7012 = 1; //clear the watch dog
key_ctrl();
if(key_value==1)
{
key_value=0; //key control whether need command train
BSR_StopRecognizer();
goto writeflash;
}
if(key_value==2) // mannul control the led on or off;
{
key_value=0;
if(led_flag)
led_off();
else
led_on();
}
res = BSR_GetResult();
if(res > 0) //识别出命令
{
if(Flop_flag)
{
timeCnt = 0;
switch(res)
{
case 0x100:
PlayRespond(gTriggerRespond[random_no]);
ImportSunCommand(0);
Flop_flag=0;
gActivated=1;
break;
case 0x101:
PlayRespond(gTriggerRespond[random_no]);
ImportSunCommand(1);
Flop_flag=0;
gActivated=1;
break;
case 0x102:
PlayRespond(gTriggerRespond[random_no]);
ImportSunCommand(2);
Flop_flag=0;
gActivated=1;
break;
case 0x103:
PlayRespond(gTriggerRespond[random_no]);
ImportSunCommand(3);
Flop_flag=0;
gActivated=1;
break;
case 0x104:
PlayRespond(gTriggerRespond[random_no]);
ImportSunCommand(4);
Flop_flag=0;
gActivated=1;
break;
}
}
else
{
if(gActivated==1)
{
timeCnt = 0;
switch(res)
{
case 0x100:
PlayRespond(gTriggerRespond[random_no]);
gActivated=1;
break;
case 0x101:
PlayRespond(kai_deng);
led_on();
break;
case 0x102:
PlayRespond(guan_deng);
led_off();
break;
}
}
}
}
else if (gActivated)
{
if (++timeCnt > 450) //超出定时
{
Flop_flag=1;
PlayRespond(RSP_NOVOICE); //在设定时间内没有检测出声音
ImportFlopCommand(Command_ID);
gActivated = 0;
timeCnt = 0;
}
}
}
}
void key_ctrl(void)
{
int key_num=0x0000;
key_state=key_state<<1;
IOA_init();
key_num=*P_IOA_Data;
if((key_num&0x0003)!=0x0000)
{
if((key_state&0x00ff)==0x0080)
{
key_state=0x00ff;
key_num=*P_IOA_Data;
switch((key_num&0x0003))
{
case 0x0001:
key_value=1;
while(key_num!=0x0000)
{
key_num=*P_IOA_Data;
key_num&=0x0003;
}
break;
case 0x0002:
key_value=2;
while(key_num!=0x0000)
{
key_num=*P_IOA_Data;
key_num&=0x0003;
}
break;
case 0x0003:
Rec_fma_hao=0; //已经保存的命令条数
Command_ID=0; //已训练条数
Frist_flag=0; //有无训练命令的标志
key_value=1;
while(key_num!=0x0000)
{
key_num=*P_IOA_Data;
key_num&=0x0003;
}
break;
}
}
}
else
key_state=key_state|1;
}
void IOB_init(void)
{
*P_IOB_Dir=0x0020;
*P_IOB_Attrib=0x0020;
*P_IOB_Data=0x0020;
}
void led_on(void)
{
IOB_init();
*P_IOB_Data=0x0000;
led_flag=1;
}
void led_off(void)
{
IOB_init();
*P_IOB_Data=0x0020;
led_flag=0;
}
void varbile_inprot(void)
{
F_FlashErase(0xF100);
F_FlashWrite1Word(0xf100,Frist_flag);//first_flag
F_FlashWrite1Word(0xf101,Rec_fma_hao);
F_FlashWrite1Word(0xf102,Command_ID);
}
void varbile_exprot(void)
{
unsigned int *p;
p = (unsigned int *)0xf100;
Frist_flag= *p;
p++;
Rec_fma_hao= *p;
p++;
Command_ID= *p;
}
int TrainWord(int WordID, int RespondID)//命令训练
{
int res;
PlayRespond(RespondID);
while(1)
{
res = BSR_Train(WordID,BSR_TRAIN_TWICE);
if(res == 0) break;
switch(res)
{
case -1: //没有检测出声音
PlayRespond(RSP_NOVOICE);
return -1;
case -2: //需要重新训练一遍
PlayRespond(RSP_AGAIN);
break;
case -3: //环境太吵
PlayRespond(RSP_NOISY);
return -1;
case -4: //数据库满
return -1;
case -5: //检测出声音不同
if(WordID == NAME_ID) PlayRespond(RSP_NAMEDIFF);//两次输入名称不同
else PlayRespond(RSP_CMDDIFF);//两次输入命令不同
return -1;
case -6: //序号错误
return -1;
}
}
return 0;
}
void IOA_init(void)
{
*P_IOA_Dir=0x0000;
*P_IOA_Attrib=0x0000;
*P_IOA_Data=0x0000;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -