📄 main.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 + -