基于单片机的语音控制小车毕业设计论文 下载本文

华科学院本科毕业设计(论文)

开始 初始化 已经训练过 N 训练小车 Y 转载语音模型 保存训练结果 进入识别模式 语言识别与执行 N 重新训练 Y 清模型存储区 等待复位 图 4.1 系统总体程序流程图

语音识别小车的主程序流程如图4.1所示,分为四大部分:初始化部分、训练部分、识别部分、重训操作。

初始化部分:初始化操作将 IOB8~IOB11 设置为输出端,用以控制电机。必要时还要有对应的输入端设置和PWM 端口设置等。

训练部分:训练部分完成的工作就是建立语音模型。程序一开始判断小车是否被训练过,如果没有训练过则要求对其进行训练,并且会在训练成功之后将训练的模型存储到FLASH,在以后使用时不需要重新训练;如果已经训练过会把存储在FLASH 中的模型调出

- 27 -

康虹:基于单片机的语言控制小车设计

来装载到辨识器中。

识别部分:在识别环节当中,如果辨识结果是名字,停止当前的动作并进入待命 状态,然后等待动作命令。如果辨识结果为动作指令小车会语音告知相应动作并执行该动作,在运动过程中可以通过呼叫小车的名字使小车停下来。

重训操作:考虑到有重新训练的需求,设置了重新训练的按键(61 板的KEY3) ,循环扫描该按键,一旦检测到此键按下,则将擦除训练标志位(0xe000 单元) ,并等待复位。复位后,程序重新执行,当检测到训练标志位为0xffff时会要求重新对其进行训练。

下面详细介绍以上提到的子程序。

4.2 系统各分支设计

4.2.1训练子程序

当程序检测到训练标志位BS_Flag内容为0xffff,就会要求操作者对它进行训练操作,训练操作的过程如图 4.2所示:训练采用两次训练获取结果的方式,以训练名字为例:小车首先会提示:给我取个名字吧, 这时你可以告诉它一个名字 (比如Jack) ; 然后它会提示: 请再说一遍, 这时再次告诉它名字 (Jack) ,如果两次的声音差别不大,小车就能够成功的建立模型,名称训练成功;如果没能够成功的建立模型,小车会告知失败的原因并要求重新训练。成功训练名称后会给出下一条待训练指令提示音:前进,参照名称训练方式训练前进指令。依次训练小车的名称—前进指令—倒车指令—左转指令—右转指令,全部训练成功子程序返回,训练结束。

开始训练

训练名称训练左转指令

NN名称训练成功左转训练成功

YY训练前进指令训练右转指令前进训练成功YNN右转训练成功Y

训练倒车指令训练成功提示- 28 - N倒车训练成功Y训练结束华科学院本科毕业设计(论文)

图4.2训练流程图

void TrainSD() {

while(TrainWord(NAME_ID,S_NAME) != 0) ;

//训练名称

//训练第1个动作 //训练第2个动作 //训练第3个动作

while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0) ; while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) ; while(TrainWord(COMMAND_LEFT_ID,S_ACT3) != 0) ;

while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ; //训练第4个动作 }

4.2.2语音识别子程序

语音识别流程如图 4.3所示:首先获取辨识器的辨识结果,判断是否有语音触发,如果有语音触发则会返回识别结果的ID号,ID号对应名称或者对应不同的动作。如果ID号为名称,则结束运动(如果当前在运动状态) ,进入待命状态,等待下一次的指令触发;如果 ID 号为动作,则语音告知将要执行的动作,并执行该动作。注:语音识别程序在语音中断函数中进行。

- 29 -

康虹:基于单片机的语言控制小车设计

语音识别 语音触发 Y N 前进指令 倒车指令 左转指令 右转指令 名字 前进 倒车 左转 右转 停车命令 返回 图4.3语音识别部分流程图

void BSR(void) {

int Result;

//辨识结果寄存

Result = BSR_GetResult(); if(Result>0) {

//获得识别结果

//有语音触发?

*P_IOB_Data=0x0000; //临时停车 switch(Result) {

case NAME_ID: //识别出名称命令

Stop(); break;

//停车待命

case COMMAND_GO_ID: //识别出第一条命令

GoAhead(); break;

//执行动作一:直走

case COMMAND_BACK_ID://识别出第二条命令

BackUp();

//执行动作二:倒车

- 30 -

华科学院本科毕业设计(论文)

} }

break;

//识别出第三条命令 //执行动作三:左转

case COMMAND_LEFT_ID:

TurnLeft(); break;

case COMMAND_RIGHT_ID: //识别出第四条命令

TurnRight(); break;

//执行动作四:右转

default: }

break;

4.2.3动作子程序

动作子程序包括:前进、倒车、左拐、右拐、停车子程序。

前进:由小车的结构原理和驱动电路分析知:只要IOB8 为高电平,IOB9,IOB10,IOB11 全部为低电平即可实现小车的前进。前进子程序包括语音提示、置端口数据、启动定时器操作。

倒车:由小车的结构原理分析和驱动电路分析知:只要IOB9 为高电平,IOB8,IOB10,IOB11全部为低电平即可实现小车的倒退。倒退子程序包括语音提示、置端口数据、启动定时器操作。

左转:由小车的结构原理分析和驱动电路分析知:小车左转需要两个条件:1.前轮左偏2.后轮前进,这时对应的 I/O 状态为:IOB8、IOB10 为高电平,IOB9、IOB11 为低电平。左转子程序包括语音提示、置端口数据、启动定时器操作。

右转:由小车的结构原理分析和驱动电路分析知:小车右转需要两个条件:1.前轮右偏2.后轮前进,这时对应的 I/O 状态为:IOB8、IOB11 为高电平,IOB9、IOB10 为低电平。右转子程序包括语音提示、置端口数据、启动定时器操作。

注:在转弯之前首先让前轮朝目标方向的反方向偏转,然后再让前轮朝目标方向偏转,这样前轮的摆动范围更大,惯性更大,摆幅也最大,能更好实现转弯。

void GoAhead() {

- 31 -

//前进