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

📄 robot_function.c

📁 智能语音识别避障机器人 // 语音识别+机器人+超声波测距综合应用方案 // 采用特定人识别技术
💻 C
📖 第 1 页 / 共 2 页
字号:
//========================================================================
//	文件名称:	robot_function.c
//	功能描述:	机器人语音训练和执行相关动作的实现(包含障碍检测函数)
//	维护记录:	2005-09-06	V1.0
//				2006-07-13	V1.2	删除语音播放函数,并使用新的播放函数代替(位于BackGroundPlaying.c文件中)
//									增加超声波障碍检测函数
//									为机器人前进、后退、跳舞、再来一曲等动作增加障碍检测
//========================================================================
#include "bsrSD.h"
#include "s480.h"
#include "robot.h"
#include "BackGroundPlaying.h"
#include "ultrasonic_App.h"

void RobotSystemInit(void);
unsigned int IsFirstDownLoad(void);
void FormatFlash(void);
void TrainFiveCommand(void);
void SaveFiveCommand(unsigned int uiAddr);
void ImportFiveCommand(unsigned int uiAddr_Import);
unsigned int TrainWord(unsigned int WordID,unsigned int SndIndex);
void Robot_DanceAgain(unsigned int n);
void Robot_Dance(unsigned int n);
void Robot_Go(unsigned int n);
void Robot_Backup(unsigned int n);
void Robot_TurnLeft(unsigned int n);
void Robot_TurnRight(unsigned int n);
void Robot_HeadTurnLeft(unsigned int n);
void Robot_HeadTurnRight(unsigned int n);
void Robot_Shoot_Prepare(unsigned int n);
void Robot_Shoot2(unsigned int n);
void Robot_Shoot_Five(unsigned int n);
int Robot_CheckEnemy();

extern void F_FlashErase(int);
extern void F_FlashWrite1Word(unsigned int,unsigned int);

extern void Delay(unsigned int n);
extern void Set_IOA_Bit(unsigned int,unsigned int,unsigned int
						,unsigned int,unsigned int);
extern void Set_IOB_Bit(unsigned int,unsigned int,unsigned int
						,unsigned int,unsigned int);

//========================================================================
//	语法格式:	void RobotSystemInit(void)
//	实现功能:	初始化机器人电机驱动相关IO
//	参数:		无
//	返回值:	无
//========================================================================
void RobotSystemInit(void)
{
	*(volatile unsigned int *)0x7013 = 0x0088;
	Delay(500);
	*P_IOA_Data = 0xfffb;
	*P_IOA_Attrib = 0xfffb;
	*P_IOA_Dir = 0xfffb;
	
	*P_IOA_Data = 0x0000;

	Delay(500);
}
//========================================================================
//	语法格式:	unsigend int IsFirstDownLoad(void)
//	实现功能:	判断是否进行过训练
//	参数:		无
//	返回值:	0	-	进行过训练
//				1	-	没有进行过训练
//========================================================================
unsigned int IsFirstDownLoad(void)
{
	unsigned int uiFlagFirst_Sub;
	unsigned int uiFlashData;
	unsigned int *p;
	
	p = 0xfd00;
	uiFlashData = *p;
	if(uiFlashData == 0xffff)
	{
		uiFlagFirst_Sub = 1;
		return uiFlagFirst_Sub;		
	}
	else if(uiFlashData == 0xaaaa)
	{
		uiFlagFirst_Sub = 0;
		return uiFlagFirst_Sub;
	}
	else
	{
		uiFlagFirst_Sub = -1;
		return uiFlagFirst_Sub;
	}
}
//========================================================================
//	语法格式:	void FormatFlash(void)
//	实现功能:	擦除存储命令模型的Flash
//	参数:		无
//	返回值:	无
//========================================================================
void FormatFlash(void)
{
	F_FlashErase(Group1);				//存储第一组命令的Flash空间
	F_FlashErase(Group1+100);			//每条命令占用96个字,用函数导出占用100个字
	F_FlashErase(Group1+200);
	F_FlashErase(Group1+300);
	F_FlashErase(Group1+400);
	
	F_FlashErase(Group2);				//存储第一组命令的Flash空间
	F_FlashErase(Group2+100);			//每条命令占用96个字,用函数导出占用100个字
	F_FlashErase(Group2+200);
	F_FlashErase(Group2+300);
	F_FlashErase(Group2+400);
	
	F_FlashErase(Group3);				//存储第一组命令的Flash空间
	F_FlashErase(Group3+100);			//每条命令占用96个字,用函数导出占用100个字
	F_FlashErase(Group3+200);
	F_FlashErase(Group3+300);
	F_FlashErase(Group3+400);
}
//========================================================================
//	语法格式:	void TrainFiveCommand(void)
//	实现功能:	训练一组五条命令
//	参数:		无
//	返回值:	无
//========================================================================
void TrainFiveCommand(void)
{
	BSR_DeleteSDGroup(0);				//初始化存储器RAM
	PlaySnd(0, 1);							//播放提示音1
	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_Four_ID,4) != 0);
}
//========================================================================
//	语法格式:	void SaveFiveCommand(unsigned int uiAddr)
//	实现功能:	保存一组五条命令的模型数据
//	参数:		uiAddr	-	保存缓冲区的首地址
//	返回值:	无
//========================================================================
void SaveFiveCommand(unsigned int uiAddr)
{
	unsigned int uiCommandID;
	unsigned int uiCount;
	unsigned int uiRes_Export;
	
	for(uiCommandID = 0x100;uiCommandID<0x105;uiCommandID++)
	{
		uiRes_Export = BSR_ExportSDWord(uiCommandID);
		while(uiRes_Export)
			uiRes_Export = BSR_ExportSDWord(uiCommandID);
		for(uiCount = 0;uiCount<100;uiCount++)
		{
			F_FlashWrite1Word(uiAddr,BSR_SDModel[uiCount]);
			uiAddr += 1;
		}
	}
}	
//========================================================================
//	语法格式:	void ImportFiveCommand(unsigned int uiAddr)
//	实现功能:	导入一组五条命令的模型数据
//	参数:		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 = 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;
		}
		uiRes_Import = BSR_ImportSDWord();
		while(uiRes_Import)
			uiRes_Import = BSR_ImportSDWord();
	}
}
//========================================================================
//	语法格式:	unsigned int TrainWord(unsigned int WordID,unsigned int SndIndex)
//	实现功能:	训练一条命令
//	参数:		WordID	-	命令ID号
//				SndIndex-	提示语音的资源序号
//	返回值:	训练结果(各返回值意义详见程序中的注释)
//========================================================================
unsigned int TrainWord(unsigned int WordID,unsigned int SndIndex)
{
	unsigned int uiRes_Train;
	PlaySnd(SndIndex, 1);
	while(1)
	{
		uiRes_Train = BSR_Train(WordID,BSR_TRAIN_TWICE);
		if(uiRes_Train == 0)
			break;
		
		switch(uiRes_Train)
		{
			case -1:					//没有检测出声音
				PlaySnd(HOO, 1);
				return -1;
			case -2:					//需要重新训练一遍
				PlaySnd(HOO, 1);
				break;
			case -3:					//环境太吵
				PlaySnd(HOO, 1);
				return -1;
			case -4:					//数据库满
				return -1;
			case -5:					//检测出声音不同
				PlaySnd(HOO, 1);
				return -1;
			case -6:					//序号错误
				PlaySnd(HOO, 1);
				return -1;									
		}
	}
	return 0;
}
//========================================================================
//	语法格式:	void Robot_Light(unsigned int n)
//	实现功能:	机器人眼睛指示灯闪烁控制函数
//	参数:		n	-	闪烁时间控制
//	返回值:	无
//========================================================================
void Robot_Light(unsigned int n)
{
	unsigned int uiP_IOA_Data;
	unsigned int uiP_IOA_Dir;
	unsigned int uiP_IOA_Attrib;

	uiP_IOA_Dir = *P_IOA_Dir;					//读回IOA口的状态值
	uiP_IOA_Attrib = *P_IOA_Attrib;
	uiP_IOA_Data = *P_IOA_Data;

	uiP_IOA_Dir |= 0x1000;						//改变IOA12位
	uiP_IOA_Attrib |= 0x1000;
	uiP_IOA_Data |= 0x1000;

	*P_IOA_Dir = uiP_IOA_Dir;					//设置IOA12为高电平输出
	*P_IOA_Attrib = uiP_IOA_Attrib;				//其它IO口不变
	*P_IOA_Data = uiP_IOA_Data;

	Delay(n);
		
	uiP_IOA_Dir = *P_IOA_Dir;					//读回IOA口的状态值
	uiP_IOA_Attrib = *P_IOA_Attrib;
	uiP_IOA_Data = *P_IOA_Data;
	
	uiP_IOA_Dir |= 0x1000;						//改变IOA12位
	uiP_IOA_Attrib |= 0x1000;
	uiP_IOA_Data &= 0xefff;
	
	*P_IOA_Dir = uiP_IOA_Dir;					//设置IOA12为低电平输出
	*P_IOA_Attrib = uiP_IOA_Attrib;				//其它IO口不变
	*P_IOA_Data = uiP_IOA_Data;
}
//========================================================================
//	语法格式:	void Robot_DanceAgain(unsigned int n)
//	实现功能:	再来一曲
//	参数:		n	-	循环跳舞次数
//	返回值:	无
//========================================================================
void Robot_DanceAgain(unsigned int n)
{
	unsigned int uiCount;
	unsigned int uiP_IOA_Data;
	unsigned int uiP_IOA_Dir;
	unsigned int uiP_IOA_Attrib;

	for(uiCount = 0;uiCount < n;uiCount++)
	{
		uiP_IOA_Dir = *P_IOA_Dir;					//读回IOA口的状态值
		uiP_IOA_Attrib = *P_IOA_Attrib;
		uiP_IOA_Data = *P_IOA_Data;
	
		uiP_IOA_Dir |= 0x2900;						//改变IOA8、IOA11、IOA13位
		uiP_IOA_Attrib |= 0x2900;
		uiP_IOA_Data |= 0x2900;
	
		*P_IOA_Dir = uiP_IOA_Dir;					//设置IOA8、IOA11、IOA13为高电平输出
		*P_IOA_Attrib = uiP_IOA_Attrib;				//其它IO口不变
		*P_IOA_Data = uiP_IOA_Data;
		
		PlaySnd(D24, 0);							//采用后台方式播放语音
		if(Robot_CheckEnemy() == -1)				//在语音播放期间进行超声波测距
			return;									//如果发现障碍物则退出动作执行
		RobotSystemInit();
		
		
		uiP_IOA_Dir = *P_IOA_Dir;					//读回IOA口的状态值
		uiP_IOA_Attrib = *P_IOA_Attrib;
		uiP_IOA_Data = *P_IOA_Data;
	
		uiP_IOA_Dir |= 0x4600;						//改变IOA9、IOA10、IOA14位
		uiP_IOA_Attrib |= 0x4600;
		uiP_IOA_Data |= 0x4600;
	
		*P_IOA_Dir = uiP_IOA_Dir;					//设置IOA9、IOA10、IOA14为高电平输出
		*P_IOA_Attrib = uiP_IOA_Attrib;				//其它IO口不变
		*P_IOA_Data = uiP_IOA_Data;
		
		PlaySnd(D25, 0);
		if(Robot_CheckEnemy() == -1)				//在语音播放期间进行超声波测距
			return;									//如果发现障碍物则退出动作执行
		RobotSystemInit();
		
		
		uiP_IOA_Dir = *P_IOA_Dir;					//读回IOA口的状态值
		uiP_IOA_Attrib = *P_IOA_Attrib;
		uiP_IOA_Data = *P_IOA_Data;
	
		uiP_IOA_Dir |= 0x0900;						//改变IOA8、IOA11位
		uiP_IOA_Attrib |= 0x0900;
		uiP_IOA_Data |= 0x0900;
	
		*P_IOA_Dir = uiP_IOA_Dir;					//设置IOA8、IOA11为高电平输出
		*P_IOA_Attrib = uiP_IOA_Attrib;				//其它IO口不变
		*P_IOA_Data = uiP_IOA_Data;
		
		PlaySnd(D26, 0);
		if(Robot_CheckEnemy() == -1)				//在语音播放期间进行超声波测距
			return;									//如果发现障碍物则退出动作执行
		RobotSystemInit();
		
		
		uiP_IOA_Dir = *P_IOA_Dir;					//读回IOA口的状态值
		uiP_IOA_Attrib = *P_IOA_Attrib;
		uiP_IOA_Data = *P_IOA_Data;
	
		uiP_IOA_Dir |= 0x0a00;						//改变IOA9、IOA11位
		uiP_IOA_Attrib |= 0x0a00;
		uiP_IOA_Data |= 0x0a00;
	
		*P_IOA_Dir = uiP_IOA_Dir;					//设置IOA9、IOA11为高电平输出
		*P_IOA_Attrib = uiP_IOA_Attrib;				//其它IO口不变
		*P_IOA_Data = uiP_IOA_Data;
		
		PlaySnd(D24, 0);
		if(Robot_CheckEnemy() == -1)				//在语音播放期间进行超声波测距
			return;									//如果发现障碍物则退出动作执行
		RobotSystemInit();
		
		
		uiP_IOA_Dir = *P_IOA_Dir;					//读回IOA口的状态值
		uiP_IOA_Attrib = *P_IOA_Attrib;
		uiP_IOA_Data = *P_IOA_Data;
	
		uiP_IOA_Dir |= 0x0500;						//改变IOA8、IOA10位
		uiP_IOA_Attrib |= 0x0500;
		uiP_IOA_Data |= 0x0500;
	
		*P_IOA_Dir = uiP_IOA_Dir;					//设置IOA8、IOA10为高电平输出
		*P_IOA_Attrib = uiP_IOA_Attrib;				//其它IO口不变
		*P_IOA_Data = uiP_IOA_Data;
		
		PlaySnd(D25, 0);
		if(Robot_CheckEnemy() == -1)				//在语音播放期间进行超声波测距
			return;									//如果发现障碍物则退出动作执行
		RobotSystemInit();
		
		
		uiP_IOA_Dir = *P_IOA_Dir;					//读回IOA口的状态值
		uiP_IOA_Attrib = *P_IOA_Attrib;
		uiP_IOA_Data = *P_IOA_Data;
	
		uiP_IOA_Dir |= 0x0a00;						//改变IOA9、IOA11位
		uiP_IOA_Attrib |= 0x0a00;
		uiP_IOA_Data |= 0x0a00;
	
		*P_IOA_Dir = uiP_IOA_Dir;					//设置IOA9、IOA11为高电平输出
		*P_IOA_Attrib = uiP_IOA_Attrib;				//其它IO口不变
		*P_IOA_Data = uiP_IOA_Data;
		
		PlaySnd(D26, 0);
		if(Robot_CheckEnemy() == -1)				//在语音播放期间进行超声波测距
			return;									//如果发现障碍物则退出动作执行
		RobotSystemInit();
		
		
		uiP_IOA_Dir = *P_IOA_Dir;					//读回IOA口的状态值
		uiP_IOA_Attrib = *P_IOA_Attrib;
		uiP_IOA_Data = *P_IOA_Data;
	

⌨️ 快捷键说明

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