凌阳语音控制小车程序.docx
《凌阳语音控制小车程序.docx》由会员分享,可在线阅读,更多相关《凌阳语音控制小车程序.docx(16页珍藏版)》请在冰豆网上搜索。
凌阳语音控制小车程序
//工程名称:
Car_Demo
//功能描述:
实现小车的语音控制
//涉及的库:
CMacro1016.lib
//bsrv222SDL.lib
//sacmv26e.lib
//组成文件:
main.c
//Flash.asm,hardware.asm,ISR.asm
//hardware.h,s480.h,hardware.inc
//硬件连接:
IOA0-----KEY1
//IOA1-----KEY2
//IOA2-----KEY3
//IOB8-----前进
//IOB9-----倒车
//IOB10----左拐
//IOB11----右拐
//维护记录:
2005-12-12v1.0
//========================================================
#include"s480.h"
#include"bsrsd.h"
#defineP_IOA_Data(volatileunsignedint*)0x7000
#defineP_IOA_Dir(volatileunsignedint*)0x7002
#defineP_IOA_Attrib(volatileunsignedint*)0x7003
#defineP_IOB_Data(volatileunsignedint*)0x7005
#defineP_IOB_Dir(volatileunsignedint*)0x7007
#defineP_IOB_Attrib(volatileunsignedint*)0x7008
#defineP_TimerA_Data(volatileunsignedint*)0x700A
#defineP_TimerA_Ctrl(volatileunsignedint*)0x700B
#defineP_TimerB_Data(volatileunsignedint*)0x700C
#defineP_TimerB_Ctrl(volatileunsignedint*)0x700D
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
#defineP_INT_Mask(volatileunsignedint*)0x702D
#defineP_INT_Clear(volatileunsignedint*)0x7011
#defineNAME_ID0x100
#defineCOMMAND_GO_ID0x101
#defineCOMMAND_BACK_ID0x102
#defineCOMMAND_LEFT_ID0x103
#defineCOMMAND_RIGHT_ID0x104
#defineS_NAME0//给我取个名字吧
#defineS_ACT11//前进
#defineS_ACT22//倒车,请注意
#defineS_ACT33//左拐
#defineS_ACT44//右拐
#defineS_RDY5//Yeah
#defineS_AGAIN6//请再说一遍
#defineS_NOVOICE7//没有听到任何声音
#defineS_CMDDIFF8//说什么暗语呀
#defineS_NOISY8//说什么暗语呀
#defineS_START9//准备就绪,开始辨识
#defineS_GJG10//拐就拐
#defineS_DCZY11//倒车,请注意
externunsignedintBSR_SDModel[100];//外部变量BSR_SDModel[100],辨识器自带
externvoidF_FlashWrite1Word(unsignedintaddr,unsignedintValue);
externvoidF_FlashErase(unsignedintsector);
unsignedintuiTimeset=3;//运行时间定时,调整该参数控制运行时间
unsignedintuiTimecont;//运行时间计时
//=============================================================
//语法格式:
voidDelay();
//实现功能:
延时
//参数:
无
//返回值:
无
//=============================================================
voidDelay()
{
unsignedinti;
for(i=0;i<0x3Fff;i++)
{
*P_Watchdog_Clear=0x0001;
}
}
//=============================================================
//语法格式:
voidPlaySnd(unsignedSndIndex,unsignedDAC_Channel);
//实现功能:
语音播放函数
//参数:
SndIndex-播放语音资源索引号
//DAC_Channel-播放声道选择
//返回值:
无
//=============================================================
voidPlaySnd(unsignedSndIndex,unsignedDAC_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);//初始化识别器
}
//=============================================================
//语法格式:
intTrainWord(intWordID,intSndID);
//实现功能:
训练一条指令
//参数:
WordID-指令编码
//SndID-指令提示音索引号
//返回值:
无
//=============================================================
intTrainWord(unsignedintWordID,unsignedintSndID)
{
intResult;
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;
}
}
return0;
}
//=============================================================
//语法格式:
voidTrainSD();
//实现功能:
训练函数
//参数:
无
//返回值:
无
//=============================================================
voidTrainSD()
{
while(TrainWord(NAME_ID,S_NAME)!
=0);//训练名称
while(TrainWord(COMMAND_GO_ID,S_ACT1)!
=0);//训练第1个动作
while(TrainWord(COMMAND_BACK_ID,S_ACT2)!
=0);//训练第2个动作
while(TrainWord(COMMAND_LEFT_ID,S_ACT3)!
=0);//训练第3个动作
while(TrainWord(COMMAND_RIGHT_ID,S_ACT4)!
=0);//训练第4个动作
}
//=============================================================
//语法格式:
voidStoreSD();
//实现功能:
存储语音模型函数
//参数:
无
//返回值:
无
//=============================================================
voidStoreSD()
{unsignedintulAddr,i,commandID,g_Ret;
F_FlashWrite1Word(0xef00,0xaaaa);
F_FlashErase(0xe000);
F_FlashErase(0xe100);
F_FlashErase(0xe200);
ulAddr=0xe000;//********
for(commandID=0x100;commandID<0x105;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;
}
}
}
//=============================================================
//语法格式:
voidStoreSD();
//实现功能:
装载语音模型函数
//参数:
无
//返回值:
无
//=============================================================
voidLoadSD()
{unsignedint*p,k,jk,Ret,g_Ret;
p=(int*)0xe000;
for(jk=0;jk<5;jk++)
{
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();
}
}
//=============================================================
//语法格式:
voidGoAhead();
//实现功能:
前进子函数
//参数:
无
//返回值:
无
//=============================================================
voidGoAhead()//前进
{
PlaySnd(S_ACT1,3);//提示
*P_IOB_Data=0x0100;//前进
*P_INT_Mask|=0x0004;//以下为中断定时操作
__asm("intfiq,irq");
uiTimecont=0;
}
//=============================================================
//语法格式:
voidBackUp();
//实现功能:
后退子函数
//参数:
无
//返回值:
无
//=============================================================
voidBackUp()//倒退
{
PlaySnd(S_DCZY,3);//提示
*P_IOB_Data=0x0200;//倒退
*P_INT_Mask|=0x0004;//以下为中断定时操作
__asm("intfiq,irq");
uiTimecont=0;
}
//=============================================================
//语法格式:
voidTurnLeft();
//实现功能:
左转子函数
//参数:
无
//返回值:
无
//=============================================================
voidTurnLeft()//左转
{
PlaySnd(S_GJG,3);
*P_IOB_Data=0x0900;//右转
Delay();//延时
*P_IOB_Data=0x0500;//左转
*P_INT_Mask|=0x0004;//以下为中断定时操作
__asm("intfiq,irq");
uiTimecont=0;
}
//=============================================================
//语法格式:
voidTurnRight();
//实现功能:
右转子函数
//参数:
无
//返回值:
无
//=============================================================
voidTurnRight()//右转
{
PlaySnd(S_GJG,3);//语音提示
*P_IOB_Data=0x0500;//左转
Delay();//延时
*P_IOB_Data=0x0900;//右转
*P_INT_Mask|=0x0004;//以下为中断定时操作
__asm("intfiq,irq");
uiTimecont=0;
}
//=============================================================
//语法格式:
voidStop();
//实现功能:
停车子函数
//参数:
无
//返回值:
无
//=============================================================
voidStop()//停车
{
*P_IOB_Data=0x0000;//停车
PlaySnd(S_RDY,3);//语音提示
}
//=============================================================
//语法格式:
voidBSR(void);
//实现功能:
辨识子函数
//参数:
无
//返回值:
无
//=============================================================
voidBSR(void)
{
intResult;//辨识结果寄存
Result=BSR_GetResult();//获得识别结果
if(Result>0)//有语音触发?
{
*P_IOB_Data=0x0000;//临时停车
switch(Result)
{
caseNAME_ID:
//识别出名称命令
Stop();//停车待命
break;
caseCOMMAND_GO_ID:
//识别出第一条命令
GoAhead();//执行动作一:
直走
break;
caseCOMMAND_BACK_ID:
//识别出第二条命令
BackUp();//执行动作二:
倒车
break;
caseCOMMAND_LEFT_ID:
//识别出第三条命令
TurnLeft();//执行动作三:
左转
break;
caseCOMMAND_RIGHT_ID:
//识别出第四条命令
TurnRight();//执行动作四:
右转
break;
default:
break;
}
}
}
//=============================================================
//语法格式:
voidIRQ5(void);
//实现功能:
中断服务子函数
//参数:
无
//返回值:
无
//=============================================================
voidIRQ5(void)__attribute__((ISR));//运动定时控制
voidIRQ5(void)
{
if(uiTimecont++==uiTimeset)
{
*P_IOB_Data=0x0000;
}
*P_INT_Clear=0x0004;
}
//=============================================================
//语法格式:
intmain(void);
//实现功能:
主函数
//参数:
无
//返回值:
无
//=============================================================
intmain(void)
{unsignedintBS_Flag;//Train标志位
*P_IOA_Dir=0xff00;//初始化IOA,IOA0~7下拉输入
*P_IOA_Attrib=0xff00;
*P_IOA_Data=0x0000;
*P_IOB_Dir=0x0f00;//初始化IOB,IOB8~11同向输出
*P_IOB_Attrib=0x0f00;
*P_IOB_Data=0x0000;
BSR_DeleteSDGroup(0);//初始化存储器RAM
BS_Flag=*(unsignedint*)0xe000;//读存储单元0xe000
if(BS_Flag==0xffff)//没有经过训练(0xe000内容为0xffff)
{
TrainSD();//训练
StoreSD();//存储训练结果(语音模型)
}
else//经过训练(0xe000内容为0x0055)
{
LoadSD();//语音模型载入识别器
}
PlaySnd(S_START,3);//开始识别提示
BSR_InitRecognizer(BSR_MIC);//初始化识别器
while
(1)
{
BSR();
if((*P_IOA_Data)&0x0004)//是否重新训练
{
F_FlashErase(0xe000);
while
(1);
}
}
}
//============================================================
//文件名称:
flash.asm
//实现功能:
SPCE06132Kflash的读写
//维护记录:
2003-6-9V1.0
//============================================================
.INCLUDEhardware.inc
.DEFINEC_FLASH_SIZE0x8000
.DEFINEC_FLASH_BLOCK_SIZE0x100
.DEFINEC_FLASH_MATCH0xAAAA
.DEFINEC_FLASH_PAGE_ERASE0x5511//擦除一页
.DEFINEC_FLASH_MASS_ERASE0x5522//
.DEFINEC_FLASH_1WORD_PGM0x5533//写一个字
.DEFINEC_FLASH_SEQUENT_PGM0x5544//写多个字
.DEFINEC_FLASH_MAIN_BLOCK0x5555
.DEFINEC_FLASH_INFORM_BLOCK0x5566
.CODE
//============================================================================================
//语法:
voidF_FlashWrite1Word(intaddr,intValue)
//描述:
写一个字到FLASH中
//参数:
addr-被写数据的存储地址Value-被写数据
//返回:
无
//===============================================================================================
.PUBLIC_F_FlashWrite1Word
.DEFINEP_Flash_Ctrl0x7555
_F_FlashWrite1Word:
.proc
pushbpto[sp]
bp=sp+1
r1=