📄 main.c
字号:
#include "SPCE061V004.h"
#include "s480.h"
#include "bsrsd.h"
#include "IDCONTROL.h"
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 *rock,coy;
unsigned int uiTimeset = 3; //运行时间定时,调整该参数控制运行时间
unsigned int uiTimecont; //运行时间计时
//=============================================================
// 语法格式: void Delay();
// 实现功能: 延时
// 参数: 无
// 返回值: 无
//=============================================================
void Delay()
{
unsigned int i,j;
for(j=0;j<0x000a;j++)
{
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); //初始化识别器
BSR_EnableCPUIndicator();
}
//=============================================================
// 语法格式: 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_CMDDIFF,3);
return -5;
case -6: //序号错误
return -6;
default:
break;
}
}
return 0;
}
//=============================================================
// 语法格式: void TrainSD();
// 实现功能: 训练函数
// 参数: 无
// 返回值: 无
//=============================================================
void TrainSD()
{
while(TrainWord(NAME_ID,S_NAME) != 0) ; //训练名称
while(TrainWord(COMMAND_START_ID,S_ACT1) != 0); //训练第1个动作程序开始
while(TrainWord(COMMAND_OK_ID,S_ACT2) != 0) ; //训练第2个动作故障排除
}
//=============================================================
// 语法格式: void StoreSD();
// 实现功能: 存储语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void StoreSD()
{
unsigned int ulAddr;
unsigned int i;
unsigned int commandID;
unsigned int g_Ret;
F_FlashWrite1Word(0xef00,0xaaaa);
F_FlashErase(0xe000);
F_FlashErase(0xe100);
F_FlashErase(0xe200);
ulAddr=0xe000;
for(commandID=0x100;commandID<0x103;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<3;jk++) //this command has been changed into <=
{
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 MISTAKE()
{
PlaySnd(S_POLICE,3); //语音提示报警
*P_INT_Mask |= 0x0004; //以下为中断定时操作
__asm("int fiq,irq");
uiTimecont = 0;
}
//=============================================================
// 语法格式: void GoAhead();
// 实现功能: 前进子函数
// 参数: 无
// 返回值: 无
//=============================================================
void GoAhead() //工作
{
*P_IOA_Data=0x0001;
PlaySnd(S_ACT1,3); //提示
while((*P_IOA_Data)&0x0001==0x0001)
{
unsigned int *rock=0x0000;
coy++;
*P_IOB_Data=0xfffe; //0x00fe 0x00fd 0x00fb 0x00f7 0x00ef 0x00df 0x00bf 0x007f
Delay(); //第一只灯亮
Delay();
coy++;
*P_IOB_Data=0xfffd; //第二只灯亮
Delay();
Delay();
coy++;
*P_IOB_Data=0xfffb; //第三只灯亮
Delay();
Delay();
coy++;
*P_IOB_Data=0xfff7; //第四只灯亮
Delay();
Delay();
coy++;
*P_IOB_Data=0xffef; //第五只灯亮
Delay();
Delay();
coy++;
*P_IOB_Data=0xffdf; //第六只灯亮
Delay();
Delay();
coy++;
*P_IOB_Data=0xff61; //第七只灯亮
Delay();
Delay();
}
MISTAKE();
}
//=============================================================
// 语法格式: void Stop();
// 实现功能: 停机报警子函数
// 参数: 无
// 返回值: 无
//=============================================================
void Stop() //停机
{
*P_IOB_Data=0xffff; //停机
PlaySnd(S_TEMP,3); //语音提示YEAH
}
//=============================================================
// 语法格式: void OK();
// 实现功能: 故障排除继续子函数
// 参数: 无
// 返回值: 无
//=============================================================
void OK()
{
*P_IOA_Data=0x0001;
PlaySnd(S_ACT2,3);
coy=(*rock);
switch(coy)
{
case 0x0001:
coy++;
*P_IOB_Data=0xfffe; //0x00fe 0x00fd 0x00fb 0x00f7 0x00ef 0x00df 0x00bf 0x007f
Delay(); //第一只灯亮
Delay();
if((*P_IOA_Data)&0x0001!=0x0001)
{
goto zhu;
}
case 0x0002:
coy++;
*P_IOB_Data=0xfffd; //第二只灯亮
Delay();
Delay();
if((*P_IOA_Data)&0x0001!=0x0001)
{
goto zhu;
}
case 0x0003:
coy++;
*P_IOB_Data=0xfffb; //第三只灯亮
Delay();
Delay();
if((*P_IOA_Data)&0x0001!=0x0001)
{
goto zhu;
}
case 0x0004:
coy++;
*P_IOB_Data=0xfff7; //第四只灯亮
Delay();
Delay();
if((*P_IOA_Data)&0x0001!=0x0001)
{
goto zhu;
}
case 0x0005:
coy++;
*P_IOB_Data=0xffef; //第五只灯亮
Delay();
Delay();
if((*P_IOA_Data)&0x0001!=0x0001)
{
goto zhu;
}
case 0x0006:
coy++;
*P_IOB_Data=0xffdf; //第六只灯亮
Delay();
Delay();
if((*P_IOA_Data)&0x0001!=0x0001)
{
goto zhu;
}
case 0x0007:
coy++;
*P_IOB_Data=0xff61; //第七只灯亮
Delay();
Delay();
if((*P_IOA_Data)&0x0001!=0x0001)
{
goto zhu;
}
default:
break;
}
zhu:
GoAhead();
}
//=============================================================
// 语法格式: void BSR(void);
// 实现功能: 辨识子函数
// 参数: 无
// 返回值: 无
//=============================================================
void BSR(void)
{
int Result; //辨识结果寄存
Result = BSR_GetResult(); //获得识别结果
if(Result>0) //有语音触发?
{
*P_IOB_Data=0xffff; //临时停工
switch(Result)
{
case NAME_ID: //识别出名称命令
Stop(); //停机待命
break;
case COMMAND_START_ID: //识别出第一条命令
GoAhead(); //执行动作一:开始工作
break;
case COMMAND_OK_ID:
OK();
break;
default:
break;
}
}
}
//=============================================================
// 语法格式: void IRQ5(void);
// 实现功能: 中断服务子函数
// 参数: 无
// 返回值: 无
//=============================================================
void IRQ5(void)__attribute__((ISR)); //运动定时控制
void IRQ5(void)
{
if(uiTimecont++ == uiTimeset)
{
*P_IOB_Data = 0xffff;
}
*P_INT_Clear = 0x0004;
}
//=============================================================
// 语法格式: int main(void);
// 实现功能: 主函数
// 参数: 无
// 返回值: 无
//=============================================================
main(void)
{
unsigned int BS_Flag; //Train标志位
//unsigned int Fosc_CLK,CPU_CLK; //定义系统及CPU时钟
unsigned int rock=0x010e;
*P_IOA_Dir=0x0000; //初始化IOA,IOA0~7下拉输入
*P_IOA_Attrib=0x0000;
*P_IOA_Data=0xffff;
*P_IOB_Dir=0x007f; //初始化IOB,IOB0--6同向低电平输出,IOB7为上拉电阻
*P_IOB_Attrib=0x007f;
*P_IOB_Data=0x0080;
*P_IOB_Data=0xffff; //清灭LED
BSR_DeleteSDGroup(0); //初始化存储器SRAM
BS_Flag=*(unsigned int *)0xe000; //读存储单元0xe000
if(BS_Flag==0xffff) //没有经过训练(0xe000内容为0xffff)
{
TrainSD(); //训练
StoreSD(); //存储训练结果(语音模型)
}
else //经过训练(0xe000内容为0x0055)
{
LoadSD(); //语音模型载入识别器
}
BSR_InitRecognizer(BSR_MIC); //初始化识别器
BSR_EnableCPUIndicator();
PlaySnd(S_START,3); //开始识别提示
while(1)
{
BSR();
if((*P_IOA_Data)&0x0004) //是否重新训练
{
F_FlashErase(0xe000);
while(1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -