基于单片机控制的智能小车设计与制作
摘 要: 课题的主要任务是设计并制作一辆智能小车,要求实现小车的语音控制、循线行走、避免撞到障碍物三大功能。设计以凌阳16位单片机为控制核心,应用光电传感器和超声波传感器,成功实现了小车的三大功能。课题完成了光电传感器和超声波传感器的选择、采购、各传感器的接口电路设计和制作,以及各传感器和电路的安装位置和方式的安排,并完成了整个硬件的制作工作。此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成软件和硬件的融合,实现小车的预期功能。
关键词:智能小车,光电传感器,超声波传感器,单片机
Abstract:This subject is to design and manufacture an intelligent car, whose three functions are car’s voice control, following the line to run, avoiding hitting the obstacles. This design takes the Ling Yang 16 monolithic integrated circuits as the control core, and with applying the photoelectric sensor and the ultrasonic sensor, the car's three functions have realized. The designer has completed the choice and purchase of the photoelectric sensor and ultrasonic sensor, the design and manufacturing of various sensors' interface circuit, the installment position and arrangement preparation of the sensors and circuit, as well as the entire hardware's manufacturing work. At the same time, the control software's design and the program’s establishment and debugging are finished. Finally completes the software and hardware's fusion, which realizes the car's anticipated function.
Keywords:intelligent car,photoelectric sensor,ultrasonic sensor,SCM
1 引 言
当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。现在国外的自动控制和传感器技术已经达到了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,而且具有一定的学习能力,还据说其智商已达到6岁儿童的水平。
作为机械行业的代表产品—汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:一是电子装置占汽车整车(特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很有可能成为依托整车制造业和用车提升配置而快速成为新的增长点;二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。
无容置疑,机电一体化人才的培养不论是在国外还是国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:亚洲广播电视联盟亚太地区机器赛(ABU ROBCON)、全国大学生“飞思卡尔”杯智能汽车竞赛等众多重要竞赛都能很好的培养大学生对于机电一体化的兴趣与强化机电一体化的相关知识。但很现实的状况是,国内不论是在机械还是电气领域,与国外的差距还是很明显的,所以作为机电一体化学生,必须加倍努力,为逐步赶上国外先进水平并超过之而努力。
为了适应机电一体化的发展在汽车智能化方向的发展要求,提出简易智能小车的构想,目的在于:通过设计并制作一辆具有简单智能化的简易小车,获得项目整体设计的能力,并掌握多通道多样化传感器综合控制的方法。所以立“基于单片机控制的智能小车设计与制作”一题作为尝试。
此项设计是在以张老师提供的小车为基础上,采用凌阳16位单片机作为控制核心,逐步实现语音识别、躲避障碍和循迹行走三大功能。
本次设计主要解决利用凌阳单片机强大的语音识别功能实现语音识别,并设计和制作避障用超声波接口电路和循迹用红外发射和接收电路。最后完成硬件实物制作与组装,并编制相关程序,使其实现功能的融合,做出具有预先要求功能的实物。
2 方案论证
小车总体功能描述:在小车的底盘上有一个总开关,当开关闭合时,小车开始工作,播放语音提示“请选择模式”,进入模式选择菜单,这时可以呼叫其名字,小车则做出相应的应答,还可以语音选择模式,即语音和循线两种模式,确定工作模式后开始工作。在语音模式下,可以识别前进,后退,左转,右转和返回五个命令,而且在小车前进、左转或右转的过程中,将调用避障函数进行避障,所以一旦离障碍物的距离小于安全距离时,(设的安全距离为23CM),小车反转急停车,播放语音提示遇到障碍;或者本来就离障碍物小于安全距离时,命令小车前进、左拐、右拐,小车将不会执行相应动作,且直接语音提示遇到障碍。当小车接到返回命令时,则返回至模式选择菜单,并语音提示返回成功;在循线模式下,把小车放到线轨上时则执行循线动作,值得注意的是如果小车不在循线轨道上时,小车是不会执行循线动作的,只有在放到线轨上才会执行动作,当按下控制板上的KEY2键则退出循线模式。至于左后退和右后退两个不常用的命令则由于语音识别函数局限的原因,放到了模式菜单那一级。
下面根据设计要求,针对各模块需要完成的功能,本着简单、实用、廉价、容易操作、稳定的原则,对各模块进行充分的理论分析和方案论证。
2.1 控制核心的选择及其简介
因为所设计的小车具有语音、循迹和避障的功能,所一对控制核心的要求还是比较高的,特别是语音模块,一般的单片机很难满足要求,比如常用的51系列单片机,要其真正实现语音识别很有难度,所以根据实际需要选用具有强大语音功能的SPCE061A单片机。SPCE061A单片机的编程环境也比较人性化,采用专用的集成开发环境(IDE)进行程序的编辑,而且其不仅支持汇编,还支持比较高级的C语言。
还有一个特点是这种单片为凌阳公司所提供,有现成做好的61板,也就是说有供电电路等辅助电路,还特别具有音频电路(含MIC输入部分和DAC音频输出部分)、复位电路等。
2.1.1 SPCE061A单片机简介
SPCE061A是继μ'nSPTM系列产品SPCE500A等之后,凌阳科技推出的又一个16位结构的微控制器。SPCE061A里内嵌了32k字的闪存FLASH。较高的处理速度,使μ'nSPTM能够非常容易地快速处理复杂的数字信号,以μ'nSPTM为核心的SPCE061A微控制器,也适用在数字语音识别应用领域。SPCE061A在2。6~3。6V工作电压范围内,工作速度范围为0。32~49115MHz,较高的工作速度使其应用领域进一步拓宽。2k字SRAM和32k字闪存FLASH仅占一页存储空间,32位可编程的多功能I/O端口:两个16位定时器/计数器,32768Hz实时时钟,低电压复位/监测功能,8通道10位模—数转换输入功能,并具有内置自动增益控制功能的麦克风输入方式,双通道10位DAC方式的音频输出功能。SPCE061A是数字声音和语音识别产品的一种非常经济的应用。
2.2.2 61板简介
61板是SPCE061A EMU BOARD的简称,是以凌阳16位单片机SPCE061A为核心的精简开发-仿真-实验板(如图2.1),大小相当于一张扑克牌,是“凌阳科技大学计划”专为大学生、电子爱好者等进行电子实习、课程设计、毕业设计、电子制作及电子竞赛所设计的,也可作为单片机项目初期研发使用。61板除了具备单片机最小系统电路外,还包括有电源电路、音频电路(含MIC输入部分和DAC音频输出部分)、复位电路等,采用电池供电,方便学生随身携带!使学生在掌握软件的同时,熟悉单片机硬件的设计制作,锻炼学生的动手能力,也为单片机学习者和开发者创造了一个良好的学习条件和开发新产品的机会!
图2.1 61板实物图
2.2.3 集成开发环境(IDE)简介
61板配有凌阳自行研发设计的16位单片机开发环境IDE。此工具在Windows环境下操作,支持标准C语言和汇编语言,集编译、编程、链接、调试和仿真于一体,应用方便简单易学。同时还提供大量的编程函数库,特别是语音播放和语音识别的相关函数,大大加快了软件开发的进程。
集成开发环境IDE具有友好的交互界面、下拉菜单、快捷键和快速访问命令列表等,使编程、调试工作方便且高效。此外,它的软件仿真功能可以在不连接仿真板的情况下模拟硬件的各项功能来调试程序。
在集成开发环境IDE中,可以非常方便将编写好的程序,通过61板配套的下载线下载到61板上进行在线调试。
2.2 小车驱动方式的选择
玩具小车上的两个电机均为一般的玩具直流电动机,前轮用一个电机控制方向,后轮的电机用来驱动小车,这就是传统的控制小车方向的方式,缺点是转向过于灵敏;另外一种常见驱动方式为两电机四驱,差速转向,其优点是转向性能好,能实现原地360°转向,且在循迹行走的时候能比较稳定的行驶,但是这种驱动方式的硬件制作比较有难度;还有一种驱动方案是采用三轮方案,即前面或后面安装一个万向轮,然后两电机分别控制两驱动轮,这种驱动方式具有两电机四驱的优点,而且硬件制作简单多了。
比较上面三种方案,首先排除了第三种方案,因为一开始的定位是要做四轮车。对于第二种驱动方式虽然有制作的经验,但是制作过于麻烦,而且由于小车采用单片机控制,可以通过单片机自动校正来克服第一种转向过于灵敏的缺点,能达到运行平稳、安全高效的要求;再者,参照合肥工业大学参加“飞思卡尔”比赛的视频,其驱动就是采用第一种方式,并很好的实现了预期的功能。所以,本设计亦采用此种驱动方式。
2.3 语音播放和语音识别模块
语音模块需要实现语音播放和语音识别的功能,在2.1章节已经对控制核心作了选择,利用61板就能很好的实现这些功能。
前面已经对61板进行了简单了介绍,61板上面已经集成了音频电路(含MIC输入部分和DAC音频输出部分),所以不必要对硬件电路进行单独设计了。再者,在软件方面,凌阳提供了多种格式的语音播放函数和功能强大的语音识别函数库,极大的方便了语音模块的程序编制。
2.4 光电检测模块
光电检测是用于循迹功能的,这里的循迹是指小车能在白色地板上循黑线行走,通常采取的方法便是红外探测法。
红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测距离有限,一般最大不应超过3cm。
图2.2 TCRT5000实物图
传感器的选用是个艰难的过程,放弃使用前几届师兄所采用的那种一般的红外发射接收对管,因为那种管子太大,不适合安装,而且发射和接收为的部分,之间没有遮挡,容易造成干扰。根据日常经验,麻将机中有一种很好的红外发射接收光耦管可以用于循线,经查找相关资料,查到如下几种型号的传感:FS-359F\\RG149A\\RPR220\\TCRT5000。然后,逐一查找到了这几种传感器的技术资料,经过仔细分析和对比其性能,结合购买可能性,最后确定了选用TCRT5000型号的传感器,其形状如图2.2所示。
2.5 障碍检测模块
智能小车既然智能,至少要求其在行走的过程中不能碰到障碍物,所以其必须具有避障的功能。避障的基本原理为小车不断发射某种东西(比如光或波),并不断检测这种东西的反射情况来判断前面有无障碍。
一般障碍检测传感器的选择有两种:
A.利用光电开关。这种方法简单实用,也很稳定,而且接口电路简单,甚至不用单独设计接口电路。但是其体积较大,而且检测距离不够远,对障碍的要求也比较高,比如遇到玻璃之类的透明物体就不能有效识别了。
B.利用超声波。这种方法较为复杂,特别是接口电路的设计,有一定的难度,但其具有体积小、灵敏度高、检测距离远、对障碍物要求不高等优点。
光电开关避障比较简单,就是在一定距离内有反射就认为遇到障碍,可以适当调节接收灵敏度来小幅度调节避障距离,这种方式不需要单片机参与计算,所以可以为单片机节省资源;而超声波的避障原理则相对复杂一些:超声波发射器向某一方向发射波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到发射波就立即停止计时。超声波在空气中的传播图2.3 TCT40-16T/R1
速度为340m/s,根据计时器记录时间t,就可以计算出发射点距离障碍物的距离(s),即:s=340t/2。当计算的距离小于程序中设定的障碍安全距离时,则认为遇到障碍。所以这个距离可以方便的在程序中调节,但是这种避障方式需要单片机参与计算,占用了资源。
综合对比两种方案的优略,最终采用超声波避障,从网络上查得一种比较合适的超声波传感器,型号为TCT40-16T/R1,其实物图如图2.3所示。其实首先进行试验的时候采用的超声波型号为TCT40-12T/R1,也许灵敏度不够或是已经坏了,在后来在成熟的电路上试验并没成功。
3 系统硬件设计
在第2章方案论证的基础上,根据设计要求,对各模块的硬件进行系统设计。由于语音播放和语音识别模块在61板上已经有现成的电路,所以在本章节中将不再作说明。
3.1 车体结构及其驱动电路
车体驱动方式已经在前一章确定下来,硬件部分则在张老师提供的小车基础上进行,小车的实物图如图3.1所示,控制板下的电路板为电机驱动电路板。
图3.1 小车实物图
该小车为四轮结构,车的结构示意图如图3.2所示。其中前面两个车轮由前轮电机控制,在连杆和支点作用下控制前轮左右摆动,来调节小车的前进方向。在自然状态下,前轮在弹簧作用下保持中间位置。后面两个车轮由后轮电机驱动,为整个小车提供动力,所以又称前面的轮子为方向轮,后面的两个轮子为驱动轮,如图3.3所示。
图3.2 车体侧视图
图3.3 车体顶视图
电机驱动电路部分虽然在小车上已经有了,但是还需要把小车拆开来对电路进行详细的分析,经分析,前后电机的驱动电路是一样的,采用的都是全桥驱动电路,其后轮驱动电路如图3.4所示,前轮的驱动电路和后轮驱动电路是一样的,只是控制接口是IOB10和IOB11。
现以后轮驱动电路为例,对其进行详细介绍。Q1、Q2、Q3、Q4四个三极管组成四个桥臂,Q1和Q4组成一组,Q2和Q3组成一组,Q5控制Q2、Q3的导通与关断,Q6控制Q1和Q4的导通与关断,而Q5、Q6由IOB9和IOB8控制(前轮驱动电路为IOB10和IOB11),这样就可以通过IOB8和IOB9控制四个桥臂的导通与关断控制后轮电机的运行状态,使之正转反转或者停转,进而控制小车的前进和后退(左拐和右拐)。
图3.4 后轮电机驱动电路
还是以后轮驱动电机为例,当IOB8为高电平、IOB9为低电平时Q1和Q4导通,Q2和Q3截止,后轮电机正转,小车前进;反之当IOB8为低电平、IOB9为高电平时Q1和Q4截止,Q2和Q3导通,后轮电机反转,小车倒退;而当IOB8、IOB9同为低电平时Q1、Q2、Q3和Q4都截止,后轮电机停转,小车停止运动。值得注意的是IOB10、IOB11不能同时为高电平,否则会造成前轮驱动全桥的桥臂短路。
至于转向电机,其电路和驱动电机的电路是一样的,只是其控制端口为IOB10、IOB11,且在IOB10和IOB11都为低电平时,前轮在弹簧的作用下保持在中间位置,所以通过控制IOB8、IOB9以及IOB10、IOB11端口的状态组合就可以得到小车不同的运动方式。
注:IOB10、IOB11或IOB8、IOB9不能同时为高电平,这样会造成前轮或后轮驱动全桥的桥臂短路。
结合以上对前轮和后轮的状态分析,得到小车的运行状态与输入的对照表,如表3.1所示:
表3.1 输入与小车运动状态对照表
| IOB11 | IOB10 | IOB9 | IOB8 | 后电机 | 前电机 | 小车 |
| 0 | 0 | 0 | 0 | 停转 | 停转 | 停 |
| 0 | 0 | 0 | 1 | 正转 | 停转 | 前进 |
| 0 | 0 | 1 | 0 | 反转 | 停转 | 倒退 |
| 0 | 1 | 0 | 1 | 正转 | 正转 | 左前进 |
| 1 | 0 | 0 | 1 | 正转 | 反转 | 右前进 |
| 0 | 1 | 1 | 0 | 反转 | 正转 | 右后退 |
| 1 | 0 | 1 | 0 | 反转 | 反转 | 左后退 |
| * | * | 1 | 1 | 停转 | * | 禁止 |
| 1 | 1 | * | * | * | 停转 |
在第2章已确定了采用红外探测法来实现循线的功能,也选用了型号为TCRT5000的红外反射式光藕,在此章节中将对其接口电路和安装方式进行详细设计。
3.2.1 循线硬件电路设计
通过互联网的资料查询,得知TCRT5000是一种自带发光二极管和光敏二极管的器件,并查得其集电极电流如与反射距离d 之间有图3.5所示关系。
图3.5 TCRT5000的Ic—d关系
当反射距离一定时,其集电极电流就主要和反射率有关了,反射率越大,则集电极电流越大;反之则越小。利用其这个特点就很容易把黑线和白线区分开来了。
图3.7 TCRT5000的相对安装位置示意图
很多循线小车设计都不止用两个传感器,一般为四个或更多,安装形式为中心对称分布,主要是用来防止由于小车惯性太大而冲出第一对传感器的检测范围。这种方法对于速度比较快的小车确实很实用,但是我所设计的小车对车速要求不高,所以就只用了两个传感器。
下面谈一下传感器的具体安装,因为小车车体已经固定,所以传感器的安装比较被动。前面已经对传感器的安装位置进行了分析,现在先看一下小车前轮底部的实物图,如图3.8。
图3.8 小车前轮底部实物图
图3.9 PCB板形状
不难发现,底部有两个孔,所以可以利用这两个孔来安装和固定传感器了。具体方案是先把传感器焊接在PCB板上,信号线由排线引出(处理电路和超声波电路焊在一块板上,并安装在车上部分,具体请查看3.3避障模块),再把焊有传感器的PCB板通过那两个小孔用螺丝固定在上面。由于空间和中间有个调整前轮转向平衡杆的原因,PCB板的形状必须是特殊的形状,经过仔细测量和用纸板模拟,得出了电路板的具体形状和尺寸,如图3.9所示。
两个安装孔的位置要比较精确,因为孔本来就比较小,误差大就安装不上去。那个半圆的作用是避开调整前轮转向平衡杆,使的即使安装了传感器也不能影响它的功能。
然后便是硬件制作,本来是打算制作PCB板的,但是由于某些问题,采用通过板代替了。通过使用小刀、剪刀和小螺丝刀等工具把通用板加工成了预想的形状,把TCRT5000焊接上,然后经过测试就开始安装了。但遗憾的是没有找到合适的螺丝,后来在刘老师的帮助下用塑料给粘上了。这样的缺点是不容易拆卸,而且影响了前轮转向平衡调整杆的使用,但幸运的是影响不大,而且比螺丝安装结实。安装好的实物图如图3.10。
图3.10 循线传感器安装实物图
3.3 避障模块
在第2章已经确定了使用超声波避障的方式,并对传感器进行了选择,在此章节中将对其接口电路和安装方式详细进行设计。
3.3.1 避障硬件电路设计
超声波电路的设计是一个曲折过程,花费的时间和精力最多,表3.2 是我查到的TCT40-16T/R1的产品性能。
表3.2 TCT40-16T/R1的产品性能
| 性能 | 要求 |
| 标称频率(KHz) | 40 |
| 发射声压at40KHz(0dB=0.02mPa)min | 117dB |
| 接收灵敏度at40KHz (0dB=V/Pa) min | -65dB |
| 静电容量at1KHz,<1V(PF) | 2400 25% |
| 阻抗(Ohm) | 1000 |
| -6dB 带宽(KHz) | 2 |
| -6dB 指向角 | 45 |
图3.11 超声波发射调理电路
这种超声波发射电路的40KHz的方波是由单片机产生,然后经过 CD4049对40KHz频率信号进行调理,以使超声波传感器产生谐振。这个电路有一个很严重的问题,在小车上40KHz的方波不可能由单片机产生,因为凌阳单片机专用方波的产生口已经被用于小车后轮的PWM调速了,也就是说那个端口被小车的驱动电路给占了。于是选择用由555构成的多谐振荡器产生方波,然后就查找相关资料,查得其基本电路组成和工作波形图如图3.12所示。
图3.12 555多谐振荡器基本电路和工作波形
其电路震荡频率的计算公式为:
(3—1)
而输出波形占空比的计算公式为:
(3—2)
由(3—1)可以看出改变的、和的值可改变振荡频率,而由(3—2)可以看出和的改变会导致输出波形占空比的改变,而且由(3—2)还可以得出占空比总是大于50%的。现在我希望得到频率为40KHz占空比为50%的方波,所以在确定上述电路各元件的具体值的同时还希望有一些小修改,以达到输出占空比为50%的方波的目的。于是我继续在网络上寻找,最后有一位网友给我介绍了一个专门设计多谐振荡器的小软件,其不但能确定各元件的最佳物理量,也能设计出能产生频率为40KHz占空比为50%的方波的振荡电路。此软件几乎可以设计任何占空比任何频率的振荡电路,只需要选择你所需要的占空比并输入所需频率就可以了。图3.13是在产生频率为40KHz占空比为50%的方波电路时的截图,软件很直观的给出了电路图和具体元件的数值,这些数值还可以方便成组变化或直接改变,且在单独改变某元件的值时,反过来可查看频率的相关变化。
图3.13 多谐振荡器设计软件截图
所以超声波所需的方波产生电路就基本上按图3.13里的电路设计了,只是把电阻值就近改成常用的电阻值,其中改成18K,改成7.5K就可以了。虽然改动和的阻值会造成输出方波的频率和占空比的改变,但是我用软件进行了计算,其频率变化并不大,而占空比基本没变,理论上是不会有什么影响的。由于没有示波器,并不能确定这个电路能否产生方波,产生的方波是否与要求的相符,在实际中是否能真正可以用,所以在接下来的试验中先不使用这个电路,而是采用比较可靠的单片机产生方波的方法进行试验,然后等相关电路都试验成功后再用那些电路反过来检验此电路。
凌阳超声波测距模组的超声波接收处理电路前级采用NE5532构成10000倍放大器,对接收信号进行放大;后级采用LM311比较器对接收信号进行调整,比较电压从LM311的第3管脚输入,可调节比较电压的大小来调节超声的波检测距离。其具体的电路图如图3.14所示。
图3.14 超声波回波接收处理电路
电路有了,接下来配置所有的元件,用面包板组出了3.11和3.14所示的电路,经过仔细的检查后用凌阳提供的测距标准程序进行测试,试验很不如意,要么收不到回波要么有干扰,根本不能正常工作。经分析可能有以下原因并分别进行试验:
A.电压问题,于是加大供电电压,但是效果甚微;
B.干扰问题,为了减少干扰,把两个超声波头的位置放远了些,干扰少了,但是还是没有达到预想的效果;
C.放大倍数不够,于是加大了放大倍数,但是收效甚微;
D.改变LM311的比较电压,干脆用可调电阻调,但是几乎没什么影响。
E.期间,还采用过TL082代替NE5532等方法,但是还是没有成功。后来甚至把LM311去掉,直接用万用表测放大后的电压变化,发现其变化范围很小。
经过上网查找资料,并向有经验的人请教,发现此电路的发射电路驱动不好,CD4049的供电电压范围太大,根本不适合,NE5532也用得不好,更不应该用LM311比较器等缺点,于是转换思路,彻底放弃此电路,重新设计新的电路,并实现了一个比较成熟且简单的电路,且对该电路进行了全面的试验。
这套电路的发射电路是由单片机输出40kHz方波信号,信号一路经一级反向器后送到超声波传感器的一个电极;另一路经两级反向器后送到超声波换能器的另一个电极。用这种推挽形式将方波信号加到超声波传感器的两端,可以提高超声波的发射强度,输出端采用两个反向器并联,用以提高驱动能力。上拉电阻 R10、R20一方面可以提高反向器74LS04输出高电平的驱动能力;另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡的时间。其电路图如图3.15。
图3.15 超声波发射电路
经仔细对比两电路,发现采用74LS04芯片要比CD4049要好,因为74LS04芯片的供电电压比较接近小车电源能提供的电压,而且这个电路经很多人做过,相对成熟,所以发射电路基本确定下来。如果试验成功就把前面所设计好的555多谐振荡电路接上再进行试验,用来检测多谐振荡电路是否可行。
这套电路的接收电路如图3.16所示,这个接收电路上使用了一个比较陌生的芯片CX20106A, 此芯片能对接收探头接收到的信号进行放大、滤波,其总放大增益为80db。这是一个用于电视遥控器接收端信号处理的,其接收的信号频率为38KHz,与超声波的频率40KHz非常的接近,而且这个频率可以在硬件电路里改变一个电阻值就可以对其进行调整,所以用来作为超声波的接收电路非常的合适。
图3.16 超声波接收电路
以下是CX20106A的引脚注释:
1脚:信号输入端,该脚和地之间本来是连接PIN光电二极管的,现连接超声波接收头,该脚的输入阻抗约为40kΩ。
2脚:该脚与地之间连接RC串联网络,它们是负反馈串联网络的一个组成部分,改变它们的数值能改变前置放大器的增益和频率特性。增大电阻R5或减小C4,将使负反馈量增大,放大倍数下降,反之则放大倍数增大。但C4的改变会影响到频率特性,一般在实际使用中不必改动,推荐选用参数为R5=4.7Ω,C4=1μF。
3脚:该脚与地之间连接检波电容,电容量大为平均值检波,瞬间相应灵敏度低;若容量小,则为峰值检波,瞬间相应灵敏度高,但检波输出的脉冲宽度变动大,易造成误动作,推荐参数为3.3μf。
4脚:接地端。
5脚:该脚与电源间接入一个电阻,用以设置带通滤波器的中心频率,阻值越大,中心频率越低。例如,取R=200kΩ时,≈42kHz,若取R=220kΩ,则中心频率≈38kHz,在此取200kΩ。
6脚:该脚与地之间接一个积分电容,标准值为330pF,如果该电容取得太大,会使探测距离变短。
7脚:遥控命令输出端,它是集电极开路输出方式,因此该引脚必须接上一个上拉电阻到电源端,推荐阻值为22kΩ,没有接受信号是该端输出为高电平,有信号时则产生下降。
8脚:电源正极,4.5~5V。
电路确定后,买了CX20106A和一对TCT40-16T/R1,开始试验,最开始,并没有在超声波头之间并连563电容,结果总是存在干扰,后来把那个电容加上后,实验非常顺利,超声波也非常稳定了,电路就基本确定下来。然后用该电路反过来检测前面设计的多谐振荡电路,也非常成功,于是超声波避障的电路就都确定了,其最后的发射电路如图3.17所示,接收电路如图3.16所示。
图3.17 发射电路
3.3.2 避障硬件电路的制作与安装
电路设计好以后,就是电路硬件的制作和安装问题。首先有一点是毋庸置疑的,超声波传感器必须安装在小车的正前端,其相对位置大概如图3.7所示。经仔细观察小车车体,发现在小车的控制板和电机驱动板之间可以通过小铜杆加一个电路板用来焊接整个电路(含循线处理电路),而且同时也可把超声波传感器直接焊接在此电路板上,再者控制板和我所加的电路板之间的连接也可用排插口很好的连接。于是对所有的安装尺寸进行了详细的测量,并用纸板模拟了电路板的形状,得出了电路板的相关尺寸。在此,提出两种实现方案:
A.设计单面PCB板,但是由于电路太复杂,加上对Protel要求的熟练程度较高,实现起来相对困难;
B.采用通用板直接焊接,该方案相对简单且通过了试验。焊接好的电路板如图3.18所示。
图3.18 焊接好的电路板
图3.18中左端两个圆头形状的元件就是超声波传感器,黑色为接收头,白色的为发射头,在其周围相应的便是接收电路和发射电路。可以看到解说电路焊接得比较集中,那是由于接收电路容易收到干扰,所以尽量缩短其连线并原理其他电路。电路板上的四个孔安装用的,可以通过小铜杆把整块电路板固定在控制板与小车驱动电路板之间。在电路板中部靠下的部位是循线传感器的处理电路,白色的六排线插座便是与车第传感器连接的接口。右边三个排插接口就是电路板与控制板的接口,其位置与控制板对应,在安装的时候控制板的排针能刚好对上这几个排插口,从而实现连接。在右边还有三个发光二极管,其是后来调试程序的时候加上去的,其作用可以方便程序的调试。
3.4 硬件完成后的小车总体图
完成了所有硬件的设计和制作(总体电路图见附录),然后进行硬件的组装,组装好的小车如图3.19所示。
图3.19 硬件完成后的小车总体图
4 系统软件设计
在第2章的方案论证部分已经对小车的总体功能有所描述了,第3章也完成了小车所有的硬件,本章则将以小车总体功能和硬件为基础进行系统的软件设计。其中由于语音识别程序部分基本都是用的凌阳提供的函数库里的函数,而且在主程序里有所介绍,在本章将不再单独说明。
4.1 主程序设计
主程序的作用是把小车的各个功能连接起来,以实现小车预期的功能。图4.1为小车主程序的流程图。具体程序可参考附录1。
图4.1 主程序流程图
流程描述:打开小车的电源开关时执行端口初始化程序,然后判断是否进行过训练,如果没有就进入训练程序,如果已经训练过了就直接初始化语音识别器,进行语音识别,判断语音命令并执行相关动作,然后判断KEY3键是否按下,如果是,清相应的训练标志位,再进入死循环,等待看门狗复位,则达到了需要重新训练的效果。
4.2 循线模块程序设计
循线程序是在语音命令为“循线”时调用的,需要实现循线的功能,同时还要留下返回接口,便于程序的返回。图4.2为循线程序的程序流程图。具体程序可参考附录2。
图4.2 循线程序流程图
流程描述:在循线的时候是不会识别语音命令的,所以首先关闭语音识别器以避免干扰,然后初始化循线用到的端口,再检测循线传感器是否有信号输入,如果有了就跳出循环,用PWM调速的方式给后轮一个速度,接下来就是判断两个传感器的状态,根据它们的状态执行小车方向的修正,同时检测KEY2键是否按下,如果按下,则停车并退出循环,打开识别器,返回主程序。
需要说明的是,在这里用到了PWM调宽调速,其作用是小车的速度,因为速度太快会导致小车冲出轨道而不能正常循线。在此,存在一个问题:小车在循线的时候是不能进行障碍检测的,最初是准备把避障的功能放到循线里来的,但是因为前面已经把避障的程序编好了,那个程序占单片机时间太多,对循线的影响很大,所以放弃了。由于时间原因,在此,仅提出一个避障模块程序的修改方案设想(具体方案见4.3 障碍检测模块程序设计)。
4.3 障碍检测模块程序设计
障碍检测模块的程序是在小车执行语音命令前进、左拐、右拐时在前进、左拐、右拐的子程序中调用的,障碍检测其实是个测距的过程,图4.3是避障程序的流程图。具体程序还可参考附录3。
图4.3 避障程序流程图
流程描述:在调用避障程序的时候,首先进行初始化,然后发射几个40KHz的波,同时开始计时,延时一断时间再开中断,延时的作用是避开余波信号的干扰,在中断中记录相关数据,然后返回主程序对数据进行处理,再得出距离并与安全距离比较,如果小于安全距离,则认为遇到障碍,将障碍标志位置1,反之置0。
避障程序其实是个测距的程序,在小车前进、左拐、右拐的过程中不断的调用,不断检测障碍标志位,当障碍标志位为1时就认为遇到障碍了,下面以前进程序的流程图(图4.4)为例进行说明,左拐、右拐的程序很相似,在此不再作说明,这些程序可参考附录4。
图4.4 前进程序流程图
流程描述:在接到前进命令时,调用小车的前进命令,首先关闭识别器,防止干扰,然后初始化相关端口,然后调用避障程序,看看是否小车前面本来就有障碍,如果有,则不前进并播放遇到障碍语音提示,没有的话就开始前进,前进的过程中不断的调用避障程序,并检测障碍标志,当障碍标志为1时立即停车,并播放遇到障碍的语音提示。如果小车一直没有遇到障碍,在前进一段设定的时间后会自然停止。
问题讨论:由小车的避障程序和前进程序可以看出,避障程序在等待回波中断的时候浪费了不少时间,所以在循线中没法实现避障,在此,提出一个解决方案:把数据处理程序都放到中断程序里,这样就能节省大量的时间而使得避障功能能在循线时实现了。由于时间问题,没有对此方案进行验证。
4.4 语音播放程序设计
语音播放程序很多函数都是有函数库提供,所以语音播放函数比较简单,其分为两部分,一是播放流程控制(如图4.5),一是中断播放服务程序(如图4.6)。具体的程序还可参考附录5。
图4.5 播放流程图
图4.6 中断播放服务流程图
5 使用说明
智能小车总体图如图5.1所示,其使用说明如下:
图5.1 小车实物图
小车的硬件连接如下:
IOB8~IOB11:控制驱动和转向电机,有4PIN排线连接;
IOB2口接超声波接收信号;
IOB4口接超声波发射口;
IOA4和IOA5奇偶接寻线用红外传感器接口电路接收口;
IOA8、IOA9、IOA10分别连接一个发光二极管,颜色依次为绿、黄、红;
所有连接都已经连接好,使用者不要随便拆卸。
小车采用四节五号电池供电,装在小车侧面,使用时请正确安装电池!
安装电池后就可以打开小车底部的电源开关了,如果小车未经过训练,小车会语音提示“开始训练”,然后可按照语音提示进行训练,先后的提示是“给我取个名字吧”、“语音”、“循线”、“左后退”、“右后退”,训练完第一组五个命令后会语音提示“训练第二组”,第二组训练语音提示为“返回”、“前进”、“后退”、“左拐”、“右拐”。训练成功后语音提示“准备就绪开始辨识”和“请选择模式”,就可以对小车进行语音控制了。
在小车重新启动之后还是不要重新进行训练的,如果需要重新训练,只需要按下小车上的KEY3键即可。在小车运行的过程中任何时候按下控制板上的RESET,小车都会进行复位,但是语音训练结果不会丢失。
各条语音命令:
呼唤小车名字,小车将语音应答“Yeah!”,命令为“语音”时,小车将播放模式选择成功,进入语音模式,在语音模式下,小车可以识别“前进”、“后退”、“左拐”、“右拐”命令,而且在前进、左拐和右拐的过程中能进行避障,在遇到障碍物时会提前提车并语音提示“遇到障碍”,而且如果小车前面本来离障碍物的距离就小于安全距离,小车将不会执行命令而是直接提示“遇到障碍”。如果想返回语音模式,可以命令“返回”,即可返回并语音提示“返回成功”,这时就可以进入了模式选择菜单;当语音命令为“循线”时,小车进入循线模式,在循线模式下拿起小车,小车是不会向前走的,只有放到线轨上,小车才进行循线动作,而且在循线过程中拿起了小车,小车也会立即停车的,如果想返回,则只需按下控制板上的KEY2键即可实现返回并语音播放“返回成功”。
由于单片机一次只能识别五条命令,小车的左后退和右后退两条不常用的命令放到了模式选择菜单一级,在模式选择菜单下才可识别左后退和右后退两条命令。
下面是几条注意事项:
A:不能在里障碍物太近的地方命令其前进、左拐或右拐,因为障碍检测有检测盲区,离障碍物太近并不能有效检测。
B:供电电池一定要电量足的新电池,不然不能实现避障功能,而且会出现走不动的现象;也可以采用单片机和电机单独供电这种比较稳定的方式。
结论
根据本次设计要求,我系统地阅读了大量的资料,并认真分析了设计课题的需求,还系统学习了凌阳单片机的工作原理及其使用方法,并独自设计智能小车的整个项目。
虽然条件艰苦,但经过不懈钻研和努力,购买到了所有所需的元器件,并系统的进行了多项试验,最终做出了整个小车的硬件系统,然后结合课题任务和小车硬件进行了程序的编制,最终顺利的通过了系统软硬件的联机调试,成功实现设计任务所要求的语音控制、循线行走和避障三大功能。
通过本次毕业设计,不仅是对我大学四年所学知识的考查,更是对我的自学能力和收集资料能力以及动手能力的考验。本次毕业设计使我对一个项目的整体设计有了初步认识,还认识了几种传感器,并能设计出其接口电路,再有对电路板的制作有了一定的了解,并学会了使用Protel设计电路。本次毕业设计还使我意识到了实验的重要性,在硬件制作和软件调试的过程中,出现了很多问题,最终都是通过实验的方法来解决的。还有以前对程序只是一个很模糊的概念,通过这次的毕业设计使我对程序完全有了一个新的认识,并能使用C熟练的进行编程了。通过本次毕业设计,极大的锻炼了我思考和分析问题的能力,并对机电一体化有了一个更深的认识。
总之,在毕业设计的过程中,无论是对于学习方法还是理论知识,我都有了新的认识,受益匪浅,这将激励我在今后再接再厉,不断完善自己的理论知识,提高实践运作能力。
谢辞
回首大学四年,感慨万千!
值此毕业论文完成之际,谨向给予我指导的张利老师表示诚挚的感谢!从论文的开题,到系统的分析、设计、编码实现,以至论文的成稿,张老师给了我诸多的帮助和悉心的指导,其严谨的作风和认真的学习态度感染了我,使我认识到,学习不仅要注重方法,更要有严谨、主动的态度,这将对我以后的工作学习产生深远的影响!再次向我的指导老师张利老师致以最诚挚的谢意!
另外,我还要感谢所有在我毕业设计期间给予我帮助的刘征宇老师和科技楼刘老师以及张伟伟师兄。还有要感谢给我录语音资料的冯珊珊同学、给我解决难题的荣左超同学、给我买元件的张铭同学等。没有他们的帮助,我是不能顺利完成毕业设计的。
衷心的感谢所有帮助我的老师和同学!
祝愿母校明天更辉煌!
[参考文献]
[1] 罗亚非.凌阳16位单片机应用基础[M].北京:北京航空航天大学出版社,2003.
[2] 侯媛彬.凌阳单片机原理及其毕业设计精选[M].北京:科学出版社,2005.
[3] 周荷琴.微型计算机原理与接口技术[M].合肥:中国科学技术出版社,2005.
[4] 吴国风.C语言程序设计教程[M].合肥:中国科学技术出版社,2005.
[5] 程昱.Protel DXP 电路设计白金教学[M].北京:科学出版社,2004.
[6] 侯少云.基于DSP 和模糊控制的寻线行走机器人设计[J].电子技术应用,2006.
[7] 赵广超.基于超声波传感的系统设计.
[8] 郭长玉.简易智能电动车设计报告.
[9] 吴建平.红外反射式传感器在自主式寻迹小车导航中的应用.
[8] 吴斌华.基于路径识别的智能车系统设计.电子技术应用,2007.
[9] 李正军.计算机控制系统[M].机械工业出版社,2005.
[10] 实验仪使用说明书.凌阳科技网站:http://www.unsp.com/
[11] 毕业设计指导书V2.0.凌阳科技网站:http://www.unsp.com/
[12] 超声波测距模组使用说明书v1.1.凌阳科技网站:http://www.unsp.com/
附录1:
主程序清单:
…… //头文件的包含和函数声明
int main(void)
{
unsigned int uiFlagFirst; //是否为第一次下载
unsigned int uiRes; //识别结果
unsigned int uiBS_Team; //用于标识现在是第几组命令在内存当中
unsigned int uiKey; //存储键盘值,按下将重新训练
unsigned int reFlag; //返回标志
*P_IOA_Data = 0xf000;
*P_IOA_Buffer = 0xfff0; //初始化
*P_IOA_Dir = 0xfff0;
Initial_ult(); //初始化超声波测距模组IO口
CarSystemInit(); //初始化小车寻线端口
Initial_route(); //初始化小车寻线端口
uiFlagFirst = IsFirstDownLoad(); //判断是否为第一次下载程序
if(uiFlagFirst == 1) //训练
{ FormatFlash(); //格式化需要存储命令的存储器
PlaySnd(15, 3); //播放"开始训练"
TrainFiveCommand(0); //训练需要的五条命令(第一组)
SaveFiveCommand(0xf700); //存储五条命令
PlaySnd(15, 3); //播放"训练2"
TrainFiveCommand(1);
SaveFiveCommand(0xf900);
*P_Watchdog_Clear = 0x0001;
PlaySnd(15, 3); //播放训练成功,开始辨识
uiFlagFirst = 0xaaaa; //置标训练志位
F_FlashWrite1Word(0xfd00,0xaaaa); }
*P_Watchdog_Clear = 0x0001;
ImportFiveCommand(Group1);
uiBS_Team = 0; PlaySnd(12, 3); reFlag=0; //请选择模式
Loop: while(reFlag)
{ PlaySnd(8, 3); reFlag=0; } //播放返回成功
BSR_InitRecognizer(BSR_MIC); //初始化识别器
while(1)
{ uiRes = BSR_GetResult(); //取得识别结果
if(uiRes > 0)
{ switch(uiRes)
{case NAME_ID:
switch(uiBS_Team)
{case 0: PlaySnd(20, 3); break; //第一组的第一个命令(名字)//播放yeah
case 1: ImportFiveCommand(Group1); uiBS_Team=0; reFlag=1;
goto Loop; break; } break; //第二组的第一个命令 (返回)
case Command_One_ID:
switch(uiBS_Team)
{ case 0: ImportFiveCommand(Group2); PlaySnd(17, 3); //第一组的第二个命令(语音)
uiBS_Team=1; goto Loop; break;
case 1: Car_Go(100); break; } break; //第二组的第二个命令(前进)
case Command_Two_ID:
switch(uiBS_Team)
{ case 0: PlaySnd(17, 3); Execute_route();//第一组的第三个命令(寻线)调用循线
ImportFiveCommand(Group1); uiBS_Team = 0; reFlag=1; goto Loop; break;
case 1: Car_Back(200);break; } break; //第二组的第三个命令(后退)
case Command_Three_ID:
switch(uiBS_Team)
{ case 0: Car_LeftBack(400); break; //第一组的第四个命令(左后退)
case 1: Car_TurnLeft(100);break; } break;//第二组的第四个命令(左转)
case Command_Four_ID:
switch(uiBS_Team)
{ case 0:Car_RightBack(400); break; //第一组的第五个命令(右后退)
case 1: Car_TurnRight(100); break; } break; }}//第二组的第五个命令(右转)
uiKey = *P_IOA_Data; uiKey = uiKey&0x0004;
if(uiKey == 0x0004) //检测KEY3键
{ F_FlashErase(0xfd00); //清标志位
while(1); }*P_Watchdog_Clear = 0x0001;}
}
附录2:
循线程序清单:
void Execute_route(void)
{ unsigned int n=1; //标志
unsigned int i=1;
unsigned int uiKey;
BSR_StopRecognizer(); //停止识别器
Initial_route();
CarSystemInit();
pp: while(i)
{ *P_TimerA_Ctrl = 0x0000|0x0000|0x0030; //关闭停止
*P_IOB_Data=0x0000;
uiKey = *P_IOA_Data; //检测KEY2键
uiKey = uiKey&0x0002;
if(uiKey == 0x0002)
{ *P_TimerA_Ctrl = 0x0000|0x0000|0x0030; //关闭停止
*P_IOB_Data=0x0000;
i=0;
n=0; }
if((*P_IOA_Data&0x0030) != 0 )
{ i=0;}
*P_TimerA_Ctrl = 0x02c0|0x0000|0x0030; //设置占空比
*P_TimerA_Data = 0xf100; //设置计数初值
while(n)
{ switch(*P_IOA_Data&0x0030)
{ case 0x0010: se_goright(); break; //左端的传感器没有信号时,向右拐
case 0x0020: se_goleft(); break; //右端的传感器没有信号时向左拐
case 0x0000: goto pp; break; //都没信号时,停车
case 0x0030: se_goahead(); break; }
uiKey = *P_IOA_Data;
uiKey = uiKey&0x0002;
if(uiKey == 0x0002) {n=0;} //检测KEY2
*P_Watchdog_Clear = 0x0001;} //清看门狗
*P_TimerA_Ctrl = 0x0000|0x0000|0x0030; //停车
*P_IOB_Data=0x0000;
*P_Watchdog_Clear = 0x0001; //清看门狗
BSR_InitRecognizer(BSR_MIC);} /初始化识别器
附录3:
超声波避障程序清单:
unsigned int Resoult_ult(unsigned int Counter)
{ unsigned int uiTemp; //实现功能: 超声波避障模块的测距数据处理程序, unsigned long ulTemp; //将TimerB的计数值换算为距离
ulTemp = (unsigned long)Counter*34000;
ulTemp = ulTemp/192000; //除以频率
ulTemp = ulTemp>>1; //除二
uiTemp = (unsigned int)ulTemp;
return uiTemp;}
unsigned int measure_ult(void) //实现功能: 超声波避障模块的检测程序,完成一次检测
{ unsigned int Exit_flag = 1;
unsigned int uiResoult;
unsigned int uiSystem_Clock;
unsigned int uiTemp;
uiSystem_Clock = *P_SystemClock; //将当前的系统时钟设置暂时保存起来
*P_SystemClock = 0x0088; //将系统时钟设置为49MHz,分频比为1,强振模式
uiTemp = *P_IOB_Data;
uiTemp = uiTemp|0x0014;
*P_IOB_Data = uiTemp; //发40KHz波
Delay_ult(SEND_TIMER); //发射时间
uiTemp = *P_IOB_Data; //停止发射
uiTemp = uiTemp&0xffef;
*P_IOB_Data = uiTemp;
*P_TimerB_Data = 0x0000;
*P_TimerB_Ctrl = 0x0001; //TimerB以192KHz的频率计数
while(*P_TimerB_Data *P_INT_Clear = 0x0100; //开中断前先清中断 *P_INT_Ctrl = *P_INT_Ctrl_New|0x0100; *P_INT_Clear = 0xffff; //清除中断发生标志 __asm("IRQ ON"); //打开总中断使能 EXT1_IRQ_flag = 0; //TimerA的溢出中断的标志变量置0 while(Exit_flag) {if(EXT1_IRQ_flag==1) //当该变量在外部中断中被置1时表示接收到了回波 {Exit_flag = 0; //跳出 uiResoult = Counter_buf; //取出时间值 uiResoult = Resoult_ult(Counter_buf); } if(*P_TimerB_Data>1000) //如计数值大于1000,表示超时 { Exit_flag = 0; //跳出 *P_TimerB_Ctrl = 0x0006; // timerB停止计数 uiResoult = 0; } *P_Watchdog_Clear = 0x0001; } //清狗 *P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100); //关掉外部中断 __asm("IRQ OFF"); *P_SystemClock = uiSystem_Clock; //恢复系统时钟的设置 return uiResoult; } //返回测量结果 void EXT1_IRQ_ult(void) //超声波避障模块程序的EXT1中断服务程序,在EXT1的IRQ中断 { Counter_buf = *P_TimerB_Data; //储存timerB数值 *P_TimerB_Ctrl = 0x0006; //timerB停止计数 *P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100); //关掉外部中断 *P_INT_Clear = 0xffff; //清除中断发生标志 EXT1_IRQ_flag = 1; } //通知测距程序,外部中断已发生 void State_ult(void) //实现功能: 超声波避障测距程序 { unsigned int Distance; Initial_ult(); Distance=measure_ult(); if((Distance!=0)&(Distance<=MINI_Distance)) //判断是否小于安全距离 {Obstacles_signs=1; } else{Obstacles_signs=0; } *P_Watchdog_Clear = 0x0001; } 前进程序清单: void Car_Go(unsigned int n) // 实现功能: 前进 { unsigned int i=0; unsigned int k=0; unsigned int j=1; BSR_StopRecognizer(); //停止识别器 for(k;k<4;k++) { State_ult(); if(Obstacles_signs==1) //先检测是否有障碍 { PlaySnd(19,3); i=60000; k=10; j=0; } //语音提示:前面有障碍 *P_Watchdog_Clear = 0x0001; } while(j) { PlaySnd(13,3);j=0; } //语音提示:前进 *P_Watchdog_Clear = 0x0001; for(;i Delay_fun(600); }*P_IOB_Data=0x0004; //停止 BSR_InitRecognizer(BSR_MIC); } //初始化识别器 附录4: 语音训练和语音播放程序清单: unsigned int TrainWord(unsigned int WordID,unsigned int SndIndex) //训练一条命令 { unsigned int uiRes_Train; PlaySnd(SndIndex, 3); while(1) { uiRes_Train = BSR_Train(WordID,BSR_TRAIN_TWICE); if(uiRes_Train == 0) break; switch(uiRes_Train) { case -1: PlaySnd(11, 3); return -1; //没有检测出声音 case -2: PlaySnd(18, 3); break; //需要重新训练一遍 case -3: PlaySnd(14, 3); return -1; //环境太吵 case -4: return -1; //数据库满 case -5: PlaySnd(5, 3);return -1; //检测出声音不同 case -6: PlaySnd(5, 3); return -1; //序号错误 }} return 0; } //============================================================= // 语法格式: 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); //初始化识别器 } 附录5下载本文