電路設計和部分程序源碼在附錄中。
本設計以 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圖
- /*************端口信息********************
- * 接線說明
- LD3320接口 STM32接口
- * RST PB11
- * CS PB10
- * WR/SPIS PB12
- * P2/SDCK PB13
- * P1/SDO PB14
- * P0/SDI PB15
- * IRQ PA15
- * A0 PA8
- *****************************************/
-
- /************************************************************************************
- // nAsrStatus 用來在main主程序中表示程序運行的狀態,不是LD3320芯片內部的狀態寄存器
- // LD_ASR_NONE: 表示沒有在作ASR識別
- // LD_ASR_RUNING: 表示LD3320正在作ASR識別中
- // LD_ASR_FOUNDOK: 表示一次識別流程結束后,有一個識別結果
- // LD_ASR_FOUNDZERO: 表示一次識別流程結束后,沒有識別結果
- // LD_ASR_ERROR: 表示一次識別流程中LD3320芯片內部出現不正確的狀態
- *********************************************************************************/
-
- uint8 nAsrStatus=0;
- void LD3320_Init(void);
- uint8 RunASR(void);
- void ProcessInt0(void);
- void LD3320_EXTI_Cfg(void);
- void LD3320_Spi_cfg(void);
- void LD3320_GPIO_Cfg(void);
- void LED_gpio_cfg(void);
- void MOTOR_Implement(u8 mode);
- extern void PrintComBit(USART_TypeDef* USARTx, uint8_t Data);
- /***********************************************************
- * 名 稱: LD3320_main(void)
- * 功 能: 主函數LD3320程序入口
- * 入口參數:
- * 出口參數:
- * 說 明:
- * 調用方法:
- **********************************************************/
- void LD3320_main(void)
- {
- uint8 nAsrRes=0;
- u8 chuanlian = 0;
- LD3320_Init();
- while(1)
- {
- switch(nAsrStatus)
- {
- case LD_ASR_RUNING:
- case LD_ASR_ERROR:
- break;
- case LD_ASR_NONE:
- nAsrStatus=LD_ASR_RUNING;
- if (RunASR()==0) // 啟動一次ASR識別流程:ASR初始化,ASR添加關鍵詞語,啟動ASR運算
- {
- nAsrStatus = LD_ASR_ERROR;
- }
- break;
-
- case LD_ASR_FOUNDOK:
- nAsrRes = LD_GetResult( ); //識別成功自動 獲取識別碼,識別碼在LDChip.h文件中,自行定義的數據
- //PrintComBit(USART1,nAsrRes ); //串口輸出識別碼
- switch(nAsrRes) /*對結果執行相關操作,客戶修改*/
- {
- case CODE_KD:
- LED_OPEN();
- PrintCom(USART1,"“開燈”命令識別成功\r\n"); /*text.....*/
- break;
- case CODE_GD:
- LED_CLOSE();
- PrintCom(USART1,"“關燈”命令識別成功\r\n"); /*text.....*/
- break;
- case CODE_KDS:
- RELAY1_OPEN();
- PrintCom(USART1,"“打開電視”命令識別成功\r\n"); /*text.....*/
- break;
- case CODE_GDS:
- RELAY1_CLOSE();
- PrintCom(USART1,"“關閉電視”命令識別成功\r\n"); /*text.....*/
- break;
-
- case CODE_KKT:
- RELAY2_OPEN();
- PrintCom(USART1,"“打開空調”命令識別成功\r\n"); /*text.....*/
- break;
- case CODE_GKT:
- RELAY2_CLOSE();
- PrintCom(USART1,"“關閉空調”命令識別成功\r\n"); /*text.....*/
- break;
- case CODE_KFS:
- FAN_OPEN();
- PrintCom(USART1,"“打開風扇”命令識別成功\r\n"); /*text.....*/
- break;
- case CODE_GFS:
- FAN_CLOSE();
- PrintCom(USART1,"“關閉風扇”命令識別成功\r\n"); /*text.....*/
- break;
-
- case CODE_KCL:
- chuanlian = 1;
- PrintCom(USART1,"“打開窗簾”命令識別成功\r\n"); /*text.....*/
- break;
- case CODE_GCL:
- chuanlian = 0;
- PrintCom(USART1,"“關閉窗簾”命令識別成功\r\n"); /*text.....*/
- break;
- case CODE_GDY:
- LED_CLOSE();
- RELAY1_CLOSE();
- RELAY2_CLOSE();
- FAN_CLOSE();
- chuanlian = 0;
- PrintCom(USART1,"“關閉電源”命令識別成功\r\n"); /*text.....*/
- break;
- default:break;
- }
- nAsrStatus = LD_ASR_NONE;
- break;
-
- case LD_ASR_FOUNDZERO:
- default: nAsrStatus = LD_ASR_NONE;
- PrintCom(USART1,"識別失敗\r\n");
- break;
- }//switch
- if(chuanlian == 1) MOTOR_Implement(1); //打開窗簾
- else MOTOR_Implement(0); //關閉窗簾
- }// while
-
- }
-
- void MOTOR_Implement(u8 mode)//步進電機旋轉
- {
- static u16 dj_count=0;
-
- if(mode == 1)
- {
- if(dj_count++ < 100)
- {
- MotorCW();//電機正轉,模擬開窗簾
- }
- else
- {
- dj_count = 100;
- MotorStop();//旋轉到一定程度,電機關閉
- }
- sys_delay_ms(1);
- }
- else
- {
- if(dj_count > 0)
- {
- dj_count--;
- MotorCCW();//電機反轉,模擬關窗簾
- }
- else
- {
- dj_count = 0;
- MotorStop();//旋轉到一定程度,電機關閉
- }
- sys_delay_ms(1);
- }
- }
-
- void PC13_LED()//識別燈閃爍
- {
- LED_PC13_L();
- sys_delay_ms(60);
- LED_PC13_H();
- sys_delay_ms(60);
-
- LED_PC13_L();
- sys_delay_ms(60);
- LED_PC13_H();
- sys_delay_ms(60);
-
- LED_PC13_L();
- sys_delay_ms(60);
- LED_PC13_H();
- }
-
- /***********************************************************
- * 名 稱:LD3320_Init(void)
- * 功 能:模塊驅動端口初始配置
- * 入口參數:
- * 出口參數:
- * 說 明:
- * 調用方法:
- **********************************************************/
- void LD3320_Init(void)
- {
- LD3320_GPIO_Cfg();
- LD3320_EXTI_Cfg();
- LD3320_Spi_cfg();
- MOTOR_GPIO_Init();
- LED_gpio_cfg();
- LD_reset();
-
- }
- /***********************************************************
- * 名 稱: RunASR(void)
- * 功 能: 運行ASR
- * 入口參數:
- * 出口參數:
- * 說 明:
- * 調用方法:
- **********************************************************/
- uint8 RunASR(void)
- {
- uint8 i=0;
- uint8 asrflag=0;
- for (i=0; i<5; i++) // 防止由于硬件原因導致LD3320芯片工作不正常,所以一共嘗試5次啟動ASR識別流程
- {
- LD_AsrStart(); //初始化ASR
- LD3320_delay(100);
- if (LD_AsrAddFixed()==0) //添加關鍵詞語到LD3320芯片中
- {
- LD_reset(); // LD3320芯片內部出現不正常,立即重啟LD3320芯片
- LD3320_delay(50); // 并從初始化開始重新ASR識別流程
- continue;
- }
-
- LD3320_delay(10);
-
- if (LD_AsrRun() == 0)
- {
- LD_reset(); // LD3320芯片內部出現不正常,立即重啟LD3320芯片
- LD3320_delay(50); // 并從初始化開始重新ASR識別流程
- continue;
- }
-
- asrflag=1;
- break; // ASR流程啟動成功,退出當前for循環。開始等待LD3320送出的中斷信號
- }
-
- return asrflag;
- }
-
- /***********************************************************
- * 名 稱: void Delay_( int i)
- * 功 能: 短延時
- * 入口參數:
- * 出口參數:
- * 說 明:
- * 調用方法:
- **********************************************************/
- void Delay_( int i)
- {
- while( i--)
- {
-
- }
- }
- /***********************************************************
- * 名 稱: LD3320_delay(unsigned long uldata)
- * 功 能: 長延時函數
- * 入口參數:
- * 出口參數:
- * 說 明:
- * 調用方法:
- **********************************************************/
- void LD3320_delay(unsigned long uldata)
- {
- unsigned int j = 0;
- unsigned int g = 0;
- for (j=0;j<5;j++)
- {
- for (g=0;g<uldata;g++)
- {
- Delay_(120);
- }
- }
- }
-
-
- /***********************************************************
- * 名 稱:LD3320_GPIO_Cfg(void)
- * 功 能:初始化需要用到的IO口
- * 入口參數:
- * 出口參數:
- * 說 明:
- * 調用方法:
- **********************************************************/
- void LD3320_GPIO_Cfg(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- // 配置PA8 輸出 8M 波形
- //定義RST/A0/CS端口
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);
- //LD_CS /RSET
- GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10|GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA,&GPIO_InitStructure);
- GPIO_SetBits(GPIOA,GPIO_Pin_8); /*A0默認拉高*/
- }
- }
- /***********************************************************
- * 名 稱:LD3320_Spi_cfg(void)
- * 功 能:配置SPI功能和端口初始化
- * 入口參數:
- * 出口參數:
- * 說 明:
- * 調用方法:
- **********************************************************/
- void LD3320_Spi_cfg(void)
- {
- SPI_InitTypeDef SPI_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- //spi端口配置
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 | RCC_APB2Periph_GPIOB,ENABLE); //使能SPI3外設時鐘
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
- //P0/P1/P2
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //spis 片選 WR
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- LD_CS_H();
-
- //spi功能配置
- SPI_Cmd(SPI2, DISABLE);
- /* SPI3 配置 */
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全雙工
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //時鐘極性 空閑狀態時,SCK保持低電平
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //時鐘相位 數據采樣從第一個時鐘邊沿開始
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //軟件產生NSS
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //波特率控制 SYSCLK/128
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //數據高位在前
- SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC多項式寄存器初始值為7
- SPI_Init(SPI2, &SPI_InitStructure);
- /* 使能SPI3 */
- SPI_Cmd(SPI2, ENABLE);
- }
- /***********************************************************
- * 名 稱: LD3320_EXTI_Cfg(void)
- * 功 能: 外部中斷功能配置和相關端口配置
- * 入口參數:
- * 出口參數:
- * 說 明:
- * 調用方法:
- **********************************************************/
- void LD3320_EXTI_Cfg(void)
- {
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
-
- //定義IRQ中斷引腳配置
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin =GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- //外部中斷線配置
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
- EXTI_InitStructure.EXTI_Line = EXTI_Line15;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
- EXTI_GenerateSWInterrupt(EXTI_Line15);
-
- GPIO_SetBits(GPIOA,GPIO_Pin_15); //默認拉高中斷引腳
-
- EXTI_ClearFlag(EXTI_Line15);
- EXTI_ClearITPendingBit(EXTI_Line15);
- //中斷嵌套配置
- NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- /***********************************************************
- * 名 稱: EXTI1_IRQHandler(void)
- * 功 能: 外部中斷函數
- * 入口參數:
- * 出口參數:
- * 說 明:
- * 調用方法:
- **********************************************************/
- void EXTI15_10_IRQHandler(void)
- {
- if(EXTI_GetITStatus(EXTI_Line15)!= RESET )
- {
- ProcessInt0();
- PrintCom(USART1,"進入中斷\r\n");
- EXTI_ClearFlag(EXTI_Line15);
- EXTI_ClearITPendingBit(EXTI_Line15);
- PC13_LED();
- }
- }
復制代碼
以上的Word格式文檔51黑下載地址:
基于STM32的智能家居語音控制系統.doc
(1.98 MB, 下載次數: 310)
2020-12-6 17:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|