第四章 系统软件设计
4.1 系统的主程序流程
图 4-1
4.1.1 初始化部分
初始化操作将
IOB8~IOB11 设置为输出端,用以控制电机。必
16
要时还要有对应的输入端设置和 PWM 端口设置等。
4.1.2 训练部分
训练部分完成的工作就是建立语音模型。程序一开始判断小车是
否被训练过,如果没有训练过则要求对其进行训练,并且会在训练成功之后将训练的模型存储到 Flash,在以后使用时不需要重新训练;如果已经训练过会把存储在 Flash 中的模型调出来装载到辨识器中。
4.1.3 识别部分
在识别环节当中,如果辨识结果是名字,停止当前的动作并进入
待命状态,然后等待动作命令。如果辨识结果为动作指令小车会语音告知相应动作并执行该动作,在运动过程中可以通过呼叫小车SPCE061A在语音控制小车中的应用的名字使小车停下来。
4.1.4 重训操作
考虑到有重新训练的需求,设置了重新训练的按键(61
板的
KEY3),循环扫描该按键,一旦检测到此键按下,则将擦除训练标志位(0xe000 单元),并等待复位。复位后,程序重新执行,当检测到训练标志位为 0xffff 时会要求重新对其进行训练。 4.2 主函数模块程序
//============================================================ // 语法格式: int main(void); // 实现功能: 主函数
//============================================================ int main(void)
{ unsigned int BS_Flag; //Train标志位
*P_IOA_Dir=0xff00; //初始化IOA,IOA0~7下拉输入 *P_IOA_Attrib=0xff00; *P_IOA_Data=0x0000;
17
*P_IOB_Dir=0x0f00; *P_IOB_Attrib=0x0f00; *P_IOB_Data=0x0000;
BSR_DeleteSDGroup(0); BS_Flag=*(unsigned int *)0xe000; if(BS_Flag==0xffff) 0xffff) { TrainSD(); StoreSD(); }
else 0x0055) { LoadSD(); }
PlaySnd(S_START,3); BSR_InitRecognizer(BSR_MIC);
while(1) { BSR(); if((*P_IOA_Data)&0x0004) { F_FlashErase(0xe000); while(1); } } }
//初始化IOB,IOB8~11同向输出
//初始化存储器RAM //读存储单元0xe000
//没有经过训练(0xe000内容为
//训练
//存储训练结果(语音模型) //经过训练(0xe000内容为
//语音模型载入识别器
//开始识别提示 //初始化识别器
//是否重新训练
4.3 语音识别的原理
语音识别主要分为“训练”和“识别”两个阶段。在训练阶段,单片机对采集到
的语音样本进行分析处理,从中提取出语音特征信息,建立一个特征模型;在识别阶段,单片机对采集到的语音样本也进行类似的分析处理,提取出语音的特征信息,然后将这个特征信息模型与已有的特征模型进行对比,如果二者达到了一定的匹配度,则输入的语音被识别。
4.4 语音训练识别程序
训练采用应答式训练,每条指令的训练次数为两次,在语音提
18
示下进行,并且能进行容错处理,整个的训练过程共有5次这样的训练,依次为名称一前进一后退一左拐一右拐,以“前进”为例说明。
步骤一:小车提示语音“前进”;告诉小车“前进”;步骤二:小车提示语音“请再说一遍” (重复训练提示音);再次告诉小车“前进”。如果训练成功,小车会自动进入下一条指令的训练,并会提示下一条指令对应的动作;如果没有训练成功,小车会提示“说什么暗语呀” 或者“没有听到任何声音”等信息,这样的话就要重复刚才所说的4个步骤,直到成功为止。在小车训练完毕之后,就进入识别“准备就绪”状态,向小车“喊话”,程序就识别“喊话”的命令,将对使用者输入的语音命令进行记录并与存储的语音模型进行比较匹配,以确定是输入的何种命令。
下面是训练部分的子程序模块:
//============================================================ // 语法格式: void TrainSD(); // 实现功能: 训练函数
//============================================================ void TrainSD() {
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个动作 }
4.5 语音动作子程序
动作子程序包括:前进、倒车、左拐、右拐、停车子程序;
前进:由小车的结构原理和驱动电路分析知:只要 IOB8 为高电平,IOB9,IOB10,IOB11 全部为低电平即可实现小车的前进。前进子程序包括语音提示、置端口数据、启动定时器操作,该部分程序如下:
19
//============================================================ // 语法格式: void GoAhead(); // 实现功能: 前进子函数
//============================================================ void GoAhead() //前进 {
PlaySnd(S_ACT1,3); //提示 *P_IOB_Data=0x0100; //前进 *P_INT_Mask |= 0x0004; //以下为中断定时操作 __asm(\ uiTimecont = 0; }
倒车:由小车的结构原理分析和驱动电路分析知:只要 IOB9 为高电平,IOB8,IOB10,IOB11 全部为低电平即可实现小车的倒退。倒退子程序包括语音提示、置端口数据、启动定时器操作,程序如下:
//============================================================ // 语法格式: void BackUp(); // 实现功能: 后退子函数
//============================================================ void BackUp() //倒退 {
PlaySnd(S_DCZY,3); //提示 *P_IOB_Data=0x0200; //倒退 *P_INT_Mask |= 0x0004; //以下为中断定时操作 __asm(\ uiTimecont = 0; }
左转:由小车的结构原理分析和驱动电路分析知:小车左转需要两个条件:1.前轮左偏 2.后轮前进,这时对应的 I/O状态为:IOB8、IOB10为高电平,IOB9、IOB11为低电平。左转子程序包括语音提示、置端口数据、启动定时器操作,该部分程序如下:
//============================================================ // 语法格式: void TurnLeft(); // 实现功能: 左转子函数
//============================================================
20
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库电子信息工程毕业论文模版 - 图文(5)在线全文阅读。
相关推荐: