www.pudn.com > SPCE061Axiaoche.rar > main.c
#include "SPCE061V004.H"
#include "bsrsd.h"
asm(".include hardware.inc");
asm(".include Resource.inc");
asm(".external F_FIQ_Service_SACM_S480");
asm(".EXTERNAL _BSR_FIQ_Routine\n\t .EXTERNAL F_BSR_GetResult");
extern int BSR_GetResult();
extern unsigned int _gIsStopRecog;
#define COMMAND_QIANJIN_ID 0x100
#define COMMAND_ZUOZHUAN_ID 0x101
#define COMMAND_YOUZHUAN_ID 0x102
#define COMMAND_TINGZHI_ID 0x103
#define WELCOME 0
#define QIANJIN 1
#define ZAISHUO 2
#define BUTONG 3
#define MEISHENYIN 4
#define ZUOZHUAN 5
#define YOUZHUAN 6
#define XIAODE 7
#define WANBI 8
#define TINGZHI 9
#define ZERO 10
#define ONE 11
#define TWO 12
#define THREE 13
#define FOUR 14
#define FIVE 15
#define SIX 16
#define SEVEN 17
#define EGHIT 18
#define NINE 19
#define MIAO 20
#define LIMI 21
#define STOP 0x0000
#define LEFT 0x0002
#define RIGHT 0x0001
#define DIRETCT 0x0003 // IOB0--RF4 ,IOB1-RF5
unsigned int keyval=100,sucess=0,t=0,tt=0;
unsigned int start=0;
unsigned int second=0;
float distanse=0;
unsigned int distance1=0;
unsigned int contflag=0;
main()
{
int i;
int ress=0;
start=0;
contflag=0;
*P_IOA_Dir=0x00f0;
*P_IOA_Attrib=0x00f0;
*P_IOA_Data=0x00f0;
*P_IOB_Dir=0xFFFF;
*P_IOB_Attrib=0xFFFF;
*P_IOB_Data=STOP;
//IO初始化
//t=*P_IOA_Latch;
// Int_Pro(C_IRQ3_KEY);
Int_Pro(0x0004);
asm("INT FIQ");
BSR_DeleteSDGroup(0);
Play_480_voice( WELCOME );
while(Word_Train(COMMAND_QIANJIN_ID , QIANJIN ) != 0);
//..........训练第一条命令.......................
while(Word_Train(COMMAND_ZUOZHUAN_ID, ZUOZHUAN ) != 0) ;
//..........训练第二条命令.......................
while(Word_Train(COMMAND_YOUZHUAN_ID, YOUZHUAN) != 0) ;
//..........训练第三条命令.......................
while(Word_Train(COMMAND_TINGZHI_ID, TINGZHI) != 0) ;
//..........训练第四条命令.......................
Play_480_voice(WANBI);
BSR_InitRecognizer(BSR_MIC);
BSR_EnableCPUIndicator();
asm("INT FIQ,IRQ");
*P_Watchdog_Clear=0x0001;
while (1)
{
*P_Watchdog_Clear=0x0001;
ress=BSR_GetResult();
*P_Watchdog_Clear=0x0001;
if(ress>0)
{
switch(ress)
{
case COMMAND_QIANJIN_ID: //触发命令响应
{
*P_IOB_Data= DIRETCT;
if(start==0)start=1;
*P_Watchdog_Clear=0x0001;
Play_480_voice(QIANJIN);
// Play_480_voice(XIAODE);
break;}
case COMMAND_ZUOZHUAN_ID: //识别第一个命令
{
*P_IOB_Data=LEFT;
if(start==0)start=1;
*P_Watchdog_Clear=0x0001;
Play_480_voice(ZUOZHUAN);
// Play_480_voice(XIAODE);
break;}
case COMMAND_YOUZHUAN_ID: //识别到第二条命令
{
*P_IOB_Data=RIGHT;
if(start==0)start=1;
*P_Watchdog_Clear=0x0001;
Play_480_voice( YOUZHUAN); //响应第二条命令“我在巡逻”
//Play_480_voice(XIAODE);
break; }
case COMMAND_TINGZHI_ID: //识别到第二条命令
{
*P_IOB_Data=STOP;
*P_Watchdog_Clear=0x0001;
if(start==1)start=0;
Play_480_voice( TINGZHI);
*P_Watchdog_Clear=0x0001;
// Play_480_voice(XIAODE);
voce_int(second);
*P_Watchdog_Clear=0x0001;
Play_480_voice(MIAO);
*P_Watchdog_Clear=0x0001;
distance1=distanse;
voce_int (distance1);
Play_480_voice(LIMI);
second=0;
distanse=0;
distance1=0;
*P_Watchdog_Clear=0x0001;
break; }
}
}
*P_Watchdog_Clear=0x0001;
}
}
void FIQ(void) __attribute__((ISR)); //FIQ中断,完成语音播放和辨识的背景功能
void FIQ(void)
{
//int tt;
if(*P_INT_Ctrl & C_FIQ_TMA )
{
*P_Watchdog_Clear=0x0001;
tt=_gIsStopRecog;
if(_gIsStopRecog==0)asm("call _BSR_FIQ_Routine");
else asm(" call F_FIQ_Service_SACM_S480");
*P_INT_Clear = C_FIQ_TMA;
}
}
void IRQ5(void) __attribute__((ISR));//用键盘唤醒中断来处理键盘
void IRQ5(void)
{
if(*P_INT_Ctrl & C_IRQ5_2Hz )
{
// asm("INT OFF");
contflag=1-contflag;
if ((contflag==1)&&(start==1))
{
second+=1;
distanse+=2.7;
}
*P_Watchdog_Clear=0x0001;
*P_INT_Clear = C_IRQ5_2Hz ;
//asm("INT IRQ,FIQ");
}
}
void Play_480_voice(unsigned int voiceid)//辨识中放音子程序
{
BSR_StopRecognizer();
SACM_S480_Initial(1);
SACM_S480_Play(voiceid,3,3);
while((SACM_S480_Status()&0x0001) != 0)
{
SACM_S480_ServiceLoop();
*P_Watchdog_Clear=0x0001;
}
SACM_S480_Stop();
BSR_InitRecognizer(BSR_MIC);
BSR_EnableCPUIndicator();
return;
}
int Word_Train(int WordID,int ResPondID)//WordID:要训练的命令号, ResPondID:训练提示音
{
int res;
Play_480_voice(ResPondID);
while(1)
{
res=BSR_Train(WordID,BSR_TRAIN_TWICE);
if(res==0)break;
switch(res)
{
case -1:
Play_480_voice(MEISHENYIN );
return -1;
case -2:
Play_480_voice(ZAISHUO);
break;
case -3:
// Play_480_voice( BAOZHAN );//应该为环境太吵闹
return -1;
case -4:
//Play_480_voice( BAOZHAN );
Play_480_voice(MEISHENYIN);
return -1; //应该为数据库满
case -5:
Play_480_voice(BUTONG);
return -1;
case -6:
return -1;
}
}
return 0;
}
void voce_int(unsigned int data) //data<=999
{
unsigned int i=data;
unsigned int a[3];
a[2]=i%10;
i/=10;
a[1]=i%10;
i/=10;
a[0]=i%10;
for (i=0;i<=2;i++)Play_480_voice(a[i]+10);
}