語音及文字警示系統論文_第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"http://存儲設備的扇區讀寫驅動,這里是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

提交評論