找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14244|回復(fù): 14
收起左側(cè)

STM32單片機(jī)LD3320智能家居語音控制系統(tǒng)設(shè)計與調(diào)試資料

  [復(fù)制鏈接]
ID:427862 發(fā)表于 2020-12-6 17:07 | 顯示全部樓層 |閱讀模式
電路設(shè)計和部分程序源碼在附錄中。

本設(shè)計以 STM32 單片機(jī)為核心的智能家居語音控制系統(tǒng),結(jié)合各功能模塊和傳感器模塊,形成一套對家居電器智能控制系統(tǒng)的設(shè)計方案。系統(tǒng)以 STM32103C8T6為系統(tǒng)的主控芯片,輔以步進(jìn)電機(jī)、非特定人語音識別模塊等諸多外設(shè)器件。通過編程完成對串口通訊、 非特定人語音識別等模塊的功能實現(xiàn)。設(shè)計側(cè)重于局域網(wǎng)本地控制及通訊接口設(shè)計。通過發(fā)送語音消息,根據(jù)語音的內(nèi)容實現(xiàn)對家用電器控制、照明系統(tǒng)控制等本地控制,功能實用、操作簡單、易于安裝,能夠有效地提升居民的生活質(zhì)量。

語音智能家居是現(xiàn)代家用電器未來發(fā)展的一個必然趨勢。在現(xiàn)在市場上主要運用的功能為語音對話,就是說在居家生活中由人與家用電器進(jìn)行對話,在距離有限的范圍里,語音模塊能根據(jù)相應(yīng)的語音指令自動識別,然后由主控芯片控制用電器實現(xiàn)相應(yīng)功能。根據(jù)芯片的語言程序編寫的不同,識別的范圍和實現(xiàn)的功能也會有相應(yīng)的區(qū)別。其中,硬件設(shè)計為軟件的實現(xiàn)提供了堅實的基礎(chǔ),軟件是硬件內(nèi)在,軟硬件相輔相成,共同作用。系統(tǒng)功能是否能夠?qū)崿F(xiàn)取決于二者的配合。本系統(tǒng)的功能框圖如下圖。

2.2控制芯片的選擇
2.2.1
選擇控制芯片需要考慮的幾個因素

(1)芯片所能應(yīng)用的領(lǐng)域:因為每個芯片的功能有所差別,因此所能應(yīng)用的系統(tǒng)環(huán)境也會不同,當(dāng)選定控制芯片之后,所需要的環(huán)境必須適合[1]。因此,在選定芯片之前要確定系統(tǒng)的環(huán)境與芯片的環(huán)境相匹配。

(2)芯片自身的功能:當(dāng)芯片的功能與設(shè)計所需要功能更加接近時,設(shè)計的難度也會降低。首先要確定系統(tǒng)要實現(xiàn)的功能,然后再看每個芯片自身的功能和能實現(xiàn)的功能,然后選擇最合適的芯片[1]。

(3)芯片的功耗:由于設(shè)計中有能量供給模塊,因此選擇控制芯片的時候要考慮到芯片所需要的能源大小以及供給的能量是否能夠維持芯片的工作時長[1]。并且也要考慮到芯片運行時會不會對環(huán)境有所污染,盡可能讓做出的產(chǎn)品環(huán)保節(jié)能。

2.2.2 主控制芯片的確定

STM32F103C8T6功能強(qiáng)大,集成度高,是MSC-51單片機(jī)所有型號中應(yīng)用比較多的一個型號。STM32F103C8T6單片機(jī)是把所必需的控制應(yīng)用都集成在一個尺寸空間有限的集成電路芯片上,傳統(tǒng)結(jié)構(gòu)模式是把CPU加到外圍芯片上。對各種功能部件的控制采用特殊功能寄存器的集中控制方式[2]?紤]到STM32單片機(jī)比51功能更加全面,所用資料比較容易搜集以及應(yīng)用更加廣泛,因此采用STM32單片機(jī)來實現(xiàn)本系統(tǒng)的相應(yīng)功能。

2.3系統(tǒng)實現(xiàn)的功能

1.語音控制開關(guān)燈

當(dāng)語音芯片收到“開燈”命令,單片機(jī)進(jìn)行識別和處理,然后燈就會打開。當(dāng)語音芯片收到“關(guān)燈”命令,單片機(jī)再次進(jìn)行識別和處理,識別成功,燈就會關(guān)閉。
2.語音控制窗簾的開啟和關(guān)閉

當(dāng)語音芯片收到“打開窗簾”命令,單片機(jī)進(jìn)行識別處理,ULN2003步進(jìn)電機(jī)驅(qū)動驅(qū)動步進(jìn)電機(jī)模擬窗簾的開啟,當(dāng)步進(jìn)電機(jī)旋轉(zhuǎn)到一定角度時,窗簾開啟。當(dāng)語音芯片收到“關(guān)閉窗簾”命令,單片機(jī)進(jìn)行識別處理,ULN2003步進(jìn)電機(jī)驅(qū)動驅(qū)動步進(jìn)電機(jī)模擬窗簾的關(guān)閉,當(dāng)步進(jìn)電機(jī)旋轉(zhuǎn)到一定角度時,窗簾關(guān)閉。

3.語音控制風(fēng)扇的開啟和關(guān)閉

當(dāng)語音芯片收到“打開風(fēng)扇”命令,單片機(jī)進(jìn)行識別和處理,然后風(fēng)扇就會旋轉(zhuǎn)。當(dāng)語音芯片收到“關(guān)閉”命令,單片機(jī)再次進(jìn)行識別和處理,識別成功,風(fēng)扇就會停止轉(zhuǎn)動。

4.語音控制開關(guān)用電器

當(dāng)語音芯片收到“打開空調(diào)”命令,單片機(jī)進(jìn)行識別和處理,然后空調(diào)的指示燈就會打開。當(dāng)語音芯片收到“關(guān)閉空調(diào)”命令,單片機(jī)再次進(jìn)行識別和處理,識別成功,空調(diào)的指示燈就會關(guān)閉。
5.語音控制關(guān)閉電源

當(dāng)用電器同時運行時,為了人們出行方便,可以使用關(guān)閉電源命令,就可以把開著的所有用電器同時關(guān)閉。


第三章 系統(tǒng)硬件設(shè)計
3.1 主控制器模塊

本系統(tǒng)采用的單片機(jī)是STM32F103C8T6單片機(jī)。此單片機(jī)比51系列更加實用高效,自帶2個AD轉(zhuǎn)換,同時運行速度比51單片機(jī)要快很多,非常方便;

STM32F103C8T6單片機(jī)具有5個不同的串口進(jìn)行通信,而51單片機(jī)只有1個單獨串口進(jìn)行通信,所以STM32有著更加強(qiáng)大的控制功能和通信功能,并且所具有的功能在現(xiàn)在市場上有廣泛的運用,由于STM32單片機(jī)可以進(jìn)行多種不同的時鐘模數(shù)轉(zhuǎn)換來進(jìn)行工作,因此功耗比較高[3]。引腳JDQ1和JDQ2與兩個用電器模塊連接,引腳29-32與步進(jìn)電機(jī)模塊連接,引腳34與風(fēng)扇模塊連接,引腳B12-B15和A8與語音模塊相連接。STM32單片機(jī)原理圖如圖3.1所示。

圖3.1 STM32單片機(jī)原理圖

STM32實物圖如圖3.2所示:

圖3.2 STM32F103C8T6實物圖

3.2 電源模塊

單片機(jī)的供電電源開關(guān)控制如圖3.3所示,單片機(jī)的供電電路是一個自鎖開關(guān)加上一個電源座子。因為本系統(tǒng)中所有的器件都是5V供電,所以只需要用電池和充電寶或者USB連接到我們使用的筆記本或者臺式電腦就可以直接使用了。但是需要注意的是,此電路之所以可以這樣設(shè)計,是因為電路中沒有什么功耗比較大的外圍電路。我們有時候會遇到雖然芯片上寫的是5V供電但是功耗非常的高[4]。所以我們在設(shè)計驅(qū)動電機(jī)或者是風(fēng)扇等電路的時候就需要特別注意電路中電流可不可以符合這些器件運行的要求。如果符合要求就可以使用,否則不可以使用。

圖3.3電源電路圖


3.3  語音識別模塊

LD3320語音芯片如下圖3.4所示,該芯片是由公司設(shè)計生產(chǎn)的一款“語音識別”專用芯片。該芯片不僅集成了一些外部電路和語音識別處理器,而且包括DA、AD轉(zhuǎn)換器、麥克風(fēng)接口、聲音輸出接口等[5]。LD3320語音芯片識別的關(guān)鍵詞語

圖3.4語音識別芯片

列表根據(jù)客戶需要是可以任意動態(tài)編輯的,不需要外接任何的輔助芯片。此芯片在功能設(shè)計上注重準(zhǔn)確與高效。只需在現(xiàn)成的產(chǎn)品中加上語音芯片就可以實現(xiàn)語音識別、聲控、人機(jī)對話功能[6]。

圖3.5語音識別原理圖

3.4  步進(jìn)電機(jī)及驅(qū)動模塊

我們可以通過脈沖的控制對電機(jī)的轉(zhuǎn)速和方向進(jìn)行調(diào)整,通過單片機(jī)來處理標(biāo)準(zhǔn)邏輯緩沖器來處理數(shù)據(jù)。單片機(jī)通過IN1 IN2 IN3 IN4 接口與ULN2003進(jìn)行連接,然后單片機(jī)用來輸出電流,由OUT1 OUT2 OUT3 OUT4輸出到電機(jī)的四相也就是ABCD。ULN2003的輸入電流只需要幾毫安就可以,由單片機(jī)提供,經(jīng)過達(dá)林頓結(jié)構(gòu),驅(qū)動為5V,耐壓為50V,灌電流可達(dá)500mA[7]。

圖3.6 ULN2003管腳原理圖

圖3.7 步進(jìn)電機(jī)驅(qū)動原理圖

3.5 風(fēng)扇控制模塊

   傳統(tǒng)電風(fēng)扇的開啟和關(guān)閉給用戶帶來了許多不便,每次風(fēng)扇開啟或者關(guān)閉,必然進(jìn)行手動操作。如果能夠不動手就可以實現(xiàn)開關(guān)風(fēng)扇的這些功能,那么就可以給用戶帶來很多方便。
   本設(shè)計系統(tǒng)通過語音芯片進(jìn)行語音信息的收集,然后由單片機(jī)分析和處理語音信息。從而達(dá)到語音控制風(fēng)扇開啟和關(guān)閉的效果。

圖3.8風(fēng)扇控制電路原理圖

3.6 繼電器控制模塊

由鐵芯、銜鐵、線圈、觸點簧片等工作原件共同組成了電磁式繼電器[8]。導(dǎo)體在閉合線圈里作切割磁感線運動,在電路中就會產(chǎn)生感應(yīng)電流,這就產(chǎn)生了電磁效應(yīng),在電磁力吸引的作用下,銜鐵就會克服返回彈簧的拉力吸向鐵芯,銜鐵的動觸點與靜觸點因此就會吸合[10]。當(dāng)關(guān)閉電源后,電磁之間就沒有相了應(yīng)的吸力,這時彈簧的反作用力就會讓銜鐵自動返回到原來的位置,動觸點與原來的靜觸點就會分開。這樣吸合、分開。從而實現(xiàn)了電路間的導(dǎo)通和切斷。


圖3.9繼電器原理圖

3.7 原理設(shè)計

Altium Designer這個繪圖軟件具有綜合電子元件開發(fā)的很多功能,設(shè)計者刻意通過這個阮籍繪制電路圖和制作電路板等。這款軟件中,有大量的可以使用的元器件的原理圖都存在與元器件庫里,并且易于查找,可用于多種電路原理圖的繪制,并且可以自己畫自己需要的元器件,使用的方法簡單,并且在繪制完電路圖之后,也可以為制作電路板提供PCB線路圖[11]。設(shè)計者可以利用這款軟件完成電路設(shè)計中的各項任務(wù),為我們省去了大量繁瑣的任務(wù),因此選擇它來作為此次設(shè)計電路圖的軟件。設(shè)計過程中所用到的軟件界面如下圖3.11所示。

圖3.11 原理圖設(shè)計界面



第四章 系統(tǒng)軟件設(shè)計
4.1 Keil編程軟件

上一章節(jié)著重介紹了本系統(tǒng)的硬件設(shè)計,這一章將介紹軟件設(shè)計。Keil5是一款兼容單片機(jī)C語言的軟件開發(fā)系統(tǒng)。Keil包括C編輯器、鏈接器、宏匯編等,通過uVision開發(fā)環(huán)境將這些部分結(jié)合起來。近幾年Keil編程軟件得到了很多仿真機(jī)廠的認(rèn)可和支持。Keil 編程軟件是由美國公司出品的軟件開發(fā)系統(tǒng)[12],目的是為了方便編程人員進(jìn)行程序編程。

本系統(tǒng)我們選擇STM32單片機(jī)進(jìn)行工程的建立。如圖4.1所示,你可以根據(jù)你使用的處理器來選擇,如果您所使用的處理器型號在列表中找不到,也可以找一款與您使用的相兼容的型號來代替。右邊一欄是對這個芯片的基本的說明,然后鼠標(biāo)點擊“是” [13]。


圖4.1芯片啟動代碼拷貝確認(rèn)對換框
有些芯片會提供啟動代碼,我們這個時候點擊“是”,到此一個工程就建立好。

4.2 系統(tǒng)總程序設(shè)計

軟件部分的主要任務(wù)是完成對語音進(jìn)行識別和處理然后控制各個器件對當(dāng)前不同的指令進(jìn)行判斷基于上述分析,當(dāng)語音芯片收到“打開窗簾”語音指令,單片機(jī)進(jìn)行處理和判別,然后步行電機(jī)就會轉(zhuǎn)動模擬窗簾的開啟,當(dāng)旋轉(zhuǎn)到一定角度后,窗簾完全打開。當(dāng)語音芯片收到“打開風(fēng)扇”的語音指令,風(fēng)扇就會轉(zhuǎn)動。當(dāng)收到“開燈”指令,LED燈就會打開。當(dāng)收到“關(guān)閉電源”的語音指令時,不管此時打開多少用電器,都會同時關(guān)閉。系統(tǒng)軟件設(shè)計流程如圖4.2所示。程序見附錄C。

圖4.2軟件設(shè)計流程圖

4.3 系統(tǒng)各功能子程序設(shè)計
4.3.1 窗簾控制子程序設(shè)計

步進(jìn)電機(jī)是現(xiàn)代數(shù)字程序控制系統(tǒng)中的主要執(zhí)行元件。它的主要功能是:當(dāng)步進(jìn)驅(qū)動器加上一個脈沖信號時,驅(qū)動步進(jìn)電機(jī)就會按照設(shè)定的方向旋轉(zhuǎn)一個固定的角度。在本系統(tǒng)中,如果語音芯片識別到“打開窗簾”的語音指令,ULN2003步行電機(jī)驅(qū)動就會驅(qū)動步行電機(jī)進(jìn)行旋轉(zhuǎn),來模擬窗簾的開啟,當(dāng)步行電機(jī)停止旋轉(zhuǎn)時,說明窗簾已經(jīng)完全打開。如果語音芯片識別到“關(guān)閉窗簾”的語音指令,ULN2003步行電機(jī)驅(qū)動就會驅(qū)動步行電機(jī)進(jìn)行旋轉(zhuǎn)[14],來模擬窗簾的關(guān)閉,當(dāng)步行電機(jī)停止旋轉(zhuǎn)時,說明窗簾已經(jīng)完全關(guān)閉。程序見附錄C。

圖4.3電機(jī)驅(qū)動流程圖

4.3.2 空調(diào)電視控制子系統(tǒng)設(shè)計

繼電器是一種用較小的電流去控制較大電流的電子控制器件,它常被用在自動控制電路中,具有輸入回路和輸出回路[15]。在本系統(tǒng)中,我們用繼電器模擬空調(diào)和電視,當(dāng)語音芯片收到“打開空調(diào)”指令,經(jīng)過單片機(jī)的處理判斷,空調(diào)前的指示燈就會打開。當(dāng)語音芯片收到“打開電視”的語音指令,經(jīng)過單片機(jī)的處理判別,電視前的指示燈就會打開。程序見附錄C。

圖4.4空調(diào)電視控制子程序流程圖

4.3.3風(fēng)扇控制子系統(tǒng)設(shè)計    

傳統(tǒng)的家用風(fēng)扇每次開啟或者關(guān)閉時,必然有人參與操作,這樣給用戶帶來諸多不便。如果能夠不動手就可以實現(xiàn)開關(guān)風(fēng)扇的這些功能,那么就可以給用戶帶來很多方便。
    本設(shè)計中的智能電風(fēng)扇控制系統(tǒng),是將電風(fēng)扇與語音芯片相關(guān)聯(lián),由單片機(jī)分析和處理語音信息。當(dāng)語音芯片收到“打開風(fēng)扇”指令時,經(jīng)過單片機(jī)的識別處理,風(fēng)扇就會打開。當(dāng)語音芯片收到“關(guān)閉風(fēng)扇”指令時,經(jīng)過單片機(jī)的識別處理,風(fēng)扇就會關(guān)閉。從而達(dá)到語音控制風(fēng)扇開啟和關(guān)閉的效果。程序見附錄C。

圖4.5 風(fēng)扇控制子系統(tǒng)流程圖

4.3.4 開關(guān)燈子系統(tǒng)設(shè)計

  在本系統(tǒng)中,當(dāng)語音模塊識別到“開燈”的語音命令,然后將收到的命令輸送給單片機(jī)主控模塊進(jìn)行處理識別,從而實現(xiàn)對燈泡的相應(yīng)操作。開關(guān)燈的子系統(tǒng)流程圖如4.6程序見附錄C。

圖4.6 燈控制子程序流程圖

4.3.5 關(guān)閉電源子系統(tǒng)設(shè)計

  從上面四部分已經(jīng)知道,利用語音芯片采集語音信息,通過主控芯片進(jìn)行識別和處理信息,系統(tǒng)可以實現(xiàn)對風(fēng)扇、窗簾、繼電器、燈泡的開啟和關(guān)閉進(jìn)行單一的控制。為了使人們的居家生活更加便捷,當(dāng)我們離開家的時候,我們可以把所有用電器同時關(guān)閉。程序見附錄C。

圖4.7 關(guān)閉電源子程序流程圖


章  焊接與系統(tǒng)調(diào)試
5.1 電路焊

手工焊接是最原始的焊接方法,在現(xiàn)代工業(yè)中,由于電子產(chǎn)品需要批量的生產(chǎn),從而手工焊接已經(jīng)不能滿足生產(chǎn)速度和質(zhì)量的需求,大量的由機(jī)器焊接所替代;但是手工焊接這種原始的焊接方法在電子元器件的設(shè)計、維修、檢測中仍然是必不可少的,并且維修、設(shè)計的質(zhì)量好壞也會由手工焊接的質(zhì)量好壞所影響。作為一名合格的工學(xué)類大學(xué)生,每個人都應(yīng)該具備手工焊接這項技能,并且應(yīng)該不斷地練習(xí)這項技能,使焊接的產(chǎn)品達(dá)到更好的質(zhì)量。

在焊接之前準(zhǔn)備好用到的焊接工具,電烙鐵的手握方法有以下幾種:正握法、握筆式和反握法。

手工焊接有以下幾個主要的步驟:

    1、準(zhǔn)備焊接: 清潔元器件、電路板、焊錫表面的灰塵,以防焊接過程中由于灰塵而導(dǎo)致焊接的不牢固或者導(dǎo)電性差。然后將元器件的各個管腳盡量的分開最大距離,避免烙鐵在焊接時燙壞元器件。

    2、加熱焊接:電烙鐵通電以后,先將電烙鐵進(jìn)行幾秒鐘的預(yù)熱,然后將電烙鐵的頭沾上合適量焊錫和松香,將其慢慢的融化后,與被焊接元器件管腳相接處,等待焊錫與電路板上的焊錫想融合之后移開。

    3、清理焊接面:在焊接完元器件時,可能會有過多的焊錫,需要將這些多余的焊錫清理干凈。需要用干凈的鑷子,在將這些焊錫融化的同時用鑷子將多余的焊錫去掉。

    4、檢查焊點:觀察元器件管腳在焊接時是與否電路板焊錫連接牢固,如有缺口需要補(bǔ)焊。觀察是否有過連接等現(xiàn)象,保證線路安全。

焊接過程應(yīng)注意的事項:

    5、焊接中一定要注意電烙鐵的放置,應(yīng)放在原本的底座上,以防將焊

接者燙傷,或者將其他的元器件燙壞,而導(dǎo)致系統(tǒng)問題。

    6、焊接前保證仔細(xì)清潔元器件的表面灰塵,防止焊接不牢固,或者接

觸不良。

    7、焊接時焊錫一定不可以過多或者過少;當(dāng)焊錫過多時,可能導(dǎo)致線路過連接使電路短路。當(dāng)焊錫過少時,元器件和電路板會連接不牢固,或者會焊點接觸不良等問題。

    8、焊接完成后要清潔電路板上遺留的焊錫,防止影響電路正常運行,以

及整體的美觀。

圖5.1焊接完成圖

5.2 系統(tǒng)調(diào)試

硬件電路板完成以后,為了達(dá)到較好的語音控制效果,在完成以后進(jìn)行了多次調(diào)試。尤其對語音模塊,步行電機(jī)驅(qū)動模塊以及小風(fēng)扇進(jìn)行了多次調(diào)試。如語音調(diào)試,語音識別過程主要包括“收集”和“識別”兩個階段。在收集階段,通過LD3320語音芯片對說話者的聲音進(jìn)行采集,從中提取出單片機(jī)能夠識別的信息,建立一個特征模型;在識別階段,單片機(jī)對LD3320語音芯片采集到的語音樣本進(jìn)行分析處理,提取出語音的特征信息,然后.將這個特征信息模型與已有的特征模型進(jìn)行對比,如果二者達(dá)到了一定的匹配度,則輸入的語音被識別。

1. 語音芯片識別到“打開窗簾”的語音指令,ULN2003步行電機(jī)驅(qū)動就會驅(qū)動步行電機(jī)進(jìn)行旋轉(zhuǎn),來模擬窗簾的開啟,當(dāng)步行電機(jī)停止旋轉(zhuǎn)時,說明窗簾已經(jīng)完全打開。如果語音芯片識別到“關(guān)閉窗簾”的語音指令,ULN2003步行電機(jī)驅(qū)動就會驅(qū)動步行電機(jī)進(jìn)行旋轉(zhuǎn),來模擬窗簾的關(guān)閉,當(dāng)步行電機(jī)停止旋轉(zhuǎn)時,說明窗簾已經(jīng)完全關(guān)閉。如下圖5.2

圖5.2 窗簾的開啟實物圖

2.本設(shè)計中的智能電風(fēng)扇控制系統(tǒng),是將電風(fēng)扇與語音芯片相關(guān)聯(lián),由單片機(jī)分析和處理語音信息。當(dāng)語音芯片收到“打開風(fēng)扇”指令時,經(jīng)過單片機(jī)的識別處理,風(fēng)扇就會打開。當(dāng)語音芯片收到“關(guān)閉風(fēng)扇”指令時,經(jīng)過單片機(jī)的識別處理,風(fēng)扇就會關(guān)閉。

圖5.3 風(fēng)扇的開啟實物圖

3. 當(dāng)語音芯片收到“開燈”指令時,經(jīng)過單片機(jī)的識別處理,燈泡就會打開。當(dāng)語音芯片收到“關(guān)燈”指令時,經(jīng)過單片機(jī)的識別處理,燈泡就會關(guān)閉。當(dāng)語音芯片收到“打開空調(diào)”指令時,經(jīng)過單片機(jī)的識別處理,空調(diào)就會打開。當(dāng)語音芯片收到“打開電視”指令時,經(jīng)過單片機(jī)的識別處理,電視就會打開。

圖5.4 燈泡和用電器的開啟實物圖

4.當(dāng)我們著急離開家的時候,我們可以通過語音控制關(guān)閉電源,把正在運行的電器一起關(guān)掉。也可以逐一關(guān)掉。



附錄A 原理圖

圖附A1電路原理圖


附錄B PCB

圖附B1電路PCB圖


  1. /*************端口信息********************
  2. * 接線說明
  3. LD3320接口                 STM32接口
  4. * RST              PB11
  5. * CS                           PB10
  6. * WR/SPIS          PB12
  7. * P2/SDCK          PB13
  8. * P1/SDO           PB14
  9. * P0/SDI           PB15
  10. * IRQ              PA15
  11. * A0                                        PA8
  12. *****************************************/

  13. /************************************************************************************
  14. //              nAsrStatus 用來在main主程序中表示程序運行的狀態(tài),不是LD3320芯片內(nèi)部的狀態(tài)寄存器
  15. //              LD_ASR_NONE:                            表示沒有在作ASR識別
  16. //              LD_ASR_RUNING:                            表示LD3320正在作ASR識別中
  17. //              LD_ASR_FOUNDOK:                            表示一次識別流程結(jié)束后,有一個識別結(jié)果
  18. //              LD_ASR_FOUNDZERO:              表示一次識別流程結(jié)束后,沒有識別結(jié)果
  19. //              LD_ASR_ERROR:                            表示一次識別流程中LD3320芯片內(nèi)部出現(xiàn)不正確的狀態(tài)
  20. *********************************************************************************/

  21. uint8 nAsrStatus=0;            
  22. void LD3320_Init(void);
  23. uint8 RunASR(void);
  24. void ProcessInt0(void);
  25. void LD3320_EXTI_Cfg(void);
  26. void LD3320_Spi_cfg(void);
  27. void LD3320_GPIO_Cfg(void);
  28. void LED_gpio_cfg(void);
  29. void MOTOR_Implement(u8 mode);
  30. extern void PrintComBit(USART_TypeDef* USARTx, uint8_t Data);
  31. /***********************************************************
  32. * 名    稱: LD3320_main(void)
  33. * 功    能: 主函數(shù)LD3320程序入口
  34. * 入口參數(shù):
  35. * 出口參數(shù):
  36. * 說    明:
  37. * 調(diào)用方法:
  38. **********************************************************/
  39. void  LD3320_main(void)
  40. {
  41.               uint8 nAsrRes=0;
  42.               u8 chuanlian = 0;
  43.               LD3320_Init();               
  44.               while(1)
  45.               {
  46.                   switch(nAsrStatus)
  47.                             {
  48.                                           case LD_ASR_RUNING:
  49.                                           case LD_ASR_ERROR:                           
  50.                                                                                                     break;
  51.                                           case LD_ASR_NONE:
  52.               nAsrStatus=LD_ASR_RUNING;
  53. if (RunASR()==0)              //              啟動一次ASR識別流程:ASR初始化,ASR添加關(guān)鍵詞語,啟動ASR運算
  54.               {                           
  55.                                                         nAsrStatus = LD_ASR_ERROR;
  56.                                                                                                                 }
  57.                                                                                                                 break;

  58.                                           case LD_ASR_FOUNDOK:
  59. nAsrRes = LD_GetResult( );              //識別成功自動 獲取識別碼,識別碼在LDChip.h文件中,自行定義的數(shù)據(jù)                                                                                                                                                                                                                                                                        
  60. //PrintComBit(USART1,nAsrRes ); //串口輸出識別碼                           
  61. switch(nAsrRes)                               /*對結(jié)果執(zhí)行相關(guān)操作,客戶修改*/
  62. {
  63.               case CODE_KD:            
  64.               LED_OPEN();
  65.               PrintCom(USART1,"“開燈”命令識別成功\r\n"); /*text.....*/
  66. break;
  67.               case CODE_GD:            
  68.               LED_CLOSE();
  69.               PrintCom(USART1,"“關(guān)燈”命令識別成功\r\n"); /*text.....*/
  70. break;
  71.                                           case CODE_KDS:                           
  72.                                           RELAY1_OPEN();
  73.                                                         PrintCom(USART1,"“打開電視”命令識別成功\r\n"); /*text.....*/
  74. break;
  75. case CODE_GDS:                           
  76. RELAY1_CLOSE();
  77. PrintCom(USART1,"“關(guān)閉電視”命令識別成功\r\n"); /*text.....*/
  78. break;
  79.                                                                                                                              
  80.                             case CODE_KKT:
  81.                             RELAY2_OPEN();
  82.                             PrintCom(USART1,"“打開空調(diào)”命令識別成功\r\n"); /*text.....*/
  83. break;
  84. case CODE_GKT:            
  85.               RELAY2_CLOSE();
  86.               PrintCom(USART1,"“關(guān)閉空調(diào)”命令識別成功\r\n"); /*text.....*/
  87. break;
  88. case CODE_KFS:                           
  89.               FAN_OPEN();
  90.               PrintCom(USART1,"“打開風(fēng)扇”命令識別成功\r\n"); /*text.....*/
  91. break;
  92. case CODE_GFS:                           
  93.               FAN_CLOSE();
  94.               PrintCom(USART1,"“關(guān)閉風(fēng)扇”命令識別成功\r\n"); /*text.....*/
  95. break;
  96.                                                                                                                              
  97. case CODE_KCL:            
  98.               chuanlian = 1;
  99.               PrintCom(USART1,"“打開窗簾”命令識別成功\r\n"); /*text.....*/
  100. break;
  101. case CODE_GCL:                           
  102. chuanlian = 0;
  103.               PrintCom(USART1,"“關(guān)閉窗簾”命令識別成功\r\n"); /*text.....*/
  104. break;
  105.               case CODE_GDY:                           
  106. LED_CLOSE();
  107. RELAY1_CLOSE();
  108. RELAY2_CLOSE();
  109. FAN_CLOSE();
  110. chuanlian = 0;
  111. PrintCom(USART1,"“關(guān)閉電源”命令識別成功\r\n"); /*text.....*/
  112. break;
  113.               default:break;
  114. }            
  115. nAsrStatus = LD_ASR_NONE;            
  116. break;
  117.                                          
  118. case LD_ASR_FOUNDZERO:
  119. default: nAsrStatus = LD_ASR_NONE;
  120.               PrintCom(USART1,"識別失敗\r\n");
  121. break;
  122. }//switch            
  123. if(chuanlian == 1)              MOTOR_Implement(1);                            //打開窗簾
  124. else MOTOR_Implement(0);              //關(guān)閉窗簾                           
  125.               }// while

  126. }

  127. void MOTOR_Implement(u8 mode)//步進(jìn)電機(jī)旋轉(zhuǎn)
  128. {
  129. static u16 dj_count=0;
  130.             
  131. if(mode == 1)
  132. {
  133. if(dj_count++ < 100)
  134. {
  135.                             MotorCW();//電機(jī)正轉(zhuǎn),模擬開窗簾
  136. }
  137. else
  138. {
  139.                             dj_count = 100;
  140.                 MotorStop();//旋轉(zhuǎn)到一定程度,電機(jī)關(guān)閉
  141. }
  142.                                                         sys_delay_ms(1);
  143.                             }
  144.                             else
  145.                             {
  146.                                                         if(dj_count > 0)
  147.                                                         {
  148.                                                                                     dj_count--;
  149.                                                                         MotorCCW();//電機(jī)反轉(zhuǎn),模擬關(guān)窗簾
  150.                                                         }
  151.                                                         else
  152.                                                         {
  153.                                                                                     dj_count = 0;
  154.                                                                         MotorStop();//旋轉(zhuǎn)到一定程度,電機(jī)關(guān)閉
  155.                                                         }
  156.                                                         sys_delay_ms(1);
  157.                             }
  158. }

  159. void PC13_LED()//識別燈閃爍
  160. {
  161.                             LED_PC13_L();
  162.                 sys_delay_ms(60);
  163.                 LED_PC13_H();
  164.                 sys_delay_ms(60);
  165.             
  166.                 LED_PC13_L();
  167.                 sys_delay_ms(60);
  168.                 LED_PC13_H();
  169.                 sys_delay_ms(60);
  170.             
  171.                 LED_PC13_L();
  172.                 sys_delay_ms(60);
  173.                 LED_PC13_H();
  174. }

  175. /***********************************************************
  176. * 名    稱:LD3320_Init(void)
  177. * 功    能:模塊驅(qū)動端口初始配置
  178. * 入口參數(shù):
  179. * 出口參數(shù):
  180. * 說    明:
  181. * 調(diào)用方法:
  182. **********************************************************/
  183. void LD3320_Init(void)
  184. {
  185.               LD3320_GPIO_Cfg();            
  186.               LD3320_EXTI_Cfg();
  187.               LD3320_Spi_cfg();            
  188.   MOTOR_GPIO_Init();            
  189.               LED_gpio_cfg();
  190.               LD_reset();
  191.             
  192. }
  193. /***********************************************************
  194. * 名    稱:              RunASR(void)
  195. * 功    能:              運行ASR
  196. * 入口參數(shù):
  197. * 出口參數(shù):
  198. * 說    明:
  199. * 調(diào)用方法:
  200. **********************************************************/
  201. uint8 RunASR(void)
  202. {
  203.               uint8 i=0;
  204.               uint8 asrflag=0;
  205.               for (i=0; i<5; i++)                                          //              防止由于硬件原因?qū)е翷D3320芯片工作不正常,所以一共嘗試5次啟動ASR識別流程
  206.               {
  207.                             LD_AsrStart();                                          //初始化ASR
  208.                             LD3320_delay(100);
  209.                             if (LD_AsrAddFixed()==0)              //添加關(guān)鍵詞語到LD3320芯片中
  210.                             {
  211.                                           LD_reset();                                          //              LD3320芯片內(nèi)部出現(xiàn)不正常,立即重啟LD3320芯片
  212.                                           LD3320_delay(50);                                          //              并從初始化開始重新ASR識別流程
  213.                                           continue;
  214.                             }

  215.                             LD3320_delay(10);

  216.                             if (LD_AsrRun() == 0)
  217.                             {
  218.                                           LD_reset();                                          //              LD3320芯片內(nèi)部出現(xiàn)不正常,立即重啟LD3320芯片
  219.                                           LD3320_delay(50);                                          //              并從初始化開始重新ASR識別流程
  220.                                           continue;
  221.                             }

  222.                             asrflag=1;
  223.                             break;                                                                      //              ASR流程啟動成功,退出當(dāng)前for循環(huán)。開始等待LD3320送出的中斷信號
  224.               }

  225.               return asrflag;
  226. }

  227. /***********************************************************
  228. * 名    稱: void Delay_( int i)
  229. * 功    能: 短延時
  230. * 入口參數(shù):
  231. * 出口參數(shù):
  232. * 說    明:
  233. * 調(diào)用方法:
  234. **********************************************************/
  235. void Delay_( int i)
  236. {   
  237.     while( i--)
  238.        {            

  239.         }
  240. }            
  241. /***********************************************************
  242. * 名    稱:              LD3320_delay(unsigned long uldata)
  243. * 功    能:              長延時函數(shù)
  244. * 入口參數(shù):
  245. * 出口參數(shù):
  246. * 說    明:
  247. * 調(diào)用方法:
  248. **********************************************************/
  249. void  LD3320_delay(unsigned long uldata)
  250. {
  251.               unsigned int j  =  0;
  252.               unsigned int g  =  0;
  253.               for (j=0;j<5;j++)
  254.               {
  255.                             for (g=0;g<uldata;g++)
  256.                             {
  257.                                           Delay_(120);
  258.                             }
  259.               }
  260. }


  261. /***********************************************************
  262. * 名    稱:LD3320_GPIO_Cfg(void)
  263. * 功    能:初始化需要用到的IO口
  264. * 入口參數(shù):
  265. * 出口參數(shù):
  266. * 說    明:
  267. * 調(diào)用方法:
  268. **********************************************************/
  269. void LD3320_GPIO_Cfg(void)
  270. {            
  271.                   GPIO_InitTypeDef GPIO_InitStructure;
  272.                             // 配置PA8 輸出              8M 波形            
  273.                             //定義RST/A0/CS端口
  274.               {
  275.                             RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);
  276.                             //LD_CS              /RSET
  277.                             GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10|GPIO_Pin_11;
  278.                             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  279.                             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  280.                             GPIO_Init(GPIOB,&GPIO_InitStructure);
  281.                            
  282.                             GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8;
  283.                             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  284.                             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  285.                             GPIO_Init(GPIOA,&GPIO_InitStructure);
  286.                             GPIO_SetBits(GPIOA,GPIO_Pin_8);              /*A0默認(rèn)拉高*/
  287.               }
  288. }
  289. /***********************************************************
  290. * 名    稱:LD3320_Spi_cfg(void)
  291. * 功    能:配置SPI功能和端口初始化
  292. * 入口參數(shù):
  293. * 出口參數(shù):
  294. * 說    明:
  295. * 調(diào)用方法:
  296. **********************************************************/
  297. void LD3320_Spi_cfg(void)
  298. {
  299.               SPI_InitTypeDef  SPI_InitStructure;
  300.               GPIO_InitTypeDef GPIO_InitStructure;
  301.   //spi端口配置
  302.               RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 | RCC_APB2Periph_GPIOB,ENABLE);                 //使能SPI3外設(shè)時鐘
  303.   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  304.               //P0/P1/P2
  305.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13;
  306.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  307.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  308.               GPIO_Init(GPIOB,&GPIO_InitStructure);

  309.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                                          //spis 片選              WR
  310.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  311.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  312.               GPIO_Init(GPIOB, &GPIO_InitStructure);

  313.               LD_CS_H();
  314.             
  315.               //spi功能配置
  316.               SPI_Cmd(SPI2, DISABLE);
  317.               /* SPI3 配置 */
  318.               SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   //全雙工
  319.               SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                                                       //主模式
  320.               SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                                         //8位
  321.               SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                                                                       //時鐘極性 空閑狀態(tài)時,SCK保持低電平
  322.               SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                                                                                       //時鐘相位 數(shù)據(jù)采樣從第一個時鐘邊沿開始
  323.               SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                                                     //軟件產(chǎn)生NSS
  324.               SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;   //波特率控制 SYSCLK/128
  325.               SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                           //數(shù)據(jù)高位在前
  326.               SPI_InitStructure.SPI_CRCPolynomial = 7;                                                                                                     //CRC多項式寄存器初始值為7
  327.               SPI_Init(SPI2, &SPI_InitStructure);
  328.               /* 使能SPI3 */
  329.               SPI_Cmd(SPI2, ENABLE);
  330. }
  331. /***********************************************************
  332. * 名    稱: LD3320_EXTI_Cfg(void)
  333. * 功    能: 外部中斷功能配置和相關(guān)端口配置
  334. * 入口參數(shù):
  335. * 出口參數(shù):
  336. * 說    明:
  337. * 調(diào)用方法:
  338. **********************************************************/
  339. void LD3320_EXTI_Cfg(void)
  340. {
  341.   EXTI_InitTypeDef EXTI_InitStructure;
  342.               NVIC_InitTypeDef NVIC_InitStructure;
  343.   GPIO_InitTypeDef GPIO_InitStructure;

  344.   //定義IRQ中斷引腳配置
  345.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  346.   GPIO_InitStructure.GPIO_Pin =GPIO_Pin_15;
  347.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  348.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  349.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  350.               //外部中斷線配置
  351.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
  352.   EXTI_InitStructure.EXTI_Line = EXTI_Line15;
  353.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  354.   EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
  355.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  356.   EXTI_Init(&EXTI_InitStructure);
  357.   EXTI_GenerateSWInterrupt(EXTI_Line15);
  358.                            
  359.               GPIO_SetBits(GPIOA,GPIO_Pin_15);              //默認(rèn)拉高中斷引腳

  360.               EXTI_ClearFlag(EXTI_Line15);
  361.               EXTI_ClearITPendingBit(EXTI_Line15);
  362.               //中斷嵌套配置
  363.   NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  364.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  365.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  366.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  367.   NVIC_Init(&NVIC_InitStructure);
  368. }
  369. /***********************************************************
  370. * 名    稱:  EXTI1_IRQHandler(void)
  371. * 功    能: 外部中斷函數(shù)
  372. * 入口參數(shù):
  373. * 出口參數(shù):
  374. * 說    明:
  375. * 調(diào)用方法:
  376. **********************************************************/
  377. void EXTI15_10_IRQHandler(void)
  378. {
  379.               if(EXTI_GetITStatus(EXTI_Line15)!= RESET )
  380.               {
  381.                             ProcessInt0();
  382.                             PrintCom(USART1,"進(jìn)入中斷\r\n");
  383.                             EXTI_ClearFlag(EXTI_Line15);
  384.                             EXTI_ClearITPendingBit(EXTI_Line15);
  385.                             PC13_LED();
  386.               }
  387. }
復(fù)制代碼

以上的Word格式文檔51黑下載地址:
基于STM32的智能家居語音控制系統(tǒng).doc (1.98 MB, 下載次數(shù): 310)
回復(fù)

使用道具 舉報

ID:223788 發(fā)表于 2020-12-7 16:59 | 顯示全部樓層
看起來好厲害的樣子,支持一下
回復(fù)

使用道具 舉報

ID:660950 發(fā)表于 2020-12-30 16:33 | 顯示全部樓層
元器件清單可以發(fā)一下嗎
回復(fù)

使用道具 舉報

ID:116773 發(fā)表于 2020-12-30 17:15 | 顯示全部樓層
也買了一塊LD3220語音識別模塊,正在熟悉過程中,正好可以借鑒樓主的經(jīng)驗。
回復(fù)

使用道具 舉報

ID:654855 發(fā)表于 2021-1-11 21:52 | 顯示全部樓層
樓主不公開源碼嗎?
回復(fù)

使用道具 舉報

ID:762171 發(fā)表于 2021-3-26 08:47 | 顯示全部樓層
最近剛好用到,感謝樓主分享
回復(fù)

使用道具 舉報

ID:485057 發(fā)表于 2021-4-2 06:55 | 顯示全部樓層
電流檢測電路更為合理,電流超過允許值,可以直接判斷系統(tǒng)故障,確保所有設(shè)備及控制部分安全
回復(fù)

使用道具 舉報

ID:652597 發(fā)表于 2021-4-16 10:03 來自手機(jī) | 顯示全部樓層
可以分享一下ad的原理圖嗎
回復(fù)

使用道具 舉報

ID:818895 發(fā)表于 2021-5-5 12:30 | 顯示全部樓層
我也想嘗試一下這個語音模塊。
回復(fù)

使用道具 舉報

ID:319585 發(fā)表于 2021-5-13 17:52 來自手機(jī) | 顯示全部樓層
那個LD3320不是帶著有開關(guān)量輸出口嗎?能不能直接用開關(guān)量輸出口,不用單片機(jī)?
回復(fù)

使用道具 舉報

ID:79240 發(fā)表于 2021-7-2 10:18 | 顯示全部樓層

還沒玩過語音模塊,想試試。
回復(fù)

使用道具 舉報

ID:1022577 發(fā)表于 2022-5-3 10:16 來自手機(jī) | 顯示全部樓層
可以分享下原理圖嗎
回復(fù)

使用道具 舉報

ID:310441 發(fā)表于 2022-5-4 09:08 來自手機(jī) | 顯示全部樓層
曾經(jīng)也嘗試過LD3320 模塊,但是一個是貴,另一個是操作復(fù)雜……現(xiàn)在某一個寶上十元的模塊超級好用了
回復(fù)

使用道具 舉報

ID:987598 發(fā)表于 2022-5-12 18:04 | 顯示全部樓層
TEXT1.C(2): error C129: missing ';' before 'nAsrStatus'
這是有錯嗎,樓主
回復(fù)

使用道具 舉報

ID:901928 發(fā)表于 2022-10-12 16:12 | 顯示全部樓層
000111222333@ 發(fā)表于 2022-5-12 18:04
TEXT1.C(2): error C129: missing ';' before 'nAsrStatus'
這是有錯嗎,樓主

加個分號唄
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表