




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Harbin Institute of Technology课程设计说明书(论文)课程名称: 单片机课程设计 设计题目: 智能控制小车 院 系:电气学院自动控制与测试系班 级: 设 计 者: 学 号: 指导教师: 设计时间: 2011.8.222011.9.2 哈尔滨工业大学课程设计考核表题目: 智能声控小车学生姓名: 班级: 1 学号:实验部分考核考核内容分值得分基本设计任务的完成情况40附加设计任务的完成情况10对教师提问的回答情况10总结报告评分评分内容分值得分内容完整、字数达标20层次清晰、重点突出、分析透彻10书写规范、文字流畅5有独特见解、有一定的创新5总成绩: 指导教师签字:哈尔滨工业大学课程设计任务书 姓 名: 院 (系):电气工程及自动化学院 专 业: 测控技术与仪器 班 号:0801101 任务起至日期: 2011 年 8 月 22 日至 2011年 9 月 2 日 课程设计题目: 智能声控小车 已知技术参数和设计要求:已知技术参数:1. 凌阳SPCE061A型单片机最小开发系统一套,包括电源接口、IO接口、音频输出接口、MIC输入接口及程序下载接口;2. 小车额定工作电压4.5V(3节干电池)。 设计要求:1. 正确焊接电路板,完成单片机最小系统的调试;2. 利用61板实现语音控制小车的基本功能,包括前进、倒车、左拐和右拐的功能; 3.根据自己能力,完成小车附加功能。 工作量: 总工作时间为10天; 完成凌阳SPCE061A型单片机最小系统的焊接与调试工作;设计程序流程图并编写、调试程序;车体与单片机最小系统连接调试,完成设定的功能;最后撰写开题报告和结题报告各一份。 工作计划安排: 1)2011.8.222011.8.24:电路板焊接、查阅资料,学习凌阳单片机;2)2011.8.252011.8.26:熟悉凌阳单片机集成开发环境、设计程序流程图,编写程序;3)2011.8.292011.8.30:调试程序,完成设定要实现的功能;4)2011.8.312011.9.1:撰写课程设计报告、准备验收。5)2011.9.2验收 同组设计者及分工: 同组人:田序昌分 工:田序昌负责电路板焊接与测试,以及前期基本功能程序的实现; 王水根(本人)负责后期拓展功能的实现与程序调试 指导教师签字_ 年 月 日 教研室主任意见: 教研室主任签字_ 年 月 日*注:此任务书由课程设计指导教师填写哈尔滨工业大学课程设计说明书(论文)单片机课设报告一、课设目的及要求(1)课题目的通过设计一个由单片机控制的智能小车来熟悉模块化编程方法,掌握单片机C语言的程序设计和调试方法,并理解单片机的原理、结构、指令、运行模式功能模块及应用开发方法。(2)课题意义及单片机发展现状 语音处理技术是一门新兴的技术,它不仅包括语音的录制和播放,还涉及语音的压缩编码和解码,语音的识别等各种处理技术。以往做这方面的设计,一般有两个途径:一种方案是单片机扩展设计,另一种就是借助于专门的语音处理芯片。普通的单片机往往不能实现这么复杂的过程和算法,即使勉强实现也要加很多的外围器件。专门的语音处理芯片也比较多,像ISD系列、PM50系列等,但是专门的语音处理芯片功能比较单一,想在语音之外的其他方面应用基本是不可能的。SPCE061A是凌阳科技推出的一款16位nSP结构的微控制器。该芯片带有硬件乘法器,能够实现乘法运算、内积运算等复杂的运算。它不仅运算能力强,而且处理速度快,单周期最高可以达到49MHz。SPCE061A内嵌32K字的FLASH程序存储器以及2K的SRAM。同时该SOC芯片具有ADC和DAC功能,其MIC_ADC通道带有AGC自动增益环节,能够很轻松的将语音信号采集到芯片内部,两路10位的电流输出型DAC,只要外接一个功放就可以完成声音的播放。以上介绍的这些硬件资源使得该SPCE061A能够单芯片实现语音处理功能。借助于SPCE061A的语音特色,我们开发出了这款语音控制小车。小车不仅具有前进、后退、左转、右转停车等基本功能;同时配合SPCE061A的语音特色,实现语音控制功能。(3)设计要求小车采用语音识别技术,可通过语音命令对其行驶状态进行控制。 基本设计任务:前进、倒车、左拐、右拐、停车的功能。附加设计任务:S型前进、左转圈和右转圈二、课题设计的主要内容和具体实施方案(1) 主要内容1 可以通过简单的I/O操作实现小车的前进、后退、左转、右转等功能; 2 配合SPCE061A的语音特色,利用系统的语音播放和语音识别资源,实现语音控制的功能; 3 可以在行走过程中声控改变小车运动状态(2) 实施方案 方案论证:方案一:采用MCS-51系列单片机实现,由于有语音识别和语音播放功能,所以需要扩展语音识别模块和语音播放模块,这样必然造成端口的资源紧张,所以还必须加入接口扩展芯片。该实现方案结构如下图所示。方案二:采用SPCE061A实现语音控制小车方案,由于SPCE061A内部具有语音识别和语音播放功能,所以只需要扩展基本的MIC和语音功放即可,该方案结构如下图所示。比较以上两个方案,方案二结构简单,易于操作,故选则方案二。方案实施:系统的结构框图如下图:系统组成主要包括以下两部分:SPCE061A精简开发板、语音小车控制电路板。图中的语音输入部分MIC_ IN、按键输入KEY、声音输出部分的功率放大环节等已经做到了精简开发板61板上,为我们使用提供了很大的方便。在电机的驱动方面,采用全桥驱动技术,利用四个I/O端口分为两组分别实现两个电机的正传、反转和停三态运行。系统控制方案小车的运动控制采用语音控制和中断定时控制相结合,通过语音触发小车动作,小车动作之后,随时可以通过语音指令改变小车的运动状态。在每一次动作触发的同时启动定时器,如果小车由于某些原因不能正常的接收语音指令,则只要定时时间到,中断服务程序会发出指令让小车停下来。车体结构介绍语音控制小车为四轮结构,其中前面两个车轮由前轮电机控制,在连杆和支点作用下控制前轮左右摆动,来调节小车的前进方向。在自然状态下,前轮在弹簧作用下保持中间位置。后面两个车轮由后轮电机驱动,为整个小车提供动力,所以又称前面的轮子为方向轮,后面的两个轮子为驱动轮,如下图所示。小车的行走原理:直走:由小车的结构分析,在自然状态下,前轮在弹簧作用下保持中间状态,这是只要后轮电机正转小车就会前进。倒车:倒车动作和前进动作刚好相反,前轮电机仍然保持中间状态,后轮电机反转,小车就会向后运动。 左转:前轮电机逆时针旋转(规定为正转),后轮电机正转,这时小车就会在前后轮共同作用下朝左侧前进。 右转:前轮电机反转,后轮电机正转,这时小车就是会在前后轮共同作用下朝右侧前进。小车控制板原理图:控制板主要包括:接口电路、电源电路和两路电机的驱动电路。小车基本的运行状态与输入的对照表如下系统软件设计系统的总体程序流程如下图语音识别小车的主程序分为四大部分:初始化部分、训练部分、识别部分、重训操作。初始化部分:初始化操作将IOB8IOB11设置为输出端,用以控制电机。训练部分:训练部分完成的工作就是建立语音模型。程序一开始判断小车是否被训练过,如果没有训练过则要求对其进行训练,并且会在训练成功之后将训练的模型存储到FLASH,在以后使用时不需要重新训练;如果已经训练过会把存储在FLASH中的模型调出来装载到辨识器中。由于凌阳单片机的局限性,每次最多只能识别5条指令,因此在训练时对8条指令预先分为第一、第二两组,每组4条指令。当程序检测到训练标志位BS_Flag内容为0xffff,就会要求操作者对它进行训练操作,训练采用两次训练获取结果的方式,以训练名字为例:小车首先会提示:给我取个名字吧,这时你可以告诉它一个名字(比如小车);然后它会提示:请再说一遍,这时再次告诉它名字(小车),如果两次的声音差别不大,小车就能够成功的建立模型,名称训练成功;如果没能够成功的建立模型,小车会告知失败的原因并要求重新训练。成功训练名称后会给出下一条待训练指令提示音:前进,参照名称训练方式训练前进指令。依次训练小车的名称前进指令倒车指令左转指令右转指令S型前进指令左转圈指令右转圈指令,全部训练成功子程序返回,训练结束。识别部分:设定Result为辨识结果,team为组别标识变量。预先加载第一组语音模型(team=0),程序运行到左转函数后随即加载第二组语音模型。语音识别首先获取辨识器的辨识结果,判断是否有语音触发,如果有语音触发则会返回识别结果Result的值。如果Result是第二组(team=1)里面的命令,则该命令无效,跳出循环等待下一次命令;如果Result是第一组(team=0)里面的命令,则根据相应的名称执行相应的动作,并且重新设定team的值。为方便跳转,主程序里设置名称指令、前进指令、后退指令执行完毕后team清0,左拐指令执行完毕后team置1,加载第二组语音模型。同理,在team置1的情况下,Result只识别第二组(team=1)的命令,对第一组无视。第二组的命令里面,右拐指令、S型前进指令、左转圈指令执行完毕后team置1,右转圈指令执行完毕后team清0,重新加载第一组命令。以此类推。虽然已经有了前进、后退以及倒车等语音控制指令,但是考虑环境的干扰因素,小车运行时的噪音影响和有效距离的限制,小车运行后可能接收不到语音指令而一直运行。为了防止出现这种情况,加入了时间控制,在启动小车运行的同时启动定时器,定时器时间到停止小车的运行,该定时器借助于2Hz时基中断完成,可以在程序中修改uiTimeset参数来控制运行时间,当uiTimeset=3时,运行时间为1.5s,以此类推。注:查阅光盘资料,在转弯之前首先让前轮朝目标方向的反方向偏转,然后再让前轮朝目标方向偏转,据说这样这样前轮的摆动范围更大,惯性更大,转向效果会更好,但实际操作历来感觉效果一般。重训操作:考虑到有重新训练的需求,设置了重新训练的按键(61板的KEY3),循环扫描该按键,一旦检测到此键按下,则将擦除训练标志位(0xe000单元),并等待复位。复位后,程序重新执行,当检测到训练标志位为0xffff时会要求重新对其进行训练。三:课程设计中发现的问题及解决方案由于电路板焊接与调试以及前期程序基本功能的实现均由谢思哲实现,我这儿提出的都是加上拓展功能时出现的各种问题:1制作音频文件时程序始终播放不了。解决方法:一开始以为是文件太大了识别不了,结果发现自己录的音频文件比系统自带的还小,不是这个原因;后来发现是之前用window自带的录音机格式转换的时候把格式弄错导致,改回去便可。2添加命令时,需要添加相应的音频文件,导致各种串音。解决方法:经老师点拨,在Resource.asm文件里最下面的添加文件顺序必须与左侧Resource对话框里的音频文件顺序一致,而且必须把添加的文件全部放在最后,不能因为训练命令的原因而认为会“提早”被调用而放在前面,这样会造成串音。四、课程设计的心得体会这次课程设计在上学期的51单片机的基础上第一次接触全新的开发板和编译环境,加强对单片机运作原理的理解。同时,贯穿整个课设的查询资料大大锻炼了我的搜寻资料的能力。同时,这是我第一次使用集成语音传感系统的单片机开发板,是对于新鲜事物的一种尝试,对我以后更深入探索电子元件世界会有帮助的。五、参考资料凌阳61板产品资料 凌阳大学计划六、鸣谢 谢谢学校、学院给我们提供了动手实践单片机的机会,更感谢课设过程中胡瑞强老师的悉心指导与帮助。附:源程序/=/ 工程名称: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#defineP_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 NAME_ID 0x100 /名字#define COMMAND_GO_ID 0x101 /前进#define COMMAND_BACK_ID 0x102 /倒车#define COMMAND_LEFT_ID 0x103 /左拐#define COMMAND_RIGHT_ID 0x104 /右拐#define COMMAND_S_ID 0x105 /S型前进#define COMMAND_LL_ID 0x106 /左转圈#define COMMAND_RR_ID 0x107 /右转圈#define S_NAME0/给我取个名字吧#define S_ACT11/前进#define S_ACT22/倒车,请注意#define S_ACT33/左拐#define S_ACT44/右拐#define S_RDY5/Yeah#define S_AGAIN6/请再说一遍#define S_NOVOICE7/没有听到任何声音#define S_CMDDIFF8/说什么暗语呀#define S_NOISY8/说什么暗语呀#define S_START9/准备就绪,开始辨识#define S_GJG10/拐就拐#define S_DCZY11/倒车,请注意#define S_WAY 12 /S型前进#define S_LL13/向左转圈#define S_RR14/向右转圈extern unsigned int BSR_SDModel100;/外部变量BSR_SDModel100,辨识器自带extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);extern void F_FlashErase(unsigned int sector);unsigned int uiTimeset = 3;/运行时间定时,调整该参数控制运行时间unsigned int uiTimecont; /运行时间计时/=/ 语法格式:void Delay();/ 实现功能:延时/ 参数:无/ 返回值:无/=void Delay()unsigned int i;for(i=0;i0x3Fff;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_one();/ 实现功能:第一组训练函数/ 参数:无/ 返回值:无/=void TrainSD_one()BSR_DeleteSDGroup(0);/清除内存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个动作/=/ 语法格式:void TrainSD_two();/ 实现功能:第二组训练函数/ 参数:无/ 返回值:无/=void TrainSD_two()BSR_DeleteSDGroup(0);/清除内存while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ;/训练第4个动作while(TrainWord(COMMAND_S_ID,S_WAY) != 0) ; /训练第5个动作while(TrainWord(COMMAND_LL_ID,S_LL) != 0) ; /训练第6个动作while(TrainWord(COMMAND_RR_ID,S_RR) != 0) ; /训练第7个动作/=/ 语法格式:void StoreSD_one();/ 实现功能:第一组存储语音模型函数/ 参数:无/ 返回值:无/=void StoreSD_one() 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;commandID0x104;commandID+)g_Ret=BSR_ExportSDWord(commandID);while(g_Ret!=0)/模型导出成功?g_Ret=BSR_ExportSDWord(commandID);for(i=0;i100;i+)/保存语音模型SD1(0xe000-0xe063) F_FlashWrite1Word(ulAddr,BSR_SDModeli);ulAddr+=1;/=/ 语法格式:void StoreSD_two();/ 实现功能:第二组存储语音模型函数/ 参数:无/ 返回值:无/=void StoreSD_two() unsigned int ulAddr,i,commandID,g_Ret;F_FlashWrite1Word(0xef00,0xaaaa);F_FlashErase(0xe300); F_FlashErase(0xe400); F_FlashErase(0xe500); ulAddr=0xe300; /*for(commandID=0x105;commandID0x109;commandID+)g_Ret=BSR_ExportSDWord(commandID);while(g_Ret!=0)/模型导出成功?g_Ret=BSR_ExportSDWord(commandID);for(i=0;i100;i+)/保存语音模型SD1(0xe000-0xe063) F_FlashWrite1Word(ulAddr,BSR_SDModeli);ulAddr+=1;/=/ 语法格式:void LoadSD_one();/ 实现功能:装载第一组命令/ 参数:无/ 返回值:无/=void LoadSD_one() unsigned int *p,k,jk,Ret,g_Ret;BSR_DeleteSDGroup(0);/清除内存p=(int *)0xe000;for(jk=0;jk4;jk+)for(k=0;k100;k+)Ret=*p;BSR_SDModelk=Ret;/装载语音模型p+=1;g_Ret=BSR_ImportSDWord();while(g_Ret!=0)/模型装载成功?g_Ret=BSR_ImportSDWord();/=/ 语法格式:void LoadSD_two();/ 实现功能:装载第二组命令/ 参数:无 / 返回值:无/=void LoadSD_two() unsigned int *p,k,jk,Ret,g_Ret; BSR_DeleteSDGroup(0);/清除内存p=(int *)0xe300;for(jk=0;jk4;jk+)for(k=0;k100;k+)Ret=*p;BSR_SDModelk=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;/左转Delay();Delay();Delay();Delay();Delay();Delay();Delay();Delay();Delay();Delay();*P_INT_Mask |= 0x0004;/以下为中断定时操作_asm(int fiq,irq);uiTimecont = 0;/=/ 语法格式:void TurnRight();/ 实现功能:右转子函数/ 参数:无/ 返回值:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 百色市出租车管理制度
- 白酒工厂安全管理制度
- 石化企业饭堂管理制度
- 美术机构考核管理制度
- 小煤矿采购管理制度
- 科普小店日常管理制度
- 小学叛逆期管理制度
- 科技教师培训管理制度
- 罪犯劳动奖惩管理制度
- 寝室网格化管理制度
- 排污许可证申请流程
- 药具培训培训试题及答案
- 重庆市大渡口区2023-2024学年四年级下学期数学期末测试卷(含答案)
- 2025年高考全国一卷写作范文4篇
- 2025年广西公需科目答案03
- 2025届江苏省徐州市名校七下数学期末达标检测试题含解析
- 2025年山东夏季高中学业水平合格考模拟生物试卷(含答案)
- 大连海事大学育鲲轮电机员培训课件详解
- GB/T 45577-2025数据安全技术数据安全风险评估方法
- IgG4肾病的诊断和治疗
- 中国啤酒篮行业市场发展前景及发展趋势与投资战略研究报告2025-2028版
评论
0/150
提交评论