版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p> 1 系統(tǒng)總體方案3</p><p> 1.1 公交車報站器可選方案3</p><p> 1.2 設(shè)計方案的可行性分析和選擇5</p><p> 1.3 公交車報站器的硬件框圖5</p><p> 2 系統(tǒng)硬件設(shè)計6&
2、lt;/p><p> 2.1 SPCE061A簡介6</p><p> 2.2 系統(tǒng)電源設(shè)計10</p><p> 2.3 語音存儲電路設(shè)計10</p><p> 2.4 音頻輸出電路設(shè)計12</p><p> 2.5 顯示電路設(shè)計13</p><p> 2.6 鍵盤電路設(shè)計
3、14</p><p> 3 系統(tǒng)軟件設(shè)計15</p><p> 3.1 語音處理15</p><p> 3.2 主函數(shù)流程圖17</p><p> 3.3 初始化函數(shù)24</p><p> 3.4 語音播放的實現(xiàn)29</p><p> 3.5 更新時間32</p&g
4、t;<p> 3.6 設(shè)置時間33</p><p><b> 參考文獻46</b></p><p><b> 謝辭47</b></p><p> 附錄一 公交車報站器電路圖49</p><p> 附錄二 公交車報站器程序50</p><p>
5、 在當(dāng)今社會,即使在私家車越來越多的今天,公交車仍然是人們出行的首選,因為公交車具有方便、快捷、車票便宜等優(yōu)點。傳統(tǒng)的公交車報站主要由售票員報站,但是有些售票員有著濃重的地方口音,給外地人乘坐公交車造成了困難,另外,隨著無人售票車逐漸增多,公交車報站器就越顯得重要了。 </p><p> 目前我國公交車輛己從原有的人工語音報站發(fā)展到現(xiàn)在的自動語音報站。就報站語音而論,絕大多數(shù)報站裝置都采用IsD系列的語音芯片
6、,部分報站產(chǎn)品也有采用最新的數(shù)字語音處理合成技術(shù),兩者各有優(yōu)缺點。前者成本低,但音質(zhì)較差,且更改報站信息不靈活,當(dāng)公交車輛臨時改道時必須重新對語音芯片編程;后者受信息容量、語音音質(zhì)的限制,且更換信息仍需專業(yè)設(shè)備。因此設(shè)計一款能夠方便地更換報站信息、播放高音質(zhì)語音信息的公交車報站器愈顯重要。</p><p> 本方案利用單片機的語音處理功能,以及其強大的處理能力,完成語音的合成技術(shù),再配合存儲器 ,擴大存儲容量,
7、很容就可以實現(xiàn)公交車報站器,從而為市民提供了更加人性化的服務(wù)。這些優(yōu)點使得本方案成為制作公交報站器一種最經(jīng)濟實用的選擇。</p><p><b> 1 系統(tǒng)總體方案</b></p><p> 公交報站系統(tǒng)的設(shè)計要求報站系統(tǒng)可以完整地播放一條公交線路的站名。可以在顯示屏上顯示當(dāng)前的時間,具有時間日期的設(shè)置功能,還可以播放音樂或廣告。經(jīng)過查閱資料,可選方案有基于MP3
8、/U盤的公交車報站設(shè)計,基于GPS的公交車報站器系統(tǒng)設(shè)計和基于SPCE061A的公交車報站系統(tǒng)設(shè)計等.</p><p> 1.1 公交車報站器可選方案</p><p> 1.1.1 基于MP3/U盤的公交車報站設(shè)計方案</p><p> 采用AT89C51SND1C單片機(內(nèi)部集成MP3解碼器)作為主控CPU及解碼MP3數(shù)據(jù),實現(xiàn)對報站信息播放、點陣字符顯
9、示、文件存儲以及用作優(yōu)盤功能時USB與PC機聯(lián)機的控制。利用FAT16在K9F1208上實現(xiàn)文件系統(tǒng),形成一個Windows可識別訪問的64MB尋址區(qū)域。結(jié)合USB控制器,系統(tǒng)可作為優(yōu)盤在Windows下使用,從而實現(xiàn)在Windows下對文件的管理以及數(shù)據(jù)存儲功能。這樣通過程序的設(shè)定,公交車可通過鍵盤實現(xiàn)MP3格式聲音信號的報站以及各種信息的廣播。列表文件在系統(tǒng)對閃存初始化時生成,系統(tǒng)在對閃存進行格式化的同時生成該名為SCHED-ULE
10、.LST的列表文件。該列表文件可在Windows下利用記事本打開,編輯所需播放的MP3名稱。播放報站信息的同時通過16個16×16的LED點陣顯示相應(yīng)的播放內(nèi)容。系統(tǒng)框圖如圖1.1所示。</p><p> 圖1.1 方案一系統(tǒng)框圖</p><p> 1.1.2 基于GPS的公交車自動報站系統(tǒng)設(shè)計方案</p><p> GPS的公交車自動報站系統(tǒng)利用G
11、PS,通過GPS接收單元接收衛(wèi)星發(fā)送的信號確認車輛的動態(tài)位置(經(jīng)度、緯度)、時間、狀態(tài)等信息,與公交線路信息庫中存儲的車站的位置進行比較,根據(jù)預(yù)先設(shè)定的距離和規(guī)則向乘客通報車站和線路的語音信息;并且能把車輛運行的詳細情況記錄下來,對公共汽車的運營狀況進行全程監(jiān)控并記錄。系統(tǒng)的組成見圖1.2。</p><p><b> 天線</b></p><p> 圖1.2 方案
12、二系統(tǒng)框圖</p><p> 1.1.3 基于SPCE061A的公交車報站系統(tǒng)設(shè)計方案</p><p> 系統(tǒng)以 SPCE061A 為核心,可以劃分為鍵盤輸入、數(shù)碼管顯示、SPR4096資源存儲與語音播放等部分,如圖1.3所示。SPCE061A作為整個系統(tǒng)的核心控制,并且負責(zé)語音的輸出。SPR4096 作為語音資源的存儲介質(zhì)。LED鍵盤顯示模組作為時間顯示與用戶輸出設(shè)備.使用SPCE0
13、61A可以非常方便靈活的實現(xiàn)語音的錄放。兩路10位精度的DAC,只需要外接功放(SPY0030A)即可完成語音的播放。</p><p> 圖 1.3 方案三系統(tǒng)框圖 </p><p> 1.2 設(shè)計方案的可行性分析和選擇</p><p> 這三種方案各有各的優(yōu)勢?;贛P3/U盤的公交報站系統(tǒng)能夠作為U盤與電腦連接,可自行下載報站器的播放內(nèi)容,也可方便地更改播
14、放內(nèi)容,播放高品質(zhì)的音樂,無報站播放時可作為MP3播放器,提高公交車服務(wù)質(zhì)量。但是MP3操作頁面對于司機來說太小,分散過多的注意力,實用性不夠?;贕PS的公交報站系統(tǒng)用先進的衛(wèi)星定位,進站、出站自動播報站名及服務(wù)用語,準確、及時、完全不需要人工介入,實現(xiàn)了公交車報站器的完全智能化。國內(nèi)GPS語音自動報站系統(tǒng)處于試驗階段,可行性太小。基于SPCE061A公交報站系統(tǒng),SPCE061A芯片有語音處理能力使得系統(tǒng)設(shè)計簡化,外圍電路較少;另外
15、具有一套指令系統(tǒng)和集成開發(fā)環(huán)境易學(xué)易用效率較高。SPR4096能夠存儲大量語音數(shù)據(jù),符合任務(wù)書所給要求。</p><p> 1.3 公交車報站器的硬件框圖</p><p> 查閱各種相關(guān)資料,設(shè)計出公交報站系統(tǒng)。系統(tǒng)電路原理圖見附錄一。</p><p><b> 2 系統(tǒng)硬件設(shè)計</b></p><p> 硬件電
16、路設(shè)計可以分為單片機控制系統(tǒng)設(shè)計;語音存儲電路設(shè)計;音頻輸出電路設(shè)計;顯示電路設(shè)計。</p><p> 2.1 SPCE061A簡介 </p><p> SPCE061A型單片機是凌陽科技公司推出的一款16位微處理器,具有體積小、集成度高、易擴展、可靠性高、功耗低、結(jié)構(gòu)簡單、中斷處理能力強等特點,內(nèi)嵌32K字閃存FLASH,處理速度高,能夠很方便的完成普通單片機的功能,尤其適應(yīng)于數(shù)字語
17、音播報和識別等應(yīng)用領(lǐng)域,是數(shù)字語音識別與語音信號處理的理想產(chǎn)品,得到廣泛的應(yīng)用。</p><p> SPCE061A單片機的主要性能有:</p><p> ??16位 u’nSP 微處理器 </p><p> ??工作電壓(CPU)VDD 為 3.0~3.6V,(I/O)VDDH為 3.0~5.5V </p><p> ??CPU時鐘
18、:0.32~49.152MHz </p><p> ??內(nèi)置 2K字 SRAM </p><p> ??內(nèi)置 32K字FLASH </p><p> ??可編程音頻處理 </p><p><b> ??晶體振蕩器 </b></p><p> ??系統(tǒng)處于備用狀態(tài)下(時鐘處于停止?fàn)顟B(tài)),耗
19、電僅為 2uA/3.6V </p><p> ??2 個16 位可編程定時器/計數(shù)器(可自動預(yù)置初始計數(shù)值) </p><p> ??2 個10位 DAC(數(shù)/模轉(zhuǎn)換)輸出通道 </p><p> ??32 位通用可編程輸入/輸出通道 </p><p> ??14 個中斷源可來自定時器 A/B、時基、2 個外部時鐘源輸入和鍵喚醒 &l
20、t;/p><p> ??具備觸鍵喚醒的功能 </p><p> ??使用凌陽音頻編碼 SACM_S480 可以播放壓縮的語音資源 </p><p> ??鎖相環(huán) PLL 振蕩器提供系統(tǒng)時鐘信號 </p><p> ??32768Hz 實時時鐘 </p><p> ??7 通道10 位電壓模/數(shù)轉(zhuǎn)換器(ADC)和單
21、通道聲音模/數(shù)轉(zhuǎn)換器 </p><p> ??聲音模/數(shù)轉(zhuǎn)換器輸入通道內(nèi)置麥克風(fēng)放大器,并具有自動增益控制(AGC)功能 </p><p> ??具備串行設(shè)備接口 </p><p> ??具備低電壓復(fù)位功能和低電壓檢測功能 </p><p> ??內(nèi)置在線仿真電路接口 </p><p> ??具有 Watch
22、Dog 功能 </p><p> 圖2.1為 SPCE061A單片機的內(nèi)部結(jié)構(gòu)框圖: </p><p> 圖 2.1 SPCE061A 內(nèi)部結(jié)構(gòu)圖 </p><p> SPCE061A引腳排列如圖2.2所示,引腳功能如表2.1所示</p><p> 圖2.2 SPCE061A引腳圖</p><p> 表 2.
23、1 SPCE061A引腳功能表</p><p> 2.2 系統(tǒng)電源設(shè)計 </p><p> 圖2.3是電源部分的電路,61單片機的內(nèi)核工作電壓是3.3V,而IO口電壓可以是3.3V也可以是5V。公交蓄電池12V直流電壓經(jīng)過7805產(chǎn)生5V電壓,再經(jīng)過SPY0029后產(chǎn)生3.3V電壓分別給系統(tǒng)供電。</p><p> LM7805是常用的三端正電源穩(wěn)壓電路,使用
24、的是TO-220封裝,能提供直流電源5V的輸出電壓,內(nèi)含短路和熱過載保護電路,應(yīng)用范圍非常廣泛。帶散熱片時能持續(xù)提供1A的電流,如果使用外圍器件,它還能提供不同的電壓和電流。它有三個引腳,引腳1為輸入電壓,引腳2為+5V輸出電壓,引腳3接地。</p><p> SPY0029是凌陽公司設(shè)計的電壓調(diào)整IC,采用CMOS工藝,具有靜態(tài)電流低,驅(qū)動能力強,線性調(diào)整出色等特點。它有三個引腳,引腳1接地,引腳2為輸入電壓
25、,引腳3為輸出電壓。</p><p> 圖2.3 單片機電源電路</p><p> 2.3 語音存儲電路設(shè)計 </p><p> 因為SPCE061A的FLASH只有32K字,要存放大量的語音資源,就要外擴存儲器。本次設(shè)計選用SPR4096芯片。</p><p> 2.3.1 SPR4096芯片簡介 </p><
26、p> SPR4096是一個高性能的4M-bit(512K×8-bit)FLASH,分為256個扇區(qū)(Sector),每個扇區(qū)為2KB。SPR4096還內(nèi)置了一個4K×8bit的SRAM。</p><p> SPR4096內(nèi)置了一個總線存儲器接口和一個串行接口,它允許單片機通過8bit并行模式或者1bit串行模式訪問FLASH/SRAM存儲區(qū)。本設(shè)計使用品行模式,串行接口的工作頻率可達
27、5MHz.有兩個電源輸入端VDDI和VDDQ.VDDI是給內(nèi)部FLASH和控制邏輯供電的;VDDQ是專門為I/O供電的。最大讀電流為2mA。</p><p> SPR4096按串行接口模式工作,要把CF2~CF0 均接高電平。CF7為低電平時選中FLASH,高電平時選中SRAM.</p><p> 3.3.2 語音存儲電路 </p><p> 圖2.4是SPR
28、4096與單片機的硬件連接圖。SPR4096 的SCK接SPCE061A的IOB0,SDA接 SPCE061A的IOB1。CF0~CF2 接高電平,CF7 接低電平,選中FLASH。 </p><p> 圖2.4 SPR4096電路圖</p><p> 2.4 音頻輸出電路設(shè)計</p><p> SPCE061A內(nèi)置2路10位精度的 DAC,芯片輸出的音頻信號
29、功率較小,在報站時要求比較大的聲音,就要對芯片輸出的聲音信號進行功率放大,因此電路選用了SPY0030音頻功率放大電路。</p><p> 圖2.5為音頻輸出電路。SPCE061A的音頻輸出采用雙通道數(shù)/模轉(zhuǎn)換DAC方式,即數(shù)字信號通過10位DAC轉(zhuǎn)換成3mA驅(qū)動的電流模擬信號輸出。語音提示輸出直接采用DAC通道,經(jīng)信號放大后,由SPEAKER(揚聲器)輸出。</p><p> 圖2.
30、5 音頻輸出電路</p><p> SPY0030芯片是一個音頻驅(qū)動,其增益可以通過外部電阻(最長增益調(diào)整為20)。它的輸出功率約700mW,電壓可調(diào)范圍很廣(2.4V-6.8V),具有雙端輸出模式,低失真,低待機電流等特點。簡單易用,僅需2.4V(兩顆電池)即可工作。圖2.6為SPY0030芯片的引腳圖。表2.2為引腳功能表。</p><p> 圖 2.6 SPY0030芯片引腳圖&
31、lt;/p><p> 表2.2 SPY0030芯片引腳功能表</p><p> 2.5 顯示電路設(shè)計 </p><p> 圖2.7為顯示電路圖。整個顯示過程中采用動態(tài)顯示,即六位顯示器逐一輪流顯示,每位持續(xù) 1ms,10ms或 20ms之內(nèi)循環(huán)一遍,刷新速度不要小于每秒三十楨。由于視覺暫留,我們看到的便是6只顯示器同時在顯示。</p><p&g
32、t; 圖2.7 顯示電路圖 </p><p> 顯示電路中只要有ULN2003A、WD0521CX和WD05643CX等元器件組成。</p><p> ULN2003A:其內(nèi)部為三極管陣列,它的IN 腳相當(dāng)于三極管的B極,OUT較相當(dāng)于三極管的C極。若IN腳輸入高電平,對應(yīng)的OUT腳接地;IN腳輸入低電平,對應(yīng)的OUT腳截止輸出。 </p><p>
33、WD0521CX:共陰極2位數(shù)碼管.a~dp為數(shù)碼管的段信號,G1、G2為2位數(shù)碼管的位信號。段信號高有效,位信號低有效。</p><p> WD05643CX:共陰極4位數(shù)碼管.a~dp為數(shù)碼管的段信號,d1、d2為時鐘冒號的段信號;G1~G4 為4位數(shù)碼管的位信號,G5為時鐘冒號的位信號。段信號高有效,位信號低有效。</p><p> 2.6 鍵盤電路設(shè)計</p>&
34、lt;p> 鍵盤輸入電路如圖2.8所示。各按鍵功能不同,根據(jù)各按鍵功能列出表2.3.</p><p> 圖 2.8 鍵盤輸入電路 </p><p> 表2.3 鍵盤各按鍵功能表</p><p><b> 3 系統(tǒng)軟件設(shè)計 </b></p><p><b> 3.1 語音處理</b>&
35、lt;/p><p> 語音處理是建立在語言學(xué)和數(shù)字信號處理基礎(chǔ)之上的綜合學(xué)科。語音處理大致可以分為 A/D 采樣輸入、編碼處理、存儲、解碼處理以及 D/A 等。</p><p> SPCE061A 是16位單片機,有2個16位定時/計數(shù)器;CPU 時鐘最高達49MHz ,16 位乘法器和內(nèi)積運算,有能力執(zhí)行復(fù)雜壓縮算法,有完善的語音處理函數(shù)庫支持等。這些都無疑為語音的播放、錄放、合成及識別
36、提供了條件。</p><p> 3.1.1 壓縮存儲</p><p> 采樣輸入是指音頻采樣和量化,將模擬的(連續(xù)的)聲音波形數(shù)字化(離散化);語音信號的時域分析,直接利用語音信號的時域波形進行分析;語音信號的頻域分析,對語音信號的頻譜、功率譜等進行分析;語音信號的線性預(yù)測分析,把語音信號用一個模型來表示,利用模型的參數(shù)來描述語音信號的波形和頻譜特性。</p><p
37、> 編碼處理采用壓縮編碼,它具有高效存儲和高速傳輸?shù)忍攸c。壓縮編碼可分為三類:</p><p> 1. 波形編碼:sub-band即SACM_A2000。特點:高質(zhì)量、高碼率,適于高保真語音/音樂。 </p><p> 2. 參數(shù)編碼:聲碼器(vocoder)模型表達,抽取參數(shù)與激勵信號進行編碼。如:SACM_S240。特點:壓縮比大,計算量大,音質(zhì)不高,廉價! </
38、p><p> 3. 混合編碼:CELP即SACM_S480。特點:綜合參數(shù)和波形編碼之優(yōu)點。 </p><p> 本次系統(tǒng)設(shè)計方案采用混合編碼方式。</p><p> 壓縮分無損壓縮和有損壓縮。無損壓縮一般指:磁盤文件,壓縮比低:2:1~4:1。而有損壓縮則是指:音/視頻文件,壓縮比可高達 100:1。 </p><p> 凌陽音頻
39、壓縮算法根據(jù)不同的壓縮比分為以下幾種: </p><p> SACM_A2000:壓縮比為8:1,8:1.25,8:1.5 </p><p> SACM_S480: 壓縮比為80:3,80:4.5 </p><p> SACM_S240: 壓縮比為80:1.5 </p><p> 按音質(zhì)排序:A2000>S480>
40、;S240 </p><p> 壓縮算法中SACM_A2000、 SACM_S480、 SACM_S240 主要是用來放音,可用于語音提示,而DVR則用來錄放音。</p><p> 3.1.2 語音識別 </p><p> 語音的識別可分為下列幾個部分:預(yù)處理,語音信號數(shù)字化;特征提取,抽取反應(yīng)語音本質(zhì)的特征參數(shù),形成特征矢量序列;語音模型庫,從一個或多個
41、講話者多次重復(fù)講話中提取的語音參數(shù)模板;模式匹配,把輸入語音的特征參數(shù)與語音模型庫進行比較分析,得到識別結(jié)果。識別的過程可用圖3.1表示。</p><p> 圖3.1 語音的識別</p><p> 3.1.3 語音合成</p><p> 語音合成是將以其他方式表示或存儲的信息轉(zhuǎn)換成語音。最常見的語音合成技術(shù)是將文本轉(zhuǎn)換為語音(TTS)。文本轉(zhuǎn)換成語音如圖3.2
42、所示。</p><p> 圖3.2 文本轉(zhuǎn)換成語音圖</p><p> 3.2 主函數(shù)流程圖</p><p> 在主函數(shù)中完成SPR4096 的初始化、鍵盤、顯示的初始化,并且進行顯示時間與播報公交車報站的站點,然后進入循環(huán)根據(jù)鍵盤的值執(zhí)行相關(guān)的操作。</p><p> 主函數(shù)流程圖如圖3.3所示。</p><p&
43、gt; 圖3.3 主函數(shù)流程圖 </p><p><b> 主函數(shù)程序:</b></p><p> int main(void)</p><p><b> {</b></p><p> unsigned int uiKey;//鍵盤值</p><p> u
44、nsigned int uiOn_Off;//數(shù)碼管顯示或不顯示標志</p><p> unsigned int uiKey1_Count;//key1按下次數(shù)</p><p> unsigned int uiKey2_Count;//key2按下次數(shù)</p><p> unsigned int uiflag;//按鍵key1、key2的奇
45、偶標志</p><p> unsigned int uiTemp;//臨時變量</p><p> uiOn_Off = 0;//局部變量初始化</p><p> uiKey1_Count = 0;//</p><p> uiKey2_Count = 16;//</p><p> uifla
46、g = 0;</p><p> SP_SIOInitial();//初始化SPR模組,SPR4096</p><p> DIG_Init();//初始化數(shù)碼管</p><p> Key_Init();//初始化鍵盤</p><p> Time_Init();//初始化顯示時間</p><p
47、> DIG_Set(1,0);</p><p> DIG_Set(2,0);</p><p> DIG_Set(3,Data[uiHour_H]);</p><p> DIG_Set(4,Data[uiHour_L]);</p><p> DIG_Set(5,Data[uiMinite_H]);</p><
48、p> DIG_Set(6,Data[uiMinite_L]);</p><p> Broadcast(52);//播放站點</p><p><b> while(1)</b></p><p><b> {</b></p><p> if(uiDisp == 0)//顯示時
49、間</p><p><b> {</b></p><p> DIG_Set(1,0);</p><p> DIG_Set(2,0);</p><p> DIG_Set(3,Data[uiHour_H]);</p><p> DIG_Set(4,Data[uiHour_L]);</p
50、><p> DIG_Set(5,Data[uiMinite_H]);</p><p> DIG_Set(6,Data[uiMinite_L]);</p><p><b> }</b></p><p> if(uiDisp == 1)//顯示月日</p><p><b> {&l
51、t;/b></p><p> DIG_Set(1,Data[uiMonth_H]);</p><p> DIG_Set(2,Data[uiMonth_L]);</p><p> DIG_Set(3,0x0077);</p><p> DIG_Set(4,Data[uiDay_H]);</p><p>
52、DIG_Set(5,Data[uiDay_L]);</p><p> DIG_Set(6,0x007f);</p><p><b> }</b></p><p> if(uiDisp == 2)//顯示年</p><p><b> {</b></p><p>
53、DIG_Set(1,0x0040);</p><p> DIG_Set(2,Data[uiYear_H]);</p><p> DIG_Set(3,Data[uiYear_MH]);</p><p> DIG_Set(4,Data[uiYear_ML]);</p><p> DIG_Set(5,Data[uiYear_L]);<
54、/p><p> DIG_Set(6,0x0040);</p><p><b> }</b></p><p> uiKey = Key_Get();//得到鍵值,掃建程序在128Hz中斷中調(diào)用</p><p> switch(uiKey)</p><p><b> {</
55、b></p><p> case KEY1:</p><p> uiA2000_S480 = 0;//選擇S480放音,在中斷FIQ</p><p> uiKey = 0;</p><p> if(uiflag < 1)</p><p><b> {</b></
56、p><p> uiKey1_Count++;</p><p> NextStation(uiKey1_Count);//播放提示下一站***</p><p> uiflag = 1;</p><p><b> }</b></p><p><b> else</b>&l
57、t;/p><p><b> {</b></p><p> uiflag = 0;</p><p> ComingStation(uiKey1_Count);//****站到了***</p><p><b> }</b></p><p> if(uiKey1_Count
58、== 16)</p><p><b> {</b></p><p> uiKey1_Count = 0;//如果是終點站,重新初始化</p><p><b> }</b></p><p><b> break;</b></p><p>
59、case KEY2:</p><p> uiA2000_S480 = 0;</p><p> if(uiflag == 0)</p><p><b> {</b></p><p> uiKey2_Count--;</p><p> NextStation(uiKey2_Count);&l
60、t;/p><p> uiflag = 1;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> uiflag = 0;</p><p>
61、 ComingStation(uiKey2_Count);</p><p><b> }</b></p><p> if(uiKey2_Count == 0)</p><p><b> {</b></p><p> uiKey2_Count = 16;</p><p>
62、;<b> }</b></p><p><b> break;</b></p><p> case KEY3:</p><p> uiA2000_S480 = 0;</p><p> PlaySnd_S480(65,3);//播放提示語,車在運行中,請做好扶穩(wěn)</p>&
63、lt;p><b> break;</b></p><p> case KEY4:</p><p> uiA2000_S480 = 0;</p><p> PlaySnd_S480(67,3);//請讓座</p><p><b> break;</b></p>&
64、lt;p> case KEY5:</p><p><b> //廣告或娛樂</b></p><p> uiA2000_S480 = 1;</p><p> PlaySnd_A2000(70,3);</p><p><b> break;</b></p><p>
65、; case KEY6:</p><p> g_4Hz_On = 1;//進入4Hz中斷代碼,實現(xiàn)閃爍效果</p><p> uiSetflag++;</p><p> Set_Time();//設(shè)置時間</p><p><b> break;</b></p><p>
66、 case KEY7:</p><p> uiKey = 0;</p><p> uiDisp++;//切換顯示時間/月日/年</p><p> if(uiDisp == 3)</p><p> uiDisp = 0;</p><p> if(uiDisp == 0)</p>&l
67、t;p><b> {</b></p><p> uiTemp = *P_INT_Ctrl_New;//打開2Hz中斷,顯示秒針</p><p> uiTemp |= C_IRQ5_2Hz;</p><p> *P_INT_Ctrl_New = uiTemp;</p><p><b> }<
68、;/b></p><p><b> else</b></p><p><b> {</b></p><p> uiTemp = *P_INT_Ctrl_New;//關(guān)閉2Hz中斷,不顯示秒針</p><p> uiTemp &= 0xfffb;</p><
69、p> *P_INT_Ctrl_New = uiTemp;</p><p> uiTemp = *P_IOB_Buffer;</p><p> uiTemp &= 0xfffb;</p><p> *P_IOB_Data = uiTemp;</p><p><b> }</b></p>
70、<p><b> break;</b></p><p> case KEY8:</p><p> if(uiOn_Off == 0)</p><p><b> {</b></p><p> DIG_Off();//關(guān)閉數(shù)碼管</p><p>
71、 uiOn_Off = 1;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> DIG_On();//打開數(shù)碼管</p><p> uiOn_Of
72、f = 0;</p><p><b> }</b></p><p><b> break;</b></p><p><b> default:</b></p><p><b> break;</b></p><p>&l
73、t;b> }</b></p><p> *P_Watchdog_Clear = 0x0001;//清看門狗</p><p><b> }</b></p><p><b> }</b></p><p> 3.3 初始化函數(shù) </p><p>
74、 系統(tǒng)要對 SPR4096、鍵盤、顯示、時間初始化。</p><p> SPR4096初始化流程圖如圖3.4所示。</p><p> 圖3.4 spr4096 初始化 </p><p> SPR4096初始化程序如下:</p><p> .PUBLIC_SP_SIOInitial</p><p>
75、 _SP_SIOInitial:.PROC</p><p><b> //系統(tǒng)時鐘設(shè)定</b></p><p> r1 = 0x0098; //Fosc=49mHz </p><p> [P_SystemClock] = r1;</p><p> r1 = [P_IOB_Dir];</p&
76、gt;<p> r1 |= 1;//set bit0 output for sck</p><p> [P_IOB_Dir] = r1;</p><p> r1 = [P_IOB_Attrib];</p><p> r1 |= 1;//buffer output</p><p> [P_IOB_
77、Attrib] = r1;</p><p> r1 = [P_IOB_Buffer];</p><p> r1 |= 1;//output high</p><p> [P_IOB_Data] = r1;</p><p><b> retf</b></p><p><b&
78、gt; .ENDP</b></p><p> 鍵盤初始化流程圖如圖3.5所示,</p><p> 圖3.5 鍵盤初始化 </p><p> 鍵盤初始化程序如下: </p><p> F_Key_Init:</p><p> _Key_Init:</p><p> pus
79、h r1 to [sp]</p><p><b> INT Off</b></p><p> r1 = [P_Key_Dir]// 初始化IO為下拉輸入</p><p> r1 &= ~Key_ALL</p><p> [P_Key_Dir] = r1</p><p>
80、r1 = [P_Key_Attrib]</p><p> r1 &= ~Key_ALL</p><p> [P_Key_Attrib] = r1</p><p><b> r1 = 0</b></p><p> [ScanCnt] = r1// 初始化變量</p><p>
81、; [KeyCode] = r1</p><p> [KeyUp] = r1</p><p> r1 = C_TMB2_128Hz// 開啟IRQ6_TMB2(128Hz)中斷</p><p> [P_TimeBase_Setup] = r1</p><p> r1 = [P_INT_Mask]</p><
82、;p> r1 |= C_IRQ6_TMB2</p><p> [P_INT_Mask] = r1</p><p> INT FIQ,IRQ</p><p> pop r1 from [sp]</p><p><b> Retf</b></p><p><b> .END
83、P</b></p><p> 數(shù)碼管初始化流程圖如圖3.6所示,</p><p> 圖3.6 數(shù)碼管初始化 </p><p> 數(shù)碼管初始化程序如下:</p><p> _DIG_Init:</p><p> F_DIG_Init:</p><p> push r
84、1,bp to [sp]</p><p><b> INT Off</b></p><p> r1 = DIG_Count</p><p> r2 = 0x0000</p><p> bp = R_DIG_Buf</p><p> ?DIG_InitBuf://Clear Dis
85、play Buffer</p><p> [bp++] = r2</p><p><b> r1 -= 1</b></p><p> jnz ?DIG_InitBuf</p><p> [R_CurDIG] = r2//Reset Dig Pointer</p><p> r1 =
86、 [P_SEG_Attrib]//Initial IO Ports for Seg</p><p> r1 |= PIN_SEG_ALL</p><p> [P_SEG_Attrib] = r1</p><p> r1 = [P_SEG_Buf]</p><p> r1 &= ~PIN_SEG_ALL</p>
87、<p> [P_SEG_Data] = r1</p><p> r1 = [P_SEG_Dir]</p><p> r1 |= PIN_SEG_ALL</p><p> [P_SEG_Dir] = r1</p><p> r1 = [P_DIG_Attrib]//Initial IO Ports for Dig<
88、;/p><p> r1 |= PIN_DIG_ALL</p><p> [P_DIG_Attrib] = r1</p><p> r1 = [P_DIG_Buf]</p><p> r1 &= ~PIN_DIG_ALL</p><p> [P_DIG_Buf] = r1</p><p&
89、gt; r1 = [P_DIG_Dir]</p><p> r1 |= PIN_DIG_ALL</p><p> [P_DIG_Dir] = r1</p><p> r1 = [P_INT_Mask]//Enable IRQ4_4KHz Int</p><p> r1 |= C_IRQ4_4KHz</p><
90、p> [P_INT_Mask] = r1</p><p> INT FIQ,IRQ</p><p> pop r1,bp from [sp]</p><p><b> retf</b></p><p><b> .ENDP</b></p><p> 時間初始
91、化流程圖如圖3.7所示。</p><p> 圖3.7 時間初始化</p><p><b> 時間初始化程序:</b></p><p> void Time_Init(void)</p><p><b> {</b></p><p> unsigned int uiT
92、emp;</p><p> uiTemp = *P_IOB_Dir;//設(shè)置IOB2為高電平輸出</p><p> uiTemp |= 0x0004;</p><p> *P_IOB_Dir = uiTemp;</p><p> uiTemp = *P_IOB_Attrib;</p><p> uiTem
93、p |= 0x0004;</p><p> *P_IOB_Attrib = uiTemp;</p><p> uiTemp = *P_IOB_Data;</p><p> uiTemp |= 0x0004;</p><p> *P_IOB_Data = uiTemp;</p><p> uiTemp = *P
94、_INT_Ctrl_New;//開2Hz、4Hz中斷</p><p> uiTemp |= C_IRQ5_2Hz;</p><p> uiTemp |= C_IRQ5_4Hz;</p><p> *P_INT_Ctrl_New = uiTemp;</p><p><b> }</b></p>&l
95、t;p> 3.4 語音播放的實現(xiàn) </p><p> 由于語音資源存儲在外廓的存儲器 SPR4096 上面,要實現(xiàn)語音播放必須采用手動方式。需要獲得語音資源,關(guān)鍵解決語音資源的起始地址,然后通過讀取函數(shù)獲得語音資源。函數(shù)流程圖如圖3.8所示。 </p><p> 圖3.8 手動方式播放流程圖 </p><p><b> 手動方式播放程序:&l
96、t;/b></p><p> void PlaySnd_A2000(unsigned int SndIndex,unsigned int DAC_Channal)</p><p><b> {</b></p><p> unsigned int uiStatus;// 語音播放狀態(tài)</p><p>
97、 unsigned int uiRet;// 存儲語音資源</p><p> unsigned long ulCon_AddrHighest;// 語音資源的最高字節(jié)地址</p><p> unsigned long ulCon_AddrHigh;// 語音資源的高字節(jié)地址</p><p> unsigned long ulCon_AddrLo
98、w;// 語音資源的低字節(jié)地址</p><p> unsigned long ulCon_AddrLowest;// 語音資源的最低字節(jié)地址</p><p> unsigned long ulCon_EndAddr;// 語音資源的末地址</p><p> unsigned long ulCon_StartAddr;</p><
99、p> unsigned int uiKey;</p><p> ulCon_AddrHighest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12);// 第一個播放文件地址</p><p> ulCon_AddrHighest = ulCon_AddrHighest << 24;</p><
100、;p> ulCon_AddrHigh = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+1);</p><p> ulCon_AddrHigh = ulCon_AddrHigh << 16;</p><p> ulCon_AddrLow = SP_SIOReadAByte(BASE_START_ADDRESS +
101、SndIndex*12+2);</p><p> ulCon_AddrLow = ulCon_AddrLow << 8;</p><p> ulCon_AddrLowest = SP_SIOReadAByte(BASE_START_ADDRESS + SndIndex*12+3);</p><p> ulCon_StartAddr = ulCon_
102、AddrHighest | ulCon_AddrHigh// 開始地址</p><p> | ulCon_AddrLow | ulCon_AddrLowest;</p><p> ulCon_AddrHighest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12);ulCon_AddrHighest = ulCon_Addr
103、Highest << 24;</p><p> ulCon_AddrHigh = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+1);</p><p> ulCon_AddrHigh = ulCon_AddrHigh << 16;</p><p> ulCon_AddrLow = SP_S
104、IOReadAByte(BASE_END_ADDRESS + SndIndex*12+2);</p><p> ulCon_AddrLow = ulCon_AddrLow << 8;</p><p> ulCon_AddrLowest = SP_SIOReadAByte(BASE_END_ADDRESS + SndIndex*12+3);</p><p&
105、gt; ulCon_EndAddr = ulCon_AddrHighest | ulCon_AddrHigh// 結(jié)束地址</p><p> | ulCon_AddrLow | ulCon_AddrLowest;</p><p> SACM_A2000_Initial(0);//初始化放音</p><p> SACM_A2000_I
106、nitQueue();//初始化隊列</p><p> SACM_A2000_InitDecoder(DAC_Channal);//初始化解碼</p><p> uiStatus = 1;//初始化放音狀態(tài)</p><p> while(uiStatus)</p><p><b> {&
107、lt;/b></p><p> while(SACM_A2000_TestQueue() != 1)//解碼隊列是否為空</p><p><b> {</b></p><p> if(ulCon_StartAddr >= ulCon_EndAddr)//文件結(jié)束?</p><p><b&g
108、t; {</b></p><p> uiStatus = 0;//如果文件結(jié)束,結(jié)束放音</p><p><b> break;</b></p><p><b> }</b></p><p> uiRet = SP_SIOReadAWord(ulCon_Start
109、Addr);//取得語音資源</p><p> SACM_A2000_FillQueue(uiRet);//填充解碼隊列</p><p> ulCon_StartAddr++;//移動資源指針</p><p> ulCon_StartAddr++;</p><p><b> }</b></
110、p><p> if(uiStatus)//解碼</p><p><b> {</b></p><p> SACM_A2000_Decoder();</p><p><b> }</b></p><p> else//停止放音</
111、p><p><b> {</b></p><p> SACM_A2000_Stop();</p><p><b> }</b></p><p> uiKey = Key_Get();</p><p> if(uiKey != 0)</p><p>
112、; uiStatus = 0;</p><p> *(unsigned int *)0x7012 = 0x0001;</p><p><b> }</b></p><p><b> }</b></p><p><b> 3.5 更新時間 </b></p>
113、<p> 可以使用SPCE061A單片機的2Hz時基中斷,在 2Hz 時基中斷中調(diào)用更新函數(shù),函數(shù)要作的就是換算好進位的關(guān)系。比如 60 秒進位 1 分鐘,然后秒清零。</p><p><b> 更新時間程序如下:</b></p><p> void Time_Run(void)</p><p><b> {<
114、;/b></p><p><b> //更新時分</b></p><p> if(g_uiSecond_half == 120)</p><p><b> {</b></p><p> g_uiSecond_half = 0;</p><p> uiMinit
115、e_L++;</p><p><b> }</b></p><p> if(uiMinite_L == 10)</p><p><b> {</b></p><p> uiMinite_L = 0;</p><p> uiMinite_H++;</p>
116、<p><b> }</b></p><p> if(uiMinite_H == 6)</p><p><b> {</b></p><p> uiMinite_H = 0;</p><p> uiHour_L++;</p><p><b>
117、 }</b></p><p> if((uiHour_H == 2)&&(uiHour_L == 4))</p><p><b> {</b></p><p> uiHour_H = 0;</p><p> uiHour_L = 0;</p><p> uiD
118、ay_L++;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(uiHour_L == 10)</p><p><b> {</b&
119、gt;</p><p> uiHour_L = 0;</p><p> uiHour_H++;</p><p><b> }</b></p><p><b> }</b></p><p><b> 3.6 設(shè)置時間 </b></p>
120、<p> 在設(shè)置時間時出現(xiàn)動態(tài)閃爍效果,這個問題使用 4Hz 的時基中斷改變標志位,在設(shè)置時間函數(shù)中根據(jù)這個標志位顯示或關(guān)閉數(shù)碼管,出現(xiàn)閃爍效果。時間設(shè)置流程圖如圖3.9所示.</p><p> 圖 3.9 時間設(shè)置流程圖</p><p><b> 時間設(shè)置程序如下:</b></p><p> void Set_Time(
121、void)</p><p><b> {</b></p><p> unsigned int uiKey;</p><p> unsigned int uiTemp;</p><p><b> while(1)</b></p><p><b> {<
122、;/b></p><p> uiKey = Key_Get();</p><p> *P_Watchdog_Clear = 0x0001;</p><p><b> //調(diào)整分鐘</b></p><p> if(uiSetflag == 1)</p><p><b> {
123、</b></p><p> if(g_Light == 1)</p><p><b> {</b></p><p> DIG_Set(3,Data[uiHour_H]);</p><p> DIG_Set(4,Data[uiHour_L]);</p><p> DIG_Set
124、(5,Data[uiMinite_H]);</p><p> DIG_Set(6,Data[uiMinite_L]);</p><p><b> }</b></p><p> if(g_Light == 0)</p><p><b> {</b></p><p>
125、DIG_Set(3,Data[uiHour_H]);</p><p> DIG_Set(4,Data[uiHour_L]);</p><p> DIG_Set(5,0);</p><p> DIG_Set(6,0);</p><p><b> }</b></p><p> switch(
126、uiKey)</p><p><b> {</b></p><p> case KEY6:</p><p> uiSetflag = 2;</p><p> uiKey = 0;</p><p><b> break;</b></p><p>
127、; case KEY7:</p><p> uiMinite_L++;</p><p> if(uiMinite_L == 10)</p><p><b> {</b></p><p> uiMinite_L = 0;</p><p> uiMinite_H++;</p>
128、<p> if(uiMinite_H == 6)</p><p> uiMinite_H = 0;</p><p><b> }</b></p><p><b> break;</b></p><p> case KEY8:</p><p> uiMi
129、nite_L--;</p><p> if(uiMinite_L == 0xffff)</p><p><b> {</b></p><p> uiMinite_L = 9;</p><p> uiMinite_H--;</p><p> if(uiMinite_H == 0xffff)
130、</p><p> uiMinite_H = 5;</p><p> }</p><p><b> break;</b></p><p><b> default:</b></p><p><b> break;</b><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公交車報站課程設(shè)計
- 單片機課程設(shè)計---公交車自動報站系統(tǒng)
- 課程設(shè)計-單片機原理公交車語音報站系統(tǒng)設(shè)計
- 嵌入式課程設(shè)計--公交車語音報站系統(tǒng)
- 課程設(shè)計——基于單片機的公交車報站器設(shè)計
- GPS公交自動報站系統(tǒng)設(shè)計.pdf
- 畢業(yè)設(shè)計---公交車報站系統(tǒng)的設(shè)計
- 公交報站畢業(yè)設(shè)計
- 城市公交自動報站系統(tǒng)設(shè)計開題報告
- 畢業(yè)設(shè)計---公交車自動報站系統(tǒng)的設(shè)計
- 智能公交車報站系統(tǒng)設(shè)計【開題報告】
- 公交車自動報站系統(tǒng)的設(shè)計-畢業(yè)設(shè)計
- 基于單片機的公交報站系統(tǒng)設(shè)計【畢業(yè)設(shè)計】
- 公交車自動報站系統(tǒng)畢業(yè)設(shè)計
- 公交車自動報站系統(tǒng)畢業(yè)設(shè)計
- 公交車自動報站的系統(tǒng)畢業(yè)設(shè)計
- 模擬公交車報站系統(tǒng)設(shè)計【文獻綜述】
- 公交車載報站顯示系統(tǒng)的設(shè)計和開發(fā).pdf
- 基于STM32的公交語音報站系統(tǒng)設(shè)計.doc
- 畢業(yè)設(shè)計--公交車自動報站系統(tǒng)的硬件設(shè)計原理
評論
0/150
提交評論