康虹:基于单片机的语言控制小车设计
}
PlaySnd(S_ACT1,3);
//提示
//前进
*P_IOB_Data=0x0100; *P_INT_Mask |= 0x0004; __asm(%uiTimecont = 0;
//以下为中断定时操作
//============================================================= // 语法格式: void BackUp(); // 实现功能: 后退子函数 // 参数: // 返回值:
无
无
//============================================================= void BackUp() { }
//============================================================= // 语法格式: void TurnLeft(); // 实现功能: 左转子函数 // 参数: // 返回值:
无
无
PlaySnd(S_DCZY,3);
//提示
//倒退
//倒退
*P_IOB_Data=0x0200; *P_INT_Mask |= 0x0004; __asm(%uiTimecont = 0;
//以下为中断定时操作
//============================================================= void TurnLeft() {
PlaySnd(S_GJG,3);
- 32 -
//左转
华科学院本科毕业设计(论文)
}
*P_IOB_Data=0x0900; Delay();
//右转
//延时
//左转
*P_IOB_Data=0x0500; *P_INT_Mask |= 0x0004; __asm(%uiTimecont = 0;
//以下为中断定时操作
//============================================================= // 语法格式: void TurnRight(); // 实现功能: 右转子函数 // 参数: // 返回值:
无
无
//============================================================= void TurnRight() { }
//============================================================= // 语法格式: void Stop(); // 实现功能: 停车子函数 // 参数: // 返回值:
无
无
PlaySnd(S_GJG,3);
//语音提示
//左转 //右转
*P_IOB_Data=0x0500; Delay();
//延时
//右转
*P_IOB_Data=0x0900; *P_INT_Mask |= 0x0004; __asm(%uiTimecont = 0;
//以下为中断定时操作
//=============================================================
- 33 -
康虹:基于单片机的语言控制小车设计
void Stop() { }
4.2.4中断子程序
*P_IOB_Data=0x0000; PlaySnd(S_RDY,3);
//停车
//停车
//语音提示
虽然已经有了前进、后退以及停车(通过直接呼叫小车的名字使其停车)等语音控制指令,但是考虑环境的干扰因素,小车运行时的噪音影响和有效距离的限制,小车运行后可能接收不到语音指令而一直运行。为了防止出现这种情况,加入了时间控制,在启动小车运行的同时启动定时器,定时器时间到停止小车的运行,该定时器借助于 2Hz 时基中断完成,所示为该程序的流程图。可以在程序中修改u i Time set 参数来控制运行时间,当ui Time set=2 时,运行时间为1s,以此类推。
void IRQ5(void)__attribute__((ISR)); void IRQ5(void) { }
程序中需要说明的几个问题
在程序中可能有几个地方不易理解,下面我向大家说明一下: 首先,小车有没有被训练过是怎么知道的?
在这里利用了一个特殊的 Flash 单元, 语音模型存储区首单元 (该示例程序中为 0xe000单元) 。 当 Flash在初始化以后,或者在擦除后为 0xffff,在成功训练并存储后为 0x0055(该值由辨识器自动生成) 。这样就可以根据这个单元的值来判断是否经过训练。
其次,为什么已经训练过的系统在重新运行时还要进行模型装载?
在首次训练完成之后,辨识器中保存着训练的模型,但是系统一旦复位辨识器中的模
- 34 -
//运动定时控制
if(uiTimecont++ == uiTimeset) { }
*P_INT_Clear = 0x0004;
*P_IOB_Data = 0x0000;
华科学院本科毕业设计(论文)
型就会丢失,所以在重新运行时必须把存储在 Flash 中的语音模型装载到辨识器(RAM)中去。
第三,在转弯时为什么前轮要先做一个反方向的摆动?
这是为了克服车体的限制,由于前轮电机的驱动能力有限,有时会出现前轮偏转不到位的情况,所以在转弯前首先让前轮朝反方向摆动,然后再朝目标方向摆动。这样前轮的摆动范围更大,惯性更大,摆幅也最大,能更好实现转弯。
第四,关于语音的一些具体问题,关于语音的一些具体问题请参看 SPCE061A相关
书籍中关于语音的详细介绍。
- 35 -
康虹:基于单片机的语言控制小车设计
- 36 -