欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14669|回復: 14
打印 上一主題 下一主題
收起左側

STM32單片機LD3320智能家居語音控制系統設計與調試資料

  [復制鏈接]
跳轉到指定樓層
樓主
ID:427862 發表于 2020-12-6 17:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
電路設計和部分程序源碼在附錄中。

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

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

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

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

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

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

2.2.2 主控制芯片的確定

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

2.3系統實現的功能

1.語音控制開關燈

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

當語音芯片收到“打開窗簾”命令,單片機進行識別處理,ULN2003步進電機驅動驅動步進電機模擬窗簾的開啟,當步進電機旋轉到一定角度時,窗簾開啟。當語音芯片收到“關閉窗簾”命令,單片機進行識別處理,ULN2003步進電機驅動驅動步進電機模擬窗簾的關閉,當步進電機旋轉到一定角度時,窗簾關閉。

3.語音控制風扇的開啟和關閉

當語音芯片收到“打開風扇”命令,單片機進行識別和處理,然后風扇就會旋轉。當語音芯片收到“關閉”命令,單片機再次進行識別和處理,識別成功,風扇就會停止轉動。

4.語音控制開關用電器

當語音芯片收到“打開空調”命令,單片機進行識別和處理,然后空調的指示燈就會打開。當語音芯片收到“關閉空調”命令,單片機再次進行識別和處理,識別成功,空調的指示燈就會關閉。
5.語音控制關閉電源

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


第三章 系統硬件設計
3.1 主控制器模塊

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

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

圖3.1 STM32單片機原理圖

STM32實物圖如圖3.2所示:

圖3.2 STM32F103C8T6實物圖

3.2 電源模塊

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

圖3.3電源電路圖


3.3  語音識別模塊

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

圖3.4語音識別芯片

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

圖3.5語音識別原理圖

3.4  步進電機及驅動模塊

我們可以通過脈沖的控制對電機的轉速和方向進行調整,通過單片機來處理標準邏輯緩沖器來處理數據。單片機通過IN1 IN2 IN3 IN4 接口與ULN2003進行連接,然后單片機用來輸出電流,由OUT1 OUT2 OUT3 OUT4輸出到電機的四相也就是ABCD。ULN2003的輸入電流只需要幾毫安就可以,由單片機提供,經過達林頓結構,驅動為5V,耐壓為50V,灌電流可達500mA[7]。

圖3.6 ULN2003管腳原理圖

圖3.7 步進電機驅動原理圖

3.5 風扇控制模塊

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

圖3.8風扇控制電路原理圖

3.6 繼電器控制模塊

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


圖3.9繼電器原理圖

3.7 原理設計

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

圖3.11 原理圖設計界面



第四章 系統軟件設計
4.1 Keil編程軟件

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

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


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

4.2 系統總程序設計

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

圖4.2軟件設計流程圖

4.3 系統各功能子程序設計
4.3.1 窗簾控制子程序設計

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

圖4.3電機驅動流程圖

4.3.2 空調電視控制子系統設計

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

圖4.4空調電視控制子程序流程圖

4.3.3風扇控制子系統設計    

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

圖4.5 風扇控制子系統流程圖

4.3.4 開關燈子系統設計

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

圖4.6 燈控制子程序流程圖

4.3.5 關閉電源子系統設計

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

圖4.7 關閉電源子程序流程圖


章  焊接與系統調試
5.1 電路焊

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

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

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

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

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

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

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

焊接過程應注意的事項:

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

接者燙傷,或者將其他的元器件燙壞,而導致系統問題。

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

觸不良。

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

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

及整體的美觀。

圖5.1焊接完成圖

5.2 系統調試

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

1. 語音芯片識別到“打開窗簾”的語音指令,ULN2003步行電機驅動就會驅動步行電機進行旋轉,來模擬窗簾的開啟,當步行電機停止旋轉時,說明窗簾已經完全打開。如果語音芯片識別到“關閉窗簾”的語音指令,ULN2003步行電機驅動就會驅動步行電機進行旋轉,來模擬窗簾的關閉,當步行電機停止旋轉時,說明窗簾已經完全關閉。如下圖5.2

圖5.2 窗簾的開啟實物圖

2.本設計中的智能電風扇控制系統,是將電風扇與語音芯片相關聯,由單片機分析和處理語音信息。當語音芯片收到“打開風扇”指令時,經過單片機的識別處理,風扇就會打開。當語音芯片收到“關閉風扇”指令時,經過單片機的識別處理,風扇就會關閉。

圖5.3 風扇的開啟實物圖

3. 當語音芯片收到“開燈”指令時,經過單片機的識別處理,燈泡就會打開。當語音芯片收到“關燈”指令時,經過單片機的識別處理,燈泡就會關閉。當語音芯片收到“打開空調”指令時,經過單片機的識別處理,空調就會打開。當語音芯片收到“打開電視”指令時,經過單片機的識別處理,電視就會打開。

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

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



附錄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主程序中表示程序運行的狀態,不是LD3320芯片內部的狀態寄存器
  15. //              LD_ASR_NONE:                            表示沒有在作ASR識別
  16. //              LD_ASR_RUNING:                            表示LD3320正在作ASR識別中
  17. //              LD_ASR_FOUNDOK:                            表示一次識別流程結束后,有一個識別結果
  18. //              LD_ASR_FOUNDZERO:              表示一次識別流程結束后,沒有識別結果
  19. //              LD_ASR_ERROR:                            表示一次識別流程中LD3320芯片內部出現不正確的狀態
  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. * 功    能: 主函數LD3320程序入口
  34. * 入口參數:
  35. * 出口參數:
  36. * 說    明:
  37. * 調用方法:
  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添加關鍵詞語,啟動ASR運算
  54.               {                           
  55.                                                         nAsrStatus = LD_ASR_ERROR;
  56.                                                                                                                 }
  57.                                                                                                                 break;

  58.                                           case LD_ASR_FOUNDOK:
  59. nAsrRes = LD_GetResult( );              //識別成功自動 獲取識別碼,識別碼在LDChip.h文件中,自行定義的數據                                                                                                                                                                                                                                                                        
  60. //PrintComBit(USART1,nAsrRes ); //串口輸出識別碼                           
  61. switch(nAsrRes)                               /*對結果執行相關操作,客戶修改*/
  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,"“關燈”命令識別成功\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,"“關閉電視”命令識別成功\r\n"); /*text.....*/
  78. break;
  79.                                                                                                                              
  80.                             case CODE_KKT:
  81.                             RELAY2_OPEN();
  82.                             PrintCom(USART1,"“打開空調”命令識別成功\r\n"); /*text.....*/
  83. break;
  84. case CODE_GKT:            
  85.               RELAY2_CLOSE();
  86.               PrintCom(USART1,"“關閉空調”命令識別成功\r\n"); /*text.....*/
  87. break;
  88. case CODE_KFS:                           
  89.               FAN_OPEN();
  90.               PrintCom(USART1,"“打開風扇”命令識別成功\r\n"); /*text.....*/
  91. break;
  92. case CODE_GFS:                           
  93.               FAN_CLOSE();
  94.               PrintCom(USART1,"“關閉風扇”命令識別成功\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,"“關閉窗簾”命令識別成功\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,"“關閉電源”命令識別成功\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);              //關閉窗簾                           
  125.               }// while

  126. }

  127. void MOTOR_Implement(u8 mode)//步進電機旋轉
  128. {
  129. static u16 dj_count=0;
  130.             
  131. if(mode == 1)
  132. {
  133. if(dj_count++ < 100)
  134. {
  135.                             MotorCW();//電機正轉,模擬開窗簾
  136. }
  137. else
  138. {
  139.                             dj_count = 100;
  140.                 MotorStop();//旋轉到一定程度,電機關閉
  141. }
  142.                                                         sys_delay_ms(1);
  143.                             }
  144.                             else
  145.                             {
  146.                                                         if(dj_count > 0)
  147.                                                         {
  148.                                                                                     dj_count--;
  149.                                                                         MotorCCW();//電機反轉,模擬關窗簾
  150.                                                         }
  151.                                                         else
  152.                                                         {
  153.                                                                                     dj_count = 0;
  154.                                                                         MotorStop();//旋轉到一定程度,電機關閉
  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. * 功    能:模塊驅動端口初始配置
  178. * 入口參數:
  179. * 出口參數:
  180. * 說    明:
  181. * 調用方法:
  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. * 入口參數:
  197. * 出口參數:
  198. * 說    明:
  199. * 調用方法:
  200. **********************************************************/
  201. uint8 RunASR(void)
  202. {
  203.               uint8 i=0;
  204.               uint8 asrflag=0;
  205.               for (i=0; i<5; i++)                                          //              防止由于硬件原因導致LD3320芯片工作不正常,所以一共嘗試5次啟動ASR識別流程
  206.               {
  207.                             LD_AsrStart();                                          //初始化ASR
  208.                             LD3320_delay(100);
  209.                             if (LD_AsrAddFixed()==0)              //添加關鍵詞語到LD3320芯片中
  210.                             {
  211.                                           LD_reset();                                          //              LD3320芯片內部出現不正常,立即重啟LD3320芯片
  212.                                           LD3320_delay(50);                                          //              并從初始化開始重新ASR識別流程
  213.                                           continue;
  214.                             }

  215.                             LD3320_delay(10);

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

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

  225.               return asrflag;
  226. }

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

  239.         }
  240. }            
  241. /***********************************************************
  242. * 名    稱:              LD3320_delay(unsigned long uldata)
  243. * 功    能:              長延時函數
  244. * 入口參數:
  245. * 出口參數:
  246. * 說    明:
  247. * 調用方法:
  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. * 入口參數:
  265. * 出口參數:
  266. * 說    明:
  267. * 調用方法:
  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默認拉高*/
  287.               }
  288. }
  289. /***********************************************************
  290. * 名    稱:LD3320_Spi_cfg(void)
  291. * 功    能:配置SPI功能和端口初始化
  292. * 入口參數:
  293. * 出口參數:
  294. * 說    明:
  295. * 調用方法:
  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外設時鐘
  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;                                                                                       //時鐘極性 空閑狀態時,SCK保持低電平
  322.               SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                                                                                       //時鐘相位 數據采樣從第一個時鐘邊沿開始
  323.               SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                                                     //軟件產生NSS
  324.               SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;   //波特率控制 SYSCLK/128
  325.               SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                           //數據高位在前
  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. * 功    能: 外部中斷功能配置和相關端口配置
  334. * 入口參數:
  335. * 出口參數:
  336. * 說    明:
  337. * 調用方法:
  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);              //默認拉高中斷引腳

  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. * 功    能: 外部中斷函數
  372. * 入口參數:
  373. * 出口參數:
  374. * 說    明:
  375. * 調用方法:
  376. **********************************************************/
  377. void EXTI15_10_IRQHandler(void)
  378. {
  379.               if(EXTI_GetITStatus(EXTI_Line15)!= RESET )
  380.               {
  381.                             ProcessInt0();
  382.                             PrintCom(USART1,"進入中斷\r\n");
  383.                             EXTI_ClearFlag(EXTI_Line15);
  384.                             EXTI_ClearITPendingBit(EXTI_Line15);
  385.                             PC13_LED();
  386.               }
  387. }
復制代碼

以上的Word格式文檔51黑下載地址:
基于STM32的智能家居語音控制系統.doc (1.98 MB, 下載次數: 310)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏27 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:223788 發表于 2020-12-7 16:59 | 只看該作者
看起來好厲害的樣子,支持一下
回復

使用道具 舉報

無效樓層,該帖已經被刪除
地板
ID:660950 發表于 2020-12-30 16:33 | 只看該作者
元器件清單可以發一下嗎
回復

使用道具 舉報

5#
ID:116773 發表于 2020-12-30 17:15 | 只看該作者
也買了一塊LD3220語音識別模塊,正在熟悉過程中,正好可以借鑒樓主的經驗。
回復

使用道具 舉報

6#
ID:654855 發表于 2021-1-11 21:52 | 只看該作者
樓主不公開源碼嗎?
回復

使用道具 舉報

7#
無效樓層,該帖已經被刪除
8#
ID:762171 發表于 2021-3-26 08:47 | 只看該作者
最近剛好用到,感謝樓主分享
回復

使用道具 舉報

9#
ID:485057 發表于 2021-4-2 06:55 | 只看該作者
電流檢測電路更為合理,電流超過允許值,可以直接判斷系統故障,確保所有設備及控制部分安全
回復

使用道具 舉報

10#
ID:652597 發表于 2021-4-16 10:03 來自觸屏版 | 只看該作者
可以分享一下ad的原理圖嗎
回復

使用道具 舉報

11#
ID:818895 發表于 2021-5-5 12:30 | 只看該作者
我也想嘗試一下這個語音模塊。
回復

使用道具 舉報

12#
無效樓層,該帖已經被刪除
13#
ID:319585 發表于 2021-5-13 17:52 來自觸屏版 | 只看該作者
那個LD3320不是帶著有開關量輸出口嗎?能不能直接用開關量輸出口,不用單片機?
回復

使用道具 舉報

14#
ID:79240 發表于 2021-7-2 10:18 | 只看該作者

還沒玩過語音模塊,想試試。
回復

使用道具 舉報

15#
ID:1022577 發表于 2022-5-3 10:16 來自觸屏版 | 只看該作者
可以分享下原理圖嗎
回復

使用道具 舉報

16#
ID:310441 發表于 2022-5-4 09:08 來自觸屏版 | 只看該作者
曾經也嘗試過LD3320 模塊,但是一個是貴,另一個是操作復雜……現在某一個寶上十元的模塊超級好用了
回復

使用道具 舉報

17#
無效樓層,該帖已經被刪除
18#
ID:987598 發表于 2022-5-12 18:04 | 只看該作者
TEXT1.C(2): error C129: missing ';' before 'nAsrStatus'
這是有錯嗎,樓主
回復

使用道具 舉報

19#
ID:901928 發表于 2022-10-12 16:12 | 只看該作者
000111222333@ 發表于 2022-5-12 18:04
TEXT1.C(2): error C129: missing ';' before 'nAsrStatus'
這是有錯嗎,樓主

加個分號唄
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表