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); 
 
}