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

📄 main.c

📁 TV_control代码+说明[1] 利用凌阳单片机语音识别功能去控制电视机
💻 C
字号:

//========================================================
//  工程名称:	TV Contral
//  功能描述:	实现电视的语音控制
//  涉及的库:	CMacro1016.lib
//            	bsrv222SDL.lib
//				sacmv26e.lib
//  组成文件:	main.c
//				Flash.asm, hardware.asm,ISR.asm 
//     			hardware.h,s480.h, hardware.inc
//              sent.c,can_sent.c
//	硬件连接:	IOA2-----KEY3
//				IOB8-----红外发射
//	维护记录:	2008年2月3号   
//  修改:林浩岳
//========================================================

#include "s480.h"
#include "bsrsd.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 A_ID 	0x100
#define B_ID    0x101
#define C_ID 	0x102
#define D_ID 	0x103
#define E_ID 	0x104

#define S_KJ				0			//开机
#define S_One				1			//1
#define S_Two				2			//2
#define S_Three				3			//3
#define S_Four   			4			//4
#define S_GJ				5			//关机
#define S_AGAIN				6			//请再说一遍
#define S_NOVOICE			7			//没有听到任何声音
#define S_NOISY				8			//说什么暗语呀
#define S_START				9			//准备就绪,开始辨识	
	

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 uiTimeset = 3;					//运行时间定时,调整该参数控制运行时间
unsigned int uiTimecont; 							//运行时间计时

extern void OP_CL(void);
extern void One(void);
extern void Two(void);
extern void Three(void);
extern void Four(void);

//=============================================================
// 语法格式:	void Delay();
// 实现功能:	延时
// 参数:		无
// 返回值:		无
//=============================================================
void Delay()							
{
	unsigned int i;
	for(i=0;i<0x3Fff;i++)
	{
		*P_Watchdog_Clear=0x0001;
	}
}

//=============================================================
// 语法格式:	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);					//初始化识别器
}

//=============================================================
// 语法格式:	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_NOVOICE,3);
			return -1;
		case -2: 						//需要训练第二次
			PlaySnd(S_AGAIN,3);
			break;
		case -3:						//环境太吵
			PlaySnd(S_NOISY,3);
			return -3;	
		case -4:						//数据库满
	 		return -4;	
		case -5: 			            		//检测出声音不同
			PlaySnd(S_NOISY,3);
			return -5;
		case -6: 			            		//序号错误
			return -6;
		default:
			break;
		}
	}
	return 0;
}

//=============================================================
// 语法格式:	void TrainSD();
// 实现功能:	训练函数
// 参数:		无
// 返回值:		无
//=============================================================
void TrainSD()
{
	while(TrainWord(A_ID,S_KJ) != 0) ;  	//训练第1条命令
	while(TrainWord(C_ID,S_One) != 0) ;		//训练第2条命令
	while(TrainWord(D_ID,S_Two) != 0) ;     //训练第3条命令
	while(TrainWord(E_ID,S_Three) != 0) ;	//训练第4条命令
	while(TrainWord(B_ID,S_GJ) != 0) ;    	//训练第5条命令
}

//=============================================================
// 语法格式:	void StoreSD();
// 实现功能:	存储语音模型函数
// 参数:		无
// 返回值:		无
//=============================================================
void StoreSD()                           			
{	unsigned int ulAddr,i,commandID,g_Ret;
	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++)					//保存语音模型SD1(0xe000---0xe063)
		{
		    F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
			ulAddr+=1;												
		}
	}
}

//=============================================================
// 语法格式:	void LoadSD();
// 实现功能:	装载语音模型函数
// 参数:		无
// 返回值:		无
//=============================================================
void LoadSD()                           			
{	unsigned int *p,k,jk,Ret,g_Ret;
	p=(int *)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();								
	}
}


//=============================================================
// 语法格式:	void BSR(void);
// 实现功能:	辨识执行子函数
// 参数:		无
// 返回值:		无
//=============================================================
void BSR(void) 
{	
	int Result;							       //辨识结果寄存
	Result = BSR_GetResult();					//获得识别结果

	if(Result>0)							    //有语音触发?
	{					
		switch(Result)
		{
		case A_ID:					     	//识别关机
			OP_CL();
			PlaySnd(S_GJ,3);					    
			*P_Watchdog_Clear = 0x0001;
			break;
			
		case B_ID:					     //识别开机
			OP_CL();
			PlaySnd(S_KJ,3);				        
			*P_Watchdog_Clear = 0x0001;
			break;
			
		case C_ID:			            //识别出第二条命令
			One();					    //执行动作一
			PlaySnd(S_One,3);
			*P_Watchdog_Clear = 0x0001;
			break;
			
		case D_ID:				        //识别出第三条命令
			Two();				       	//执行动作二
			PlaySnd(S_Two,3);
			*P_Watchdog_Clear = 0x0001;
			break;
			
		case E_ID:				         //识别出第四条命令 
 			Three();			       	//执行动作三
 			PlaySnd(S_Three,3);
 			*P_Watchdog_Clear = 0x0001;
			break;
			
		default:
			break;
		}
	}
}


//=============================================================
// 语法格式:	int main(void);
// 实现功能:	主函数
// 参数:		无
// 返回值:		无
//=============================================================
int main(void)
{	unsigned int BS_Flag;						//Train标志位
	
	*P_IOA_Dir=0xff00;						//初始化IOA,IOA0~7下拉输入
	*P_IOA_Attrib=0xff00;
	*P_IOA_Data=0x0000;

	BSR_DeleteSDGroup(0);						//初始化存储器RAM
	BS_Flag=*(unsigned int *)0xe000;			//读存储单元0xe000
	
	if(BS_Flag==0xffff)						//没有经过训练(0xe000内容为0xffff)
	{
		TrainSD();						//训练
		StoreSD();						//存储训练结果(语音模型)
	}
	else 								//经过训练(0xe000内容为0x0055)
	
		LoadSD();						//语音模型载入识别器
	
	
	PlaySnd(S_START,3);						//开始识别提示
    BSR_InitRecognizer(BSR_MIC);				//初始化识别器	
    
	while(1)
	{
		BSR();
		if((*P_IOA_Data)&0x0004)				//是否重新训练
		{	
			F_FlashErase(0xe000);
			while(1);
		}
	}
}

⌨️ 快捷键说明

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