语音及文字警示系统论文_第1页
语音及文字警示系统论文_第2页
语音及文字警示系统论文_第3页
语音及文字警示系统论文_第4页
语音及文字警示系统论文_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

word文档可自由复制编辑摘要为改善铁路平面交叉道口尤其是站内道口的安全状况,有必要设计一种具有高可靠性的道口报警设备,当列车接近道口时告警,提示道口值班人员及行人、车辆注意,以确保列车安全通过,减少以至杜绝各种道口交通事故的发生[1]。本论文所研究的语音及文字警示系统主要用于铁路道口的警示;采取语音播放及文字信息显示等措施,其中语音部分可采用两种方式,一是自动播放系统预先存储或录制的语音内容,二是通过系统连接的话筒进行人工语音播放;文字部分采用LCD显示屏显示预先存储的文字信息,该文字信息可与语音信息同步显示相同的内容,需要显示的文字信息和播放的语音内容均采用SD卡存储方式,易于修改(针对不同的应用场合只需修改SD卡上的数据内容即可),语音播放及文字显示可采用自动触发(系统外接主动红外入侵探测器等设备等)或人工操作两种方式。关键词:SD卡,MP3语音,TXT,警示,C8051F340,VS1003ABSTRACTToimprovethesecurityofthelevelcrossingparticularlyinsidecrossing,itisnecessarytodesignahighlyreliablecrossingalarmequipment,whenthetrainisapproachingthecrossing,suggestdutypedestrianandthevehiclestakingcareofit.Toensurethesafepassageoftrains,reduceandeventuallyeliminateallcrossingtrafficaccidents[1].Thisthesisstudiedvoiceandtextalertssystemismainlyusedfortherailwaycrossingwarning;takevoiceplaybackandtextinformationdisplayandothermeasures,includingpartsofspeechcanbeusedintwoways,oneisautomaticplaybacksystempre-storedorrecordedaudiocontent,Second,thesystemconnectorofthemicrophoneforartificialvoiceplayback;textportionofLCDdisplaypreviouslystoredtextmessage,thetextmessagecanbesynchronizedwiththevoiceinformationwiththesamecontent,thetextinformationtobedisplayedandplaybackaudiocontentareusedSDcardstorage,easytomodify(fordifferentapplicationssimplymodifythecontentsofthedataontheSDcardcanbe),voiceplaybackandtextdisplaycanbetriggeredautomatically(systemexternalactiveinfraredintrusiondetectorsandotherequipment,etc.),ormanualoperationtwoways.KEYWORDS:SDcard,MP3,TXT,warning,C8051F340,VS1003word文档可自由复制编辑目录TOC\o"1-4"\h\z\u前言 word文档可自由复制编辑前言在铁路网比较发达的欧洲,道口密度大,事故风险也相对比较高。其中,英国安全工作做的比较好,近年来其道口事故发生率和每个道口平均死亡人数均比其他各国低。这主要得益于英国政府增加警力,强行控制道口违章行为。在驾校增设关于平交道口的安全教育,开展平交道口危险性的宣传活动。同时,英国西屋铁路系统公司在别国成功技术的基础上,研制了一种新型的平交道口预测器(英文名称缩写LCP)。其工作过程是在道口装一个LCP单元,两边轨道的端点处各装一个无源转辙器。当列车经过前转辙器时,轨道电路的阻抗和电压会线形减少,呈现下斜图形,反映列车接近轨道口的位置,LCP根据图形斜率计算列的速度,确定列车经过道口的时间,从而产生报警,当列车经过后转辙器以后,报警结束。该设备符合道口报警设备的一般设计原理,但是其价格昂贵,同时英国铁路轨道电路与我国轨道电路有诸多不同之处,所以无法将其移用至我国铁路道口中[2,3]。本文以铁路道口应用为例设计了一款基于SD卡的文字声光警示系统。通过现有技术加强我国铁路道口的现代化改造,必将提高道口管理的自动化水平,提升道口通过的安全性,对于减少道口事故、保障人民生命财产安全、提高铁路公路运营效率有着十分重要的意义。于该警示系统是用SD卡存储警示内容,内容方便修改,因此可以使用于其他的场合。例如安防、普通十字路口、施工现场、学校、博物馆等,只需要将SD卡中的警示内容更改为场合相对应的警示内容即可,无需改变软件程序。本论文共分为五章。第1章是绪论,主要阐述了设计中的一些基本原理和系统总体方案设计。第2章是硬件设计,单片机最小系统模块、MP3解码模块、SD卡模块、串口通信模块、手持话筒模块,功率放大模块硬件设计。第3章是软件设计,MP3解码模块、SD卡模块以及串口通信模块等的软件设计。第4章是调试与分析,通过测试程序,验证各模块的功能,并对调试过程中产生的问题进行了分析与总结。第5章是系统设计的结论与展望,在这一章中,结论对系统的设计结果作了简单的总结,展望则根据系统中存在的不足提出了一些相应的改进的方法。第1章绪论本章主要对SD文件系统和znFAT及SPI通信做介绍和说明。1.1SD卡原理及内部结构SD卡(SecureDigitalMemoryCard)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD模式和SPI模式,本系统采用SPI模式[19]。图1-1SD卡内部图表1-1SPI总线模式定义引脚名称类型功能描述1CS输入片选2DATAIN输入主卡命令和数据3VSS1服务接地4VDD服务接电源5CLK输入时钟6VSS2服务接地7DATAOUT输出主卡数据和状态8RSV(2)输入接受9RSV(2)输入接受1、SD卡主要引脚和功能如下。(1)CLK(时钟信号),每个时钟周期传输一个命令或数据位,频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz的频率;(2)CMD(双向命令和回复线),命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡;(3)DAT0~3(数据线),数据可以从卡传向主机也可以从主机传向卡。SD卡以命令形式来控制SD卡的读写等操作。可根据命令对多块或单块进行读写操作。在SPI模式下其命令由6个字节构成,其中高位在前。图1-2SD卡分区图表1-2主启动记录和分区表BP长度文件名内容0446主启动记录不限44616分区表(第一部分)见下表46216分区表(第二部分)全是0x0047816分区表(第三部分)全是0x0049416分区表(第四部分)全是0x005102信号字(SignatureWord)0x55,0xaa2、主启动记录和分区注释如下。(1)0到445主启动记录此间内容不被叙述。(2)446到461分区表(第一部分)这个部分叙述了第一分区在体系中的信息。这个分区意味着使用者可以没有相互的证明使用普通区域。(3)462到477分区表(第二部分)如果体系只有一个分区,此间内容为0。(4)478到493分区表(第三部分)如果体系只有一个分区,此间内容为0。(5)494到509分区表(第四部分)如果体系只有一个分区,此间内容为0。(6)510到511信号字(SignatureWord)此处记录了0x55(BP510)和0xaa。表1-3分区表BP长度文件名内容01启动指示0x00或0x8011启始磁头数值22启始柱面和扇区数值41系统ID号0x01或0x04或0x0651终止磁头数值62终止柱面和扇区数值84RelativeSector数值124总扇区数值3、SD卡文件分区注释。(1)BP0启动指示如果以SD卡作为启动(盘),记录0x80,否则记录0x00。(2)BP1启始磁头此处叙述分区的起始磁头。(3)BP2和3启始柱面和扇区此处将叙述分区的启始柱面和扇区。6个位(在BP2中0到5位),将作为启始扇区。10个位(在BP2中的6和7位,在BP3中的0到7的)将作为启始柱面。(4)BP4系统ID号此处叙述文件系统类型。如果分区大小是少于32680个扇区,它将被记录0x01。如果少于65536个扇区,它将被记录0x04。否则,它将被记录0x06。(5)BP5终止磁头此处记录终止磁头。(6)BP6和7终止柱面和扇区此处记录终止柱面和扇区。6个位(在BP6中的0到位5位)作为结束扇区。10个位(在BP6中的位6和7位,在BP7中的0到7位)作为结束柱面。(7)BP8到11RelativeSector此处叙述这此分区的起始扇区之前存在的数目。(8)BP12到15总扇区此处记录总扇区数量。(9)申请分配表(FAT)FAT将包含一个格式ID号和一些项目,每个使用者区域的指示群集。这些项目连续的将是有限的出发由于2而且项目数目将和~相等对应的群集数目。每个项目在FAT中将指示对应的群集状态。FAT项目将用来识别被分派到每个文件的群集组[18]。1.2znFATznFAT是一种高效、完备、精简且具有高可移植性的嵌入式FAT32文件系统解决方案。其主要特性如下。1、可通用于多种嵌入式CPU,如51、AVR、PIC、ARM、Cortex、DSP、MSP430、freescaleS12等等。2、所占用的RAM与ROM资源极少,并可由使用者视目标平台资源情况进行灵活配置,最简配置情况下,RAM的使用量约在800~900字节左右。3、内建独特的数据写入加速算法以及扇区级的基于“预建文件”的数据写入机制。4、底层提供简单的单扇区读写驱动接口以及可选的硬件级多扇区连续读写驱动接口。(在提供多扇区连续读写驱动的情况下,数据读写速度将有近2~4倍的提升,甚至更高。)5、提供清晰而强大的对函数模块裁剪的功能,极大限度的减小最终生成的可执行文件的体积。6、提供数据读取的重定向功能,使读到的数据无需缓冲暂存,直接流向应用目的。7、支持长文件名,长文件名最大长度可配置。默认配备并使用GB2312中文字符,并可选择是否使用OEM字符集,以减少程序体积。8、支持与Windows、Linux等操作系统兼容的路径表示,路径分隔可使用/或\。支持无限深目录,支持长名目录。9、提供数据写入的实时模式,写入的任何数据,只怕只有一个字节,立即落实到物理存储器,防止因恶劣工作环境、干扰或其它原因引起的目标平台不可预见的死机或故障,造成数据丢失(实时模式数据写入速度不高,内存中不缓冲任何数据)。10、支持对存储设备的格式化,文件系统为FAT32。11、支持*与?通配,长名亦支持通配。12、支持文件与目录的删除,目录支持内含子目录与无限深级子目录结构的删除。13、支持无限级目录创建。14、支持多文件同时操作。15、支持多设备,即同时挂载多种存储设备,可在多种存储设备间任意切换。1.3SPI串行通信SPI是英语SerialPeripheralInterface的缩写,顾名思义就是串行外围设备接口。时钟由Master控制,在移位时钟的脉冲下,数据按位传输,高位在前,低位在后(MSBfirst),目前应用中的数据速率可达几Mbps的水平。其主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议[19]。1.3.1SPI接口定义SPI总线是一种环形结构,由NSS、SCK、MOSI、MISO构成,其时序其实很简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。典型连接图如图1-3所示。1、MOSI:主器件数据输出,从器件数据输入;2、MISO:主器件数据输入,从器件数据输出;3、SCK:时钟信号,由主器件产生;4、NSS:从器件使能信号,由主器件控制。图1-3SPI主从方式典型连接图1.3.2SPI总线工作方式SPI主器件启动SPI总线上所有的数据传输。通过将主允许标志(MSTEN,SPI0CFG.6)置1将SPI0置于主方式。当处于主方式时,向SPI0数据寄存器(SPI0DAT)写入一个字节时是写发送缓冲器。如果SPI移位寄存器为空,发送缓冲器中的数据字节被传送到移位寄存器,数据传输开始。SPI0主器件立即在MOSI线上串行移出数据,同时在SCK上提供串行时钟。在传输结束后SPIF(SPI0CN.7)标志被置为逻辑1。如果中断被允许,在SPIF标志置位时将产生一个中断请求。在全双工操作中,当SPI主器件在MOSI线向从器件发送数据时,被寻址的SPI从器件同时在MISO线上向主器件发送其移位寄存器中的内容。因此,SPI标志既作为发送完成标志又作为接收数据准备好标志。从器件接收的数据字节以MSB在先的形式传送到主器件的移位寄存器。当一个数据字节被完全移入移位寄存器时,便被传送到接收缓冲器,处理器通过读SPI0DAT来读该字节。当被配置为主器件时,SPI0可以工作在下面的三种方式之一:多主方式、3线单主方式或4线单主方式。当NSSMD1(SPI0CN.3)=0且NSSMD0(SPI0CN.2)=1时,是默认的多主方式。在该方式,NSS是器件的输入,用于禁止主SPI0,以允许另一主器件访问总线。在该方式,当NSS被拉为低电平时,MSTEN(SPI0CN.6)和SPIEN(SPI0CN.0)位被硬件清0,以禁止SPI主器件,且方式错误标志(MODF,SPI0CN.5)被置1。如果中断被允许,将产生方式错误中断。在这种情况下,必须用软件重新使能SPI0。在多主系统中,当器件不作为系统主器件使用时,一般被默认为从器件。在多主方式,可以用通用I/O引脚对从器件单独寻址(如果需要)。当NSSMD1(SPI0CN.3)=0且NSSMD0(SPI0CN.2)=0时,SPI0工作在3线单主方式。在该方式,NSS未被使用,也不被交叉开关映射到外部端口引脚。在该方式,应使用通用I/O引脚选择要寻址的从器件。当NSSMD1(SPI0CN.3)=1时,SPI0工作在4线单主方式。在该方式,NSS被配置为输出引脚,可被用作从选择信号去选中一个SPI器件。在该方式,NSS的输出值由NSSMD0(SPI0CN.2)控制(用软件)。可以用通用I/O引脚选择另外的从器件[19]。1.3.4SPI时序分析如图1-4所示,使用SPI0配置寄存器(SPI0CFG)中的时钟控制选择位可以在串行时钟相位和极性的4种组合中选择其一。CKPHA位(SPI0CFG.5)选择两种时钟相位(锁存数据所用的边沿)中的一种。CKPOL位(SPI0CFG.4)在高电平有效和低电平有效的时钟之间选择。主器件和从器件必须被配置为使用相同的时钟相位和极性。在改变时钟相位和极性期间应禁止SPI0(通过清除SPIEN位,SPI0CN.0)。这里需要注意的是在主方式,SPI在SCK无效沿(MOSI改变状态之际)的前1个系统时钟采样MISO线,以便为从器件提供最大的建立时间。SPI0时钟速率寄存器(SPI0CKR,见SFR定义20.3)控制方式的串行时钟频率。当工作于从方式时该寄存器被忽略。当SPI被配置为主器件时,最大数据传输率(位/秒)是系统时钟频率的二分之一。当SPI被配置为从器件时,全双工操作的最大数据传输率(位/秒)是系统时钟频率的十分之一,前提是主器件与系统时钟同步发出SCK、NSS(在4线从方式)和串行输入数据。如果主器件发出的SCK、NSS及串行输入数据不同步,则最大数据传输率(位/秒)必须小于系统时钟频率的十分之一。在主器件只想发送数据到从器件而不需要接收从器件发出的数据(即半双工操作)这一特殊情况下,SPI从器件接收数据时的最大数据传输率(位/秒)是系统时钟频率的四分之一,这是在假设由主器件发出SCK、NSS和串行输入数据与系统时钟同步的情况下[11]。图1-4SPI时序图1.4系统方案MCU最小系统中使用的是美国SiliconLaboratories公司生产的C8051F340单片机。该芯片是完全集成的混合信号片上系统型MCU,具有片内上电复位、VDD监视器、电压调整器、看门狗定时器和时钟振荡器,是真正能独立工作的片上系统。FLASH存储器还具有在系统重新编程能力,可用于非易失性数据存储,并允许现场更新8051固件。用户软件对所有外设具有完全的控制,可以关断任何一个或所有外设以节省功耗[12]。1.4.1软件介绍原理图和PCB图的设计使用的是AltiumDesigner。AltiumDesignerSummer09是Altium公司新出的一款EDA开发工具。AltiumDesignerSummer09的发布延续了连续不断的新技术的应用过程。这必将帮助用户更轻松地创建下一代电子设计。同时,我们将令AltiumDesigner更符合电子设计师的要求。Altium的一体化设计结构将硬件、软件和变成硬件集合在一个单一的环境中,这将使用户自由地探索新的设计构想。在整个设计构成中,每个人都使用同一个设计界面。Summer09版本解决了大量历史遗留问题。其中就包括了增加更多的机械层设置、增强原理图网络类定义。可以再Windows7上运行,增加了很多类似于Windows的快捷键,大大缩短了绘图周期。对于初学者而言更加容易上手[13]。C8051F340程序的开发环境采用的是KEILuVISION4。KEILuVISION4是众多单片机应用开发软件中最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM,它集编辑,编译,仿真等于一体,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能[15]。1.4.2系统测试为了验证系统的可靠性,在系统设计完毕后就需要对各功能模块进行测试。首先进行硬件测试,上电前仔细检查各元器件是否正确焊接在电路板上,上电后用万用表测试相应引脚电压值是否与期望值相符;硬件测试完毕后,对各功能分别编写简单的测试程序进行调试;最后进行系统总体调试,验证系统功能。第2章警示系统硬件设计在设计过程中,将系统功能分为硬件和软件两部分来分别实现。本章详细介绍了系统设计的硬件部分,主要分几个模块详细描述各部分的设计方案及其实现功能。2.1警示系统硬件功能概述硬件设计是整个系统设计的基础,是软件运行的平台。主要的硬件电路有C8051F340最小系统电路,MP3解码电路,SD卡电路,串口通信电路。其中各部分功能介绍如下。1、C8051F340最小系统电路C8051F340最小系统电路主要电路有,JTAG调试电路,复位电路,供电电路,触发源输入电路。2、MP3解码电路MP3解码电路主要有,复位电路,时钟电路,麦克风接口电路,供电电路由于VS1003解码芯片也是采用3.3V供电所以供电电路是和C8051F340同用一个供电电路使设计更加方便。时钟采用12.288MHZ的晶振。3、SD卡电路SD卡读取是为了使本系统的应用范围更广而设计的。SD卡读取技术会使警示系统更加灵活的使用到各种场合。4、串口字符通信电路串口字符电路使用MAX3232作为串口通信芯片,具有通用性,使系统的更加便于使用。5、手持话筒电路手持话筒模块电路使用以NE5532运算放大器为核心器件,具有较强的音频放大功能的电路。将话筒的MIC头转换出来的电信号进行放大。NE5532非常常用的音频放大芯片,在音频的范围内具有极高的精度,能保证声音信号的相对真实。6、功率放大电路功率放大电路分为,音频功率放大、电源供电、控制模块和模拟开关模块。音频功率放大模块采用TDA7377为核心器件。控制模块采用HCF4052为核心器件。模拟开关模块采用74LS00为核心器件。本设计需要完成上述6个主要电路的搭建,C8051F340最小系统电路是系统最为重要的部分,所以很多外设电路都是为最小系统服务的电路。C8051F340最小系统使用内部时钟,所以没有时钟电路。本章将介绍以上电路的线路连接。2.2警示系统硬件总体设计根据系统的功能要求,需要完成如下设计:以C8051F340为核心的最小系统、以VS1003为核心的MP3解码电路,以SD卡为核心的SD卡读取电路和以MAX3232为电平转换芯片的串口通信电路。其整体设计框图如图2-1所示。图2-1警示系统硬件原理框图2.3警示系统硬件详细设计2.3.1C8051F340最小系统C8051F340最小系统包括电源供电电路、复位电路、JTAG仿真电路、触发源输入电路等模块。下面分别对各模块进行介绍。2.3.1.1供电电路本设计中需要用到+5V、+3.3V和+2.5V三种电压,而简单易得的USB电源是+5V,但是USB作为电源电压太低难以驱动继电器,使继电器工作。而且工业常用+12V作为电源。因而需要使用+12V转换以分别产生+5V、+3.3V和+2.5V。其原理图如图2-2所示。图2-2系统供电电路图2-2中采用三端线性稳压器LM7805先将+12V的电源转化成+5V,然后再用三端稳压器AMS1117把+5V转化为+2.5V,利用C8051F340将+5V电压转化为+3.3V给系统其它部分供电。2.3.1.2复位电路在调试过程和实际应用过程中随时可能需要系统复位,以使程序可以重新运行。因此设置按键复位电路是非常必要的。本设计利用RC电路的延迟特性给出复位需要的低电平时间。上电瞬间,电容C0两端电压不能突变,通过电阻R0进行充电,充电时间由RC乘积值决定,一般要求大于5个外部时钟周期,为防止复位不完全,参数可选大一些,本设计中采用0.1µF电容和10KΩ电阻,时间常数为1ms,满足系统复位要求。图2-3所示电路连接除可以完成上电复位外还可以完成手动复位。当按钮闭合时,电容C放电,使电容C上的电压降为0,当按键断开时,电容的充电过程与上电复位类似。从而实现手动复位。图2-3C8051F2.3.1.3JTAG电路在系统调试时,需要一个C8051F340仿真器,把在计算机上编译并生成的HEX下载到C8051F340中,实现在线调试C8051F340硬件和软件。仿真器接口有两端接口,其中一端与计算机的USB口相连,另一端与C8051F340的JTAG接口相连,这是一个10针的接口,其硬件连接如图2-4所示。图2-4C8051F2.3.1.4触发源输入电路如图2-5所示,触发源输入电路是为外部触发设计的。当外部有一个低电平输入时,就会触发警示系统。系统就会调用SD卡上的警示信息,将语音信息传输给VS1003解码输出人声语音并通过音响播放,同时将TXT文件上的文字信息通过串口传输给外部显示模块进行显示。目前警示系统是以按键代替外部触发,但是实际使用时可以将按键改为外部触发,比如主动红外入侵探测器等设备。图2-5外部触发源输入电路2.3.2MP3解码电路MP3解码电路包括时钟电路,复位电路,与单片机通信的串行输入电路,串行输出电路,时钟电路等。2.3.2.1时钟电路MP3解码芯片VS1003需要一个12.228MHZ的晶振作为VS1003的时钟。VS1003利用内部的PLL将12.228MHZ的时钟倍频到更高的频率,以适应不同码率的音频解码的需求。图2-7VS1003时钟电路2.3.2.2复位电路由于VS1003是低电平复位,所以将复位端口电平下拉。使得复位更加快速和精确。图2-8VS1003复位电路2.3.3字符通信电路本设计的主要利用以MAX3232作为核心,将字符信息通过串口发送给外部的显示设备。由于TTL电平的特殊性必须将单片机输出的电平通过MAX3232转化为EIA电平,以用作串行通信。图2-9字符通信电路2.3.4SD卡读取电路如图2-10所示,SD卡有两种模式,一种是SD卡模式,另一种是SPI模式。本设计采用的是SPI模式。因为C8051F340有硬件SPI,而且采用SPI速度更快,能解码更高码率的音频文件。图2-10SD卡电路2.3.5手持话筒模块手持话筒模块主要是将MIC头转换出来的电信号进行前级放大。为了低功耗设计,本论文设计了了按键,当按键按下时,系统供电工作。并且当系统供电时三极管导通将A位置电平拉低,输出一个低电平,控制功放工作如图2-11。图2-11手持话筒模块电路2.3.6功放模块功放模块包括音频功放模块、模拟开关模块、电源供电模块和控制模块。2.3.6.1音频功放模块音频功放模块主要以TDA7377为核心,TDA7377是一种新技术AB类车用无线电放大器可以在双桥梁或四单端配置方式下工作,常用在汽车收音机上。本设计使用TDA7377是为了将警示喊话更加清楚,使系统更加实用。低功耗设计方面,本系统利用TDA7377的待机功能使功放模块的功耗降到很低。只有在有音频输入时才激活系统如图2-12。图2-12音频功放模块电路2.3.6.2模拟开关模块如图2-13所示模拟开关模块使用HCF4052作为主要器件。HCF4052双4-通道模拟多路复用/分解器,其内部相当于一个单刀双掷开关。HCF4052有两个控制端,可以控制4组两路切换。本设计只使用两路切换故将B控制端接地。图2-13模拟开关模块电路2.3.6.3供电模块供电模块是用于整个功放模块供电。使用一个6A10二极管,可以防止电源反接。6A10的反向工作电压达到1000V,而电源电压只有12V,所以6A10可以保证功放模块的正常运行。图2-14供电模块电路2.3.6.4控制模块如图2-15所示控制模块采用74LS00与非门作为核心器件。当MIC头有输出或者有MP3输出时,使输出为高电平,控制TDA7377工作。图2-15控制模块电路2.4警示系统整体原理图设计系统的原理图采用AltiumDesignerSummer09软件绘制,具体原理图分别见附录I。2.5警示系统整体PCB图设计系统的原理图均采用AltiumDesignerSummer09软件绘制,具体原理图分别见附录II。第3章警示系统软件设计硬件设计完成之后,需要编写相应的应用程序,本章主要分基于znFAT文件系统的SD卡读取和基于VS1003的MP3解码两部分分别进行详细介绍。3.1警示系统程序功能概述根据系统功能要求,系统的软件设计可主要分为两大模块:基于znFAT文件系统的SD卡读取和MP3解码部分,具体功能描述如下。1、实现SD文件系统的基本功能,读取和储存,本设计主要用到读取部分;2、实现基于SPI的MP3解码;3、实现对继电器开断;4、实现对触发源输入的及时响应;3.2警示系统程序总体设计系统程序流程图如图3-1所示,程序结构图如3-2所示。主程序主要包括触发源判断,znFAT文件系统,MP3解码,触发源判断等3个主要部分。图3-1系统程序流程图图3-2程序结构图3.3警示系统程序详细设计3.3.1基于ZNFAT的SD卡文件系统3.3.1.1znFAT代码结构主体:znFAT的具体实现。znFAT.h是对相关数据结构、宏的定义,以及对使用者可调用的功能函数的声明。znFAT.c是对功能函数的具体实现。移植相关:znFAT的移植相关文件。mytype.h中对类型进行重定义。deviceio.c对存储设备物理扇区读写驱动进行具体实现。config.h对znFAT进行一些配置。其它头文件:cc_macro.h是znFAT中的功能函数依赖关系的定义。gb2uni.h是znFAT中GB2312向UNICODE转换的映射表。deviceio.h此文件向znFAT提供扇区读写驱动接口函数的声明。template.hznFAT中用于实现格式化功能的模板数据。图3-3znFAT的代码结构3.3.1.2znFAT移植方法znFAT的移植其实非常简单,前提是已经有了现成的,较为成熟稳定的存储设备扇区读写等驱动函数。重新定义数据类型,如图3-4所示。图3-4重新定义数据类型根据硬件平台实际的数据类型对mytype.h中的类型进行重新定义,包括无符号整型、有符号整形与固化数据的ROM类型。通过deviceio.c将存储设备驱动函数与znFAT标准物理接口进行接驳,包括存储设备初始化、单扇区读取、单扇区写入[多扇区连续读取与写入,多扇区连续清0]。1、加入存储设备驱动头文件,如图3-5。图3-5加入存储设备驱动头文件2、将存储设备初始化函数与znFAT_Device_Init函数接驳,如图3-6。图3-6将存储设备初始化函数与znFAT_Device_Init函数接驳除了将实际存储设备的初始化函数加入接口函数znFAT_Device_Init中,此函数中其它代码请不要改动(以下同理)。并且最好按函数中的格式来写,在有多个存储设备的情况下,可以方便地知道每一个存储设备的初始化成功与否。将扇区读取驱动函数与znFAT_Device_Read_Sector函数进行接驳,如图3-7。图3-7将扇区读取驱动函数与znFAT_Device_Read_Sector函数进行接驳(4)将扇区写入驱动函数与znFAT_Device_Write_Sector函数进行接驳,如图3-8。图3-8将扇区写入驱动函数与znFAT_Device_Write_Sector函数进行接驳(5)将多扇区连续读取驱动函数与znFAT_Device_Read_nSector函数进行接驳,如图3-9。图3-9将多扇区连续读取驱动函数与znFAT_Device_Read_nSector函数进行接驳znFAT中的多扇区连续读取驱动接口函数采用了两种实现方式,使用者可以通过修改config.h中的相应宏选择使用哪种实现方式。config.h中的宏如图3-10。图3-10多扇区连续读取驱动接口函数选择如果这个宏被注释,则采用单扇区读取驱动+循环的实现方式;否则,将采用硬件级的多扇区连续读取驱动,此地,使用者必须提供存储设备的多扇区连续读取驱动函数。(6)将多扇区连续写入驱动函数与znFAT_Device_Write_nSector函数进行接驳(与V同理,config.h中对应的宏为#defineUSE_MULTISEC_W)(7)将多扇区连续清零驱动函数与znFAT_Device_Clear_nSector函数进行接驳(与5与6同理,config.h中对应的宏为#defineUSE_MULTISEC_CLEAR)以上就是znFAT的移植方法。通过此方法将znFAT文件系统移植到C8051F340上。自定义初始化和接口函数如下。sbitSD_SCL=P0^0;//SD卡同步时钟输入sbitSD_SI=P0^2;//SD卡同步数据输入sbitSD_CS=P0^3;//SD卡片选 输入sbitSD_SO=P0^1;//SD卡同步数据输出#defineDELAY_TIME2000//SD卡的复位与初始化时SPI的延时参数,根据实际速率修改其值,否则会造成SD卡复位或初始化失败#defineTRY_TIME200//向SD卡写入命令之后,读取SD卡的回应次数,即读TRY_TIME次,如果在TRY_TIME次中读不到回应,产生超时错误,命令写入失败//错误码定义//#defineINIT_CMD0_ERROR0x01//CMD0错误#defineINIT_CMD1_ERROR0x02//CMD1错误#defineWRITE_BLOCK_ERROR0x03//写块错误#defineREAD_BLOCK_ERROR0x04//读块错误////函数声明unsignedcharSD_Reset();unsignedcharSD_Init();unsignedcharSD_Write_Sector(unsignedlongaddr,unsignedchar*buffer);unsignedcharSD_Read_Sector(unsignedlongaddr,unsignedchar*buffer);#endif3.3.2MP3解码程序设计MP3解码程序主要包括VS1003驱动部分和SPI通信部分。VS1003驱动部分,MCU初始化完成后,当有触发源输入时,清空VS1003缓存,调用语音文件。其中初始化函数包括端口初始化、时钟初始化、中断初始化。SPI通信部分,先SPI初始化,然后VS1003与单片机握手,建立连接。建立连接后,传输数据,待数据传输完毕后,释放连接。3.3.2.1VS1003驱动程序VS1003的驱动程序包括端口初始化,VS1003初始化,向VS1003写字节,从VS1003读字节,向VS1003发送音频数据,清空VS1003的数据缓存等。1、初始化(1)端口初始化sbitVS_XDCS=P2^1;//数据片选sbitVS_XCS=P2^2;//片选信号sbitVS_XRESET=P2^6;//复位信号sbitVS_DREQ=P2^0;//数据请求(2)VS1003初始化VS_XRESET=1;delay(100);VS_XRESET=0;delay(100);VS_XRESET=1;//硬件复位,XRESET低电平有效delay(100);VS_Write_Reg(0x00,0x08,0x04);//软件复位,向0号寄存器写入0x0804SM_SDINEW为1SM_RESET为1VS_Write_Reg(0x03,0x98,0x00);//时钟设置,向3号寄存器写入0x9800SC_MULT为4SC_ADD为3SC_FREQ为0VS_Write_Reg(0x0b,0x00,0x00);//音量设置,左右声道均最大音量VS_XDCS=0; //打开数据片选,注意此时XCS(片选)为高电平,SDI有效SPI_WriteByte(0);//写入数据,这里写入4个0,是无关数据,用来启动数据传输SPI_WriteByte(0);SPI_WriteByte(0);SPI_WriteByte(0);VS_XDCS=1; //关闭数据片选,SDI无效2、其他驱动voidVS_Write_Reg(unsignedcharaddr,unsignedcharhdat,unsignedcharldat);//向VS1003的功能寄存器写入一个字unsignedintVS_Read_Reg(unsignedcharaddr);//从VS1003的功能寄存器读取一个字voidVS_Send_Dat(unsignedchardat);//向VS1003发送音频数据voidVS_Flush_Buffer();//清空VS1003的数据缓冲区voidVS_sin_test(unsignedcharx);//正弦测试3.3.3.2SPI通信程序SPI通信程序流程图如图3-10所示。图3-11SPI通信流程图1、初始化初始化包括端口初始化、中断初始化、SPI初始化、UART初始化、参考电平初始化等。具体初始化过程如下。(1)端口初始化配置P0.0、P0.1、P0.2、P0.3为SPI总线端口。其中P0.0为SCK,数字输入,开漏输出;P0.1为MISO,数字输入,上拉输出;P0.2为MOSI,数字输入,开漏输出;P0.3为NSS,数字输入,开漏输出。配置P0.4、P0.5为UART1端口。其中P0.4为TX1,数字输入,上拉输出;P0.5为RX1,数字输入,开漏输出。(2)中断初始化IE=0xC0; //开总中断及SPI中断EIE2=0x02; //置位ART1中断允许位(3)SPI初始化SPI0CN=0x05; //设四线从方式,且使能SPISPI0CKR=0x17; //设置SPI0的时钟频率为1M(4)UART初始化SBRLL1=0x1E; //UART波特率发生器低字节SBRLH1=0xF6; //UART波特率发生器高字节SCON1=0x10;SBCON1=0x43; //波特率发生器使能,预分频1(5)定时器初始化TCON=0x40;//定时器1使能TMOD=0x20;//使用方式2,8位自动重装载的定时器CKCON=0x02;//时钟预置分频2TH1=0x98;//定时器1高字节初始化3.3.4触发源判断程序do{ if(!IO_IN1)//判断触发源一是否有输入 {Delay_ms(200)//延时200ms if(!IO_IN1)//再次判断触发源是否有输入 { JDQ1=1;//继电器吸合 strcpy((void*)mp3_name,"\\Y0000000.mp3");//调用Y0000000.MP3 strcpy((void*)char_name,"\\C0000000.txt");//调用C00000000.txt MP3_Play();//MP3播放 Char_Display();//将文字发送到LCD屏播放 } } elseif(!IO_IN2)//判断触发源二是否有输入 { Delay_ms(200)//延时200ms elseif(!IO_IN2)//再次判断触发源是否有输入 { JDQ2=1;//继电器二吸合 strcpy((void*)mp3_name,"\\Y0000001.mp3");/调用Y0000000.MP3 strcpy((void*)char_name,"\\C0000001.txt");//调用C00000000.txt MP3_Play();//MP3播放 Char_Display();//将文字发送到LCD屏播放} }}while(1);}3.4警示系统程序代码系统程序代码在KeiluVision4环境下编写,具体程序代码分别见附录Ⅲ。第4章调试与分析在完成硬件和软件的设计之后,本章着重讲述的是如何调试,并对调试的结果进行了详细的记录和分析。4.1调试目的调试的目的是验证系统各部分功能,具体如下。1、验证触发源触发效果;2、验证SD卡读取;3、验证语音播放;4、验证继电器的启动;5、验证串口通信;6、验证警示系统。4.2调试方案1、将按键按下,用示波器或者万用表测试端口电平。2、在操作SD卡时,在SD卡挂载成功口加串口打印函数,将挂载成功和SD卡读取成功通过串口显示出来,并将读取的SD卡信息通过串口发送出来在串口助手上显示。3、当SD卡挂载和读取成功过后,将MP3语音文件通过电脑复制到SD卡。然后通过调用MP3语音文件,通过SPI发送给VS1003播放,听音响是否有声音传出。4、当触发源输入是低电平时,观察继电器是否吸合。吸合时有吸合声,并伴随LED小灯亮。5、在SD卡挂载和读取都成功过后,将TXT文本文档复制到SD卡中。通过调用SD卡上的文本文件,通过串口发送给电脑,在串口助手上显示。6、在上述步骤都已完成的情况下,连接外部显示LCD屏和音响。通过触发按键,观察LCD的显示和语音的播放。4.3调试结果4.3.1触发源测试在硬件连接好后,系统上电,用示波器测试触发效果。结果显示触发正常迅速。结果如图4-1所示。图4-1触发源输入测试4.3.2SD卡读取调试将程序烧录到单片机中,利用串口将SD卡挂载成功的信息传到电脑上。原理是在每次操作SD卡时,调用一次调试程序将SD消息(SD卡读取OK和SD卡挂载OK)通过串口传出,如图4-2所示。图4-2SD卡读取测试4.3.3语音播放测试将音响接线连接到系统的音频接口,再给系统上电。最后在触发源输入低电平,听音响发出语音。结果是音响正常发出语音如图4-3。图4-3语音测试用的号角喇叭4.3.4继电器启动测试硬件连接好后,运行程序,触发源输入低电平,观察继电器是否吸合,小灯是否亮起。结果是有继电器吸合声,小灯亮起,表明继电器正常启动如图4-4。图4-4继电器启动测试4.3.5串口通信测试硬件连接好后,运行程序,打开窗口助手,接受数据。观察数据是否为SD卡上所存储的数据。测试结果正常,如图4-5所示,收到字符内码数据(A3B1BAC5C9DACEBBB1A8B8E6B1A9D3FCA1A1A1A1A图4-5串口通信4.3.6整体功能测试硬件连接好后,将外部的音响和LED显示屏都接到系统上。上电,运行程序。触发源输入低电平。观察外部显示屏是否有信息显示,音响是否有语音警示。测试结果正常,系统运行正常。运行情况如图4-6,4-7,4-8和4-9所示。图4-6系统整体展示之一图4-7系统整体展示之二图4-8系统整体展示之三图4-9系统整体展示之四4.4调试问题与分析在系统的调试过程中,产生了许许多多的问题。下面就对这些问题进行分析,以及给出相应的解决方法。1、触发源误触发有可能是硬件的原因,也有可能是软件的原因,由于硬件是系统的基础,就先对硬件进行了检查。为避免误触发,在硬件上进行了改进。在测试过程中,发现对单片机端口进行上拉后,误触发明显减少。由于触发源没有硬件滤波,系统电平波动也有可能造成误触发。鉴于上述情况,对软件进行了改进。在触发源判断中加延时,加2次判断。经测试误触发基本可以避免。结论:为了避免单片机端口的误输入,一定要加硬件滤波或者软件滤波。更加保险的办法是将端口上拉或者下拉,使得输入更加准确。2、SPI通信未能成功再次检查硬件线路连接和程序代码无误后,初步判断是单片机被烧掉。在一块好的单片机上编写测试程序,分别给目标最小系统的每个I/O口置高和置低,然后单步运行程序,用万用表测量目标系统板的每个I/O口,发现一切正常。最后,在程序中的从机片选信号有效后设个断点,运行程序至断点,再用万用表测相应引脚电平,发现依然是高电平(而实际应该是低电平),找到问题所在,再检查程序中的I/O端口配置,发现输出口未配置成上拉而配成了开漏,修改配置后SPI通信就正常了。结论:C8051F340的I/O输入要配置为开漏,输出要配置为上拉(若不接上拉电阻的情况下),此外,以后检查程序时不能忘了检查初始化配置。3、串口通信不成功在测试时由于没有将串口的接地引脚共地,而是将串口两端的接地引脚分别接地。造成串口无法正常发送数据。通过检查发现就算是同一个供电源也要将串口的接地引脚接到一起共地。结论:串口通信接地引脚必须共地,不然无法正常通信。第5章结论与展望最后本章对本设计进行总结,并提出相应的不足之处与改进方法。5.1结论在硬件设计上,本设计完成了SD卡读取模块、C8051F340最小系统、串口通信模块、MP3解码模块等设计。在软件上,实现了基于znFAT文件系统、基于VS1003的MP3解码、串口字符通信等功能。总之,本设计基本完成了系统设计的要求。在这次毕业设计过程中,我对基于SD卡的文件系统、C8051系列的增强型单片机、SPI总线通信、MP3语音播放有了更深刻的认识,同时也学到了许多书本上学不到的东西,这不仅加强了我的动手能力,而且也增强了发现问题、分析问题、解决问题的能力。为期一个半月的毕业设计,使我对新事物的了解,学习及应用能力都有了明显的提高。通过这次毕业设计,我不但开阔了视野,而且对书上的理论知识有了更加深层次的理解。总之,这次毕业设计实践使我受益良多,认识到自己有很多不足之处:基础还不够扎实,运用知识的能力还不强,考虑问题不够到位等等。所以在以后的学习当中,我还需要更加努力地充实自己,不断提高本身的理论素养和实践动手能力。5.2展望整个系统的设计基本完成了它的功能,但由于它还存在很多不足之处,所以,这里列举了一些改进的方法,使系统的功能更加趋于完善,并能使系统更有实用价值。1、可以将以太网通信加上,使得系统具有远程的警示和控制功能。2、可以将各种传感器模块加上,使得系统的应用范围更加广泛。3、本设计还可以加上摄像机,通过以太网传输数据,将图像信息传到中心机房,可以使系统的预警功能更加强大。4、可以将警示或报警信息通过个分机之间的通信传到中心机房,还可以将信息存储到SD卡或分机中,以便以后提取证据或者分析数据。参考文献[1]李显军.道口报警系统的设计与实现[J],北京:铁路技术创新,2004,3:5-6.[2]李玲桂.国外平交道口的安全措施[J],北京:铁道知识,2005,2:22-23.[3]王梦琛.站内道口微机自动通知系统的研究与实现[J],北京:铁道运输与经济1997,3:30-32.[4]A.Mirabadi,N.Mort,F.Schmid,ApplicationofSensorFusiontoRailwaySystem,Proceedingsofthe1996IEEE/SICE/RSJInternationalConferenceofMultisensorFusionandIntegrationforIntelligentSystem,1996:1-6.[5]边春元等编著.单片机应用开发实用子程序[M].人民邮电出版社.2005:10-198.[6]张毅坤等编著.单片微型计算机原理及应用[M].西安电子科技大学出版社.1997:1-80.[7]高吉祥主编.全国大学生电子设计大赛培训系列教程[M].电子工业社.2007:1-60.[8]康华光,陈大钦,张林.电子技术基础[M].高等教育出版社.2006.1:1-80.[9]张铁壁,张学军.无人值守火车道口报警系统的设计[J],河北:信息化技术与控制.2009:1-3.[10]边春元等编著.单片机应用开发实用子程序[M].人民邮电出版社.2005:1-58.[11]孟慧霞,吕书勇.基于ARM的SD卡文件系统设计[J],河南:通信技术.2009:1-5.[12]C8051F34xDataManual[M].SiliconLaboratories.[13]徐向民.AltiumDesigner快速入门[M].北京:北京航空航天大学出社,2011:1-244.[14]VS1003DataSheet[M].VLSIsolution.[15]童长飞.C8051F系列单片机开发与C语言编程[M].北京:北京航空航天大学出版社,2005:1-310.[16]MAX3232DataSheet[M].TexasInstruments.[17]AMS1117DataSheet[M].AdvancedMonolithicSystems.[18]李文华,徐国洪,胡华文[J].基于FAT32文件系统的SD卡数据储存结构研究,湖北:长江大学学报.2012:1-4.[19]田茂,鲜于李可,潘永才.SPI模式下SD卡驱动的设计与实现[J],湖北:现代电子技术.2009:1-3.[20]张勇.C/C++语言硬件程序设计[M].西安:西安电子科技大学出版社,2005:205-229.致谢经过近一个多月的努力学习和工作,毕业论文终于顺利完成。在本论文完成之际,我首先要感谢的是我的指导老师卫建华老师。从论文的选题到课题的研究设计,最后到论文的完成,每一步都得到了卫老师的悉心指导和帮助,特别是在系统调试过程中。回顾这段时间的毕业设计,我从他的身上不仅学到了我应该掌握的专业技能,更重要的是学到了进行科研探索的方法。他渊博的知识、严谨的治学态度和热忱待人的品格都使我受益匪浅,在此谨向卫老师表示由衷的感谢。同时还要感谢西安工程大学通信教研室的全体老师、同学,是他们创造了良好的工作和学习氛围。在论文工作过程中给予了极大的支持。最后,向所有关心和帮助过我的人们表示感谢。附录Ⅰ警示系统原理图附录Ⅱ警示系统PCB图附录Ⅲ警示系统部分程序代码main.c程序代码如下。voidmain(){ PCA0MD&=~0x40;//看门狗失效Init_Device();//C8051F340处理器初始化znFAT_Device_Init();//存储设备初始化pArg=&Init_Arg_SDCARD; //指针指向SD卡文件系统参数集合,znFAT将从这个集合中获取参数Dev_No=SDCARD;//设备号为SDCARD,znFAT依照此设备号选择存储设备驱动 Delayms(20);znFAT_Init(); //文件系统初始化Delayms(20); QIEHUAN=0; YJKD_flag=0; VS_Reset();//VS1003复位初始化do{ if(!IO_IN1) { JDQ1=1; strcpy((void*)mp3_name,"\\Y0000000.mp3"); strcpy((void*)char_name,"\\C0000000.txt"); MP3_Play(); Char_Display(); } elseif(!IO_IN2) { JDQ2=1; strcpy((void*)mp3_name,"\\Y0000001.mp3"); strcpy((void*)char_name,"\\C0000001.txt"); MP3_Play(); Char_Display(); } }while(1);}znFAT.c程序代码如下。#include"znfat.h"#include"sd.h"//存储设备的扇区读写驱动,这里是SD卡//#include"ch375.h" //存储设备的扇区读写驱动,这里是U盘//#include"cf.h"#include"string.h"externunsignedcharSTOP_FLAG;/***************************************************************************************************************///全局变量定义structdirentrytemp_rec;INT8temp_dir_name[13];UINT32temp_dir_cluster;UINT32temp_last_cluster;UINT8znFAT_Buffer[512];//扇区数据读写缓冲区,由外部提供/******************************************************************-功能描述:znFAT的存储设备初始化函数-隶属模块:znFAT文件系统模块-函数属性:外部(用于对存储设备进行初始化)-参数说明:无-返回说明:无-注:在调znFAT其它函数之前,必须先对存储设备进行成功的初始化。******************************************************************/voidznFAT_Device_Init(){SD_Reset();SD_Init();}/**************************************************************************-功能描述:获取剩余容量-隶属模块:znFAT文件系统模块-函数属性:外部,使用户使用-参数说明:无-返回说明:剩余容量,单位字节-注:从FSInfo中读取空闲簇数,而从计算得到剩余的容量,单位字节***********************************************************************/#ifdefznFAT_GET_REMAIN_CAPUINT32znFAT_Get_Remain_Cap(void){znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);if(((structFSInfo*)znFAT_Buffer)->Free_Cluster[0]==0xff&&((structFSInfo*)znFAT_Buffer)->Free_Cluster[1]==0xff&&((structFSInfo*)znFAT_Buffer)->Free_Cluster[2]==0xff&&((structFSInfo*)znFAT_Buffer)->Free_Cluster[3]==0xff)returnpArg->Total_Size;elsereturnLE2BE(((structFSInfo*)znFAT_Buffer)->Free_Cluster,4)*pArg->SectorsPerClust*pArg->BytesPerSector;}#endif-功能描述:从文件某一位置读取一定长度的数据,由pfun所指向的函数来处理-隶属模块:znFAT文件系统模块-函数属性:外部,使用户使用-参数说明:pfi:FileInfoStruct类型的结构体指针,用于装载文件参数信息,文件读取的过程中,此结构体中的相关参数会更新,比如文件的当前偏移量、文件的当前扇区,文件的当前簇等等offset:要定位的偏移量,要小于文件的大小len:要读取的数据的长度,如果len+offset大于文件的大小,则实际读取的数据量是从offset开始到文件结束pfun:对读取的数据的处理函数,pfun指向处理函数,这样可以灵活的配置数据如何去处理,比如是放在缓冲区中,还是把数据通过串口发送出去,只需要pfun去指向相应的处理函数可以了-返回说明:读取到的实际的数据长度,如果读取失败,比如指定的偏移量大于了文件大小,则返回0-注:在读取一个文件的数据前,必须先将该文件用znFAT_Open_File打开**************************************************************************/#ifdefZNFAT_READ_FILEXUINT32znFAT_Read_FileX(structFileInfoStruct*pfi,UINT32offset,UINT32len,void(*pfun)(UINT8)){ UINT32i,j,k,temp; UINT32counter=0; if(offset<pfi->FileSize) { if(offset+len>pfi->FileSize)len=pfi->FileSize-offset; znFAT_Seek_File(pfi,offset); znFAT_ReadSector(pfi->FileCurSector,znFAT_Buffer); for(i=pfi->FileCurPos;i<pArg->BytesPerSector;i++) { if(counter>=len) { returnlen; } (*pfun)(znFAT_Buffer[i]); counter++; pfi->FileCurPos++; pfi->FileCurOffset++; } if(pfi->FileCurSector-(SOC(pfi->FileCurCluster))!=(pArg->SectorsPerClust-1)) { for(j=pfi->FileCurSector+1;j<(SOC(pfi->FileCurCluster))+pArg->SectorsPerClust;j++) { znFAT_ReadSector(j,znFAT_Buffer); pfi->FileCurSector=j; for(i=0;i<pArg->BytesPerSector;i++) { if(counter>=len) { returnlen; } (*pfun)(znFAT_Buffer[i]); counter++; pfi->FileCurPos++; pfi->FileCurOffset++; } } } temp=(len-counter)/(pArg->BytesPerSector*pArg->SectorsPerClust); for(k=0;k<temp;k++) { pfi->FileCurCluster=znFAT_GetNextCluster(pfi->FileCurCluster); for(j=(SOC(pfi->FileCurCluster));j<(SOC(pfi->FileCurCluster))+pArg->SectorsPerClust;j++) { znFAT_ReadSector(j,znFAT_Buffer); pfi->FileCurSector=j; for(i=0;i<pArg->BytesPerSector;i++) { if(counter>=len) { returnlen; } (*pfun)(znFAT_Buffer[i]); counter++; pfi->FileCurOffset++; pfi->FileCurPos++; pfi->FileCurPos%=pArg->BytesPerSector; } } } pfi->FileCurCluster=znFAT_GetNextCluster(pfi->FileCurCluster); temp=(SOC(pfi->FileCurCluster))+((len-counter)/pArg->BytesPerSector); pfi->FileCurSector=(SOC(pfi->FileCurCluster)); for(j=(SOC(pfi->FileCurCluster));j<temp;j++) { znFAT_ReadSector(j,znFAT_Buffer); pfi->FileCurSector=j; for(i=0;i<pArg->BytesPerSector;i++) { if(counter>=len) { returnlen; } (*pfun)(znFAT_Buffer[i]); counter++; pfi->FileCurPos++; pfi->FileCurPos%=pArg->BytesPerSector; pfi->FileCurOffset++; } } pfi->FileCurSector=j; znFAT_ReadSector(pfi->FileCurSector,znFAT_Buffer); temp=len-counter; for(i=0;i<temp;i++) { if(counter>=len) { returnlen; } (*pfun)(znFAT_Buffer[i]); counter++; pfi->FileCurPos++; pfi->FileCurPos%=pArg->BytesPerSector; pfi->FileCurOffset++; } } else { len=0; } returnlen;}#endif-功能描述:文件重命名-隶属模块:znFAT文件系统模块-函数属性:外部,使用户使用-参数说明:filename:将要重命名的源文件的路径如\a.txtnewfilename:目标文件名如b.txt(注目标文件名是单纯的文件名,不含路径)-返回说明:1:源文件打开打败0:成功-注:无**************************************************************************/#ifdefZNFAT_RENAME_FILEUINT8znFAT_Rename_File(CONSTINT8*filename,CONSTINT8*newfilename){structFileInfoStructfi;UINT8i=0,j=0;if(znFAT_Open_File(&fi,filename,0,1))return1;//文件打开失败znFAT_ReadSector(fi.Rec_Sec,znFAT_Buffer);for(i=0;i<11;i++)(znFAT_Buffer+fi.nRec)[i]=0x20;i=0;while(newfilename[i]!='.'){(znFAT_Buffer+fi.nRec)[i]=L2U(newfilename[i]);i++;}i++;while(newfilename[i]){(znFAT_Buffer+fi.nRec+8)[j]=L2U(newfilename[i]);i++;j++;}znFAT_WriteSector(fi.Rec_Sec,znFAT_Buffer);return0;}#endif/**************************************************************************-功能描述:文件关闭-隶属模块:znFAT文件系统模块-函数属性:外部,使用户使用-参数说明:pfi:指向当前打开的文件的文件信息结构-返回说明:0:成功-注:无**************************************************************************/#ifdefZNFAT_FILE_CLOSEUINT8znFAT_File_Close(structFileInfoStruct*pfi){UINT16i=0; for(i=0;i<sizeof(structFileInfoStruct);i++){((UINT8*)p

温馨提示

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

评论

0/150

提交评论