⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 凌阳单片机声控小车源码,对于想开发声控小车的人来说,是相当有用的
💻 C
字号:
#define	P_IOA_Data 				(volatile unsigned int *)0x7000   
#define P_IOA_Buffer 			(volatile unsigned int *)0x7001
#define P_IOA_Dir 				(volatile unsigned int *)0x7002
#define P_IOA_Attrib 			(volatile unsigned int *)0x7003
#define P_IOA_Latch 			(volatile unsigned int *)0x7004
#define P_IOB_Data				(volatile unsigned int *)0x7005  
#define P_IOB_Buffer			(volatile unsigned int *)0x7006   
#define P_IOB_Dir				(volatile unsigned int *)0x7007   
#define P_IOB_Attrib			(volatile unsigned int *)0x7008   

#define P_Watchdog_Clear		(volatile unsigned int *)0x7012   
#define P_SystemClock			(volatile unsigned int *)0x7013  
#include "bsrsd.h"
#include "hardware.h"

#define NAME_ID 		0x100
#define COMMAND_ONE_ID 	0x101
#define COMMAND_TWO_ID 	0x102
#define COMMAND_THREE_ID 	0x103
#define COMMAND_FORE_ID 	0x104
#define COMMAND_FIVE_ID 	0x105
#define COMMAND_SIX_ID 	0x106
#define COMMAND_SEVEN_ID 	0x107
#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 RSP_GUNSHOT		0
#define RSP_PATROL		11
#define RSP_READY		12
#define RSP_COPY		13
#define RSP_NOISY		14
extern  unsigned int BSR_SDModel[100];
unsigned int commandID;
unsigned int g_Ret;
//..................全程变量....................
int gActivated = 0;	//该变量用于检测是否有触发命令,当有识别出语句
                    //为触发名称则该位置1 
					 
int gTriggerRespond[] = {RSP_MASTER, RSP_HERE, RSP_MASTER};
int gComm2Respond[] = {RSP_PATROL, RSP_READY, RSP_COPY};
extern void ClearWatchDog();
int PlayFlag = 0;
unsigned  int uiSpeed=0;
//unsigned int *ClearWatchdog = 0x7012;
void PlayRespond2(int Result)
{
	BSR_StopRecognizer();
	SACM_A2000_Initial(1);
	SACM_A2000_Play(Result, 3, 3);
	while((SACM_A2000_Status()&0x0001) != 0)
	{
		SACM_A2000_ServiceLoop();
		ClearWatchDog();
	}
	SACM_A2000_Stop();
	BSR_InitRecognizer(BSR_MIC);
	BSR_EnableCPUIndicator();	
}

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

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(5);
			return -1;
		case -2: 									//需要重新训练一遍
			PlayRespond(4);
			break;
		case -3: 									//环境太吵
			PlayRespond(5);
			return -1;		
		case -4: 									//数据库满
		 	return -1;
		case -5: 									//检测出声音不同
			if(WordID == NAME_ID)	PlayRespond(5);//两次输入名称不同
			else					PlayRespond(5);//两次输入命令不同
			return -1;
		case -6: 									//序号错误
			return -1;
		}
	}
	return 0;
}
void F_GoAheadCtr(int n)                     			//前进
{  
	int i,j ;	 
	for(j=0;j<n;j++)
	{
	ClearWatchDog();
	i=i&0x00c0;
	i=i|0x2800;
	*P_IOB_Data=i;
	F_Delay(90);
	i=i&0x00c0;
	i=i|0x0000;
	*P_IOB_Data=i;
	F_Delay(60);
	} 
}
void F_BackUpCtr(int n)                        		//倒退
{
  
	int i,j ;	
	 ClearWatchDog(); 
	for(j=0;j<n;j++)
	{
	i=i&0x00c0;
	i=i|0x1400;
	*P_IOB_Data=i;
	F_Delay(90);
	i=i&0x00c0;
	i=i|0x0000;
	*P_IOB_Data=i;
	F_Delay(60);
	} 
}

void F_TurnLeftCtr(int n)                       		//左转
{
	int i,j ;
	ClearWatchDog();	 
	for(j=0;j<n;j++)
	{
	i=i&0x00c0;
	i=i|0x2400;
	*P_IOB_Data=i;
	F_Delay(90);
	i=i&0x00c0;
	i=i|0x0000;
	*P_IOB_Data=i;
	F_Delay(60);
	} 

}
void F_TurnRightCtr(int n)                            //右转
{
	int i,j ;
	ClearWatchDog();	 
	for(j=0;j<n;j++)
	{
	i=i&0x00c0;
	i=i|0x1800;
	*P_IOB_Data=i;
	F_Delay(90);
	i=i&0x00c0;
	i=i|0x0000;
	*P_IOB_Data=i;
	F_Delay(60);
	} 
}

void F_StopCtr()                            //停止
{
	int i,j ;	 
    ClearWatchDog();
	i=i&0x00c0;
	i=i|0x0000;

}

void F_ShunCtr()                             //壁障 
{
      int i;
  
	    	i=*P_IOB_Data;
   		    i=i&0x00c0;
  
				switch(i)
				{
				case 0x00c0:
				    
				    F_GoAheadCtr(50);
				   
					break;
				case 0x0000:
					
				  
				    F_BackUpCtr(500);
				    F_TurnRightCtr(200); 
				 
					break;
				case 0x0040:
				 
				
					F_TurnLeftCtr(200); 
					F_BackUpCtr(100);
					F_TurnLeftCtr(200); 
					F_BackUpCtr(100);
					F_TurnLeftCtr(200); 
					F_BackUpCtr(100);
					F_TurnLeftCtr(200); 
					F_BackUpCtr(100);
				    
				    break;
				case 0x0080:
				
				F_TurnRightCtr(200);
				F_BackUpCtr(100); 
				F_TurnRightCtr(200);
				F_BackUpCtr(100);  
				F_TurnRightCtr(200);
				F_BackUpCtr(100); 
				F_TurnRightCtr(200);
				F_BackUpCtr(100); 
				
				    break; 
			   }			
}
int main()
{
	int res,jk,k, timeCnt=0, random_no=0,iMoveFlag=0xffff,BS_Flag=0,iMoveFlagBS=0,iCarState=0,iCarSpeed=14;
	
	int uiIOB,i,ulAddr,Ret,free,*p;
//	unsigned int *p;
 	p=0xef00;
	BS_Flag=*p;
 	ClearWatchDog(); 
	SP_Init_IOB(0xff00,0x0000,0xff00); 
	SP_Init_IOA(0x0000,0x0000,0x0000);


    BSR_DeleteSDGroup(0);							// 初始化存储器RAM
if(BS_Flag==0xffff)
{
	PlayRespond(0);				    		//播放开始训练的提示音
	//..........训练名称..............................
	while(TrainWord(NAME_ID,0) != 0) ;
	//..........训练第一条命令.......................
	while(TrainWord(COMMAND_ONE_ID,1) != 0) ;
	//..........训练第二条命令.......................
	while(TrainWord(COMMAND_TWO_ID,2) != 0) ;
	//..........训练第三条命令.......................
	while(TrainWord(COMMAND_THREE_ID,3) != 0) ;
	//..........训练第四条命令.......................
	while(TrainWord(COMMAND_FORE_ID,4) != 0) ;
	BS_Flag=0xaaaa;
	F_FlashWrite1Word(0xef00,0xaaaa);
    F_FlashErase(0xe000);
    F_FlashErase(0xe100);
    F_FlashErase(0xe200);
    
	ulAddr=0xe000;//********
	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++)
		{
		    F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
	
			ulAddr+=1;												
		}
		}	//***********************
}
if(BS_Flag==0xaaaa)	
{
BSR_DeleteSDGroup(0);
	p=0xe000;																					
	for(jk=0;jk<5;jk++)
	{
		for(k=0;k<100;k++)
		{
			Ret=*p;							
			BSR_SDModel[k]=Ret;				
			p+=1;													
		}					
		g_Ret=BSR_ImportSDWord();
		while(g_Ret!=0)
		g_Ret=BSR_ImportSDWord();							
	}
}
	//..........开始识别命令.........................
	BSR_InitRecognizer(BSR_MIC);		    		//辨识器初始化
	//BSR_EnableCPUIndicator();

	PlayRespond(0);			    			// 播放开始辨识的提示音
	PlayRespond(0);
	//Interrupt();
	iMoveFlag=0;
	while(1)
	{
	  
	
//	    ClearWatchdog = 0x0001; 
	   
        random_no ++;
		if(random_no >= 3) random_no = 0;
		res = BSR_GetResult();
		
		if(res > 0)							//识别出命令
		{
			  
			if(gActivated)
			{
				timeCnt = 0;
				switch(res)
				{
				case NAME_ID:
   					PlayFlag = 0;
				
					ClearWatchDog();
			
					F_StopCtr();
					iMoveFlag=1;
					iMoveFlagBS=0;
			
					break;
				case COMMAND_ONE_ID:
				    PlayRespond(1);
				    ClearWatchDog();
				    F_GoAheadCtr(600);
				    iMoveFlag=0;
				    iMoveFlagBS=0;
				   
					gActivated = 0;
					F_StopCtr();
					iCarState=0x2800;
					break;
				case COMMAND_TWO_ID:
					PlayRespond(2);
				ClearWatchDog();
				    F_BackUpCtr(650);
				
					PlayFlag = 0;
				    iMoveFlag=0;
				    iCarState=0x1400;
				iMoveFlagBS=0;
					ClearWatchDog();
					gActivated = 0;
					F_StopCtr();
					break;
				case COMMAND_THREE_ID:
				 PlayRespond(3);
				
				F_TurnLeftCtr(450); 
					F_GoAheadCtr(100);
						F_TurnLeftCtr(350); 
					F_GoAheadCtr(100);
					F_TurnLeftCtr(350); 
					F_GoAheadCtr(100);
					F_TurnLeftCtr(350); 
					F_GoAheadCtr(100);
					iMoveFlag=0;
					iMoveFlagBS=0;
				
				    iCarState=0;
					
					ClearWatchDog();
				    gActivated = 0;
				F_StopCtr();
				    break;
				case COMMAND_FORE_ID:
				PlayRespond(4);
				
				F_TurnRightCtr(450);
				F_GoAheadCtr(100); 
				F_TurnRightCtr(350);
				F_GoAheadCtr(100);  
				F_TurnRightCtr(350);
				F_GoAheadCtr(100); 
				F_TurnRightCtr(350);
				F_GoAheadCtr(100); 
				iMoveFlag=0; 
				iMoveFlagBS=0;
				iCarState=0;
		
				    
					
				ClearWatchDog();
				    gActivated = 0;
				F_StopCtr();
				
				    break; 
			   }				
			}
			else
			{
			//	gActivated = 1;
				if(res == NAME_ID)
				{
					ClearWatchDog(); 
					PlayRespond(0);
					iMoveFlag=1;
					iMoveFlagBS=0;
					gActivated = 1;
					timeCnt = 0;
				}
		
			}	
		}
		else if (gActivated)
		{
		
			if (++timeCnt > 450)			//超出定时
			{
				ClearWatchDog(); 
								
				gActivated = 0;
				timeCnt = 0;
			}
		}
		
		if(iMoveFlagBS==13&&iMoveFlag==0) 
	   	{
	   	i=*P_IOB_Data;//**
   		i=i&0x00c0;//**
   		ClearWatchDog();
   		if(i==0x0080||i==0x0040||i==0x0000) free=0;//F_ShunCtr();//free=0; // //F_ShunCtr();//**
	   	else
	   	{
	   		i=i&0x00c0;
			i=i|iCarState;
			//*P_IOB_Data=i;
			ClearWatchDog();
			}
			
		}
		if(iMoveFlagBS==iCarSpeed&&iMoveFlag==0)
		{
			i=i&0x00c0;
			i=i|0x0000;
			*P_IOB_Data=i;
			iMoveFlagBS=0;
	    	ClearWatchDog();

		}
			iMoveFlagBS++;
			i=*P_IOA_Data;//**
   		    i=i&0x0007;//**
   		    if(i==0x0003)  iCarSpeed++;
   		    i=i&0x0004;
   		    if(i==0x0004)  F_FlashErase(0xef00); 
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -