📄 robot_function.c
字号:
//========================================================================
// 文件名称: 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 + -