基于凌阳61单片机的语音控制小车的设计

基于凌阳61单片机的语音控制小车的设计 - 墙的日志 - 网易博客网易首页 网易博客 博客首页
博客拍拍
精美风格
博客圈子
博客活动
娱乐中心
博客话题

找 朋 友
博客复制
手机博客
短信写博

意见反馈

更多>>
搜 索 登录 | 注册 !!!!SAY LOVE YOU!!!!是谁,在山长水阔的年华里徘徊?是谁,做了黑夜中洞穿遥远的灯盏?————是妳~~~导航
首页 日志 相册 音乐 收藏 博友 关于我 日志 墙 我喜欢我喜欢的,我想我想的,我做我该做的,我就是我!!!
加博友 关注他
最新日志
真的平静了下来……达赖、班禅的由来及其转世 80后的我们为什么不结婚!经典爱情“爱”这东西……狙击手推荐日志
相关日志 戒指的戴法 我的她……
基于凌阳61单片机的语音控制小车的设计自己做的东西 2007-08-19 18:19:39 阅读3133 评论18 字号:大中小 1. 实习目的与意义
1.1 实习任务
设计并制作一个能自动往返于起跑线与终点线间的智能小车,并具备人工遥控的功能,其跑道俯视图如图1所示。

跑道说明:跑道宽度0.5m,表面贴有白纸,两,表面贴有白纸,两侧有挡板,挡板与地面垂直。在跑道的B、C、D、E、F、G各点处画有2cm宽的黑线,各段的长度如图1所示。
1.2 基本要求
(1)、智能小车主控芯片任选一款单片机:AT89S52或SPCE061A;
(2)、人工遥控小车发车(语音遥控或无线遥控任选);
(3)、智能小车从起跑线出发(出发前,车体不得超过起跑线),到达终点后停留10秒,然后自动返回起跑线(允许倒车返回),往返一次的时间应力求最短(从小车起跑开始计时);
(4)、到达终点线和返回起跑线,停车位置离终点线和起跑线偏差应最小,且小车与跑道中心线的偏差也应为最小;
(5)、D—E间为限速区,车辆往返均要求以低速通过,通过时间不得少于8秒,但不允许在限速区内停车;
(6)、如采用语音遥控,则小车回到起跑线后需语音播报“旅行结束”。
1.3 实习意义

通过智能小车的设计及制作,巩固并掌握IDE2.0的编程方法,学会利用单片机进行程序设计并实现功能。通过在小车的设计与制作,将所学的知识体现出来,并应用于实际生活中,在设计过程中对小车功能的创新和改良,增强学生的创新意识和逻辑思维能力,提高学生的动手能力和研究主动性。
2. 实验内容和步骤
2.1车体设计
2.1.1 61板简介
61板是SPCE061A EMU
BOARD的简称,是以凌阳16位单片机SPCE061A为核心的精简开发——仿真——实验板,大小相当于一张扑克牌,是“凌阳大学计划”专为电子爱好者和高校大学生进

行课程设计、毕业设计及电子竞赛所设计的,也可作为单片机项目初期研发使用。61板除了具备单片机最小系统电路外,还包括电源电路、音频电路(含MIC输入部分和DAC音频输出部分)、复位电路等,使学生在掌握软件设计的同时,熟悉单片机硬件的设计制作,锻炼动手能力,也为单片机学习者和开发者创造了一个良好的学习条件和开发新产品的机会!

2.1.2 SPCE061A单片机简介
SPCE061A是一款16位结构的微控制器,下图是它的结构概览:

SPCE061A主要包括输入/输出端口、定时器/计数器、数/模转换、模/数转换、串行设备输入输出、通用异步串行接口、低电压监测和复位等部分,并且内置在线仿真电路ICE接口,较高的处理速度使其能够快速的处理复杂的数字信号。
SPCE061A单片机应用领域广泛,例如应用在家用电器控制器、工业控制、通信产品、医疗设备以及电子书籍等诸多方面。
2.1.3 电源

61板采用3节5号电池进行供电,由J10接入。其中的前后两组电容用来去耦滤波,使其供给芯片的电源更加干净平滑。为了获得标准的3.3V电压,在扳子上加入SPY0029A三端稳压器。

两个二极管,是为了防止误将电源接反造成不必要损失而设置的,在操作过程中千万不要将电源接反,因为反向电压超过一定的值,二极管将会被损坏,达不到保护的目的。后面的零电阻及其电源、地分成不同的几路是为了减少电磁干扰设置的。
2.1.4程序下载区

ICE基本运作方式是通过控制CLOCK及通过ICE喂入指令方式,来控制CPU的运行及缓存器资料和内存资料的存取,因此必须透过控制缓存器值的设定来控制目前CPU的动作。

每个相连接的不同ICE模块都拥有自己独特的3—bitID,当PC在传送control信号时都会先传送该3—bitID,只有ICE本身的ID和control信号的ID相同时才会执行该命令或回传资料。61板上的74HC244主要在我们选用下载线的时候起作用,主要奇缓存的作用和完成SDA是作为数据回送还是数据下传的选择。
2.1.5传感器模块

用光敏电阻组成光敏探测器。光敏电阻的阻值可以跟随周围环境光线的变化而变化。当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化。将阻值的变化值经过比较器就可以输出高低电平。
2.2 语音控制小车概述
2.2.1功能要求

语音控制小车是凌阳大学计划推出的基于SPCE061A的代表性兴趣产品,它配合61板推出,综合应用了SPCE061A的众多资源,打破了传统教学中单片机学习枯燥和低效的现状。小车采用语音识别技术,可通过语音命令对其行驶状态进行控制


语音控制小车的主要功能:
可以通过简单的I/O操作实现小车的前进、后退、左转、右转功能;
配合SPCE061A的语音特色,利用系统的语音播放和语音识别资源,实现语音控制的功能;
可以在行走过程中声控改变小车的运动状态;
2.2.2车体结构
车体结构图图3、4所示。语音控制小车为四轮结构,车的结构示意图如下图所示。其中前面两个车轮由前轮电机控制,在连杆和支点作用下控制前轮左右摆动,来调节小车的前进方向。在自然状态下,前轮在弹簧作用下保持中间位置。后面两个车轮又后轮电机驱动,为整个小车提供动力,所以又称前面的轮子为方向郑竺娴牧礁雎肿游?/FONT>


整个小车分为三大部分:车体部分、61板、控制板。

车体部分:小车车体主要为两个电机驱动装置,分前轮(方向)驱动和后轮(动力驱动)。在车体的下面有一个可以安装3节AA电池的电池盒,整个小车的电源就是由它来提供的。在小车的底部有一个红色的小开关,它负责控制整个小车的电源开通与关断。

61板:61板是小车的核心部分,它负责整个小车控制信号的产生,以及语音的播放和识别功能实现的。在不使用小车时可以将61板从小车上拆下来,61板仍然是完整的,可以用它来做其它的实验或开发。
控制板:控制板负责将来自61板的控制信号转化为能够驱动电动机的信号。
2.2.4 硬件框图

小车控制系统硬件结构比较简单,主要分为两个部分:一个是SPCE061A精简开发板(即“61”板)如图5所示,另外一个是电机控制板如图6所示。电机控制板的工作就是根据61板的输出新高去启动和停止相应的电机,以及调整电机的正反转方向。正是通过开启和关闭相应的电机,使电机在不同的组合状态运转,最终来实现小车的前进,倒退等功能。


2.3小车方案及程序分析
2.3.1小车方案

可以通过简单的I/O操作实现小车的前进、后退、左转、右转功能;配合SPCE061A的语音特色,利用系统的语音播放和语音识别资源,实现语音控制的功能;可以在行走过程中声控改变小车的运动状态;实现能自动往返于起跑线与终点线间的智能流程,并具备人工遥控(我们选用语音控制)的功能。
2.3.2程序流程图

1、语音识别总流程图



语音识别小车的主程序流程如图7所示,分为四大部分:初始化部分、训练部分、识别部分、重训操作。初始化部分:初始化操作将IOB8~IOB11设置为输出端,用以控制电机。必要时还要有对应的输入端设置和PWM端口设置等。训练部分:训练部分完成的工作就是建立语音模型。程序一开始判断小车是否被训练

过,如果没有训练过则要求对其进行训练,并且会在训练成功之后将训练的模型存储到FLASH,在以后使用时不需要重新训练;如果已经训练过会把存储在FLASH中的模型调出来装载到辨识器中。识别部分:在识别环节当中,如果辨识结果是名字,则进入自动往返流程状态。如果辨识结果为动作指令小车会语音告知相应动作并执行该动作。重训操作:考虑到有重新训练的需求,设置了重新训练的按键(61板的KEY3),循环扫描该按键,一旦检测到此键按下,则将擦除训练标志位(0xe000单元),并等待复位。复位后,程序重新执行,当检测到训练标志位为0xffff时会要求重新对其进行训练。下面详细介绍以上提到的子程序。
2、训练函数流程图

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

3、语音识别函数流程图


语音识别流程如图9所示:首先获取辨识器的辨识结果,判断是否有语音触发,如果有语音触发则会返回识别结果的ID号,ID号对应名称或者对应不同的动作。如果ID号为名称,则进入运动自动往返程序流程;如果ID号为动作,则语音告知将要执行的动作,并执行该动作。

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

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


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

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


右转:由小车的结构原理

分析和驱动电路分析知:小车右转需要两个条件:1.前轮右偏2.后轮前进,这时对应的I/O状态为:IOB8、IOB11为高电平,IOB9、IOB10为低电平。右转子程序包括语音提示、置端口数据、启动定时器操作。
4、自动往返(如图10所示):由语音识别子函数的名字命令来触发的自动往返鱼如图1所示的跑道的上的子程序。该程序流程实现小车对各黑线的识别并在识别后执行相应的动作,识别黑线流程实质上是在检测到黑线并又黑线到白线的上升(原为下降,为实现检测信号的灵敏度加反向器后为上升沿)沿脉冲触发下依次开外部中断
Ext2 IRQ3 13次的过程。在从起点到终点过程中当检测到D线以及在从终点返回起点检测到E线时小车步进减速并开启IRQ6-4HZ中断定时8
s后自动加速前进继续检测后续黑线并执行相应动作流程。同时为实现在终点线H过后停留10 s的要求,需要在检测到H线后开启IRQ5-4HZ中断实现定时10;
A、B、C、D、E、F、G……线时开外不中断2,分别在去城和回程 检测到D、E线时开IRQ6-2HZ,在第一次检测到G线时小车停10S。


5、中断控制流程。虽然已经有了前进、后退以(通过直接呼叫小车的名字使其停车)等语音控制指令,但是考虑环境的干扰因素,小车运行时的噪音影响和有效距离的限制,小车运行后可能接收不到语音指令而一直运行。为了防止出现这种情况,加入了时间控制,在启动小车运行的同时启动定时器,定时器时间到停止小车的运行,该定时器借助于2Hz时基中断完成,图12.14所示为该程序的流程图。可以在程序中修改uiTimeset参数来控制运行时间,当uiTimeset=2时,运行时间为1s,以此类推。


3.1硬件连接调试过程


硬件调试过程相对顺利,实验第一步就是按照实验说明书对61板的元件进行焊接以及小车车体的连接安装;在对实习要求理解的基础上确立了实现方案后,硬件的连接有了明确的要求:为了实现对黑线的检测需要连接黑白传感器,由于黑白线的识别是基于外部黑白传感信号的输入进而开外不中断实现的(在本次方案中采用外部中断2
IPQ3),所以将IOB3口外接黑白传感器,以实现对黑白信号的检测。

由于光线的关系,在实际调程序时传感器的灵敏度不是很高,多数情况下很难检测到信号。基于上述现象,我们给传感器附加白光灯,用以解决光线不稳定给程序调试带来的影响。

经过上面步骤的硬件改良后,虽然黑白线的识别以明显改善,在光线条件良好的情况下黑白线识别信号检测基本正常,但在相对较暗情况下,传感器并不灵敏。为了改进这个缺陷,通过对传感器的输出信号的检测发现,在有白线

到黑线时信号更为灵敏,于是就有有了在黑白传感器输出口加反向器的设计。
由于车体焊接存在的问题,在程序调试过程中出现了一系列的硬件问题,但经过仔细分析后,这些问题都得到了解决,硬件的调试改进为软件的实现调试打下了基础。
3.2程序调试过程分析
本次设计任务对软件编写调试的能力要求相对较高,程序调节是否顺利决定了实习进度。
由于初次接触61的编程,所以在实习初期我们主要是学习和认知61的板以及61编程的基本知识,这是个学习深入的过程。

在对编程基础知识了解后,基于对题目要求的理解和思考,我们确定实现方案。可以通过简单的I/O操作实现小车的前进、后退、左转、右转功能;配合SPCE061A的语音特色,利用系统的语音播放和语音识别资源,实现语音控制的功能;可以在行走过程中声控改变小车的运动状态;实现能自动往返于起跑线与终点线间的智能流程,并具备人工遥控(我们选用语音控制)的功能。

这个方案的确定是在查阅了,61资料“语音控制小车”的实现程序后得到的思路。基于对现有程序框架的理解,我们加入了自动往返程序流程。当然,程序的调试是不可能一两次就能成功的。这其中遇到的问题有很多,其中就有硬件的问题以及对61编程的知识的理解的不够而出现的调试困难。
3.3总体结果分析
本设计综合应用了SPCE061A丰富的软硬件资源,成功的实现了语音控制功能。标准的C语言编程,丰富的语音资源函数为编程提供了很大的方便。
该设计方案结构简单,以单芯片实现了语音播放与识别以及电机控制功能,相当于“语音识别芯片+普通单片机”的功能。但是比“语音识别芯片+普通单片机”。
该语音控制小车操作比较简单,训练和识别成功的几率也比较高,是一个典型的语音识别方案。由于时间和精力有限,我们实现了实习要求的基本内容和发挥部分的大部分内容,但未能实现自动语音播报行驶距离的设计要求,这主要是我们对硬件的设计还不够熟练和精通,以及对61编程也未达到纯熟的地步。

对以实现的功能要求来说,我们的设计相对理想,为了实现小车从起跑线出发,到达终点后停留10秒后,然后自动返回起跑线(容许倒车返回),D~E减速区车辆减速通过不得少于8s但又不容许停车,往返一次的时间力求最短的要求。我们在检测黑线程序流程中的相应操作中引用了三次定时中断,分别为从D~E的减速区用到IRQ6-2HZ中断定时8s;到终点线后的停车10s定时引用IRQ5-4HZ中断;以及从E~D的倒车减速区用到了IRQ6-2HZ中断。这几个定时中断确保了往返时间的精确和紧凑性

。但有一点不理想的是:在减速区小车步进过程过慢,造成在限速区车体如遇到些许障碍时甚至发生停车现象,还好我们在设计中加入了8s的定时操做,避免了车体在D~E区间由于过慢的步进而长时间停留。
源代码:
//======================================================
// The information contained herein is the exclusive property of
// Sunnnorth Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================
//========================================================
// 工程名称: Car_Demo
// 功能描述: 实现小车的语音控制
// 涉及的库: CMacro1016.lib
// bsrv222SDL.lib
// sacmv26e.lib
// 组成文件: main.c
// Flash.asm, hardware.asm,ISR.asm
// hardware.h,s480.h, hardware.inc
// 硬件连接: IOA0-----KEY1
// IOA1-----KEY2
// IOA2-----KEY3
// IOB8-----前进
// IOB9-----倒车
// IOB10----左拐
// IOB11----右拐
// 维护记录: 2005-12-12 v1.0
//========================================================
#include "s480.h"
#include "bsrsd.h"
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_TimerA_Data (volatile unsigned int *)0x700A
#define P_TimerA_Ctrl (volatile unsigned int *)0x700B
#define P_TimerB_Data (volatile unsigned int *)0x700C
#define P_TimerB_Ctrl (volatile unsigned int *)0x700D
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define P_INT_Mask (volatile unsigned int *)0x702D
#define P_INT_Clear (volatile unsigned int *)0x7011
#define P_INT_Ctrl (volatile unsigned int *)0x7010
#define P_SystemClock (volatile unsigned int *)0x7013

#define NAME_ID 0x100
#define COMMAND_GO_ID 0x101
#define COMMAND_BACK_ID 0x102
#define COMMAND_LEFT_ID 0x103
#define COMMAND_RIGHT_ID 0x104
#define S_NAME 0 //给我取个名字吧
#define S_ACT1 1 //前进
#define S_ACT2 2 //倒车,请注意
#define S_ACT3 3 //左拐
#define S_ACT4 4 //右拐
#define S_RDY 5 //Yeah
#define S_AGAIN 6 //请再说一遍
#define S_NOVOICE 7 //没有听到任何声音
#define S_CMDDIFF 8 //说什么暗语呀
#define S_NOISY 8 //说什么暗语呀
#define S_START 9 //准备就绪,开始辨识
#define S_GJG 10 //拐就拐
#define S_DCZY 11 //倒

车,请注意
extern unsigned int BSR_SDModel[100]; //外部变量BSR_SDModel[100],辨识器自带
extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);
extern void F_FlashErase(unsigned int sector);
unsigned int uiTimeset = 3; //运行时间定时,调整该参数控制运行时间
unsigned int uiTimecont; //运行时间计时

unsigned int time_10s,time,tem,h,temp,m,c,y,t;


//=============================================================
// 语法格式: void Delay();
// 实现功能: 延时
// 参数: 无
// 返回值: 无
//=============================================================
void Delay()
{
unsigned int i;
for(i=0;i<0x3Fff;i++)
{
*P_Watchdog_Clear=0x0001;
}
}
//=============================================================
// 语法格式: void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);
// 实现功能: 语音播放函数
// 参数: SndIndex-播放语音资源索引号
// DAC_Channel-播放声道选择
// 返回值: 无
//=============================================================
void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
{
BSR_StopRecognizer(); //停止识别器
SACM_S480_Initial(1); //初始化为自动播放
SACM_S480_Play(SndIndex, DAC_Channel, 3); //开始播放一段语音
while((SACM_S480_Status()&0x0001)!= 0) //是否播放完毕?
{
SACM_S480_ServiceLoop(); //解码并填充队列
*P_Watchdog_Clear=0x0001; //清看门狗
}
SACM_S480_Stop(); //停止播放
BSR_InitRecognizer(BSR_MIC); //初始化识别器
}
//=============================================================
// 语法格式: int TrainWord(int WordID,int SndID);
// 实现功能: 训练一条指令
// 参数: WordID-指令编码
// SndID-指令提示音索引号
// 返回值: 无
//=============================================================
int TrainWord(unsigned int WordID,unsigned int SndID)
{
int Result;
PlaySnd(SndID,3); //引导训练,播放指令对应动作
while(1)
{
Result = BSR_Train(WordID,BSR_TRAIN_TWICE); //训练两次,获得训练结果

if(Result==0)break;
switch(Result)
{
case -1: //没有检测出声音
PlaySnd(S_NOVOICE,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;
}
}
return 0;
}
//=============================================================
// 语法格式: 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个动作
}
//=============================================================
// 语法格式: void StoreSD();
// 实现功能: 存储语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void StoreSD()
{ unsigned int ulAddr,i,commandID,g_Ret;
F_FlashWrite1Word(0xef00,0xaaaa);
F_FlashErase(0xe000);
F_FlashErase(0xe100);
F_FlashErase(0xe200);
ulAddr=0xe000;//********
for(commandID=0x100;commandID<0x105;commandID++)
{
g_Ret=BSR_ExportSDWord(commandID);
while(g_Ret!=0) //模型导出成功?
g_Ret=BSR_ExportSDWord(commandID);
for(i=0;i<100;i++) //保存语音模型SD1(0xe000---0xe063)
{
F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
ulAddr+=1;
}
}
}
//=============================================================
// 语法格式: void StoreSD();
// 实现功能: 装载语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void LoadSD()
{ unsigned int *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_ImportSDWord();
while(g_Ret!=0) //模型装载成功?
g_Ret=BSR_ImportSDWord();
}
}
//=============================================================
// 语法格式: void GoAhead();
// 实现功能: 前进子函数
// 参数: 无
// 返回值: 无
//=============================================================
void GoAhead() //前进
{
PlaySnd(S_ACT1,3); //提示
*P_IOB_Data=0x0100; //前进
*P_INT_Mask |= 0x0004; //以下为中断定时操作
__asm("int fiq,irq");
uiTimecont = 0;
}
//=============================================================
// 语法格式: void BackUp();
// 实现功能: 后退子函数
// 参数: 无
// 返回值: 无
//=============================================================
void BackUp() //倒退
{
PlaySnd(S_DCZY,3); //提示
*P_IOB_Data=0x0200; //倒退
*P_INT_Mask |= 0x0004; //以下为中断定时操作
__asm("int fiq,irq");
uiTimecont = 0;
}
//=============================================================
// 语法格式: void TurnLeft();
// 实现功能: 左转子函数
// 参数: 无
// 返回值: 无

//=============================================================
void TurnLeft() //左转
{
PlaySnd(S_GJG,3);
*P_IOB_Data=0x0900; //右转
Delay(); //延时
*P_IOB_Data=0x0500; //左转
*P_INT_Mask |= 0x0004; //以下为中断定时操作
__asm("int fiq,irq");
uiTimecont = 0;
}
//=============================================================
// 语法格式: void TurnRight();
// 实现功能: 右转子函数
// 参数: 无
// 返回值: 无
//=============================================================
void TurnRight() //右转
{
PlaySnd(S_GJG,3); //语音提示
*P_IOB_Data=0x0500; //左转
Delay(); //延时
*P_IOB_Data=0x0900; //右转
*P_INT_Mask |= 0x0004; //以下为中断定时操作
__asm("int fiq,irq");
uiTimecont = 0;
}
//=============================================================
// 语法格式: void Stop();
// 实现功能: 停车子函数
// 参数: 无
// 返回值: 无
//=============================================================
void Stop() //停车
{
*P_IOB_Data=0x0000; //停车
PlaySnd(S_RDY,3); //语音提示
}
//=============================================================
// 语法格式: void BSR(void);
// 实现功能: 辨识子函数
// 参数: 无
// 返回值: 无
//=============================================================
void BSR(void)
{
int Result; //辨识结果寄存
Result = BSR_GetResult(); //获得识别结果
if(Result>0) //有语音触发?
{
*P_IOB_Data=0x0000; //临时停车
switch(Result)
{
case NAME_ID:
c=1;
BSR_StopRecognizer();
*P_SystemClock=0x0003;
*P_INT_Mask=0x0200; //识别出名称命令

break;
case COMMAND_GO_ID: //识别出第一条命令
GoAhead(); //执行动作一:直走
break;
case COMMAND_BACK_ID: //识别出第二条命令
BackUp(); //执行动作二:倒车
break;
case COMMAND_LEFT_ID: //识别出第三条命令
TurnLeft(); //执行动作三:左转
break;
case COMMAND_RIGHT_ID: //识别出第四条命令
TurnRight(); //执行动作四:右转

break;
default:
break;
}
}
}
//=============================================================
// 语法格式: void IRQ5(void);
// 实现功能: 中断服务子函数
// 参数: 无
// 返回值: 无
//=============================================================
void Delay0()
{
unsigned int i;
for(i=0;i<0x00ff;i++)
{
*P_Watchdog_Clear=0x0001;
}
}

void Delay11(unsigned int m)
{
unsigned int i;
for(i=0;i{
*P_Watchdog_Clear=0x0001;
}
}
void Delay_h()
{
unsigned int i;
for(i=0;i

<0x0100;i++)
{
*P_Watchdog_Clear=0x0001;
}
}
void Delay1()
{
unsigned int i;
for(i=0;i<0x02Ff;i++)
{
*P_Watchdog_Clear=0x0001;
}
}

void Delay2()
{
unsigned int i;
for(i=0;i<0x0Dff;i++)
{
*P_Watchdog_Clear=0x0001;
}
}
void Delay3()
{
unsigned int i;
for(i=0;i<0x2fff;i++)
{
*P_Watchdog_Clear=0x0001;
}
}

void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
if(*P_INT_Ctrl&0x0200)
{ while(!(*P_IOB_Data&0x0008))
{
Delay_h();
if((*P_IOB_Data)&0x0008)
h++;
}
*P_INT_Clear =0x0200;
}
else if(*P_INT_Ctrl&0x0100)
{
m=m+1;
*P_INT_Clear=0x0100;}
}
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{ if (c==0)
{if(uiTimecont++ == uiTimeset)
{
*P_IOB_Data = 0x0000;
}
*P_INT_Clear = 0x0004;


}
else if(c==1)
{ if(*P_INT_Ctrl&0x0004)
{
time++;
*P_INT_Clear =0x0004;
}

if(*P_INT_Ctrl&0x0008)
{
*P_INT_Clear =0x0008;
time_10s++;
if(time_10s==40)
{h=h+1;*P_INT_Mask=0x0000; }

}
}
}
//=============================================================
// 语法格式: void play();
// 实现功能: 全程计时播放
// 参数: 无
// 返回值: 无
//=============================================================
void play(void)
{unsigned int s0,s1,s2,s3;
double x;
int length;
PlaySnd(26,3);
PlaySnd(30,3);
if(time%2==0)
{
s0=(time/2)%10;
s1=(time/2)/10;
}
else
{
s0=((time+1)/2)%10;
s1=((time+1)/2)/10;
}

PlaySnd(s1+13,3);
PlaySnd(23,3);
PlaySnd(s0+13,3);
PlaySnd(28,3);

PlaySnd(25,3);
x=m*8.8;
s0=(int)(x/1000);
s1=(int)(x/100)-s0*10;
s2=(int)(x/10)-s0*100-s1*10;
s3=(int)x-s0*1000-s1*100-s2*10;
PlaySnd(s0+13,3);
PlaySnd(23,3);
PlaySnd(s1+13,3);
PlaySnd(24,3);
PlaySnd(s2+13,3);
PlaySnd(s3+13,3);
PlaySnd(27,3);

PlaySnd(12,3);
x=x/time;
s0=(x/100);
s1=(int)(x/10)-s0*10;
s2=(int)(x)-s0*100-s1*10;
PlaySnd(s0+13,3);
PlaySnd(24,3);
PlaySnd(s1+13,3);
PlaySnd(s2+13,3);
PlaySnd(29,3);

}
//=============================================================
// 语法格式: int main(void);
// 实现功能: 主函数
// 参数: 无
// 返回值: 无
//=============================================================
int main(void)
{ unsigned int BS_Flag; //Train标志位
unsigned int a,b;
*P_IOA_Dir=0xff00; //初始化IOA,IOA0~7下拉输入
*P_IOA_Attrib=0xff00;
*P_IOA_Data=0x0000;


*P_IOB_Dir=0x0f00; //初始化IOB,IOB8~11同向输出/
*P_IOB_Attrib=0x0f08;
*P_IOB_Data=0x000C;

h=0;time=0;time_10s=0;m=0;b=0;a=0;c=0;y=0;t=0;
BSR_DeleteSDGroup(0); //初始化存储器RAM
BS_Flag=*(unsigned int *)0xe000; //读存储单元0xe000
if(BS_Flag==0xffff) //没有经过训练(0xe000内容为0xffff)
{
TrainSD(); //训练
StoreSD(); //

存储训练结果(语音模型)
}
else //经过训练(0xe000内容为0x0055)
{
LoadSD(); //语音模型载入识别器
}

PlaySnd(S_START,3); //开始识别提示
BSR_InitRecognizer(BSR_MIC); //初始化识别器

while(1)
{ *P_Watchdog_Clear = 0x0001;


if (c==0)
{BSR();
if((*P_IOA_Data)&0x0004) //是否重新训练
{
F_FlashErase(0xe000);
while(1); }
}


else if (c==1)
switch(h)
{
case 0:

tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0100;
*P_IOB_Data=temp;
break;
case 1:
*P_INT_Mask|=0x0104;
tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0100;
*P_IOB_Data=temp;
break;
case 2:
tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0100;
*P_IOB_Data=temp;
break;
case 3:
*P_INT_Mask|=0x0002;
tem=*P_IOB_Data&0xf0ff;
*P_IOB_Data=tem;
Delay3();
temp=tem;
*P_IOB_Data=temp|0x0100;
Delay2();
*P_IOB_Data=temp;
break;
case 4:

tem=*P_IOB_Data&0xf0ff;

temp=tem|0x0100;
*P_IOB_Data=temp;
break;
case 5:
tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0100;
*P_IOB_Data=temp;
break;
case 6:
tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0000;
*P_IOB_Data=temp;
break;
case 7:
tem=*P_IOB_Data&0xf0ff;
temp=tem;
*P_IOB_Data=temp;
*P_INT_Ctrl=0x000C;

if (a==0)
{*P_IOB_Data=tem|0x0200;
Delay11(12000);
*P_IOB_Data=temp;a=2;
}
break;
case 8:
*P_INT_Mask|=0x0304;
tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0200;
*P_IOB_Data=temp;
break;
case 9:
tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0200;
*P_IOB_Data=temp;
break;
case 10:
tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0200;
*P_IOB_Data=temp;
break;
case 11:
*P_INT_Mask|=0x0002;
tem=*P_IOB_Data&0xf0ff;

*P_IOB_Data=tem;
Delay3();
temp=tem|0x0200;
*P_IOB_Data=temp;
Delay2();

break;
case 12:

tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0200;
*P_IOB_Data=temp;
break;
case 13:

tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0200;
*P_IOB_Data=temp;
break;
case 14:
tem=*P_IOB_Data&0xf0ff;
temp=tem|0x0200;
*P_IOB_Data=temp;
break;
case 15:
__asm("int off");
tem=*P_IOB_Data&0xf0ff;
temp=tem;
*P_IOB_Data=temp;
if (b==0)
{*P_IOB_Data=tem|0x0100;
Delay11(25000);
*P_IOB_Data=temp;
b=2;
}
play();
PlaySnd(S_START,3); //开始识别提示
BSR_InitRecognizer(BSR_MIC); //初始化识别器
c=0;
__asm("int fiq,irq");
break;
default:break;

}

}
}

void IRQ6(void) __attribute__ ((ISR));
void IRQ6(

void)
{

y=y+1;
if (y==64)
{y=0;*P_INT_Mask&=0xFFFD;
h=h+1;
}
*P_INT_Clear=0x0002;
}





有0人推荐 阅读(3133)| 评论(18)| 引用(0) |举报
上一篇:戒指的戴法
下一篇:我的她……
最近读者
登录后,您可以在此留下足迹。 林道 wxy071 舒畅 xzncut 难得糊 djx317 frankd 咋了
评论
登录后你可以发表评论,请先登录。登录>>《反低俗,文明上网通告》
03-09 17:17林道
跪求小弟的邮箱lijiasheng5042520@https://www.360docs.net/doc/e413100709.html,
回复
2009-05-31 16:36难得糊涂
好东西,谢谢,谢谢
同大家一样,希望您能给小弟一份具体点的设计.谢谢,.做论文不容易啊.
回复
2008-11-12 05:46咋了
哥们!
太及时了,
我现在也在做设计
能把硬件发过来不,
gfxyyjk@https://www.360docs.net/doc/e413100709.html,
回复
2008-08-25 20:06asa125
帅哥,能不能把你的硬件部分发给我啊,asa125@https://www.360docs.net/doc/e413100709.html,.我在做毕业设计,求!!!谢谢!!!
回复
2008-07-24 09:16无风
您好,可不可以把硬件结构告诉我呀!不胜感激。谢谢,我的邮箱wangzhenwufeng@https://www.360docs.net/doc/e413100709.html,
回复
2008-06-26 18:42rxbeibei
o(∩_∩)o... 我现在也在写这个论文 拿走了
回复
2008-04-30 22:51守望幸福
乞求你咯,师兄,小车的图啊chjiajin@https://www.360docs.net/doc/e413100709.html,
回复
2008-04-30 22:50守望幸福
师兄,可以把小车的图发过来看看吗?谢谢咯!chjiajin@https://www.360docs.net/doc/e413100709.html,
回复
2008-04-23 22:11小霞
可以发具体的硬件电路图给我吗?我的邮箱是lhx131315@https://www.360docs.net/doc/e413100709.html,,我们工程实践要做一个声控的单片小车。谢谢了
回复
2008-04-22 16:38fengxiaoyue007@126
同学你好!也许你现在已经工作了,我现在是和你曾经是一样的,为了毕业设计而苦恼,想必你现在已经脱离了这种痛苦,如果你有语音遥控小车方面的资料能够给我提供一份吗?在下不胜感激,希望同学能够理解我的心情,同时也但愿我们能够成为忠实的朋友,谢谢!如果方便请给我发一份到邮箱里,谢谢!

fengxiaoyue007@https://www.360docs.net/doc/e413100709.html,
回复
2008-04-22 16:38fengxiaoyue007@126
同学你好!也许你现在已经工作了,我现在是和你曾经是一样的,为了毕业设计而苦恼,想必你现在已经脱离了这种痛苦,如果你有语音遥控小车方面的资料能够给我提供一份吗?在下不胜感激,希望同学能够理解我的心情,同时也但愿我们能够成为忠实的朋友,谢谢!如果方便请给我发一份到邮箱里,谢谢!


回复
2008-04-17 23:17zuoxd
能不能把你的硬件部分发给我zuoxd@https://www.360docs.net/doc/e413100709.html,.我在做毕业设计,求!!!谢谢!!!
回复
2008-04-16 00:36j10chinese
你好!能否把硬件的原理图发给我一下!我也想做个声控与循迹小车! 谢谢了! j10chinese@https://www.360docs.net/doc/e413100709.html,
回复
2008-04-08 21:03cdsudan
可以把基于凌阳61单片机语音控制小车的电路图发给我参考下吗,我的邮箱是cdsudan

@https://www.360docs.net/doc/e413100709.html, 谢谢!
回复
2008-03-20 19:45铁血丹心
我想做一个寻迹小车,但不知道什么写程序,你能帮我一下吗,我的邮箱是ak47vsm16-2008@https://www.360docs.net/doc/e413100709.html,,谢谢
回复
2008-03-16 21:17wsht
有没有完整的毕业设计啊 我做的是往返小车 可以参考一下没弄过 一点头绪都没 谢谢 我的邮箱 wsht19850105@https://www.360docs.net/doc/e413100709.html,
回复
2008-03-13 10:35小豹
跪求小弟的邮箱liebao2004@https://www.360docs.net/doc/e413100709.html,
回复
2008-03-13 10:35小豹
能不能发一分具体的硬件电路图给小弟谢谢!
回复

上一页 1... -1-1-1-1-1-1-1... -1下一页 页脚
公司简介 - 联系方法 - 招聘信息 - 客户服务 - 相关法律 -
网易公司版权所有 ©1997-2010×登录
欢迎通过百度搜索来到墙的博客!
注册登录后,你也可以拥有自己的个人博客,还可以和博友更好的交流。
网易博客欢迎你的加入
请输入登录信息
用户名: 密 码:








相关文档
最新文档