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

下载本文档

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

文档简介

1、在日常生活中,盲人属于弱势群体,行动及其不方便,外出行走时需要用拐杖或类似的代替物,这样既不方便同时存在安全隐患。本系统具有辅助盲人进行避障的功能,利用了HY-SRF05超声波模块进行超声波检测、采用ISD4004语音模块作为语音提示,结合单片机系统实现超声波测距语音报警的功能。文中对超声波测距原理、硬件电路结构和单片机软件系统等进行了论述,还对系统性能进行了可行性分析。本系统具有成本低,可靠性强,较好便携性,安装使用方便等优点,具有人机交互等智能化功能,为广大盲人朋友提供了一种新型的避障辅助器材,具有一定的市场推广空间。关键词:HY-SRF05超声波模块、ISD4004语音模块、单片机系统、

2、智能避障目录摘要11. 引言22. 超声波测距基本原理23. 系统硬件设计3系统要求3系统结构3主要器件资料4 硬件电路84.单片机程序设计9程序及算法分析9程序流程图11程序代码12oteus仿真186.系统调试206.1实验测试206.2实验数据206.3误差分析与改进217.市场前景与开发价值228.参考文献23盲人智能避障系统1. 引言对于正常人来说,也许避开前方的障碍物是很自然的,但是对于盲人来说,这就不是一件容易的事情了。本作品设计了一种帮助盲人躲避障碍物的系统,让盲人的生活变得更加轻松。2. 超声波测距基本原理超声波是指频率高于20khz的机械波。为了以超声波作为检测手段,必须产

3、生超声波和接收超声波。完成这种功能的装置就是超声波传感器,习惯上称为超声波换能器或超声波探头。超声波传感器有发送器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。超声波传感器分机械方式和电气方式两类,它实际上是一种换能器,在发射端它把电能或机械能转换成声能,接收端则反之。本次设计超声波传感器采用电气方式中的压电式超声波换能器,它是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能

4、转换为电信号,就成为超声波接收器。在超声波电路中,发射端输出一系列脉冲方波,脉冲宽度越大,输出的个数越多,能量越大,所能测的距离也越远。超声波发射换能器与接收换能器其结构上稍有不同,使用时应分清器件上的标志。超声波测距的方法有多种:如往返时间检测法、相位检测法、声波幅值检测法。本设计采用往返时间检测法测距。其原理是超声波传感器发射一定频率的超声波,借助空气媒质传播,到达测量目标或障碍物后反射回来,经反射后由超声波接收器接收脉冲,其所经历的时间即往返时间,往返时间与超声波传播的路程的远近有关。测试传输时间可以得出距离。假定s(m)为被测物体到测距探头之间的距离,测得的时间为t(m/s),超声波传

5、播速度为(m/s)表示,则有关系式2.1。()在精度要求较高的情况下,需要考虑温度对超声波传播速度的影响,按式2.2对超声波传播速度加以修正,以减小误差。本设计不进行温度校正,取v=344m/s()。 (2.2)式中0下超声波在介质中的传播速度实际温度,单位:3. 系统硬件设计3.1 系统要求利用单片机、超声波测距模块、Proteus和Keil C51工具设计出距离测量系统,测量结果精确到1cm,制作实物并进行测试。3.2 系统结构本系统由HY-SRF05超声波模块、ISD4004语音模块,显示模块和单片机等构成,整个系统由51单片机控制。HY-SRF05超声波模块包含超声波发射电路、超声波接

6、收电路,可通过单片机给其发送启动信号,HY-SRF05超声波模块接受到启动信号发送超声波,最后将测量信号返回给单片机。单片机对测量信号进行处理,通过显示模块显示测量结果,并且一旦测量值小于设定值,语音芯片将播放事先录制好的预警声音信号。显示模块由3位LED共阴数码管及相关电路组成,显示模块主要用于系统调试,调试完成后可将其去掉。系统结构框图如图所示。显示模块复位电路AT89C51晶振电路HY-SRF05超声波模块语音模块3.3 主要器件资料3.3.1 HY-SRF05超声波模块HY-SRF05超声波测距模块可提供2cm450cm的非接触式距离感测功能,测距精度可高达3mm3.3所示。有的模块并

7、没有OUT口,本设计也没用到。图超声波侧面图3.3超声波正面基本工作原理:(1)采用IO口TRIG触发测距,给至少10us的高电平;(2)模块自动发送8个40KHz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间(10us18ms),如果没有检测到反向则输出36ms的高电平。工作时序如图3.4所示。图 3.4工作时序3.3.2 显示模块 主要用于试验阶段的数据显示和分析。显示模块由3位一体的LED数码管、74HC373锁存器和S8550三极管驱动电路构成。数码管结构如图3.5所示。图3.5显示模块74HC373锁存

8、器可以让数码管显示更稳定。外部封装如图3.6所示,内部逻辑如图3.7所示,引脚说明见表3.1,真值表见表3.2。图3.6 74HC373外部封装图3.7 内部逻辑表3.1 引脚说明引脚名说明D0 D7数据输入端Q0 Q7数据输出端三态允许控制端,低电平有效LE锁存允许端,高电平有效VCC电源,5VGND接地表真值表OEDnQnLHHHLHLLLLXQ0HXXZH:高电平L:低电平Q0:输入端准备状态条件建立前已确定的Q端(输出端)电平Z:高阻态驱动电路可以防止单片机IO口驱动能力不足。3.3.3 单片机本设计采用的是宏晶公司生产的采用DIP40封装形式的STC516RD+芯片,属于51系列的单

9、片机,具有8位数据宽度的CPU,能处理8位二进制数据或代码,32K Bytes Flash ROM,512Bytes 片内RAM。晶振频率高达24M。如图3.8所示。图3.8 单片机引脚图3.3.4 ISD4004语音芯片ISD4004系列工作电压3V,单片机录放时间8至16分钟,音质好,适用于移动电话及其他便携式电子产品中。芯片采用CMOS技术,内含振荡器,防混淆滤波器,平滑滤波器,音频放大器,自动静噪及高密度多电平闪烁存储阵列。芯片设计是基于所有操作的必须由微控制器控制,操作命令可通过串口通信协议(SPI或Microwire)送入,芯片采用多电平直接模拟量存储技术,每个采样值直接存储在片内

10、的闪存中,因此可以十分真实自然地再现音乐、语音和效果音,避免了一般固体录音电路因量化和压缩造成的量化噪声和“金属声”。采样频率可为4.0HZ,5.3HZ,6.4HZ,8.0HZ,频率越低,录放音时间越长,而音质则有所下降,片内信息存于闪烁存储器中,可在断电的情况下保存100年,反复录音10万次。3.4 硬件电路图3.9 硬件电路由于Proteus中没有3位数码管器件,暂且用4位数码管代替。PWRIN1是5V电源接口,HY-SRF05是超声超声波模块接口。器件清单如表3.3。表3.3 器件清单器件类型器件标号数量值电阻R1,R2,R3,R5410kR41220电容C1,C2230pFC3110u

11、FIC芯片U11W78E058B40DLU2174HC373晶体管Q1,Q2,Q33S8550数码管DSPLED13位一体数码管按键开关K11排阻RP11晶振X11电源接口PWRIN115V直流电源超声波模块接口HY-SRF0514脚排针4.单片机软件系统设计4.1算法分析整个单片机程序分为主函数、超声波时间测量、距离计算和数码管显示4个部分。主函数用来初始化系统和整体控制,其中包括给超声波测距模块发送启动测量信号。超声波时间测量模块获取所测时间,然后距离计算模块利用获得的所测时间计算出距离,最后显示模块显示测量距离。超声波时间测量模块是通过查询的方式来检测ECHO引脚的电平变化的,通过定时器

12、T0来测量时间。显示模块通过定时器中断的方式实现数码管的扫描显示。测量过程的原理如图所示。初始化时将T0的寄存器TH0和TL0清零,使用12MHz晶振时,则所测时间可通过式算得。 ()式中所测时间,单位:us由之前的式2.1,取v=344m/s,可得所测距离为: ()化简得: ()如果采用11.0592MHz的晶振,由于定时计数器计1个数的时间约为1.085us,因此距离不能通过式计算,不然会有较大的误差,这时可通过式4.1.计算。本设计的实物制作时使用的是11.0592MHz的晶振。其他晶振频率也可通过类似计算得到。本设计的测量精度为1cm。()图测量原理图4.2程序流程图显示结果结束距离是

13、否小于预警值报警停止计时,并打开T1中断进行显示计算距离令溢出标志flag=1,变量echo=0T0是否溢出出?echo=0?发射超声波开始关闭T1中断,启动超声波模块定时器T0、T1初始化,打开T0和总中断是否发射完毕(ECHO为高电平)?停止发射启动计时模块 Y N YY4.3子程序代码oid ceju() i=0; flag=0;Tx=0; /首先拉低脉冲输入引脚TMOD=0x10; /定时器0,定时器1,16位工作方式 IT0=0; /由高电平变低电平,触发外部中断EX0=0; /关闭外部中断EA=1; while(shuju=0)uint distance_data;ET1=0; T

14、x=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; /启动定时器1 ET1=1; while(TH1 <30);/等待测量的结果,周期65.535毫秒(可用中断实现) TR1=0; /关闭定时器1 EX0=0; /关闭外部中断 if(succeed_flag=1) distance_data=outcomeH; /测量结果的高8位

15、 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米 =厘米=微秒/58 if(succeed_flag=0) distance_data=0; /没有回波则清零 distancei=distance_data; /将测量结果的数据放入缓冲区 i+; if(i=3) uin

16、t a,b; uchar CONT_1;distance_data=(distance0+distance1+distance2+distance3)/4; pai_xu(); distance_data=distance1; 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; 子程序void setkey_treat(void) set_key=1;/置IO口为1,准备读入数据 DelayUs(1); if(set_ke

17、y=0) DelayMs(5);/延5ms去抖 if(set_key=0) if(flag3=0)/录音键和放音键互锁,录音好后,禁止再次录音。如果要再次录音,那就要复位单片机,重新开始录音 if(count=0)/判断是否为上电或复位以来第一次按录音键 st_add=170; else st_add=end_add+3; /每段语言间隔3个地址 addscount=st_add;/每段语音的起始地址暂时 if(count>=25)/判断语音段数时候超过25段,因为单片机内存的关系? /本程序只录音25段,如果要录更多的语音,改为不可查询的即可 /如果超过25段,则覆盖之前的语音,从新开

18、始录音 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;/录音结

19、束后停止计时 isd_stop(); /发送4004停止命令 end_add=time_total/2+2;/计算语音的结束地址 addecount=end_add;/本段语音结束地址暂存 LED1=0; /录音完毕,LED熄灭 count+;/录音段数自加 count_flag=count;/录音段数寄存 flag2=1; flag4=1;/解锁放音键 void upkey_treat(void)/ uchar ovflog; AN=1;/准备读入数据 DelayUs(1); if(AN=0)/判断放音键是否动作 DelayMs(5);/延5ms去抖 if(AN=0) if(flag4=1)

20、/互锁录音键 if(flag2=1)/判断是否为录音好后的第一次放音 count=0;/从第0段开始播放 isd_powerup(); /AN键按下,ISD上电并延迟50msisd_stopwrdn();isd_powerup(); st_add=addscount;/送当前语音的起始地址 isd_setplay(st_add&0x00ff,st_add>>8); /发送setplay指令,从指定地址开始放音isd_play(); /发送放音指令DelayUs(20);while(INT=1); /等待放音完毕的EOM中断信号isd_stop(); /放音完毕,发送stop

21、指令while(AN=0); / isd_stop(); count+;/语音段数自加 flag2=0; flag3=1; if(count>=count_flag)/如果播放到最后一段后还按加键,则从第一段重新播放 count=0; 5.Proteus仿真Proteus软件是英国Labcenter electronics公司出版的EDA工具软件,它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件

22、、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。其中Proteus ISIS用于原理图输入和电路仿真,Proteus ARES用于PCB设计。由于Proteus ISIS中没有HY-SRF05超声波模块器件,并不能做完整的仿真,但也可以初步验证一下系统的功能是否正确,对设计的正确性做出分析,及早发现错误。在Prote

23、us中可以验证单片机发送的启动HY-SRF05超声波模块的信号是正确,和测量时序是否正确。由于电源接口PWRIN1和HY-SRF05超声波接口HY-SRF05是自定义的元件,Proteus中并没有对应的仿真模型,因此并不能对电路进行仿真。这里将它们都变成子系统,分别在这两元件上点击右键,并选择“Edit Component”,进入“Edit Component”界面(或用快捷键Ctrl+E),在底下的复选项的“Attach hierarchy module”前打勾,这样就将元件转换为子系统了。仿真结果如图5.1所示。图5.2是TRIG引脚和ECHO引脚的电压波形。ECHO持续1ms高电平,理论

24、计算的距离为,精确到1cm则是17cm,仿真结果正确,由TRIG引脚和ECHO引脚的电压波形可知,测量时序是正确的,可见系统的功能是正常的。图5.1硬件原理图图5.2 波形图6.系统调试6.1实验测试完成软件开发,系统仿真和硬件电路设计之后,成品图如图6.1所示。图 6.16.2实验数据在室内测试所获得的一些实验数据如表6.1所示,预警值为50cm,。表6.1 实验数据系统测量值(cm)实测值(cm)报警2019否3031否4041否6060是7072是8083是6.3误差分析与改进由实验数据可知,在100cm的测量范围以内,误差在7%以内,测量的距离越大,误差也越大。误差的来源主要有以下各个

25、方面:(1)声速引起的误差。声波传输速度与媒介的弹性模量和密度相关,因此,利用声速测量距离,就要考虑这些因素对声速影响。在气体中,压强、温度、湿度等因素会引起密度变化,气体中声速主要受密度影响,液体的深度、温度等因素会引起密度变化,固体中弹性模量对声速影响较密度影响更大,一般超声波在固体中传播速度最快,液体次之,在气体中的传播速度最慢。气体中声速受温度的影响最大。要减少这类误差可以增加相应的补偿电路,或进行软件补偿。(2)反射问题。如果被探测物体始终在合适的角度,那超声波传感器将会获得正确的角度。但是不幸的是,在实际使用中,很少被探测物体是能被正确的检测的。如图6.2所示。图6.2 a情况叫三

26、角误差,当被测物体与传感器成一定角度的时候,所探测的距离和实际距离有个三角误差。图6.2 b叫镜面反射在特定的角度下,发出的声波被光滑的物体镜面反射出去,因此无法产生回波,也就无法产生距离读数,这时超声波传感器会忽视这个物体的存在。图6.2 c中的情况叫做多次反射。这种现象在探测墙角或者类似结构的物体时比较常见。声波经过多次反弹才被传感器接收到,因此实际的探测值并不是真实的距离值。这类误差通过多点测量能进行一定程度的改善,对测量探头的方向性要求较高。图6.2(3)噪声影响。虽然多数超声波传感器的工作频率为40-45Khz,远远高于人类能够听到的频率。但是周围环境也会产生类似频率的噪音。比如,电

27、机在转动过程会产生一定的高频,轮子在比较硬的地面上的摩擦所产生的高频噪音。这个问题可以通过对发射的超声波进行编码来解决,比如发射一组长短不同的音波,只有当探测头检测到相同组合的音波的时候,才进行距离计算。这样可以有效的避免由于环境噪音所引起的误读。(4)单片机时间分辨率的影响。不管是查询发射波与回波,还是由其触发单片机中断再通过软件启停定时器,都需要一定的时候,中断的方式误差相对要小一些。相对而言,单片机的时间分辨率还是不太高,如晶振频率为12MHz时,时间分辨率为1µs。由于测量过程中的随机误差是按统计规律变化的,为了减少其影响,可在同一位置处多次重复测量,然后取平均值。(5)单片

28、机计算误差。以本次设计为例,存放结果的变量是无符号整型,势必存在截短误差。这类误差地通过改用精度更大的数据类型改善。7.市场前景与开发价值由于使用本产品便携性好,成本低,可靠性强,同时可以节省较多的能源及较多的时间,具有广阔的市场空间。据统计,目前我国的盲人为300万个。假如有三分之一的人使用本产品,约有100万可能使用本产品。产品按照推广价格每套300元计算,利润按毛利(含税)20%计算,销售额约为3亿元,毛利约为6000万元。8.参考文献1 杨素行主编.模拟电子技术基础简明教程.3版.北京:高等教育出版,4 5 苏炜,龚壁建,潘笑.超声波测距误差分析.传感器技术.2004,23(6):8-

29、11附件:程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/录音和放音键IO口定义:sbit AN=P34;/放音键控制接口sbit set_key=P35;/录音键控制口/录音和放音键IO口定义:sbit Tx = P33; /产生脉冲引脚sbit Rx = P32; /回波引脚/ ISD4004控制口定义:sbit SS =P10; /4004片选sbit MOSI=P11; /4004数据输入sbit MISO=P12; /400

30、4数据输出sbit SCLK=P13; /ISD4004时钟sbit INT =P14; /4004中断sbit LED1 =P16;/录音指示灯#define LCM_Data P0 /LCD1602数据接口sbit LCM_RW = P21; /读写控制输入端,LCD1602的第五脚sbit LCM_RS = P20; /寄存器选择输入端,LCD1602的第四脚sbit LCM_E = P22; /使能信号输入端,LCD1602的第6脚void DelayUs(uint us); /微妙延时程序void DelayMs(uint Ms);/毫秒延时程序void init_t0();/定时器

31、0初始化函数void setkey_treat(void);/录音键处理程序void upkey_treat(void);/播放键处理程序void display();/显示处理程序void isd_setrec(uchar adl,uchar adh);/发送setrec指令void isd_rec();/发送rec指令void isd_stop();/stop指令(停止当前操作)void isd_powerup();/发送上电指令void isd_stopwrdn();/发送掉电指令void isd_send(uchar isdx);/spi串行发送子程序,8位数据void isd_set

32、play(uchar adl,uchar adh);void isd_play();void fayin();/程序中的一些常量定义uint time_total,st_add,end_add=0;uint adds5;/5段语音的起始地址暂存uint adde5;/5段语音的结束地址暂时uchar t0_crycle,count,count_flag,flag2,flag3,flag4;uchar second_count=170,msecond_count=0;/uint distance4; /测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outc

33、omeL,i,shuju; /自定义寄存器bit succeed_flag; /测量成功标志void delay_20us()uchar bt ; for(bt=0;bt<60;bt+);void conversion(uint temp_data) uchar ge_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;EX

34、0=0; bai = bai_data; shi = shi_data; ge = ge_data ; ET1=1;EX0=1;/*void pai_xu()uint t; if(distance0>distance1) t=distance0;distance0=distance1;distance1=t; if(distance0>distance2) t=distance2;distance2=distance0;distance0=t; if(distance1>distance2) t=distance1;distance1=distance2;distance2=

35、t; void ceju() i=0; flag=0;Tx=0; /首先拉低脉冲输入引脚TMOD=0x10; /定时器0,定时器1,16位工作方式 IT0=0; /由高电平变低电平,触发外部中断EX0=0; /关闭外部中断EA=1; while(shuju=0)uint distance_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清零 T

36、F1=0; / TR1=1; /启动定时器1 ET1=1; while(TH1 <30);/等待测量的结果,周期65.535毫秒(可用中断实现) TR1=0; /关闭定时器1 EX0=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

37、; /微秒的单位除以58等于厘米 /为什么除以58等于厘米, Y米=(X秒*344)/2 / X秒=( 2*Y米)/344 =X秒=0.0058*Y米 =厘米=微秒/58 if(succeed_flag=0) distance_data=0; /没有回波则清零 distancei=distance_data; /将测量结果的数据放入缓冲区 i+; if(i=3) uint a,b; uchar CONT_1;distance_data=(distance0+distance1+distance2+distance3)/4; pai_xu(); distance_data=distance1;

38、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; /*= 主程序=*/void main(void) LED1=0;/灭录音指示灯 flag3=0; flag4=0; adds0=170; count=0;/ LCMInit(); /1602初始化 init_t0();/定时器初始化 EA=1; while(set_key=1); setkey_treat();/录音键处理 while(1) upkey_treat();

39、/放音键处理 ceju(); while(shuju<50) fayin();break; /display();/显示处理 shuju=0; /外部中断0,用做判断回波电平void INTO_() interrupt 0 / 外部中断是0号 outcomeH =TH1; /取出定时器的值 outcomeL =TL1; /取出定时器的值 succeed_flag=1; /至成功测量的标志 EX0=0; /关闭外部中断/定时器0中断程序void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0_crycle

40、+; 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初始化函数void init_t0() TMOD=0x01;/设定定时器工作方式1,定时器定时50毫秒TH0=(65536-50000)/256;TL0=(65536-50000)%256;/EA=1;ET0=1;/允许定时器0中断t0_crycle

41、=0;/定时器中断次数计数单元/录音键处理程序从指定地址开始录音的程序就是在这段里面void setkey_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个地址 addscount=st_

42、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

43、=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;/计算语音的结束地址 addecount=end_add;/本段语音结束地址暂存 LED1=0; /录音完毕,LED熄灭 count+;/录音段数自加 count_flag=count;/录音段数寄存 flag2=1; flag4=1;/解锁放音键 /放音机处理程序从指定地址开始放本段语音就是这段程序void upkey_treat(void)/ uchar ovflog; AN=1;/准备读入数据 DelayUs(1); if(AN=0)/判断放音键是否动作 DelayMs(5);/延5ms去抖 if(AN=0) if(flag4=1)/互锁录音键 if(flag2=1)/判断是否为录音好后的第一次放音 count=0;/从第0段开始播放 isd_

温馨提示

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

评论

0/150

提交评论