版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課程設(shè)計(jì)說(shuō)明書(shū)(論文)</p><p> 課程名稱(chēng): 單片機(jī)課程設(shè)計(jì) </p><p> 設(shè)計(jì)題目: 智能控制小車(chē) </p><p> 院 系:電氣學(xué)院自動(dòng)控制與測(cè)試系</p><p> 班 級(jí): </p><p>&l
2、t;b> 課程設(shè)計(jì)考核表</b></p><p> 題目: 智能聲控小車(chē)</p><p><b> 實(shí)驗(yàn)部分考核</b></p><p><b> 總結(jié)報(bào)告評(píng)分</b></p><p> 總成績(jī): 指導(dǎo)教師簽字:<
3、;/p><p><b> 大學(xué)課程設(shè)計(jì)任務(wù)書(shū)</b></p><p> *注:此任務(wù)書(shū)由課程設(shè)計(jì)指導(dǎo)教師填寫(xiě)</p><p><b> 單片機(jī)課設(shè)報(bào)告</b></p><p><b> 一、課設(shè)目的及要求</b></p><p><b>
4、?。?)課題目的</b></p><p> 通過(guò)設(shè)計(jì)一個(gè)由單片機(jī)控制的智能小車(chē)來(lái)熟悉模塊化編程方法,掌握單片機(jī)C語(yǔ)言的程序設(shè)計(jì)和調(diào)試方法,并理解單片機(jī)的原理、結(jié)構(gòu)、指令、運(yùn)行模式功能模塊及應(yīng)用開(kāi)發(fā)方法。</p><p> (2)課題意義及單片機(jī)發(fā)展現(xiàn)狀 </p><p> 語(yǔ)音處理技術(shù)是一門(mén)新興的技術(shù),它不僅包括語(yǔ)音的錄制和播放,還涉及語(yǔ)音的壓縮編
5、碼和解碼,語(yǔ)音的識(shí)別等各種處理技術(shù)。以往做這方面的設(shè)計(jì),一般有兩個(gè)途徑:一種方案是單片機(jī)擴(kuò)展設(shè)計(jì),另一種就是借助于專(zhuān)門(mén)的語(yǔ)音處理芯片。普通的單片機(jī)往往不能實(shí)現(xiàn)這么復(fù)雜的過(guò)程和算法,即使勉強(qiáng)實(shí)現(xiàn)也要加很多的外圍器件。專(zhuān)門(mén)的語(yǔ)音處理芯片也比較多,像ISD系列、PM50系列等,但是專(zhuān)門(mén)的語(yǔ)音處理芯片功能比較單一,想在語(yǔ)音之外的其他方面應(yīng)用基本是不可能的。</p><p> SPCE061A是凌陽(yáng)科技推出的一款16位μ
6、'nSP結(jié)構(gòu)的微控制器。該芯片帶有硬件乘法器,能夠?qū)崿F(xiàn)乘法運(yùn)算、內(nèi)積運(yùn)算等復(fù)雜的運(yùn)算。它不僅運(yùn)算能力強(qiáng),而且處理速度快,單周期最高可以達(dá)到49MHz。SPCE061A內(nèi)嵌32K字的FLASH程序存儲(chǔ)器以及2K的SRAM。同時(shí)該SOC芯片具有ADC和DAC功能,其MIC_ADC通道帶有AGC自動(dòng)增益環(huán)節(jié),能夠很輕松的將語(yǔ)音信號(hào)采集到芯片內(nèi)部,兩路10位的電流輸出型DAC,只要外接一個(gè)功放就可以完成聲音的播放。以上介紹的這些硬件資源
7、使得該SPCE061A能夠單芯片實(shí)現(xiàn)語(yǔ)音處理功能。</p><p> 借助于SPCE061A的語(yǔ)音特色,我們開(kāi)發(fā)出了這款語(yǔ)音控制小車(chē)。小車(chē)不僅具有前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)停車(chē)等基本功能;同時(shí)配合SPCE061A的語(yǔ)音特色,實(shí)現(xiàn)語(yǔ)音控制功能。(3)設(shè)計(jì)要求</p><p> 小車(chē)采用語(yǔ)音識(shí)別技術(shù),可通過(guò)語(yǔ)音命令對(duì)其行駛狀態(tài)進(jìn)行控制。 </p><p> 基本設(shè)計(jì)
8、任務(wù):前進(jìn)、倒車(chē)、左拐、右拐、停車(chē)的功能。</p><p> 附加設(shè)計(jì)任務(wù):S型前進(jìn)、左轉(zhuǎn)圈和右轉(zhuǎn)圈</p><p> 二、課題設(shè)計(jì)的主要內(nèi)容和具體實(shí)施方案</p><p><b> 主要內(nèi)容</b></p><p> 1. 可以通過(guò)簡(jiǎn)單的I/O操作實(shí)現(xiàn)小車(chē)的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)等功能; </p>
9、<p> 2. 配合SPCE061A的語(yǔ)音特色,利用系統(tǒng)的語(yǔ)音播放和語(yǔ)音識(shí)別資源,實(shí)現(xiàn)語(yǔ)音控制的功能; </p><p> 3. 可以在行走過(guò)程中聲控改變小車(chē)運(yùn)動(dòng)狀態(tài)</p><p><b> 實(shí)施方案</b></p><p><b> 方案論證:</b></p><p><
10、;b> 方案一:</b></p><p> 采用MCS-51系列單片機(jī)實(shí)現(xiàn),由于有語(yǔ)音識(shí)別和語(yǔ)音播放功能,所以需要擴(kuò)展語(yǔ)音識(shí)別模塊和語(yǔ)音播放模塊,這樣必然造成端口的資源緊張,所以還必須加入接口擴(kuò)展芯片。該實(shí)現(xiàn)方案結(jié)構(gòu)如下圖所示。</p><p><b> 方案二:</b></p><p> 采用SPCE061A實(shí)現(xiàn)語(yǔ)音
11、控制小車(chē)方案,由于SPCE061A內(nèi)部具有語(yǔ)音識(shí)別和語(yǔ)音播放功能,所以只需要擴(kuò)展基本的MIC和語(yǔ)音功放即可,該方案結(jié)構(gòu)如下圖所示。</p><p> 比較以上兩個(gè)方案,方案二結(jié)構(gòu)簡(jiǎn)單,易于操作,故選則方案二。</p><p><b> 方案實(shí)施:</b></p><p> ?、毕到y(tǒng)的結(jié)構(gòu)框圖如下圖:</p><p>
12、 系統(tǒng)組成主要包括以下兩部分:SPCE061A精簡(jiǎn)開(kāi)發(fā)板、語(yǔ)音小車(chē)控制電路板。</p><p> 圖中的語(yǔ)音輸入部分MIC_ IN、按鍵輸入KEY、聲音輸出部分的功率放大環(huán)節(jié)等已經(jīng)做到了精簡(jiǎn)開(kāi)發(fā)板——61板上,為我們使用提供了很大的方便。在電機(jī)的驅(qū)動(dòng)方面,采用全橋驅(qū)動(dòng)技術(shù),利用四個(gè)I/O端口分為兩組分別實(shí)現(xiàn)兩個(gè)電機(jī)的正傳、反轉(zhuǎn)和停三態(tài)運(yùn)行。</p><p><b> ?、蚕到y(tǒng)
13、控制方案</b></p><p> 小車(chē)的運(yùn)動(dòng)控制采用語(yǔ)音控制和中斷定時(shí)控制相結(jié)合,通過(guò)語(yǔ)音觸發(fā)小車(chē)動(dòng)作,小車(chē)動(dòng)作之后,隨時(shí)可以通過(guò)語(yǔ)音指令改變小車(chē)的運(yùn)動(dòng)狀態(tài)。在每一次動(dòng)作觸發(fā)的同時(shí)啟動(dòng)定時(shí)器,如果小車(chē)由于某些原因不能正常的接收語(yǔ)音指令,則只要定時(shí)時(shí)間到,中斷服務(wù)程序會(huì)發(fā)出指令讓小車(chē)停下來(lái)。</p><p><b> ?、耻?chē)體結(jié)構(gòu)介紹</b></p
14、><p> 語(yǔ)音控制小車(chē)為四輪結(jié)構(gòu),其中前面兩個(gè)車(chē)輪由前輪電機(jī)控制,在連桿和支點(diǎn)作用下控制前輪左右擺動(dòng),來(lái)調(diào)節(jié)小車(chē)的前進(jìn)方向。在自然狀態(tài)下,前輪在彈簧作用下保持中間位置。后面兩個(gè)車(chē)輪由后輪電機(jī)驅(qū)動(dòng),為整個(gè)小車(chē)提供動(dòng)力,所以又稱(chēng)前面的輪子為方向輪,后面的兩個(gè)輪子為驅(qū)動(dòng)輪,如下圖所示。</p><p><b> 小車(chē)的行走原理:</b></p><p&
15、gt; 直走:由小車(chē)的結(jié)構(gòu)分析,在自然狀態(tài)下,前輪在彈簧作用下保持中間狀態(tài),這是只要后輪電機(jī)正轉(zhuǎn)小車(chē)就會(huì)前進(jìn)。</p><p> 倒車(chē):倒車(chē)動(dòng)作和前進(jìn)動(dòng)作剛好相反,前輪電機(jī)仍然保持中間狀態(tài),后輪電機(jī)反轉(zhuǎn),小車(chē)就會(huì)向后運(yùn)動(dòng)。 </p><p> 左轉(zhuǎn):前輪電機(jī)逆時(shí)針旋轉(zhuǎn)(規(guī)定為正轉(zhuǎn)),后輪電機(jī)正轉(zhuǎn),這時(shí)小車(chē)就會(huì)在前后輪共同作用下朝左側(cè)前進(jìn)。 </p><p>
16、 右轉(zhuǎn):前輪電機(jī)反轉(zhuǎn),后輪電機(jī)正轉(zhuǎn),這時(shí)小車(chē)就是會(huì)在前后輪共同作用下朝右側(cè)前進(jìn)。</p><p><b> 小車(chē)控制板原理圖:</b></p><p> 控制板主要包括:接口電路、電源電路和兩路電機(jī)的驅(qū)動(dòng)電路。</p><p> 小車(chē)基本的運(yùn)行狀態(tài)與輸入的對(duì)照表如下</p><p><b> ⒋系統(tǒng)軟件
17、設(shè)計(jì)</b></p><p> 系統(tǒng)的總體程序流程如下圖</p><p> 語(yǔ)音識(shí)別小車(chē)的主程序分為四大部分:初始化部分、訓(xùn)練部分、識(shí)別部分、重訓(xùn)操作。</p><p> 初始化部分:初始化操作將IOB8~IOB11設(shè)置為輸出端,用以控制電機(jī)。</p><p> 訓(xùn)練部分:訓(xùn)練部分完成的工作就是建立語(yǔ)音模型。程序一開(kāi)始判斷
18、小車(chē)是否被訓(xùn)練過(guò),如果沒(méi)有訓(xùn)練過(guò)則要求對(duì)其進(jìn)行訓(xùn)練,并且會(huì)在訓(xùn)練成功之后將訓(xùn)練的模型存儲(chǔ)到FLASH,在以后使用時(shí)不需要重新訓(xùn)練;如果已經(jīng)訓(xùn)練過(guò)會(huì)把存儲(chǔ)在FLASH中的模型調(diào)出來(lái)裝載到辨識(shí)器中。</p><p> 由于凌陽(yáng)單片機(jī)的局限性,每次最多只能識(shí)別5條指令,因此在訓(xùn)練時(shí)對(duì)8條指令預(yù)先分為第一、第二兩組,每組4條指令。</p><p> 當(dāng)程序檢測(cè)到訓(xùn)練標(biāo)志位BS_Flag內(nèi)容為0
19、xffff,就會(huì)要求操作者對(duì)它進(jìn)行訓(xùn)練操作,訓(xùn)練采用兩次訓(xùn)練獲取結(jié)果的方式,以訓(xùn)練名字為例:小車(chē)首先會(huì)提示:給我取個(gè)名字吧,這時(shí)你可以告訴它一個(gè)名字(比如小車(chē));然后它會(huì)提示:請(qǐng)?jiān)僬f(shuō)一遍,這時(shí)再次告訴它名字(小車(chē)),如果兩次的聲音差別不大,小車(chē)就能夠成功的建立模型,名稱(chēng)訓(xùn)練成功;如果沒(méi)能夠成功的建立模型,小車(chē)會(huì)告知失敗的原因并要求重新訓(xùn)練。成功訓(xùn)練名稱(chēng)后會(huì)給出下一條待訓(xùn)練指令提示音:前進(jìn),參照名稱(chēng)訓(xùn)練方式訓(xùn)練前進(jìn)指令。依次訓(xùn)練小車(chē)的名稱(chēng)
20、——前進(jìn)指令——倒車(chē)指令——左轉(zhuǎn)指令——右轉(zhuǎn)指令——S型前進(jìn)指令——左轉(zhuǎn)圈指令——右轉(zhuǎn)圈指令,全部訓(xùn)練成功子程序返回,訓(xùn)練結(jié)束。</p><p> 識(shí)別部分:設(shè)定Result為辨識(shí)結(jié)果,team為組別標(biāo)識(shí)變量。預(yù)先加載第一組語(yǔ)音模型(team=0),程序運(yùn)行到左轉(zhuǎn)函數(shù)后隨即加載第二組語(yǔ)音模型。</p><p> 語(yǔ)音識(shí)別首先獲取辨識(shí)器的辨識(shí)結(jié)果,判斷是否有語(yǔ)音觸發(fā),如果有語(yǔ)音觸發(fā)則會(huì)返
21、回識(shí)別結(jié)果Result的值。如果Result是第二組(team=1)里面的命令,則該命令無(wú)效,跳出循環(huán)等待下一次命令;如果Result是第一組(team=0)里面的命令,則根據(jù)相應(yīng)的名稱(chēng)執(zhí)行相應(yīng)的動(dòng)作,并且重新設(shè)定team的值。為方便跳轉(zhuǎn),主程序里設(shè)置名稱(chēng)指令、前進(jìn)指令、后退指令執(zhí)行完畢后team清0,左拐指令執(zhí)行完畢后team置1,加載第二組語(yǔ)音模型。同理,在team置1的情況下,Result只識(shí)別第二組(team=1)的命令,對(duì)第一
22、組無(wú)視。第二組的命令里面,右拐指令、S型前進(jìn)指令、左轉(zhuǎn)圈指令執(zhí)行完畢后team置1,右轉(zhuǎn)圈指令執(zhí)行完畢后team清0,重新加載第一組命令。以此類(lèi)推。</p><p> 雖然已經(jīng)有了前進(jìn)、后退以及倒車(chē)等語(yǔ)音控制指令,但是考慮環(huán)境的干擾因素,小車(chē)運(yùn)行時(shí)的噪音影響和有效距離的限制,小車(chē)運(yùn)行后可能接收不到語(yǔ)音指令而一直運(yùn)行。為了防止出現(xiàn)這種情況,加入了時(shí)間控制,在啟動(dòng)小車(chē)運(yùn)行的同時(shí)啟動(dòng)定時(shí)器,定時(shí)器時(shí)間到停止小車(chē)的運(yùn)行
23、,該定時(shí)器借助于2Hz時(shí)基中斷完成,可以在程序中修改uiTimeset參數(shù)來(lái)控制運(yùn)行時(shí)間,當(dāng)uiTimeset=3時(shí),運(yùn)行時(shí)間為1.5s,以此類(lèi)推。</p><p> 注:查閱光盤(pán)資料,在轉(zhuǎn)彎之前首先讓前輪朝目標(biāo)方向的反方向偏轉(zhuǎn),然后再讓前輪朝目標(biāo)方向偏轉(zhuǎn),據(jù)說(shuō)這樣這樣前輪的擺動(dòng)范圍更大,慣性更大,轉(zhuǎn)向效果會(huì)更好,但實(shí)際操作歷來(lái)感覺(jué)效果一般。</p><p> 重訓(xùn)操作:考慮到有重新訓(xùn)
24、練的需求,設(shè)置了重新訓(xùn)練的按鍵(61板的KEY3),循環(huán)掃描該按鍵,一旦檢測(cè)到此鍵按下,則將擦除訓(xùn)練標(biāo)志位(0xe000單元),并等待復(fù)位。復(fù)位后,程序重新執(zhí)行,當(dāng)檢測(cè)到訓(xùn)練標(biāo)志位為0xffff時(shí)會(huì)要求重新對(duì)其進(jìn)行訓(xùn)練。</p><p> 三:課程設(shè)計(jì)中發(fā)現(xiàn)的問(wèn)題及解決方案</p><p> 由于電路板焊接與調(diào)試以及前期程序基本功能的實(shí)現(xiàn)均由謝思哲實(shí)現(xiàn),我這兒提出的都是加上拓展功能時(shí)出
25、現(xiàn)的各種問(wèn)題:</p><p> 1.制作音頻文件時(shí)程序始終播放不了。</p><p> 解決方法:一開(kāi)始以為是文件太大了識(shí)別不了,結(jié)果發(fā)現(xiàn)自己錄的音頻文件比系統(tǒng)自帶的還小,不是這個(gè)原因;后來(lái)發(fā)現(xiàn)是之前用window自帶的錄音機(jī)格式轉(zhuǎn)換的時(shí)候把格式弄錯(cuò)導(dǎo)致,改回去便可。</p><p> 2.添加命令時(shí),需要添加相應(yīng)的音頻文件,導(dǎo)致各種串音。</p>
26、;<p> 解決方法:經(jīng)老師點(diǎn)撥,在Resource.asm文件里最下面的添加文件順序必須與左側(cè)Resource對(duì)話(huà)框里的音頻文件順序一致,而且必須把添加的文件全部放在最后,不能因?yàn)橛?xùn)練命令的原因而認(rèn)為會(huì)“提早”被調(diào)用而放在前面,這樣會(huì)造成串音。</p><p> 四、課程設(shè)計(jì)的心得體會(huì)</p><p> 這次課程設(shè)計(jì)在上學(xué)期的51單片機(jī)的基礎(chǔ)上第一次接觸全新的開(kāi)發(fā)板和
27、編譯環(huán)境,加強(qiáng)對(duì)單片機(jī)運(yùn)作原理的理解。同時(shí),貫穿整個(gè)課設(shè)的查詢(xún)資料大大鍛煉了我的搜尋資料的能力。同時(shí),這是我第一次使用集成語(yǔ)音傳感系統(tǒng)的單片機(jī)開(kāi)發(fā)板,是對(duì)于新鮮事物的一種嘗試,對(duì)我以后更深入探索電子元件世界會(huì)有幫助的。</p><p><b> 五、參考資料</b></p><p> 凌陽(yáng)61板產(chǎn)品資料 凌陽(yáng)大學(xué)計(jì)劃</p><p&g
28、t;<b> 六、鳴謝</b></p><p> 謝謝學(xué)校、學(xué)院給我們提供了動(dòng)手實(shí)踐單片機(jī)的機(jī)會(huì),更感謝課設(shè)過(guò)程中胡瑞強(qiáng)老師的悉心指導(dǎo)與幫助。</p><p><b> 附:源程序</b></p><p> //====================================================
29、====</p><p> // 工程名稱(chēng):Car_Demo</p><p> // 功能描述:實(shí)現(xiàn)小車(chē)的語(yǔ)音控制</p><p> // 涉及的庫(kù):CMacro1016.lib</p><p> // bsrv222SDL.lib</p><p> //sacmv
30、26e.lib</p><p> // 組成文件:main.c</p><p> //Flash.asm, hardware.asm,ISR.asm </p><p> // hardware.h,s480.h, hardware.inc</p><p> //硬件連接:IOA0-----KEY1<
31、/p><p> //IOA1-----KEY2</p><p> //IOA2-----KEY3</p><p> //IOB8-----前進(jìn)</p><p> //IOB9-----倒車(chē)</p><p> //IOB10----左拐</p><p>
32、; //IOB11----右拐</p><p> //維護(hù)記錄:2005-12-12 v1.0</p><p> //========================================================</p><p> #include "s480.h"</p><p>
33、 #include "bsrsd.h"</p><p> #defineP_IOA_Data (volatile unsigned int *)0x7000 </p><p> #define P_IOA_Dir (volatile unsigned int *)0x7002</p><p> #define P_IOA_
34、Attrib (volatile unsigned int *)0x7003</p><p> #define P_IOB_Data(volatile unsigned int *)0x7005 </p><p> #define P_IOB_Dir(volatile unsigned int *)0x7007 </p><p> #de
35、fine P_IOB_Attrib(volatile unsigned int *)0x7008 </p><p> #define P_TimerA_Data(volatile unsigned int *)0x700A </p><p> #define P_TimerA_Ctrl(volatile unsigned int *)0x700B </p&
36、gt;<p> #define P_TimerB_Data(volatile unsigned int *)0x700C </p><p> #define P_TimerB_Ctrl(volatile unsigned int *)0x700D </p><p> #define P_Watchdog_Clear(volatile unsigned
37、int *)0x7012 </p><p> #define P_INT_Mask(volatile unsigned int *)0x702D </p><p> #define P_INT_Clear(volatile unsigned int *)0x7011 </p><p> #define NAME_ID 0x100
38、 //名字</p><p> #define COMMAND_GO_ID 0x101 //前進(jìn)</p><p> #define COMMAND_BACK_ID 0x102 //倒車(chē)</p><p> #define COMMAND_LEFT_ID 0x103 //左拐</p><p>
39、#define COMMAND_RIGHT_ID 0x104 //右拐</p><p> #define COMMAND_S_ID 0x105 //S型前進(jìn)</p><p> #define COMMAND_LL_ID 0x106 //左轉(zhuǎn)圈</p><p> #define COMMAND_RR_ID
40、 0x107 //右轉(zhuǎn)圈</p><p> #define S_NAME0//給我取個(gè)名字吧</p><p> #define S_ACT11//前進(jìn)</p><p> #define S_ACT22//倒車(chē),請(qǐng)注意</p><p> #defin
41、e S_ACT33//左拐</p><p> #define S_ACT44//右拐</p><p> #define S_RDY5//Yeah</p><p> #define S_AGAIN6//請(qǐng)?jiān)僬f(shuō)一遍</p><p> #define
42、S_NOVOICE7//沒(méi)有聽(tīng)到任何聲音</p><p> #define S_CMDDIFF8//說(shuō)什么暗語(yǔ)呀</p><p> #define S_NOISY8//說(shuō)什么暗語(yǔ)呀</p><p> #define S_START9//準(zhǔn)備就緒,開(kāi)始辨識(shí)</p>
43、<p> #define S_GJG10//拐就拐</p><p> #define S_DCZY11//倒車(chē),請(qǐng)注意</p><p> #define S_WAY 12 //S型前進(jìn)</p><p> #define S_LL13//向左轉(zhuǎn)圈<
44、/p><p> #define S_RR14//向右轉(zhuǎn)圈</p><p> extern unsigned int BSR_SDModel[100];//外部變量BSR_SDModel[100],辨識(shí)器自帶</p><p> extern void F_FlashWrite1Word(unsigned int addr,unsig
45、ned int Value);</p><p> extern void F_FlashErase(unsigned int sector);</p><p> unsigned int uiTimeset = 3;//運(yùn)行時(shí)間定時(shí),調(diào)整該參數(shù)控制運(yùn)行時(shí)間</p><p> unsigned int uiTimecont; //
46、運(yùn)行時(shí)間計(jì)時(shí)</p><p> //=============================================================</p><p> // 語(yǔ)法格式:void Delay();</p><p> // 實(shí)現(xiàn)功能:延時(shí)</p><p><b> // 參數(shù):無(wú)</b&g
47、t;</p><p> // 返回值:無(wú)</p><p> //=============================================================</p><p> void Delay()</p><p><b> {</b></p>&l
48、t;p> unsigned int i;</p><p> for(i=0;i<0x3Fff;i++)</p><p><b> {</b></p><p> *P_Watchdog_Clear=0x0001;</p><p><b> }</b></p><
49、;p><b> }</b></p><p> //=============================================================</p><p> // 語(yǔ)法格式:void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);</p><p>
50、 // 實(shí)現(xiàn)功能:語(yǔ)音播放函數(shù)</p><p> // 參數(shù):SndIndex-播放語(yǔ)音資源索引號(hào)</p><p> //DAC_Channel-播放聲道選擇</p><p> // 返回值:無(wú)</p><p> //=================================================
51、============</p><p> void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)</p><p><b> {</b></p><p> BSR_StopRecognizer();//停止識(shí)別器</p><p> SACM_S48
52、0_Initial(1);//初始化為自動(dòng)播放</p><p> SACM_S480_Play(SndIndex, DAC_Channel, 3);//開(kāi)始播放一段語(yǔ)音</p><p> while((SACM_S480_Status()&0x0001)!= 0)//是否播放完畢?</p><p><b> {&
53、lt;/b></p><p> SACM_S480_ServiceLoop();//解碼并填充隊(duì)列</p><p> *P_Watchdog_Clear=0x0001;//清看門(mén)狗</p><p><b> }</b></p><p> SACM_S480_Stop();
54、//停止播放</p><p> BSR_InitRecognizer(BSR_MIC);//初始化識(shí)別器</p><p><b> }</b></p><p> //=============================================================</p><p
55、> // 語(yǔ)法格式:int TrainWord(int WordID,int SndID);</p><p> // 實(shí)現(xiàn)功能:訓(xùn)練一條指令</p><p> // 參數(shù):WordID-指令編碼</p><p> //SndID-指令提示音索引號(hào)</p><p> // 返回值:無(wú)</p>&
56、lt;p> //=============================================================</p><p> int TrainWord(unsigned int WordID,unsigned int SndID)</p><p><b> {</b></p><p> int R
57、esult;</p><p> PlaySnd(SndID,3);//引導(dǎo)訓(xùn)練,播放指令對(duì)應(yīng)動(dòng)作</p><p><b> while(1)</b></p><p><b> {</b></p><p> Result = BSR_Train(WordID,BSR_TRAI
58、N_TWICE);//訓(xùn)練兩次,獲得訓(xùn)練結(jié)果</p><p> if(Result==0)break;</p><p> switch(Result)</p><p><b> {</b></p><p> case -1://沒(méi)有檢測(cè)出聲音</p><p> P
59、laySnd(S_NOVOICE,3);</p><p> return -1;</p><p> case -2: //需要訓(xùn)練第二次</p><p> PlaySnd(S_AGAIN,3);</p><p><b> break;</b></p><p> cas
60、e -3://環(huán)境太吵</p><p> PlaySnd(S_NOISY,3);</p><p> return -3;</p><p> case -4://數(shù)據(jù)庫(kù)滿(mǎn)</p><p> return -4;</p><p> case -5:
61、 //檢測(cè)出聲音不同</p><p> PlaySnd(S_CMDDIFF,3);</p><p> return -5;</p><p> case -6: //序號(hào)錯(cuò)誤</p><p> return -6;</p><p><b> def
62、ault:</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> return 0;</b></p><p>
63、;<b> }</b></p><p> //=============================================================</p><p> // 語(yǔ)法格式:void TrainSD_one();</p><p> // 實(shí)現(xiàn)功能:第一組訓(xùn)練函數(shù)</p><p>
64、<b> // 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p><p> //=============================================================</p><p> void TrainSD_one()</p><p><b>
65、 {</b></p><p> BSR_DeleteSDGroup(0);//清除內(nèi)存</p><p> while(TrainWord(NAME_ID,S_NAME) != 0) ; //訓(xùn)練名稱(chēng)</p><p> while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0) ; //訓(xùn)練
66、第1個(gè)動(dòng)作</p><p> while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) ; //訓(xùn)練第2個(gè)動(dòng)作</p><p> while(TrainWord(COMMAND_LEFT_ID,S_ACT3) != 0) ; //訓(xùn)練第3個(gè)動(dòng)作</p><p><b> }</b></p&g
67、t;<p> //=============================================================</p><p> // 語(yǔ)法格式:void TrainSD_two();</p><p> // 實(shí)現(xiàn)功能:第二組訓(xùn)練函數(shù)</p><p><b> // 參數(shù):無(wú)</b>&
68、lt;/p><p> // 返回值:無(wú)</p><p> //=============================================================</p><p> void TrainSD_two()</p><p><b> {</b></p><p&
69、gt; BSR_DeleteSDGroup(0);//清除內(nèi)存</p><p> while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ;//訓(xùn)練第4個(gè)動(dòng)作</p><p> while(TrainWord(COMMAND_S_ID,S_WAY) != 0) ; //訓(xùn)練第5個(gè)動(dòng)作</p><
70、;p> while(TrainWord(COMMAND_LL_ID,S_LL) != 0) ; //訓(xùn)練第6個(gè)動(dòng)作</p><p> while(TrainWord(COMMAND_RR_ID,S_RR) != 0) ; //訓(xùn)練第7個(gè)動(dòng)作</p><p><b> }</b></p><p> /
71、/=============================================================</p><p> // 語(yǔ)法格式:void StoreSD_one();</p><p> // 實(shí)現(xiàn)功能:第一組存儲(chǔ)語(yǔ)音模型函數(shù)</p><p><b> // 參數(shù):無(wú)</b></p>&
72、lt;p> // 返回值:無(wú)</p><p> //=============================================================</p><p> void StoreSD_one() </p><p><b> {</b>
73、;</p><p> unsigned int ulAddr,i,commandID,g_Ret;</p><p> F_FlashWrite1Word(0xef00,0xaaaa);</p><p> F_FlashErase(0xe000);</p><p> F_FlashErase(0xe100);</p>&l
74、t;p> F_FlashErase(0xe200);</p><p> ulAddr=0xe000; //********</p><p> for(commandID=0x100;commandID<0x104;commandID++)</p><p><b>
75、 {</b></p><p> g_Ret=BSR_ExportSDWord(commandID);</p><p> while(g_Ret!=0)//模型導(dǎo)出成功?</p><p> g_Ret=BSR_ExportSDWord(commandID);</p><p> for(i=0;i&
76、lt;100;i++)//保存語(yǔ)音模型SD1(0xe000---0xe063)</p><p><b> {</b></p><p> F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);</p><p> ulAddr+=1;</p><p>
77、<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //=============================================================</p><p> //
78、語(yǔ)法格式:void StoreSD_two();</p><p> // 實(shí)現(xiàn)功能:第二組存儲(chǔ)語(yǔ)音模型函數(shù)</p><p><b> // 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p><p> //===========================================
79、==================</p><p> void StoreSD_two() </p><p><b> {</b></p><p> unsigned int ulAddr,i,commandID,g_Ret;</p><p> F_Fl
80、ashWrite1Word(0xef00,0xaaaa);</p><p> F_FlashErase(0xe300);</p><p> F_FlashErase(0xe400);</p><p> F_FlashErase(0xe500);</p><p> ulAddr=0xe300;
81、 //********</p><p> for(commandID=0x105;commandID<0x109;commandID++)</p><p><b> {</b></p><p> g_Ret=BSR_ExportSDWord(commandID);</p><p
82、> while(g_Ret!=0)//模型導(dǎo)出成功?</p><p> g_Ret=BSR_ExportSDWord(commandID);</p><p> for(i=0;i<100;i++)//保存語(yǔ)音模型SD1(0xe000---0xe063)</p><p><b> {</b>
83、;</p><p> F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);</p><p> ulAddr+=1;</p><p><b> }</b></p><p><b> }</b></p><p><
84、;b> }</b></p><p> //=============================================================</p><p> // 語(yǔ)法格式:void LoadSD_one();</p><p> // 實(shí)現(xiàn)功能:裝載第一組命令</p><p><b
85、> // 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p><p> //=============================================================</p><p> void LoadSD_one() </p
86、><p><b> {</b></p><p> unsigned int *p,k,jk,Ret,g_Ret;</p><p> BSR_DeleteSDGroup(0);//清除內(nèi)存</p><p> p=(int *)0xe000;</p>&
87、lt;p> for(jk=0;jk<4;jk++)</p><p><b> {</b></p><p> for(k=0;k<100;k++)</p><p><b> {</b></p><p> Ret=*p;</p><p>
88、 BSR_SDModel[k]=Ret;//裝載語(yǔ)音模型</p><p> p+=1;</p><p><b> }</b></p><p> g_Ret=BSR_ImportSDWord();</p><p> while(g_Ret!=0)
89、//模型裝載成功?</p><p> g_Ret=BSR_ImportSDWord();</p><p><b> }</b></p><p><b> }</b></p><p> //=========================================
90、====================</p><p> // 語(yǔ)法格式:void LoadSD_two();</p><p> // 實(shí)現(xiàn)功能:裝載第二組命令</p><p> // 參數(shù):無(wú) </p><p> // 返回值:無(wú)</p><p> //====================
91、=========================================</p><p> void LoadSD_two() </p><p><b> {</b></p><p> unsigned int *p,k,jk,Ret,g_Ret;</p>
92、<p> BSR_DeleteSDGroup(0);//清除內(nèi)存</p><p> p=(int *)0xe300;</p><p> for(jk=0;jk<4;jk++)</p><p><b> {</b></p><p> for(
93、k=0;k<100;k++)</p><p><b> {</b></p><p> Ret=*p;</p><p> BSR_SDModel[k]=Ret;//裝載語(yǔ)音模型</p><p> p+=1;</p><p><
94、;b> }</b></p><p> g_Ret=BSR_ImportSDWord();</p><p> while(g_Ret!=0)//模型裝載成功?</p><p> g_Ret=BSR_ImportSDWord();</p><p><b> }&
95、lt;/b></p><p><b> }</b></p><p> //=============================================================</p><p> // 語(yǔ)法格式:void GoAhead();</p><p> // 實(shí)現(xiàn)功能:前進(jìn)子
96、函數(shù)</p><p><b> // 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p><p> //=============================================================</p><p> void GoAhead()
97、 //前進(jìn)</p><p><b> { </b></p><p> PlaySnd(S_ACT1,3);//提示</p><p> *P_IOB_Data=0x0100;//前進(jìn)</p><p> *P_INT_Mask |= 0x0004;/
98、/以下為中斷定時(shí)操作</p><p> __asm("int fiq,irq");</p><p> uiTimecont = 0;</p><p><b> }</b></p><p> //==================================================
99、===========</p><p> // 語(yǔ)法格式:void BackUp();</p><p> // 實(shí)現(xiàn)功能:后退子函數(shù)</p><p><b> // 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p><p> //=================
100、============================================</p><p> void BackUp() //倒退</p><p><b> {</b></p><p> PlaySnd(S_DCZY,3);//提示</p>&
101、lt;p> *P_IOB_Data=0x0200;//倒退</p><p> *P_INT_Mask |= 0x0004;//以下為中斷定時(shí)操作</p><p> __asm("int fiq,irq");</p><p> uiTimecont = 0;</p><p><b
102、> }</b></p><p> //=============================================================</p><p> // 語(yǔ)法格式:void TurnLeft();</p><p> // 實(shí)現(xiàn)功能:左轉(zhuǎn)子函數(shù)</p><p><b>
103、// 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p><p> //=============================================================</p><p> void TurnLeft() //左轉(zhuǎn)</p>&l
104、t;p><b> {</b></p><p> PlaySnd(S_GJG,3);</p><p> *P_IOB_Data=0x0900;//右轉(zhuǎn)</p><p> Delay();</p><p> *P_IOB_Data=0x0500;//左轉(zhuǎn)<
105、/p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> *
106、P_INT_Mask |= 0x0004;//以下為中斷定時(shí)操作</p><p> __asm("int fiq,irq");</p><p> uiTimecont = 0;</p><p><b> }</b></p><p> //======================
107、=======================================</p><p> // 語(yǔ)法格式:void TurnRight();</p><p> // 實(shí)現(xiàn)功能:右轉(zhuǎn)子函數(shù)</p><p><b> // 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p>
108、<p> //=============================================================</p><p> void TurnRight() //右轉(zhuǎn)</p><p><b> {</b></p><p> PlaySnd
109、(S_GJG,3);//語(yǔ)音提示</p><p> *P_IOB_Data=0x0500;//左轉(zhuǎn)</p><p> Delay();</p><p> *P_IOB_Data=0x0900;//右轉(zhuǎn)</p><p> Delay();Delay();</p>
110、<p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> *P_INT_Mask |= 0x0004;//以下為中斷定時(shí)操作</p>
111、;<p> __asm("int fiq,irq");</p><p> uiTimecont = 0;</p><p><b> }</b></p><p> //=============================================================</p&g
112、t;<p> // 語(yǔ)法格式:void S_loop();</p><p> // 實(shí)現(xiàn)功能:停車(chē)子函數(shù)</p><p><b> // 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p><p> //====================================
113、=========================</p><p> void S_loop() //S形路線(xiàn)</p><p><b> {</b></p><p> unsigned int i;</p><p> PlaySnd(S_WAY,
114、3);</p><p> for(i=0;i<4;i++)</p><p><b> { </b></p><p> *P_IOB_Data=0x0500;</p><p> Delay();</p><p> *P_IOB_Data=0x0
115、800;</p><p> *P_IOB_Data=0x0800;</p><p><b> Delay();</b></p><p> *P_IOB_Data=0x0500;</p><p> *P_INT_Mask |= 0x0004;//以下為中斷定時(shí)操作</p>&
116、lt;p> __asm("int fiq,irq");</p><p> uiTimecont = 0;</p><p> } </p><p><b> }</b></p><p> //======================================
117、=======================</p><p> // 語(yǔ)法格式:void L_circle();</p><p> // 實(shí)現(xiàn)功能:左轉(zhuǎn)圈子函數(shù)</p><p><b> // 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p><p> //==
118、===========================================================</p><p> void L_circle() //向左轉(zhuǎn)圈</p><p><b> {</b></p><p> PlaySnd(S_LL,3);</
119、p><p> *P_IOB_Data=0x0900;//右轉(zhuǎn)</p><p> Delay();//延時(shí)</p><p> *P_IOB_Data=0x0500;//左轉(zhuǎn)</p><p> Delay();Delay();</p><p> Delay();Del
120、ay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><
121、;p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> Delay();Del
122、ay();</p><p> Delay();Delay();</p><p> Delay();Delay();</p><p> *P_INT_Mask |= 0x0004;//以下為中斷定時(shí)操作</p><p> __asm("int fiq,irq");</p><p&g
123、t; uiTimecont = 0;</p><p><b> }</b></p><p> //=============================================================</p><p> // 語(yǔ)法格式:void R_circle();</p><p> /
124、/ 實(shí)現(xiàn)功能:右轉(zhuǎn)圈子函數(shù)</p><p><b> // 參數(shù):無(wú)</b></p><p> // 返回值:無(wú)</p><p> //=============================================================</p><p> void R_circle
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能小車(chē)課程設(shè)計(jì)--智能循跡小車(chē)
- 課程設(shè)計(jì)-- 智能小車(chē)循跡控制系統(tǒng)
- 智能小車(chē)課程設(shè)計(jì)--智能巡線(xiàn)小車(chē)的設(shè)計(jì)
- 遙控智能小車(chē)課程設(shè)計(jì)
- 課程設(shè)計(jì)--智能小車(chē)控制信號(hào)的fpga實(shí)現(xiàn)
- 智能小車(chē)控制系統(tǒng)課程設(shè)計(jì)說(shuō)明書(shū)
- 小車(chē)自動(dòng)往返控制課程設(shè)計(jì)
- 智能控制課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)--智能循跡小車(chē)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--智能小車(chē)—硬件設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電動(dòng)智能小車(chē)
- 單片機(jī)智能藍(lán)牙小車(chē)課程設(shè)計(jì)
- 智能小車(chē)課程設(shè)計(jì)說(shuō)明書(shū)
- plc小車(chē)運(yùn)行方向控制課程設(shè)計(jì)
- 綜合電子課程設(shè)計(jì)----智能循跡避障小車(chē)
- 裝卸料小車(chē)控制系統(tǒng)課程設(shè)計(jì)
- 裝卸料小車(chē)控制系統(tǒng)課程設(shè)計(jì)
- 裝卸料小車(chē)控制系統(tǒng)課程設(shè)計(jì)
- plc課程設(shè)計(jì)---運(yùn)料小車(chē)控制模擬
- 課程設(shè)計(jì)---運(yùn)動(dòng)小車(chē)plc控制系統(tǒng)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論