凌阳语音控制小车程序.docx
- 文档编号:28854373
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:20
- 大小:217.48KB
凌阳语音控制小车程序.docx
《凌阳语音控制小车程序.docx》由会员分享,可在线阅读,更多相关《凌阳语音控制小车程序.docx(20页珍藏版)》请在冰豆网上搜索。
凌阳语音控制小车程序
//工程名称:
Car_Demo
//功能描述:
实现小车的语音控制
//涉及的库:
CMacro1016.lib
//bsrv222SDL.Iib
//sacmv26e.lib
//组成文件:
main.c
//Flash.asm,hardware.asm,ISR.asm
//hardware.h,s480.h,hardware.inc
//硬件连接:
IOA0-----KEY1
//IOA1-----KEY2
//IOA2-----KEY3
//IOB8-----前进
//I0B9-----倒车
//IOB10----左拐
//IOB11----右拐
//维护记录:
2005-12-12v1.0
//========================================================
#include"s480.h"
#include"bsrsd.h"
(volatileunsignedint*)0x7000
(volatileunsignedint*)0x7002
(volatileunsignedint*)0x7003
(volatileunsignedint*)0x7005
(volatileunsignedint*)0x7007
(volatileunsignedint*)0x7008
(volatileunsignedint*)0x700A(volatileunsignedint*)0x700B
(volatileunsignedint*)0x700C
(volatileunsignedint*)0x700D
#defineP」NT_Mask
#defineP」NT_Clear
#defineP_Watchdog_Clear(volatileunsignedint*)0x7012
(volatileunsignedint*)0x702D
(volatileunsignedint*)0x7011
#defineCOMMANDLEFTID0x103
#defineCOMMAND_RIGHT_ID0x104
//外部变量
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(unsignedSndlndex,unsignedDAC_Channel);
//实现功能:
语音播放函数
//参数:
SndIndex-播放语音资源索引号
//DAC_Channel-播放声道选择
//返回值:
无
//==========================================================
voidPlaySnd(unsignedSndlndex,unsignedDAC_Channel)
{
BSR_StopRecognizer();//停止识别器
SACM_S480_lnitial
(1);//初始化为自动播放
SACM_S480_Play(Sndlndex,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(WordlD,BSR_TRAIN_TWICE);//训练两次,获得训练
结果
if(Result==0)break;
switch(Result)
{
case-1:
//没有检测出声音
PlaySnd(S_N0V0ICE,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」D,S_NAME)!
=0);//训练名称
while(TrainWord(COMMAND_GO」D,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,commandlD,g_Ret;
F_FlashWrite1Word(0xef00,0xaaaa);
F_FlashErase(0xe000);
F_FlashErase(0xe100);
F_FlashErase(0xe200);
ulAddr=0xe000;//********
for(commandlD=0x100;commandlD<0x105;commandlD++)
{
g_Ret=BSR_ExportSDWord(commandlD);
while(g_Ret!
=0)〃模型导出成功?
g_Ret=BSR_ExportSDWord(commandlD);
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_lmportSDWord();
while(g_Ret!
=O)//模型装载成功?
g_Ret=BSR_ImportSDWord();
}
}//==========================================================//语法格式:
voidGoAhead();
//实现功能:
前进子函数
//参数:
无
//返回值:
无
//==========================================================
//语法格式:
voidBackUp();
//实现功能:
后退子函数
//参数:
无
//返回值:
无
//==========================================================
__asm("intfiq,irq");
//==========================================================
//语法格式:
voidTurnLeft();
//实现功能:
左转子函数
//参数:
无
//返回值:
无
//==========================================================
//==========================================================
//语法格式:
voidStop();
//实现功能:
停车子函数
//参数:
无
//返回值:
无
//==========================================================
voidStop()〃停车
{
*P」OB_Data=OxOOOO;//停车
PlaySnd(S_RDY,3);//语音提示
}
//==========================================================
//语法格式:
voidBSR(void);
//实现功能:
辨识子函数
//参数:
无
//返回值:
无
//==========================================================
voidBSR(void)
{
intResult;//辨识结果寄存
Result=BSR_GetResult();//获得识别结果
if(Result>0)//有语音触发?
{
*P」OB_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」OB_Data=0x0000;
}
*P」NT_Clear=0x0004;
}
//运动定时控制
//==========================================================
//语法格式:
intmain(void);
//实现功能:
主函数
//参数:
无
//返回值:
无
//==========================================================
intmain(void)
{unsignedintBS_Flag;
*P」OA_Dir=0xff00;
*P」OA_Attrib=0xff00;
*P」OA_Data=0x0000;
//Train标志位
〃初始化IOA,IOA0~7下拉输入
P」OB_Dir=0x0f00;
P」OB_Attrib=0x0f00;
//初始化IOB,IOB8~11同向输出
P」OB_Data=OxOOOO;
PlaySnd(S_START,3);//开始识别提示
BSR_InitRecognizer(BSR_MIC);//初始化识别器
while
(1)
{
BSR();
if((*P」OA_Data)&0x0004)//是否重新训练
{
F_FlashErase(OxeOOO);
while
(1);
}
}
}
//==========================================================
//文件名称:
flash.asm
//实现功能:
SPCE06132Kflash的读写
//维护记录:
2003-6-9V1.0
//==========================================================
」NCLUDEhardware」nc
.DEFINEC_FLASH_SIZE0x8000
.DEFINEC_FLASH_BLOCK_SIZE0x100
.DEFINEC_FLASH_MATCHOxAAAA
II擦除一页
//
II写一个字
II写多个字
.DEFINEC_FLASH_PAGE_ERASE0x5511
.DEFINEC_FLASH_MASS_ERASE0x5522
.DEFINEC_FLASH_1W0RD_PGM0x5533
.DEFINEC_FLASH_SEQUENT_PGM0x5544.DEFINEC_FLASH_MAIN_BLOCK0x5555.DEFINEC_FLASH_INFORM_BLOCK0x5566
.CODE
〃==========================================================
II语法:
voidF_FlashWrite1Word(intaddr,intValue)
II描述:
写一个字到FLASH中
II参数:
addr-被写数据的存储地址Value-被写数据
〃返回:
无
〃==========================================================
.PUBLIC_F_FlashWrite1Word
.DEFINEP_Flash_Ctrl0x7555
_F_FlashWrite1Word:
.proc
pushbpto[sp]
bp=sp+1
r1=C_FLASH_MATCHIIAAAA
[P_Flash_Ctrl]=r1
r1=C_FLASH_1WORD_PGMII5533
[P_Flash_Ctrl]=r1
r1=[bp+3]IIflashaddress
r2=[bp+4]IIdata
[r1]=r2
popbpfrom[sp]
retf
.ENDP
〃==========================================================
II语法:
F_FlashWrite(intsector」nt&num,intsize)
II描述:
顺序写多个字
//参数:
sector-被写数据的起始地址&num-被写数据size-写数据的数量
〃返回:
无
//:
.PUBLIC_F_FlashWrite
F_FlashWrite:
.proc
pushbpto[sp]bp=sp+1r1=[bp+3]r2=[bp+4]r3=[bp+5]
//flashbaseaddress
//data
//多个字节
r4=C_FLASH_MATCH
[P_Flash_Ctrl]=r4
//AAAA
L_FlashWriteLoop:
r4=C_FLASH_SEQUENT_PGM[P_Flash_Ctrl]=r4
r4=[r2++]
〃5544
[r1++]=r4
r3-=1
jnzL_FlashWriteLoop[P_Flash_Ctrl]=r3popbpfrom[sp]retf
.ENDP
〃写结束
//
//语法:
voidF_FlashErase(sector)
//描述:
擦除256字节
//参数:
sector-擦除页的起始地址
〃返回:
无
//
.PUBLIC_F_FlashErase
_F_FlashErase:
.proc
pushbpto[sp]
bp=sp+1
r1=C_FLASH_MATCH//AAAA
[P_Flash_Ctrl]=r1
r1=C_FLASH_PAGE_ERASE//5511
[P_Flash_Ctrl]=r1
r1=[bp+3]〃擦除一页
[r1]=r1
popbpfrom[sp]
retf
.ENDP
.END
//==========================================================
//文件名称:
ISR.asm
//实现功能:
语音播放/识别中断服务
//维护记录:
2003-9-9V1.0
//==========================================================
.ineludehardware」nc
.public_FIQ;
.external_BSR_FIQ_Routine
.externalF_FIQ_Service_SACM_S480
.text
_FIQ:
pushR1,R5to[sp];//寄存器压栈保护
R1=C_FIQ_TMA;
[P」NT_Clear]=R1;
call_BSR_FIQ_Routine//语音识别中断服务
callF_FIQ_Service_SACM_S480;//语音播放中断服务
popR1,R5from[sp];
reti;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语音 控制 小车 程序