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

📄 main.c

📁 智能语音识别避障机器人 // 语音识别+机器人+超声波测距综合应用方案 // 采用特定人识别技术
💻 C
字号:
//========================================================================
//	The information contained herein is the exclusive property of
//	Sunnnorth Technology Co. And shall not be distributed, reproduced,
//	or disclosed in whole in part without prior written permission.
//	(C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
//	ALL RIGHTS RESERVED
//	The entire notice above must be reproduced on all authorized copies.
//========================================================================

//========================================================================
//	工程名称:	Robot
//	功能描述:	智能语音识别避障机器人
//              语音识别+机器人+超声波测距综合应用方案
//				采用特定人识别技术,程序开始时用户需要对语音识别进行训练,每
//				条指令训练两次,训练成功后,才开始真正的语音辨识,针对用户发
//				出的不同语音指令,机器人执行不同的动作,在动作过程中进行超声
//				波测距,遇到障碍物停止动作,并发射飞盘
//	涉及的库:	CMacro1016.lib  
//				bsr222SDL.lib
//				SACMV26e.lib
//	组成文件:	main.c/BackGroudPlaying.c/Flash.asm/FIQ.asm/hadrware.asm
//     			InterruptStatus.asm/IRQ.c/robot_function.c/SetIOBit.asm
//              System.asm/ultrasonic.c/BackGroundPlaying.h/hardware.inc
//              bsrSD.h/s480.h/hardware.h/robot.h
//	硬件连接:	硬件连接主要是针对61板与超声波模组以及机器人的连线,如下:
//				将机器人原有插在IOB7~IOB15上的线换至IOA7~IOA15
//				使用10PIN排线连接超声波模组的J5与61板的IOB口的低八位
//				使用10PIN排线连接超声波模组的J4与61板的IOB口的高低八位
//
//	维护记录:	2006-07-14	v1.0    by lijian
//				
//	注	  意:	
//========================================================================
//**********************************************************************//
//-	超声波障碍检测程序位于robot_function.c中。
//-	在机器人前进、后退、跳舞期间,调用Robot_CheckEnemy()函数进行障碍检测
//-	一旦检测到附近25cm左右距离有障碍物,则停止当前动作,并发射飞盘
//**********************************************************************//

//======================================================================
//	文件名称:	main.c
//	功能描述:	使用ADC转换器,将输入的0-3.3V电压转换为数字
//				信号并在LED上显示出来
//	维护记录:	2005-09-06	v1.0
//				2006-07-11	v2.0	增加超声波测距相关代码
//======================================================================
#include "bsrSD.h"
#include "robot.h"
#include "ultrasonic_App.h"
#include "spce061a.h"
#include "BackGroundPlaying.h"
#include "InterruptStatus.h"

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

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

extern void Delay(unsigned int);

extern unsigned int uiTim;
//========================================================================
//	语法格式:	int main(void)
//	实现功能:	系统主函数
//	参数:		无
//	返回值:	无
//========================================================================
int main(void)
{
	unsigned int uiFlagFirst;				//是否为第一次下载
	unsigned int uiRes;						//识别结果
	unsigned int uiTimerCount;				//时间是否超时
	unsigned int uiBS_Team;					//用于标识现在是第几组命令在内存当中
	unsigned int uiKey;						//存储键盘值,按下将重新训练
	unsigned int uiActivated;				//是否出于待命状态

	uiTim = 0;								//4096Hz计数器
	SetPlayStatus(plNULL);					//初始化语音播放状态为空闲
	uiEnemyIndex = 0;						//该变量用于保存当前测距记录在数组中的位置
	uiEnemy[0] = 0;							//该数组用于保存最近几次的测距记录
	uiEnemy[1] = 0;
	uiEnemy[2] = 0;
	uiEnemy[3] = 0;
	uiEnemy[4] = 0;
	*P_INT_Ctrl = *P_INT_Ctrl_New | 0x0004;	//打开2Hz时基中断
	SetInterruptStatus(0x0004);				//设置R_InterruptStatus变量以防止放音程序将中断关闭
	__asm("INT FIQ,IRQ");
	RobotSystemInit();						//初始化机器人IO口
	Initial_ult();							//初始化超声波测距模组IO口
	uiActivated = 0;

 	uiFlagFirst = IsFirstDownLoad();		//判断是否为第一次下载程序
	
	if(uiFlagFirst == 1)
	{
		//训练
		FormatFlash();						//格式化需要存储命令的存储器
		TrainFiveCommand();					//训练需要的五条命令(一组)
		SaveFiveCommand(0xf700);			//存储五条命令
		PlaySnd(OK, 1);						//播放Ok,Let's go,表示一组命令存储结束
		PlaySnd(LETUSGO, 1);	

		TrainFiveCommand();
		SaveFiveCommand(0xf900);
		PlaySnd(FOLLOWME, 1);

		TrainFiveCommand();
		SaveFiveCommand(0xfb00);
		PlaySnd(HO, 1);
		PlaySnd(HOO, 1);
		PlaySnd(HOO, 1);
		PlaySnd(HOOO, 1);
		PlaySnd(HO, 1);
		PlaySnd(HOO, 1);
		PlaySnd(HOO, 1);
		PlaySnd(HOOO, 1);

		uiFlagFirst = 0xaaaa;
		F_FlashWrite1Word(0xfd00,0xaaaa);
	}
 	
	ImportFiveCommand(Group1);
	uiBS_Team = 0;
	
Loop:
	BSR_InitRecognizer(BSR_MIC);			//初始化识别器
	while(1)
	{
		//开始识别命令
		uiRes = BSR_GetResult();			//取得识别结果
		if(uiRes > 0)
		{	
			if(uiActivated)
			{
				uiTimerCount = 0;
				switch(uiRes)
				{
					case NAME_ID:
						switch(uiBS_Team)
						{
							case 0:				//第一组的第一个命令(杰克)
							//播放Ok,Les's go,Yeah
							PlaySnd(OK, 1);
							break;
							case 1:				//第二组的第一个命令(开始)
							PlaySnd(OK, 1);
							PlaySnd(LETUSGO, 1);
							PlaySnd(YEAH, 1);
							//播放Ok,Les's go
							break;
							case 2:				//第三组的第一个命令(准备)
							PlaySnd(OK, 1);
							//播放Ok
							break;
						}	
						break;

					case Command_One_ID:
						switch(uiBS_Team)
						{
							case 0:				//第一组的第二个命令(开始)
							//导入第二组命令,修改uiBS_Team为1,播放Wo,Ho,Hoo,Hooo,跳出循环
							ImportFiveCommand(Group2);
							uiBS_Team = 1;
							PlaySnd(HO, 1);
							PlaySnd(HOO, 1);
							PlaySnd(HOO, 1);
							PlaySnd(HOOO, 1);
							goto Loop;
							break;
							case 1:				//第二组的第二个命令(向前走)
							//播放喀咔声音,控制电机向前走
							Robot_Go(1);
							ImportFiveCommand(Group1);
							uiBS_Team = 0;
							goto Loop;
							break;
							case 2:				//第三组的第二个命令(向左瞄准)
							
							//播放旋转声音,头部电机向左转
							Robot_HeadTurnLeft(1);
							PlaySnd(TURNHEAD, 1);
							PlaySnd(TURNHEAD, 1);
							PlaySnd(TURNHEAD, 1);
							ImportFiveCommand(Group1);
							uiBS_Team = 0;
							goto Loop;
							break;
						}	
						uiActivated = 0;		//杰克为触发命令,每完成一个动作需要出发一次
						break;

					case Command_Two_ID:
						switch(uiBS_Team)
						{
							case 0:				//第一组的第三个命令(准备)
							
							//导入第三组命令,修改uiBS_Team为2,播放Wo,Ho,Hoo,Hooo,跳出循环
							ImportFiveCommand(Group3);
							uiBS_Team = 2;
							PlaySnd(HO, 1);
							PlaySnd(HOO, 1);
							PlaySnd(HOO, 1);
							PlaySnd(HOOO, 1);
							goto Loop;
							break;
							case 1:				//第二组的第三个命令(倒退)
							//播放喀咔声音,控制电机向后走
							Robot_Backup(1);
							ImportFiveCommand(Group1);
							uiBS_Team = 0;
							break;
							case 2:				//第三组的第三个命令(向右瞄准)
							
							//播放旋转声音,头部电机向右转
							Robot_HeadTurnRight(1);
							PlaySnd(TURNHEAD, 1);
							PlaySnd(TURNHEAD, 1);
							PlaySnd(TURNHEAD, 1);
							ImportFiveCommand(Group1);
							uiBS_Team = 0;
							goto Loop;
							break;
						}
						uiActivated = 0;
						break;

					case Command_Three_ID:
						switch(uiBS_Team)
						{
							case 0:				//第一组的第四个命令(跳舞)
							//跳舞,清看门狗,时间比较长
							Robot_Dance(2);
							break;
							case 1:				//第二组的第四个命令(左转)
							//播放旋转声音,向左旋转
							Robot_TurnLeft(1);
							PlaySnd(WALK, 1);
							ImportFiveCommand(Group1);
							uiBS_Team = 0;
							goto Loop;
							break;
							case 2:				//第三组的第四个命令(发射)
							
							//播放咚咚声音,发射飞盘
							Robot_Shoot_Prepare(5);
							Delay(1500);
							Robot_Shoot2(3);
							ImportFiveCommand(Group1);
							uiBS_Team = 0;
							goto Loop;
							break;
						}
						uiActivated = 0;
						break;

					case Command_Four_ID:
						switch(uiBS_Team)
						{
							case 0:				//第一组的第五个命令(再来一曲)
							//在来一曲
							Robot_DanceAgain(2);
							break;
							case 1:				//第二组的第五个命令(右转)
							//播放声音,向右旋转,导到第一组命令,设置uiBS_Team为0,推出循环
							Robot_TurnRight(1);
							PlaySnd(WALK, 1);
							ImportFiveCommand(Group1);
							uiBS_Team = 0;
							goto Loop;
							break;
							case 2:				//第三组的第五个命令(连续发射)
							
							//连续发射飞盘,导到第一组命令,设置uiBS_Team为0,推出循环
							Robot_Shoot_Prepare(5);
							Delay(1500);
							Robot_Shoot_Five(3);
							ImportFiveCommand(Group1);
							uiBS_Team = 0;
							goto Loop;
							break;
						}
						uiActivated = 0;
						break;
				}
			}
			else
			{
				if(uiRes == NAME_ID)
				{
					uiActivated = 1;
					uiTimerCount = 0;
					PlaySnd(OK, 1);					//播放应答OK
				}
			}
		}
		else if(uiActivated)
		{
			if(++uiTimerCount > 700)
			{
				uiActivated = 0;
				uiTimerCount = 0;
				PlaySnd(HOOO, 1);
			}
		}
		uiKey = *P_IOA_Data;
		uiKey = uiKey&0x0004;
		if(uiKey == 0x0004)
		{
			F_FlashErase(0xfd00);
		}	//擦除标志位
	}
}

⌨️ 快捷键说明

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