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

内容发布更新时间 : 2024/5/12 19:51:46星期一 下面是文章的全部内容请认真阅读。

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

}

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 -