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

📄 main.c

📁 本程序利用凌阳单片机的声控翻书机源程序 语音命令有分组
💻 C
字号:
//*************************************************************************
//声控翻书系统==========freela========08年10月26日========================= 
//*************************************************************************/



#include "s480.h"
#include "bsrsd.h"
#include "spce061v004.h"

#define	P_IOA_Data 			(volatile unsigned int *)0x7000   
#define P_IOA_Dir 			(volatile unsigned int *)0x7002
#define P_IOA_Attrib 		(volatile unsigned int *)0x7003
#define P_IOB_Data			(volatile unsigned int *)0x7005  
#define P_IOB_Dir			(volatile unsigned int *)0x7007   
#define P_IOB_Attrib		(volatile unsigned int *)0x7008   
#define P_TimerA_Data		(volatile unsigned int *)0x700A   
#define P_TimerA_Ctrl		(volatile unsigned int *)0x700B   
#define P_TimerB_Data		(volatile unsigned int *)0x700C   
#define P_TimerB_Ctrl		(volatile unsigned int *)0x700D   
#define P_Watchdog_Clear	(volatile unsigned int *)0x7012   
#define P_INT_Mask			(volatile unsigned int *)0x702D   
#define P_INT_Clear			(volatile unsigned int *)0x7011   

#define C_ONE_ID 	    	    0x100   //第一条命
#define C_TWO_ID                0x101   //第二条命令
#define C_THREE_ID 		        0x102   //第三条
#define C_FOUR_ID 	            0x103   //第四条
#define C_FIVE_ID 	            0x104   //第五条




#define S_ZU2        0      //第二组命令
#define S_ONE        1      //第一个命令
#define S_TWO        2      //第二个命令
#define S_THREE      3      //
#define S_FOUR       4      //
#define S_FIVE       5      //第五个命令
#define S_AGAIN      6      //请在说一遍
#define S_BQ         7      //不清楚,请再说一遍
#define S_WELCOME    8      //欢迎使用
#define S_DENGDAI    9      //翻书中请等待
#define S_NOSONG     10     //没有听到任何声音
#define S_DQ         11     //大强在
#define S_XQ         12     //小强在

extern  unsigned int BSR_SDModel[100];		//外部变量BSR_SDModel[100],辨识器自带
extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);
extern void F_FlashErase(unsigned int sector);


unsigned int Team=0;	// 标记组


//********************************************
//uart_init()  串行口初始化函数
//********************************************
void uart_init()   //uart初始化
{
	 __asm("INT OFF");
	
	*P_IOB_Attrib = 0x0480;				//初始化IOB7、IOB10端口
	*P_IOB_Dir = 0x0400;
	*P_IOB_Data = 0x0000;
	
	*P_UART_BaudScalarLow = 0x00;		//设置波特率为9600
	*P_UART_BaudScalarHigh = 0x05;
	
	*P_UART_Command1 = 0x0080;			//使能接收中断,,0x00c0为发射接和收中断
	*P_UART_Command2 = 0x00c0;			//使能发送、接收通道

//	*P_INT_Ctrl=C_IRQ3_EXT1|C_IRQ3_EXT2;            //开中断EXT1
	__asm("INT IRQ");

}


//=============================================================
// 语法格式:	void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);
// 实现功能:	语音播放函数
// 参数:		SndIndex-播放语音资源索引号
//				DAC_Channel-播放声道选择
// 返回值:		无
//=============================================================
void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
{
	BSR_StopRecognizer();								//停止识别器
	SACM_S480_Initial(1);								//初始化为自动播放
	SACM_S480_Play(SndIndex, DAC_Channel, 3);			//开始播放一段语音
	while((SACM_S480_Status()&0x0001)!= 0)				//是否播放完毕?
	{
		SACM_S480_ServiceLoop();						//解码并填充队列
		*P_Watchdog_Clear=0x0001;						//清看门狗
	}
	SACM_S480_Stop();									//停止播放
	BSR_InitRecognizer(BSR_MIC);	   	//初始化识别器
    BSR_EnableCPUIndicator();					
}

//=============================================================
// 语法格式:	int TrainWord(int WordID,int SndID);
// 实现功能:	训练一条指令
// 参数:		WordID-指令编码
//				SndID-指令提示音索引号
// 返回值:		无
//=============================================================
int TrainWord(unsigned int WordID,unsigned int SndID)
{
	int Result;
	PlaySnd(SndID,3);									//引导训练,播放指令对应动作
	while(1)
	{
		Result = BSR_Train(WordID,BSR_TRAIN_TWICE);		//训练两次,获得训练结果
										
		if(Result==0)break;
		switch(Result)
		{
		case -1:										//没有检测出声音
			PlaySnd(S_NOSONG,3);
			return -1;
		case -2: 										//需要训练第二次
			PlaySnd(S_AGAIN,3);
			break;
		case -3:										//环境太吵
			PlaySnd(S_BQ,3);
			return -3;	
		case -4:										//数据库满
	 		PlaySnd(S_DENGDAI,3);
	 		return -4;	
		case -5: 			            				//检测出声音不同
			PlaySnd(S_BQ,3);                        // 都用了NOSONG代替
			return -5;
		case -6: 			            				//序号错误
			return -6;
		default:
			break;
		}
	}
	return 0;
}

//=============================================================
// 语法格式:	void TrainSD();
// 实现功能:	训练函数
// 参数:		无
// 返回值:		无
//=============================================================
void TrainSD()
{   
	BSR_DeleteSDGroup(0);
	while(TrainWord(C_ONE_ID,S_ONE) != 0) ;  		//第一条
	while(TrainWord(C_TWO_ID,S_TWO) != 0) ;  	    //第二条
	while(TrainWord(C_THREE_ID,S_THREE) != 0) ;  	//
	while(TrainWord(C_FOUR_ID,S_FOUR) != 0) ;  	    //
	while(TrainWord(C_FIVE_ID,S_FIVE) != 0) ;       //
}


void FormatFlash(void)
{
	F_FlashErase(0xe000);				//存储第一组命令的Flash空间
	F_FlashErase(0xe000+100);			//每条命令占用96个字,用函数导出占用100个字
	F_FlashErase(0xe000+200);
	F_FlashErase(0xe000+300);
	F_FlashErase(0xe000+400);
	
	F_FlashErase(0xe400);				//存储第一组命令的Flash空间
	F_FlashErase(0xe400+100);			//每条命令占用96个字,用函数导出占用100个字
	F_FlashErase(0xe400+200);
	F_FlashErase(0xe400+300);
	F_FlashErase(0xe400+400);
	
}





//=============================================================
// 语法格式:	void StoreSD();
// 实现功能:	存储语音模型函数
// 参数:		无
// 返回值:		无
//=============================================================
void StoreSD(unsigned int ulAddr)                           			
{	unsigned int i,commandID,g_Ret;
	F_FlashWrite1Word(0xef00,0xaaaa);

//   	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++)								//保存语音模型SD1(0xe000---0xe063)
		{
		    F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
			ulAddr+=1;												
		}
	}
}


//=============================================================
// 语法格式:	void ImportFiveCommand(unsigned int uiAddr_Import);
// 实现功能:	装载语音模型函数
// 参数:		无
// 返回值:		无
//=============================================================
void ImportFiveCommand(unsigned int uiAddr_Import)
{
	unsigned int uiCommand_Import;
	unsigned int uiCount;
	unsigned int uiRes_Import;
	unsigned int *p_Import;
	
	BSR_DeleteSDGroup(0);					//清除内存
	
	p_Import = (unsigned int *)uiAddr_Import;
	for(uiCommand_Import = 0;uiCommand_Import < 5;uiCommand_Import++)
	{
		for(uiCount = 0;uiCount < 100;uiCount++)
		{
			uiRes_Import = *p_Import;
			BSR_SDModel[uiCount] = uiRes_Import;
			p_Import += 1;
			*(unsigned int *)0x7012 = 1;
		}
		uiRes_Import = BSR_ImportSDWord();
		while(uiRes_Import)
			uiRes_Import = BSR_ImportSDWord();
		*(unsigned int *)0x7012 = 1;
	}
}

//=============================================================
// 语法格式:	void BSR(void);
// 实现功能:	辨识子函数
// 参数:		无
// 返回值:		无
//=============================================================
void BSR(void)
{	
				
	int Result;									//辨识结果寄存
	Result = BSR_GetResult();					//获得识别结果
	if(Result>0)								//有语音触发?
	{	
	 
	   
	   	switch(Result)
		{
		case C_ONE_ID:							//
			   switch(Team)
			 		{
			 		case 0:
		         	    PlaySnd(S_XQ,3);					
		                ImportFiveCommand(0xe400);  // 载入第二组命令
		                Team=1; 
		        	    break;
		        	case 1:
		        	    PlaySnd(S_DQ,3);
		        	    ImportFiveCommand(0xe000); // 载入第一组命令
		        	    Team=0;
		        	    break;
			 		}
		    break; 		
		case C_TWO_ID:                       //
		         switch(Team)
		           {
		           	case 0:
		           	   *P_UART_Data=0x01;
		           	   PlaySnd(S_DENGDAI,3);
		           	   break;
		           	case 1:
		           	   PlaySnd(S_ONE,3);
		           	   break;   						 
		           }
		      break;
		case C_THREE_ID:
		       switch(Team)
		       {
		       	case 0:
		       	    *P_UART_Data=0x11;					          
			        PlaySnd(S_DENGDAI,3);
			        break;
			    case 1:
			         PlaySnd(S_TWO,3);
			         break;
		       }    
              break;
		case C_FOUR_ID:
		      switch(Team) 
		        {  case 0:
		      		*P_UART_Data=0x02;
		      		PlaySnd(S_DENGDAI,3);			          
			        break;
			      case 1:
			        PlaySnd(S_THREE,3);
			        break;
		        }   
			        
               break;
		  case C_FIVE_ID:
		      switch(Team)
		      {
		      	case 0:
		      	     *P_UART_Data=0x12; 					     
		             PlaySnd(S_DENGDAI,3);
					 break;
				case 1:
				    PlaySnd(S_FOUR,3);
				    break;
		       }	 	
	         break;
		   default:
			        break;
		}
	}
}

//=======================================================
//main.c
//=======================================================
int main()
{
	unsigned int BS_Flag;		                //Train标志位



	uart_init();                                //串口初始化
//	BSR_DeleteSDGroup(0);						//初始化存储器RAM

	BS_Flag=*(unsigned int *)0xe000;			//读存储单元0xe000
	
	if(BS_Flag==0xffff)							//没有经过训练(0xe000内容为0xffff)
	{	
	    FormatFlash();
		TrainSD();								//训练
		StoreSD(0xe000);
		PlaySnd(S_ZU2,3);

		TrainSD();
		StoreSD(0xe200);
		PlaySnd(S_WELCOME,3);				        //存储训练结果(语音模型)
	}
	else 										    //经过训练(0xe000内容为0x0055)
	{
	    ImportFiveCommand(0xe000);								//语音模型载入识别器
	}
    ImportFiveCommand(0xe000);	
    PlaySnd(S_WELCOME,3);							//开始识别提示
    
	BSR_InitRecognizer(BSR_MIC);				    //初始化识别器
    while(1)
    {
    	BSR();
    	if((*P_IOA_Data)&0x0004)				    //是否重新训练
		{	
			F_FlashErase(0xe000);
			while(1);
		}
    	*P_Watchdog_Clear=0x0001;
    }  
}  

   	

⌨️ 快捷键说明

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