挑战杯论文(盲人避障)_第1页
挑战杯论文(盲人避障)_第2页
挑战杯论文(盲人避障)_第3页
挑战杯论文(盲人避障)_第4页
挑战杯论文(盲人避障)_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要在日常生活中,盲人属于弱势群体,行动及其不方便,外出行走时需要用拐杖或类似的代替物,这样既不方便同时存在安全隐患。本系统具有辅助盲人进行避障的功能,利用了HY-SRF05超声波模块进行超声波检测、采用ISD4004语音模块作为语音提示,结合单片机系统实现超声波测距语音报警的功能。文中对超声波测距原理、硬件电路结构和单片机软件系统等进行了论述,还对系统性能进行了可行性分析。本系统具有成本低,可靠性强,较好便携性,安装使用方便等优点,具有人机交互等智能化功能,为广大盲人朋友提供了一种新型的避障辅助器材,具有一定的市场推广空间。关键词:HY-SRF05超声波模块、ISD4004语音模块、单片机系统、智能避障目录TOC\o"1-5"\h\z\o"CurrentDocument"摘要I\o"CurrentDocument"引言1\o"CurrentDocument"超声波测距基本原理1系统硬件设计23.1系统要求2\o"CurrentDocument"3.2系统结构23.3主要器件资料33.4硬件电路8单片机程序设计9\o"CurrentDocument"4.1程序及算法分析94.2程序流程图114.3程序代码12\o"CurrentDocument"Proteus仿真18系统调试206.1实验测试20\o"CurrentDocument"6.2实验数据20\o"CurrentDocument"6.3误差分析与改进21\o"CurrentDocument"市场前景与开发价值22\o"CurrentDocument"参考文献23盲人智能避障系统引言对于正常人来说,也许避开前方的障碍物是很自然的,但是对于盲人来说,这就不是一件容易的事情了。本作品设计了一种帮助盲人躲避障碍物的系统,让盲人的生活变得更加轻松。超声波测距基本原理超声波是指频率高于20khz的机械波。为了以超声波作为检测手段,必须产生超声波和接收超声波。完成这种功能的装置就是超声波传感器,习惯上称为超声波换能器或超声波探头。超声波传感器有发送器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。超声波传感器分机械方式和电气方式两类,它实际上是一种换能器,在发射端它把电能或机械能转换成声能,接收端则反之。本次设计超声波传感器采用电气方式中的压电式超声波换能器,它是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,就成为超声波接收器。在超声波电路中,发射端输出一系列脉冲方波,脉冲宽度越大,输出的个数越多,能量越大,所能测的距离也越远。超声波发射换能器与接收换能器其结构上稍有不同,使用时应分清器件上的标志。超声波测距的方法有多种:如往返时间检测法、相位检测法、声波幅值检测法。本设计采用往返时间检测法测距。其原理是超声波传感器发射一定频率的超声波,借助空气媒质传播,到达测量目标或障碍物后反射回来,经反射后由超声波接收器接收脉冲,其所经历的时间即往返时间,往返时间与超声波传播的路程的远近有关。测试传输时间可以得出距离。假定s(m)为被测物体到测距探头之间的距离,测得的时间为t(m/s),超声波传播速度为(m/s)表示,则有关系式2.1。s-vt/2(2.1)在精度要求较高的情况下,需要考虑温度对超声波传播速度的影响,按式2.2对超声波传播速度加以修正,以减小误差。本设计不进行温度校正,取v=344m/s(20。。)。v-v+0.607T(2.2)式中v——0°C下超声波在介质中的传播速度T——实际温度,单位:。。系统硬件设计3.1系统要求利用单片机、超声波测距模块、Proteus和庇^C51工具设计出距离测量系统,测量结果精确到1cm,制作实物并进行测试。3.2系统结构本系统由HY-SRF05超声波模块、ISD4004语音模块,显示模块和单片机等构成,整个系统由51单片机控制。HY-SRF05超声波模块包含超声波发射电路、超声波接收电路,可通过单片机给其发送启动信号,HY-SRF05超声波模块接受到启动信号发送超声波,最后将测量信号返回给单片机。单片机对测量信号进行处理,通过显示模块显示测量结果,并且一旦测量值小于设定值,语音芯片将播放事先录制好的预警声音信号。显示模块由3位LED共阴数码管及相关电路组成,显示模块主要用于系统调试,调试完成后可将其去掉。系统结构框图如图3.1所示。

图3.1系统结构3.3主要器件资料3.3.1HY-SRF05超声波模块HY-SRF05超声波测距模块可提供2cm~450cm的非接触式距离感测功能,测距精度可高达3mm;模块包括超声波发射器、接收器与控制电路。实物及引脚说明如图3.2和图3.3所示。有的模块并没有OUT口,本设计也没用到。图3.2超声波侧面

rig瘫制端rig瘫制端cho接收端UT开美岸输出端ND公共地VTG

kp2,3p相5.图3.3超声波正面基本工作原理:采用IO口TRIG触发测距,给至少10us的高电平;模块自动发送8个40KHz的方波,自动检测是否有信号返回;有信号返回,通过IO口ECH。输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间(10us~18ms),如果没有检测到反向则输出36ms的高电平。工作时序如图3.4所示。检测距离二(Tx声速)/2(TRIGGER输入大于LOU5的高电平)输入(TRIGGER输入大于LOU5的高电平)输入(INPUT)8个40K乙的方波前一次松测完成至后一次检威开始

必须有10m滓待超声波发射探头输出(OUTPUT)输出(OUTPUT)ECHO输出

10uS-L8mSBt|高电平

电平时间为T如没有检删到有反射

则输出36希高电平3.3.2显示模块主要用于试验阶段的数据显示和分析。显示模块由3位一体的LED数码管、74HC373锁存器和S8550三极管驱动电路构成。数码管结构如图3.5所示。DDPDIG.3反射器R5631DrGJDIG-2CIG.3A曜/示器电路坂DDPDIG.3反射器R5631DrGJDIG-2CIG.3A曜/示器电路坂5631A忘J削G3图3.5显示模块LGE631xx—1minlzw汕LG5631Ax/Bx74HC373锁存器可以让数码管显示更稳定。外部封装如图3.6所示,内部逻辑如图3.7所示,引脚说明见表3.1,真值表见表3.2。VCC。7C7庵Og05DjD4O4LE闵仙n□irrinri111211?11』i[§i]§11■i]孑i[rrnQE0(>DqDi0]02[>2D303GND

图3.674HC373外部封装

图3.7内部逻辑表3.1引脚说明引脚名说明D0~D7数据输入端Q0~Q7数据输出端OE三态允许控制端,低电平有效LE锁存允许端,高电平有效VCC电源,5VGND接地表3.2真值表OEOEDnQnLHHHLHLLLLXQ0HXXZH:高电平L:低电平©LrCo010204l>60?:D00DGo_aGD_QG©LrCo010204l>60?:D00DGo_aGD_QG°4LATCHENABLEfiI。。©©0]。0:输入端准备状态条件建立前已确定的Q端(输出端)电平Z:高阻态驱动电路可以防止单片机IO口驱动能力不足。

本设计采用的是宏晶公司生产的采用DIP40封装形式的STC516RD+芯片,属于51系列的单片机,具有8位数据宽度的CPU,能处理8位二进制数据或代码,32KBytesFlashROM512Bytes片内RAM。晶振频率高达24M。如图3.8所示。T2?P1.0匚140□VDDT2EXdP1.1二239□P0.0.ADOP1.2匚330P&.1hAD1P1.3匚437HP02.AD2P1.4匚53书□PD3AD3P1.5匚635□P04.AD4P1.6匚734□PO.5hAD5P17匚833□PO⑥AD6RST-932□P"AD7RXD?P3.0匚1031瓦TXD,P3.1匚1130□ALEINTO,P3.21229—P3ENIMT1,P3.3、1328□P2.7,A15T0:P3.4匚1427□P2.6hA1JT1dP3,5匚152^□P2.5,A13P3.61625□P2.4hA12RD,P3.7匚V24PZ.3hA11XTAL2匚1823□P2.2hA10XTAL1匚1922□P2.1hA9VSS匚2021□P2.0..A8图3.8单片机引脚图3.3.4ISD4004语音芯片ISD4004系列工作电压3V,单片机录放时间8至16分钟,音质好,适用于移动电话及其他便携式电子产品中。芯片采用CMOS技术,内含振荡器,防混淆滤波器,平滑滤波器,音频放大器,自动静噪及高密度多电平闪烁存储阵列。芯片设计是基于所有操作的必须由微控制器控制,操作命令可通过串口通信协议(SPI或Microwire)送入,芯片采用多电平直接模拟量存储技术,每个采样值直接存储在片内的闪存中,因此可以十分真实自然地再现音乐、语音和效果音,避免了一般固体录音电路因量化和压缩造成的量化噪声和“金属声”。采样频率可为4.0HZ,5.3HZ,6.4HZ,8.0HZ,频率越低,录放音时间越长,而音质则有所下降,片内信息存于闪烁存储器中,可在断电的情况下保存100年,反复录音10万次。3.4硬件电路POWERIN5VD0C——LZ_|―h1^220-POWERIN5VD0C——LZ_|―h1^220-U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6RSTP0.7/AD7P2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12EAP2.5/A13P2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXDP1.2P3.2/INT0P1.3P3.3/INT1P1.4P3.4/T0P1.5P3.5/T1P1.6P3.6/WRW78E058B40DLD3D5U2D1Q1D2Q2D3Q3D4Q4D5Q5D6Q6D7Q7OE74HC3732A,5B6C9D12E15F16G.图3.9硬件电路由于Proteus中没有3位数码管器件,暂且用4位数码管代替。PWRIN1是5V电源接口,HY-SRF05是超声超声波模块接口。器件清单如表3.3。

器件类型器件标号数量值电阻R1,R2,R3,R5410kR41220电容C1,C2230pFC3110uFIC芯片U11W78E058B40DLU2174HC373晶体管Q1,Q2,Q33S8550数码管DSPLED13位一体数码管按键开关K11排阻RP11晶振X1111.0592MHz电源接口PWRIN115V直流电源超声波模块接口HY-SRF0514脚排针4.单片机软件系统设计4.1算法分析整个单片机程序分为主函数、超声波时间测量、距离计算和数码管显示4个部分。主函数用来初始化系统和整体控制,其中包括给超声波测距模块发送启动测量信号。超声波时间测量模块获取所测时间,然后距离计算模块利用获得的所测时间计算出距离,最后显示模块显示测量距离。超声波时间测量模块是通过查询的方式来检测ECHO引脚的电平变化的,通过定时器T0来测量时间。显示模块通过定时器中断的方式实现数码管的扫描显示。测量过程的原理如图4.1所示。初始化时将T0的寄存器TH0和TL0清零,使用12MHz晶振时,则所测时间可通过式4.1.1算得。time=TH0*256+TL0(4.1.1)式中time所测时间,单位:us由之前的式2.1,取v=344m/s,可得所测距离为:s=172*time*10-6*102(cm)(4.1.2)化简得:s=time/58.1(cm)(4.1.3)如果采用11.0592MHz的晶振,由于定时计数器计1个数的时间约为1.085us,因此距离不能通过式4.1.3计算,不然会有较大的误差,这时可通过式4.1.计算。本设计的实物制作时使用的是11.0592MHz的晶振。其他晶振频率也可通过类似计算得到。本设计的测量精度为1cm。s=time/53.6(cm)(414)4.3.1超声波子程序oidceju(){i=0;flag=0;Tx=0;//首先拉低脉冲输入引脚TMOD=0x10;//定时器0,定时器1,16位工作方式IT0=0;//由高电平变低电平,触发外部中断EX0=0;//关闭外部中断EA=1;while(shuju==0){uintdistance_data;ET1=0;Tx=1;delay_20us();Tx=0;〃产生一个20us的脉冲,在Tx引脚while(Rx==0);//等待Rx回波引脚变高电平succeed_flag=0;〃清测量成功标志EX0=1;//打开外部中断TH1=0;//定时器1清零TL1=0;//定时器1清零TF1=0;//TR1=1;//启动定时器1ET1=1;while(TH1<30);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0;//关闭定时器1EX0=0;//关闭外部中断if(succeed_flag==1){distance_data=outcomeH;//测量结果的高8位distance_data<<=8;//放入16位的高8位distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据distance_data*=12;//因为定时器默认为12分频distance_data/=580;//微秒的单位除以58等于厘米}//X秒二(2*Y米)/344二二》X秒=0.0058*Y米二二》厘米二微秒/58if(succeed_flag==0){distance_data=0;//没有回波则清零}distance[i]=distance_data;//将测量结果的数据放入缓冲区i++;if(i==3){uinta,b;ucharCONT_1;distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;pai_xu();distance_data=distance[1];a=distance_data;if(b==a)CONT_1=0;if(b!=a)CONT_1++;if(CONT_1>=3){CONT_1=0;b=a;shuju=a;conversion(b);}i=0;}}}4.3.2录音子程序voidsetkey_treat(void){set_key=1;//置IO口为1,准备读入数据DelayUs(1);if(set_key==0){DelayMs(5);〃延5ms去抖if(set_key==0){if(flag3==0)//录音键和放音键互锁,录音好后,禁止再次录音。如果要再次录音,那就要复位单片机,重新开始录音{if(count==0)//判断是否为上电或复位以来第一次按录音键{st_add=170;}else{st_add=end_add+3;}//每段语言间隔3个地址adds[count]=st_add;//每段语音的起始地址暂时if(count>=25)//判断语音段数时候超过25段,因为单片机内存的关系?//本程序只录音25段,如果要录更多的语音,改为不可查询的即可{//如果超过25段,则覆盖之前的语音,从新开始录音count=0;st_add=170;time_total=340;}isd_powerup();//AN键按下,ISD上电并延迟50msisd_stopwrdn();isd_powerup();LED1=1;//录音指示灯亮,表示录音模式isd_setrec(st_add&0x00ff,st_add>>8);//从指定的地址if(INT==1)//判定芯片有没有溢出{isd_rec();//发送录音指令}time_total=st_add*2;//计时初始值计算TR0=1;//开计时器while(set_key==0);//等待本次录音结束TR0=0;//录音结束后停止计时isd_stop();//发送4004停止命令end_add=time_total/2+2;//计算语音的结束地址adde[count]=end_add;//本段语音结束地址暂存LED1=0;//录音完毕,LED熄灭count++;//录音段数自加count_flag=count;//录音段数寄存flag2=1;flag4=1;//解锁放音键}}}}4.3.3放音子程序voidupkey_treat(void){//ucharovflog;AN=1;//准备读入数据DelayUs(1);if(AN==0)//判断放音键是否动作{DelayMs(5);//延5ms去抖if(AN==0)if(flag4==1)//互锁录音键{if(flag2==1)//判断是否为录音好后的第一次放音{count=0;//从第0段开始播放}isd_powerup();//AN键按下,ISD上电并延迟50msisd_stopwrdn();isd_powerup();st_add=adds[count];//送当前语音的起始地址isd_setplay(st_add&0x00ff,st_add>>8);//发送setplay指令,从指定地址开始放音isd_play();//发送放音指令DelayUs(20);while(INT==1);//等待放音完毕的EOM中断信号isd_stop();//放音完毕,发送stop指令while(AN==0);//isd_stop();count++;//语音段数自加flag2=0;flag3=1;if(count>=count_flag)//如果播放到最后一段后还按加键,则从第一段重新播放{count=0;}}}5.Proteus仿真Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件,它不仅具有其它EDAX具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和1^?430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。其中ProteusISIS用于原理图输入和电路仿真,ProteusARES用于PCB设计。由于ProteusISIS中没有HY-SRF05超声波模块器件,并不能做完整的仿真,但也可以初步验证一下系统的功能是否正确,对设计的正确性做出分析,及早发现错误。在Proteus中可以验证单片机发送的启动HY-SRF05超声波模块的信号是正确,和测量时序是否正确。由于电源接口PWRIN1和HY-SRF05超声波接口HY-SRF05是自定义的元件,Proteus中并没有对应的仿真模型,因此并不能对电路进行仿真。这里将它们都变成子系统,分别在这两元件上点击右键,并选择“EditComponent”,进入“EditComponent”界面(或用快捷键Ctrl+E),在底下的复选项的“Attachhierarchymodule”前打勾,这样就将元件转换为子系统了。仿真结果如图5.1所示。图5.2是TRIG引脚和ECHO引脚的电压波形。ECHO持续1ms高电平,理论计算的距离为17.2cm,精确到1cm则是17cm,仿真结果正确,由TRIG引脚和ECHO引脚的电压波形可知,测量时序是正确的,可见系统的功能是正常的。W78E058B40DLVCC1・-1UlXTAL1P0.0/AD0XTAL2P0.1/AD1P0.2/AD2P0.3/AD3RSTP0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9PSENP2.2/A10P2.3/A11ALEP2.4/A12EAP2.5/A13P1.0P2.6/A14P2.7/A15P3.0/RXDP1.1P3.1/TXDP1.2P3.2/INT0P1.3P3.3/INT1P1.4P3.4/T0P1.5P3.5/T1P1.6P3.6/WR■39D02>■38D13"■37D24.■36D35.■35D46..34D57.■33D68"D0Q0D1Q1D2Q2D3Q3D4Q4D5Q5D6Q6D7Q7OE74HC373■2A—■5B,■6C,■9D■12E■15F■■16G图5.1硬件原理图CHY-SRF05图5.2波形图GNDECHOTRIGVCC图6.1图6.1系统调试6.1实验测试完成软件开发,系统仿真和硬件电路设计之后,成品图如图6.1所示。6.2实验数据在室内测试所获得的一些实验数据如表6.1所示,预警值为50cm,。表6.1实验数据系统测量值(cm)实测值(cm)报警2019否3031否4041否6060是7072是8083是6.3误差分析与改进由实验数据可知,在100cm的测量范围以内,误差在7%以内,测量的距离越大,误差也越大。误差的来源主要有以下各个方面:(1)声速引起的误差。声波传输速度与媒介的弹性模量和密度相关,因此,利用声速测量距离,就要考虑这些因素对声速影响。在气体中,压强、温度、湿度等因素会引起密度变化,气体中声速主要受密度影响,液体的深度、温度等因素会引起密度变化,固体中弹性模量对声速影响较密度影响更大,一般超声波在固体中传播速度最快,液体次之,在气体中的传播速度最慢。气体中声速受温度的影响最大。要减少这类误差可以增加相应的补偿电路,或进行软件补偿。(2)反射问题。如果被探测物体始终在合适的角度,那超声波传感器将会获得正确的角度。但是不幸的是,在实际使用中,很少被探测物体是能被正确的检测的。如图6.2所示。图6.2a情况叫三角误差,当被测物体与传感器成一定角度的时候,所探测的距离和实际距离有个三角误差。图6.2b叫镜面反射在特定的角度下,发出的声波被光滑的物体镜面反射出去,因此无法产生回波,也就无法产生距离读数,这时超声波传感器会忽视这个物体的存在。图6.2c中的情况叫做多次反射。这种现象在探测墙角或者类似结构的物体时比较常见。声波经过多次反弹才被传感器接收到,因此实际的探测值并不是真实的距离值。这类误差通过多点测量能进行一定程度的改善,对测量探头的方向性要求较高。(3)噪声影响。虽然多数超声波传感器的工作频率为40-45Khz,远远高于人类能够听到的频率。但是周围环境也会产生类似频率的噪音。比如,电机在转动过程会产生一定的高频,轮子在比较硬的地面上的摩擦所产生的高频噪音。这个问题可以通过对发射的超声波进行编码来解决,比如发射一组长短不同的音波,只有当探测头检测到相同组合的音波的时候,才进行距离计算。这样可以有效的避免由于环境噪音所引起的误读。(4)单片机时间分辨率的影响。不管是查询发射波与回波,还是由其触发单片机中断再通过软件启停定时器,都需要一定的时候,中断的方式误差相对要小一些。相对而言,单片机的时间分辨率还是不太高,如晶振频率为12MHz时,时间分辨率为1s。由于测量过程中的随机误差是按统计规律变化的,为了减少其影响,可在同一位置处多次重复测量,然后取平均值。(5)单片机计算误差。以本次设计为例,存放结果的变量是无符号整型,势必存在截短误差。这类误差地通过改用精度更大的数据类型改善。市场前景与开发价值由于使用本产品便携性好,成本低,可靠性强,同时可以节省较多的能源及较多的时间,具有广阔的市场空间。据统计,目前我国的盲人为300万个。假如有三分之一的人使用本产品,约有100万可能使用本产品。产品按照推广价格每套300元计算,利润按毛利(含税)20%计算,销售额约为3亿元,毛利约为6000万元。参考文献杨素行主编.模拟电子技术基础简明教程.3版.北京:高等教育出版,2006.5陈忠平编著.基于Proteus的51系列单片机设计与仿真.2版.北京:电子工业出版社,2012.5赵建领等编著.51系列单片机开发宝典.2版.北京:电子工业出版社,2012.2周润景等编著.基于PROTEUS的电路及单片机系统设计与仿真.北京:北京航空航天大学出版社,2006.5苏炜,龚壁建,潘笑.超声波测距误差分析.传感器技术.2004,23(6):8-11附件:程序#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint〃录音和放音键IO口定义:sbitAN=P3"4;//放音键控制接口sbitset_key=P3"5;//录音键控制口//录音和放音键IO口定义:sbitTx=P3"3;//产生脉冲引脚sbitRx=P3";〃回波引脚//ISD4004控制口定义:sbitSS二PE;//4004片选sbitMOSI二P1\;//4004数据输入sbitMISO=P1";//4004数据输出sbitSCLK=P1"3;//ISD4004时钟sbitINT=P1"4;//4004中断sbitLED1=P1"6;//录音指示灯#defineLCM_DataP0//LCD1602数据接口sbitLCM_RW=P2、;//读写控制输入端,LCD1602的第五脚sbitLCM_RS=P2P;//寄存器选择输入端,LCD1602的第四脚sbitLCM_E=P2";//使能信号输入端,LCD1602的第6脚voidDelayUs(uintus);//微妙延时程序voidDelayMs(uintMs);//毫秒延时程序voidinit_t0();//定时器0初始化函数voidsetkey_treat(void);//录音键处理程序voidupkey_treat(void);//播放键处理程序voiddisplay();//显示处理程序voidisd_setrec(ucharadl,ucharadh);//发送setrec指令voidisd_rec();//发送rec指令voidisd_stop();//stop指令(停止当前操作)voidisd_powerup();//发送上电指令voidisd_stopwrdn();//发送掉电指令voidisd_send(ucharisdx);//spi串行发送子程序,8位数据voidisd_setplay(ucharadl,ucharadh);voidisd_play();voidfayin();〃程序中的一些常量定义uinttime_total,st_add,end_add=0;uintadds[5];//5段语音的起始地址暂存uintadde[5];//5段语音的结束地址暂时uchart0_crycle,count,count_flag,flag2,flag3,flag4;ucharsecond_count=170,msecond_count=0;////////////////////////////////////////////uintdistance[4];//测距接收缓冲区ucharge,shi,bai,temp,flag,outcomeH,outcomeL,i,shuju;//自定义寄存器bitsucceed_flag;//测量成功标志voiddelay_20us(){ucharbt;for(bt=0;bt<60;bt++);voidconversion(uinttemp_data){ucharge_data,shi_data,bai_data;bai_data=temp_data/100;temp_data=temp_data%100;〃取余运算shi_data=temp_data/10;temp_data=temp_data%10;〃取余运算ge_data=temp_data;ET1=0;EX0=0;bai=bai_data;shi=shi_data;ge=ge_data;ET1=1;EX0=1;}//*********************************************************voidpai_xu(){uintt;if(distance[0]>distance[1]){t=distance[0];distance[0]=distance[1];distance[1]=t;}if(distance[0]>distance[2])t=distance[2];distance[2]=distance[0];distance[0]=t;}if(distance[1]>distance[2]){t=distance[1];distance[1]=distance[2];distance[2]=t;}}voidceju(){i=0;flag=0;Tx=0;//首先拉低脉冲输入引脚TMOD=0x10;//定时器0,定时器1,16位工作方式IT0=0;//由高电平变低电平,触发外部中断EX0=0;//关闭外部中断EA=1;while(shuju==0){uintdistance_data;ET1=0;Tx=1;delay_20us();Tx=0;〃产生一个20us的脉冲,在Tx引脚while(Rx==0);//等待Rx回波引脚变高电平succeed_flag=0;〃清测量成功标志EX0=1;//打开外部中断TH1=0;//定时器1清零TL1=0;//定时器1清零TF1=0;//TR1=1;//启动定时器1ET1=1;while(TH1<30);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0;//关闭定时器1EX0=0;//关闭外部中断if(succeed_flag==1){distance_data=outcomeH;//测量结果的高8位distance_data<<=8;//放入16位的高8位distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据distance_data*=12;//因为定时器默认为12分频distance_data/=580;//微秒的单位除以58等于厘米}//为什么除以58等于厘米,Y米二(X秒*344)/2//X秒二(2*Y米)/344二二》X秒=0.0058*Y米二二》厘米二微秒/58if(succeed_flag==0){//没有回波distance_data=0;则清零}//没有回波distance[i]=distance_data;//将测量结果的数据放入缓冲区i++;if(i==3){uinta,b;ucharCONT_1;distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;pai_xu();distance_data=distance[1];a=distance_data;if(b==a)CONT_1=0;if(b!=a)CONT_1++;if(CONT_1>=3){CONT_1=0;b=a;shuju=a;conversion(b);}i=0;}}/*=========================================================主程序=============================================================================*/voidmain(void){LED1=0;//灭录音指示灯flag3=0;flag4=0;time_total=340;//录音地址从170开始,对应的单片机开始计时的时间就是340*0.1秒adds[0]=170;count=0;//LCMInit();//1602初始化init_t0();//定时器初始化EA=1;while(set_key==1);setkey_treat();//录音键处理while(1){upkey_treat();//放音键处理ceju();while(shuju<50){fayin();break;}//display();//显示处理shuju=0;}}〃外部中断0,用做判断回波电平voidINTO_()interrupt0//外部中断是0号{outcomeH=TH1;〃取出定时器的值outcomeL=TL1;〃取出定时器的值succeed_flag=1;//至成功测量的标志EX0=0;//关闭外部中断}//定时器0中断程序voidtimer0()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0_crycle++;if(t0_crycle==2)//0.1秒{t0_crycle=0;time_total++;msecond_count++;if(msecond_count==10)//1秒{msecond_count=0;second_count++;if(second_count==60){second_count=0;}}if(time_total==4800)time_total=0;}}//定时器0初始化函数voidinit_t0(){TMOD=0x01;//设定定时器工作方式1,定时器定时50毫秒TH0=(65536-50000)/256;TL0=(65536-50000)%256;//EA=1;ET0=1;//允许定时器0中断t0_crycle=0;//定时器中断次数计数单元}//录音键处理程序从指定地址开始录音的程序就是在这段里面voidsetkey_treat(void){set_key=1;//置IO口为1,准备读入数据DelayUs(1);if(set_key==0){DelayMs(5);〃延5ms去抖if(set_key==0){if(flag3==0)//录音键和放音键互锁,录音好后,禁止再次录音。如果要再次录音,那就要复位单片机,重新开始录音if(count==0)//判断是否为上电或复位以来第一次按录音键{st_add=170;}else{st_add=end_add+3;}//每段语言间隔3个地址adds[count]=st_add;//每段语音的起始地址暂时if(count>=25)//判断语音段数时候超过25段,因为单片机内存的关系?//本程序只录音25段,如果要录更多的语音,改为不可查询的即可{//如果超过25段,则覆盖之前的语音,从新开始录音count=0;st_add=170;time_total=340;}isd_powerup();//AN键按下,ISD上电并延迟50msisd_stopwrdn();isd_powerup();LED1=1;//录音指示灯亮,表示录音模式isd_setrec(st_add&0x00ff,st_add>>8);//从指定的地址if(INT==1)//判定芯片有没有溢出{isd_rec();//发送录音指令time_total=st_add*2;//计时初始值计算TR0=1;//开计时器while(set_key==0);//等待本次录音结束TR0=0;//录音结束后停止计时isd_stop();//发送4004停止命令end_add=time_total/2+2;//计算语音的结束地址adde[count]=end_add;//本段语音结束地址暂存LED1=0;//录音完毕,LED熄灭count++;//录音段数自加count_flag=count;//录音段数寄存flag2=1;flag4=1;//解锁放音键}}}}//放音机处理程序从指定地址开始放本段语音就是这段程序voidupkey_treat(void){//ucharovflog;AN=1;//准备读入数据DelayUs(1);if(AN==0)//判断放音键是否动作{DelayMs(5);//延5ms去抖if(AN==0){if(flag4==1)//互锁录音键{if(flag2==1)//判断是否为录音好后的第一次放音{count=0;//从第0段开始播放}isd_powerup();//AN键按下,ISD上电并延迟50msisd_stopwrdn();isd_powerup();st_add=adds[count];//送当前语音的起始地址isd_setplay(st_add&0x00ff,st_add>>8);//发送setplay指令,从指定地址开始放音isd_play();//发送放音指令DelayUs(20);while(INT==1);//等待放音完毕的EOM中断信号isd_stop();//放音完毕,发

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论