標(biāo)題: STM32單片機(jī)LD3320智能家居語(yǔ)音控制系統(tǒng)設(shè)計(jì)與調(diào)試資料 [打印本頁(yè)]
作者: 狂愛(ài)電子的小白 時(shí)間: 2020-12-6 17:07
標(biāo)題: STM32單片機(jī)LD3320智能家居語(yǔ)音控制系統(tǒng)設(shè)計(jì)與調(diào)試資料
電路設(shè)計(jì)和部分程序源碼在附錄中。
本設(shè)計(jì)以 STM32 單片機(jī)為核心的智能家居語(yǔ)音控制系統(tǒng),結(jié)合各功能模塊和傳感器模塊,形成一套對(duì)家居電器智能控制系統(tǒng)的設(shè)計(jì)方案。系統(tǒng)以 STM32103C8T6為系統(tǒng)的主控芯片,輔以步進(jìn)電機(jī)、非特定人語(yǔ)音識(shí)別模塊等諸多外設(shè)器件。通過(guò)編程完成對(duì)串口通訊、 非特定人語(yǔ)音識(shí)別等模塊的功能實(shí)現(xiàn)。設(shè)計(jì)側(cè)重于局域網(wǎng)本地控制及通訊接口設(shè)計(jì)。通過(guò)發(fā)送語(yǔ)音消息,根據(jù)語(yǔ)音的內(nèi)容實(shí)現(xiàn)對(duì)家用電器控制、照明系統(tǒng)控制等本地控制,功能實(shí)用、操作簡(jiǎn)單、易于安裝,能夠有效地提升居民的生活質(zhì)量。
語(yǔ)音智能家居是現(xiàn)代家用電器未來(lái)發(fā)展的一個(gè)必然趨勢(shì)。在現(xiàn)在市場(chǎng)上主要運(yùn)用的功能為語(yǔ)音對(duì)話(huà),就是說(shuō)在居家生活中由人與家用電器進(jìn)行對(duì)話(huà),在距離有限的范圍里,語(yǔ)音模塊能根據(jù)相應(yīng)的語(yǔ)音指令自動(dòng)識(shí)別,然后由主控芯片控制用電器實(shí)現(xiàn)相應(yīng)功能。根據(jù)芯片的語(yǔ)言程序編寫(xiě)的不同,識(shí)別的范圍和實(shí)現(xiàn)的功能也會(huì)有相應(yīng)的區(qū)別。其中,硬件設(shè)計(jì)為軟件的實(shí)現(xiàn)提供了堅(jiān)實(shí)的基礎(chǔ),軟件是硬件內(nèi)在,軟硬件相輔相成,共同作用。系統(tǒng)功能是否能夠?qū)崿F(xiàn)取決于二者的配合。本系統(tǒng)的功能框圖如下圖。
2.2控制芯片的選擇
2.2.1選擇控制芯片需要考慮的幾個(gè)因素(1)芯片所能應(yīng)用的領(lǐng)域:因?yàn)槊總(gè)芯片的功能有所差別,因此所能應(yīng)用的系統(tǒng)環(huán)境也會(huì)不同,當(dāng)選定控制芯片之后,所需要的環(huán)境必須適合[1]。因此,在選定芯片之前要確定系統(tǒng)的環(huán)境與芯片的環(huán)境相匹配。
(2)芯片自身的功能:當(dāng)芯片的功能與設(shè)計(jì)所需要功能更加接近時(shí),設(shè)計(jì)的難度也會(huì)降低。首先要確定系統(tǒng)要實(shí)現(xiàn)的功能,然后再看每個(gè)芯片自身的功能和能實(shí)現(xiàn)的功能,然后選擇最合適的芯片[1]。
(3)芯片的功耗:由于設(shè)計(jì)中有能量供給模塊,因此選擇控制芯片的時(shí)候要考慮到芯片所需要的能源大小以及供給的能量是否能夠維持芯片的工作時(shí)長(zhǎng)[1]。并且也要考慮到芯片運(yùn)行時(shí)會(huì)不會(huì)對(duì)環(huán)境有所污染,盡可能讓做出的產(chǎn)品環(huán)保節(jié)能。
2.2.2 主控制芯片的確定STM32F103C8T6功能強(qiáng)大,集成度高,是MSC-51單片機(jī)所有型號(hào)中應(yīng)用比較多的一個(gè)型號(hào)。STM32F103C8T6單片機(jī)是把所必需的控制應(yīng)用都集成在一個(gè)尺寸空間有限的集成電路芯片上,傳統(tǒng)結(jié)構(gòu)模式是把CPU加到外圍芯片上。對(duì)各種功能部件的控制采用特殊功能寄存器的集中控制方式[2]?紤]到STM32單片機(jī)比51功能更加全面,所用資料比較容易搜集以及應(yīng)用更加廣泛,因此采用STM32單片機(jī)來(lái)實(shí)現(xiàn)本系統(tǒng)的相應(yīng)功能。
2.3系統(tǒng)實(shí)現(xiàn)的功能1.語(yǔ)音控制開(kāi)關(guān)燈
當(dāng)語(yǔ)音芯片收到“開(kāi)燈”命令,單片機(jī)進(jìn)行識(shí)別和處理,然后燈就會(huì)打開(kāi)。當(dāng)語(yǔ)音芯片收到“關(guān)燈”命令,單片機(jī)再次進(jìn)行識(shí)別和處理,識(shí)別成功,燈就會(huì)關(guān)閉。
2.語(yǔ)音控制窗簾的開(kāi)啟和關(guān)閉
當(dāng)語(yǔ)音芯片收到“打開(kāi)窗簾”命令,單片機(jī)進(jìn)行識(shí)別處理,ULN2003步進(jìn)電機(jī)驅(qū)動(dòng)驅(qū)動(dòng)步進(jìn)電機(jī)模擬窗簾的開(kāi)啟,當(dāng)步進(jìn)電機(jī)旋轉(zhuǎn)到一定角度時(shí),窗簾開(kāi)啟。當(dāng)語(yǔ)音芯片收到“關(guān)閉窗簾”命令,單片機(jī)進(jìn)行識(shí)別處理,ULN2003步進(jìn)電機(jī)驅(qū)動(dòng)驅(qū)動(dòng)步進(jìn)電機(jī)模擬窗簾的關(guān)閉,當(dāng)步進(jìn)電機(jī)旋轉(zhuǎn)到一定角度時(shí),窗簾關(guān)閉。
3.語(yǔ)音控制風(fēng)扇的開(kāi)啟和關(guān)閉
當(dāng)語(yǔ)音芯片收到“打開(kāi)風(fēng)扇”命令,單片機(jī)進(jìn)行識(shí)別和處理,然后風(fēng)扇就會(huì)旋轉(zhuǎn)。當(dāng)語(yǔ)音芯片收到“關(guān)閉”命令,單片機(jī)再次進(jìn)行識(shí)別和處理,識(shí)別成功,風(fēng)扇就會(huì)停止轉(zhuǎn)動(dòng)。
4.語(yǔ)音控制開(kāi)關(guān)用電器
當(dāng)語(yǔ)音芯片收到“打開(kāi)空調(diào)”命令,單片機(jī)進(jìn)行識(shí)別和處理,然后空調(diào)的指示燈就會(huì)打開(kāi)。當(dāng)語(yǔ)音芯片收到“關(guān)閉空調(diào)”命令,單片機(jī)再次進(jìn)行識(shí)別和處理,識(shí)別成功,空調(diào)的指示燈就會(huì)關(guān)閉。
5.語(yǔ)音控制關(guān)閉電源
當(dāng)用電器同時(shí)運(yùn)行時(shí),為了人們出行方便,可以使用關(guān)閉電源命令,就可以把開(kāi)著的所有用電器同時(shí)關(guān)閉。
第三章 系統(tǒng)硬件設(shè)計(jì)
3.1 主控制器模塊本系統(tǒng)采用的單片機(jī)是STM32F103C8T6單片機(jī)。此單片機(jī)比51系列更加實(shí)用高效,自帶2個(gè)AD轉(zhuǎn)換,同時(shí)運(yùn)行速度比51單片機(jī)要快很多,非常方便;
STM32F103C8T6單片機(jī)具有5個(gè)不同的串口進(jìn)行通信,而51單片機(jī)只有1個(gè)單獨(dú)串口進(jìn)行通信,所以STM32有著更加強(qiáng)大的控制功能和通信功能,并且所具有的功能在現(xiàn)在市場(chǎng)上有廣泛的運(yùn)用,由于STM32單片機(jī)可以進(jìn)行多種不同的時(shí)鐘模數(shù)轉(zhuǎn)換來(lái)進(jìn)行工作,因此功耗比較高[3]。引腳JDQ1和JDQ2與兩個(gè)用電器模塊連接,引腳29-32與步進(jìn)電機(jī)模塊連接,引腳34與風(fēng)扇模塊連接,引腳B12-B15和A8與語(yǔ)音模塊相連接。STM32單片機(jī)原理圖如圖3.1所示。

圖3.1 STM32單片機(jī)原理圖
STM32實(shí)物圖如圖3.2所示:

圖3.2 STM32F103C8T6實(shí)物圖
3.2 電源模塊單片機(jī)的供電電源開(kāi)關(guān)控制如圖3.3所示,單片機(jī)的供電電路是一個(gè)自鎖開(kāi)關(guān)加上一個(gè)電源座子。因?yàn)楸鞠到y(tǒng)中所有的器件都是5V供電,所以只需要用電池和充電寶或者USB連接到我們使用的筆記本或者臺(tái)式電腦就可以直接使用了。但是需要注意的是,此電路之所以可以這樣設(shè)計(jì),是因?yàn)殡娐分袥](méi)有什么功耗比較大的外圍電路。我們有時(shí)候會(huì)遇到雖然芯片上寫(xiě)的是5V供電但是功耗非常的高[4]。所以我們?cè)谠O(shè)計(jì)驅(qū)動(dòng)電機(jī)或者是風(fēng)扇等電路的時(shí)候就需要特別注意電路中電流可不可以符合這些器件運(yùn)行的要求。如果符合要求就可以使用,否則不可以使用。

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

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

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

圖3.6 ULN2003管腳原理圖

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

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

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

圖3.11 原理圖設(shè)計(jì)界面
第四章 系統(tǒng)軟件設(shè)計(jì)
4.1 Keil編程軟件上一章節(jié)著重介紹了本系統(tǒng)的硬件設(shè)計(jì),這一章將介紹軟件設(shè)計(jì)。Keil5是一款兼容單片機(jī)C語(yǔ)言的軟件開(kāi)發(fā)系統(tǒng)。Keil包括C編輯器、鏈接器、宏匯編等,通過(guò)uVision開(kāi)發(fā)環(huán)境將這些部分結(jié)合起來(lái)。近幾年Keil編程軟件得到了很多仿真機(jī)廠的認(rèn)可和支持。Keil 編程軟件是由美國(guó)公司出品的軟件開(kāi)發(fā)系統(tǒng)[12],目的是為了方便編程人員進(jìn)行程序編程。
本系統(tǒng)我們選擇STM32單片機(jī)進(jìn)行工程的建立。如圖4.1所示,你可以根據(jù)你使用的處理器來(lái)選擇,如果您所使用的處理器型號(hào)在列表中找不到,也可以找一款與您使用的相兼容的型號(hào)來(lái)代替。右邊一欄是對(duì)這個(gè)芯片的基本的說(shuō)明,然后鼠標(biāo)點(diǎn)擊“是” [13]。
圖4.1芯片啟動(dòng)代碼拷貝確認(rèn)對(duì)換框
有些芯片會(huì)提供啟動(dòng)代碼,我們這個(gè)時(shí)候點(diǎn)擊“是”,到此一個(gè)工程就建立好。
4.2 系統(tǒng)總程序設(shè)計(jì) 軟件部分的主要任務(wù)是完成對(duì)語(yǔ)音進(jìn)行識(shí)別和處理然后控制各個(gè)器件對(duì)當(dāng)前不同的指令進(jìn)行判斷基于上述分析,當(dāng)語(yǔ)音芯片收到“打開(kāi)窗簾”語(yǔ)音指令,單片機(jī)進(jìn)行處理和判別,然后步行電機(jī)就會(huì)轉(zhuǎn)動(dòng)模擬窗簾的開(kāi)啟,當(dāng)旋轉(zhuǎn)到一定角度后,窗簾完全打開(kāi)。當(dāng)語(yǔ)音芯片收到“打開(kāi)風(fēng)扇”的語(yǔ)音指令,風(fēng)扇就會(huì)轉(zhuǎn)動(dòng)。當(dāng)收到“開(kāi)燈”指令,LED燈就會(huì)打開(kāi)。當(dāng)收到“關(guān)閉電源”的語(yǔ)音指令時(shí),不管此時(shí)打開(kāi)多少用電器,都會(huì)同時(shí)關(guān)閉。系統(tǒng)軟件設(shè)計(jì)流程如圖4.2所示。程序見(jiàn)附錄C。

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

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

圖4.4空調(diào)電視控制子程序流程圖
4.3.3風(fēng)扇控制子系統(tǒng)設(shè)計(jì) 傳統(tǒng)的家用風(fēng)扇每次開(kāi)啟或者關(guān)閉時(shí),必然有人參與操作,這樣給用戶(hù)帶來(lái)諸多不便。如果能夠不動(dòng)手就可以實(shí)現(xiàn)開(kāi)關(guān)風(fēng)扇的這些功能,那么就可以給用戶(hù)帶來(lái)很多方便。
本設(shè)計(jì)中的智能電風(fēng)扇控制系統(tǒng),是將電風(fēng)扇與語(yǔ)音芯片相關(guān)聯(lián),由單片機(jī)分析和處理語(yǔ)音信息。當(dāng)語(yǔ)音芯片收到“打開(kāi)風(fēng)扇”指令時(shí),經(jīng)過(guò)單片機(jī)的識(shí)別處理,風(fēng)扇就會(huì)打開(kāi)。當(dāng)語(yǔ)音芯片收到“關(guān)閉風(fēng)扇”指令時(shí),經(jīng)過(guò)單片機(jī)的識(shí)別處理,風(fēng)扇就會(huì)關(guān)閉。從而達(dá)到語(yǔ)音控制風(fēng)扇開(kāi)啟和關(guān)閉的效果。程序見(jiàn)附錄C。
圖4.5 風(fēng)扇控制子系統(tǒng)流程圖
4.3.4 開(kāi)關(guān)燈子系統(tǒng)設(shè)計(jì) 在本系統(tǒng)中,當(dāng)語(yǔ)音模塊識(shí)別到“開(kāi)燈”的語(yǔ)音命令,然后將收到的命令輸送給單片機(jī)主控模塊進(jìn)行處理識(shí)別,從而實(shí)現(xiàn)對(duì)燈泡的相應(yīng)操作。開(kāi)關(guān)燈的子系統(tǒng)流程圖如4.6程序見(jiàn)附錄C。
圖4.6 燈控制子程序流程圖
4.3.5 關(guān)閉電源子系統(tǒng)設(shè)計(jì) 從上面四部分已經(jīng)知道,利用語(yǔ)音芯片采集語(yǔ)音信息,通過(guò)主控芯片進(jìn)行識(shí)別和處理信息,系統(tǒng)可以實(shí)現(xiàn)對(duì)風(fēng)扇、窗簾、繼電器、燈泡的開(kāi)啟和關(guān)閉進(jìn)行單一的控制。為了使人們的居家生活更加便捷,當(dāng)我們離開(kāi)家的時(shí)候,我們可以把所有用電器同時(shí)關(guān)閉。程序見(jiàn)附錄C。
圖4.7 關(guān)閉電源子程序流程圖
第五章 焊接與系統(tǒng)調(diào)試
5.1 電路焊接手工焊接是最原始的焊接方法,在現(xiàn)代工業(yè)中,由于電子產(chǎn)品需要批量的生產(chǎn),從而手工焊接已經(jīng)不能滿(mǎn)足生產(chǎn)速度和質(zhì)量的需求,大量的由機(jī)器焊接所替代;但是手工焊接這種原始的焊接方法在電子元器件的設(shè)計(jì)、維修、檢測(cè)中仍然是必不可少的,并且維修、設(shè)計(jì)的質(zhì)量好壞也會(huì)由手工焊接的質(zhì)量好壞所影響。作為一名合格的工學(xué)類(lèi)大學(xué)生,每個(gè)人都應(yīng)該具備手工焊接這項(xiàng)技能,并且應(yīng)該不斷地練習(xí)這項(xiàng)技能,使焊接的產(chǎn)品達(dá)到更好的質(zhì)量。
在焊接之前準(zhǔn)備好用到的焊接工具,電烙鐵的手握方法有以下幾種:正握法、握筆式和反握法。
手工焊接有以下幾個(gè)主要的步驟:
1、準(zhǔn)備焊接: 清潔元器件、電路板、焊錫表面的灰塵,以防焊接過(guò)程中由于灰塵而導(dǎo)致焊接的不牢固或者導(dǎo)電性差。然后將元器件的各個(gè)管腳盡量的分開(kāi)最大距離,避免烙鐵在焊接時(shí)燙壞元器件。
2、加熱焊接:電烙鐵通電以后,先將電烙鐵進(jìn)行幾秒鐘的預(yù)熱,然后將電烙鐵的頭沾上合適量焊錫和松香,將其慢慢的融化后,與被焊接元器件管腳相接處,等待焊錫與電路板上的焊錫想融合之后移開(kāi)。
3、清理焊接面:在焊接完元器件時(shí),可能會(huì)有過(guò)多的焊錫,需要將這些多余的焊錫清理干凈。需要用干凈的鑷子,在將這些焊錫融化的同時(shí)用鑷子將多余的焊錫去掉。
4、檢查焊點(diǎn):觀察元器件管腳在焊接時(shí)是與否電路板焊錫連接牢固,如有缺口需要補(bǔ)焊。觀察是否有過(guò)連接等現(xiàn)象,保證線路安全。
焊接過(guò)程應(yīng)注意的事項(xiàng):
5、焊接中一定要注意電烙鐵的放置,應(yīng)放在原本的底座上,以防將焊
接者燙傷,或者將其他的元器件燙壞,而導(dǎo)致系統(tǒng)問(wèn)題。
6、焊接前保證仔細(xì)清潔元器件的表面灰塵,防止焊接不牢固,或者接
觸不良。
7、焊接時(shí)焊錫一定不可以過(guò)多或者過(guò)少;當(dāng)焊錫過(guò)多時(shí),可能導(dǎo)致線路過(guò)連接使電路短路。當(dāng)焊錫過(guò)少時(shí),元器件和電路板會(huì)連接不牢固,或者會(huì)焊點(diǎn)接觸不良等問(wèn)題。
8、焊接完成后要清潔電路板上遺留的焊錫,防止影響電路正常運(yùn)行,以
及整體的美觀。

圖5.1焊接完成圖
5.2 系統(tǒng)調(diào)試硬件電路板完成以后,為了達(dá)到較好的語(yǔ)音控制效果,在完成以后進(jìn)行了多次調(diào)試。尤其對(duì)語(yǔ)音模塊,步行電機(jī)驅(qū)動(dòng)模塊以及小風(fēng)扇進(jìn)行了多次調(diào)試。如語(yǔ)音調(diào)試,語(yǔ)音識(shí)別過(guò)程主要包括“收集”和“識(shí)別”兩個(gè)階段。在收集階段,通過(guò)LD3320語(yǔ)音芯片對(duì)說(shuō)話(huà)者的聲音進(jìn)行采集,從中提取出單片機(jī)能夠識(shí)別的信息,建立一個(gè)特征模型;在識(shí)別階段,單片機(jī)對(duì)LD3320語(yǔ)音芯片采集到的語(yǔ)音樣本進(jìn)行分析處理,提取出語(yǔ)音的特征信息,然后.將這個(gè)特征信息模型與已有的特征模型進(jìn)行對(duì)比,如果二者達(dá)到了一定的匹配度,則輸入的語(yǔ)音被識(shí)別。
1. 語(yǔ)音芯片識(shí)別到“打開(kāi)窗簾”的語(yǔ)音指令,ULN2003步行電機(jī)驅(qū)動(dòng)就會(huì)驅(qū)動(dòng)步行電機(jī)進(jìn)行旋轉(zhuǎn),來(lái)模擬窗簾的開(kāi)啟,當(dāng)步行電機(jī)停止旋轉(zhuǎn)時(shí),說(shuō)明窗簾已經(jīng)完全打開(kāi)。如果語(yǔ)音芯片識(shí)別到“關(guān)閉窗簾”的語(yǔ)音指令,ULN2003步行電機(jī)驅(qū)動(dòng)就會(huì)驅(qū)動(dòng)步行電機(jī)進(jìn)行旋轉(zhuǎn),來(lái)模擬窗簾的關(guān)閉,當(dāng)步行電機(jī)停止旋轉(zhuǎn)時(shí),說(shuō)明窗簾已經(jīng)完全關(guān)閉。如下圖5.2

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

圖5.3 風(fēng)扇的開(kāi)啟實(shí)物圖
3. 當(dāng)語(yǔ)音芯片收到“開(kāi)燈”指令時(shí),經(jīng)過(guò)單片機(jī)的識(shí)別處理,燈泡就會(huì)打開(kāi)。當(dāng)語(yǔ)音芯片收到“關(guān)燈”指令時(shí),經(jīng)過(guò)單片機(jī)的識(shí)別處理,燈泡就會(huì)關(guān)閉。當(dāng)語(yǔ)音芯片收到“打開(kāi)空調(diào)”指令時(shí),經(jīng)過(guò)單片機(jī)的識(shí)別處理,空調(diào)就會(huì)打開(kāi)。當(dāng)語(yǔ)音芯片收到“打開(kāi)電視”指令時(shí),經(jīng)過(guò)單片機(jī)的識(shí)別處理,電視就會(huì)打開(kāi)。

圖5.4 燈泡和用電器的開(kāi)啟實(shí)物圖
4.當(dāng)我們著急離開(kāi)家的時(shí)候,我們可以通過(guò)語(yǔ)音控制關(guān)閉電源,把正在運(yùn)行的電器一起關(guān)掉。也可以逐一關(guān)掉。
附錄A 原理圖
圖附A1電路原理圖
附錄B PCB圖
圖附B1電路PCB圖
- /*************端口信息********************
- * 接線說(shuō)明
- LD3320接口 STM32接口
- * RST PB11
- * CS PB10
- * WR/SPIS PB12
- * P2/SDCK PB13
- * P1/SDO PB14
- * P0/SDI PB15
- * IRQ PA15
- * A0 PA8
- *****************************************/
-
- /************************************************************************************
- // nAsrStatus 用來(lái)在main主程序中表示程序運(yùn)行的狀態(tài),不是LD3320芯片內(nèi)部的狀態(tài)寄存器
- // LD_ASR_NONE: 表示沒(méi)有在作ASR識(shí)別
- // LD_ASR_RUNING: 表示LD3320正在作ASR識(shí)別中
- // LD_ASR_FOUNDOK: 表示一次識(shí)別流程結(jié)束后,有一個(gè)識(shí)別結(jié)果
- // LD_ASR_FOUNDZERO: 表示一次識(shí)別流程結(jié)束后,沒(méi)有識(shí)別結(jié)果
- // LD_ASR_ERROR: 表示一次識(shí)別流程中LD3320芯片內(nèi)部出現(xiàn)不正確的狀態(tài)
- *********************************************************************************/
-
- 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);
- /***********************************************************
- * 名 稱(chēng): LD3320_main(void)
- * 功 能: 主函數(shù)LD3320程序入口
- * 入口參數(shù):
- * 出口參數(shù):
- * 說(shuō) 明:
- * 調(diào)用方法:
- **********************************************************/
- 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) // 啟動(dòng)一次ASR識(shí)別流程:ASR初始化,ASR添加關(guān)鍵詞語(yǔ),啟動(dòng)ASR運(yùn)算
- {
- nAsrStatus = LD_ASR_ERROR;
- }
- break;
-
- case LD_ASR_FOUNDOK:
- nAsrRes = LD_GetResult( ); //識(shí)別成功自動(dòng) 獲取識(shí)別碼,識(shí)別碼在LDChip.h文件中,自行定義的數(shù)據(jù)
- //PrintComBit(USART1,nAsrRes ); //串口輸出識(shí)別碼
- switch(nAsrRes) /*對(duì)結(jié)果執(zhí)行相關(guān)操作,客戶(hù)修改*/
- {
- case CODE_KD:
- LED_OPEN();
- PrintCom(USART1,"“開(kāi)燈”命令識(shí)別成功\r\n"); /*text.....*/
- break;
- case CODE_GD:
- LED_CLOSE();
- PrintCom(USART1,"“關(guān)燈”命令識(shí)別成功\r\n"); /*text.....*/
- break;
- case CODE_KDS:
- RELAY1_OPEN();
- PrintCom(USART1,"“打開(kāi)電視”命令識(shí)別成功\r\n"); /*text.....*/
- break;
- case CODE_GDS:
- RELAY1_CLOSE();
- PrintCom(USART1,"“關(guān)閉電視”命令識(shí)別成功\r\n"); /*text.....*/
- break;
-
- case CODE_KKT:
- RELAY2_OPEN();
- PrintCom(USART1,"“打開(kāi)空調(diào)”命令識(shí)別成功\r\n"); /*text.....*/
- break;
- case CODE_GKT:
- RELAY2_CLOSE();
- PrintCom(USART1,"“關(guān)閉空調(diào)”命令識(shí)別成功\r\n"); /*text.....*/
- break;
- case CODE_KFS:
- FAN_OPEN();
- PrintCom(USART1,"“打開(kāi)風(fēng)扇”命令識(shí)別成功\r\n"); /*text.....*/
- break;
- case CODE_GFS:
- FAN_CLOSE();
- PrintCom(USART1,"“關(guān)閉風(fēng)扇”命令識(shí)別成功\r\n"); /*text.....*/
- break;
-
- case CODE_KCL:
- chuanlian = 1;
- PrintCom(USART1,"“打開(kāi)窗簾”命令識(shí)別成功\r\n"); /*text.....*/
- break;
- case CODE_GCL:
- chuanlian = 0;
- PrintCom(USART1,"“關(guān)閉窗簾”命令識(shí)別成功\r\n"); /*text.....*/
- break;
- case CODE_GDY:
- LED_CLOSE();
- RELAY1_CLOSE();
- RELAY2_CLOSE();
- FAN_CLOSE();
- chuanlian = 0;
- PrintCom(USART1,"“關(guān)閉電源”命令識(shí)別成功\r\n"); /*text.....*/
- break;
- default:break;
- }
- nAsrStatus = LD_ASR_NONE;
- break;
-
- case LD_ASR_FOUNDZERO:
- default: nAsrStatus = LD_ASR_NONE;
- PrintCom(USART1,"識(shí)別失敗\r\n");
- break;
- }//switch
- if(chuanlian == 1) MOTOR_Implement(1); //打開(kāi)窗簾
- else MOTOR_Implement(0); //關(guān)閉窗簾
- }// while
-
- }
-
- void MOTOR_Implement(u8 mode)//步進(jìn)電機(jī)旋轉(zhuǎn)
- {
- static u16 dj_count=0;
-
- if(mode == 1)
- {
- if(dj_count++ < 100)
- {
- MotorCW();//電機(jī)正轉(zhuǎn),模擬開(kāi)窗簾
- }
- else
- {
- dj_count = 100;
- MotorStop();//旋轉(zhuǎn)到一定程度,電機(jī)關(guān)閉
- }
- sys_delay_ms(1);
- }
- else
- {
- if(dj_count > 0)
- {
- dj_count--;
- MotorCCW();//電機(jī)反轉(zhuǎn),模擬關(guān)窗簾
- }
- else
- {
- dj_count = 0;
- MotorStop();//旋轉(zhuǎn)到一定程度,電機(jī)關(guān)閉
- }
- sys_delay_ms(1);
- }
- }
-
- void PC13_LED()//識(shí)別燈閃爍
- {
- 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();
- }
-
- /***********************************************************
- * 名 稱(chēng):LD3320_Init(void)
- * 功 能:模塊驅(qū)動(dòng)端口初始配置
- * 入口參數(shù):
- * 出口參數(shù):
- * 說(shuō) 明:
- * 調(diào)用方法:
- **********************************************************/
- void LD3320_Init(void)
- {
- LD3320_GPIO_Cfg();
- LD3320_EXTI_Cfg();
- LD3320_Spi_cfg();
- MOTOR_GPIO_Init();
- LED_gpio_cfg();
- LD_reset();
-
- }
- /***********************************************************
- * 名 稱(chēng): RunASR(void)
- * 功 能: 運(yùn)行ASR
- * 入口參數(shù):
- * 出口參數(shù):
- * 說(shuō) 明:
- * 調(diào)用方法:
- **********************************************************/
- uint8 RunASR(void)
- {
- uint8 i=0;
- uint8 asrflag=0;
- for (i=0; i<5; i++) // 防止由于硬件原因?qū)е翷D3320芯片工作不正常,所以一共嘗試5次啟動(dòng)ASR識(shí)別流程
- {
- LD_AsrStart(); //初始化ASR
- LD3320_delay(100);
- if (LD_AsrAddFixed()==0) //添加關(guān)鍵詞語(yǔ)到LD3320芯片中
- {
- LD_reset(); // LD3320芯片內(nèi)部出現(xiàn)不正常,立即重啟LD3320芯片
- LD3320_delay(50); // 并從初始化開(kāi)始重新ASR識(shí)別流程
- continue;
- }
-
- LD3320_delay(10);
-
- if (LD_AsrRun() == 0)
- {
- LD_reset(); // LD3320芯片內(nèi)部出現(xiàn)不正常,立即重啟LD3320芯片
- LD3320_delay(50); // 并從初始化開(kāi)始重新ASR識(shí)別流程
- continue;
- }
-
- asrflag=1;
- break; // ASR流程啟動(dòng)成功,退出當(dāng)前for循環(huán)。開(kāi)始等待LD3320送出的中斷信號(hào)
- }
-
- return asrflag;
- }
-
- /***********************************************************
- * 名 稱(chēng): void Delay_( int i)
- * 功 能: 短延時(shí)
- * 入口參數(shù):
- * 出口參數(shù):
- * 說(shuō) 明:
- * 調(diào)用方法:
- **********************************************************/
- void Delay_( int i)
- {
- while( i--)
- {
-
- }
- }
- /***********************************************************
- * 名 稱(chēng): LD3320_delay(unsigned long uldata)
- * 功 能: 長(zhǎng)延時(shí)函數(shù)
- * 入口參數(shù):
- * 出口參數(shù):
- * 說(shuō) 明:
- * 調(diào)用方法:
- **********************************************************/
- 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);
- }
- }
- }
-
-
- /***********************************************************
- * 名 稱(chēng):LD3320_GPIO_Cfg(void)
- * 功 能:初始化需要用到的IO口
- * 入口參數(shù):
- * 出口參數(shù):
- * 說(shuō) 明:
- * 調(diào)用方法:
- **********************************************************/
- 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默認(rèn)拉高*/
- }
- }
- /***********************************************************
- * 名 稱(chēng):LD3320_Spi_cfg(void)
- * 功 能:配置SPI功能和端口初始化
- * 入口參數(shù):
- * 出口參數(shù):
- * 說(shuō) 明:
- * 調(diào)用方法:
- **********************************************************/
- void LD3320_Spi_cfg(void)
- {
- SPI_InitTypeDef SPI_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- //spi端口配置
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 | RCC_APB2Periph_GPIOB,ENABLE); //使能SPI3外設(shè)時(shí)鐘
- 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; //時(shí)鐘極性 空閑狀態(tài)時(shí),SCK保持低電平
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //時(shí)鐘相位 數(shù)據(jù)采樣從第一個(gè)時(shí)鐘邊沿開(kāi)始
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //軟件產(chǎn)生NSS
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //波特率控制 SYSCLK/128
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //數(shù)據(jù)高位在前
- SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC多項(xiàng)式寄存器初始值為7
- SPI_Init(SPI2, &SPI_InitStructure);
- /* 使能SPI3 */
- SPI_Cmd(SPI2, ENABLE);
- }
- /***********************************************************
- * 名 稱(chēng): LD3320_EXTI_Cfg(void)
- * 功 能: 外部中斷功能配置和相關(guān)端口配置
- * 入口參數(shù):
- * 出口參數(shù):
- * 說(shuō) 明:
- * 調(diào)用方法:
- **********************************************************/
- 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); //默認(rèn)拉高中斷引腳
-
- 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);
- }
- /***********************************************************
- * 名 稱(chēng): EXTI1_IRQHandler(void)
- * 功 能: 外部中斷函數(shù)
- * 入口參數(shù):
- * 出口參數(shù):
- * 說(shuō) 明:
- * 調(diào)用方法:
- **********************************************************/
- void EXTI15_10_IRQHandler(void)
- {
- if(EXTI_GetITStatus(EXTI_Line15)!= RESET )
- {
- ProcessInt0();
- PrintCom(USART1,"進(jìn)入中斷\r\n");
- EXTI_ClearFlag(EXTI_Line15);
- EXTI_ClearITPendingBit(EXTI_Line15);
- PC13_LED();
- }
- }
復(fù)制代碼
以上的Word格式文檔51黑下載地址:
基于STM32的智能家居語(yǔ)音控制系統(tǒng).doc
(1.98 MB, 下載次數(shù): 310)
2020-12-6 17:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: JACKLI 時(shí)間: 2020-12-7 16:59
看起來(lái)好厲害的樣子,支持一下
作者: 醉眼看人間 時(shí)間: 2020-12-30 16:33
元器件清單可以發(fā)一下嗎
作者: hujj 時(shí)間: 2020-12-30 17:15
也買(mǎi)了一塊LD3220語(yǔ)音識(shí)別模塊,正在熟悉過(guò)程中,正好可以借鑒樓主的經(jīng)驗(yàn)。
作者: Oxygen_ 時(shí)間: 2021-1-11 21:52
樓主不公開(kāi)源碼嗎?
作者: Shitianz 時(shí)間: 2021-3-26 08:47
最近剛好用到,感謝樓主分享
作者: 樂(lè)與你分享 時(shí)間: 2021-4-2 06:55
電流檢測(cè)電路更為合理,電流超過(guò)允許值,可以直接判斷系統(tǒng)故障,確保所有設(shè)備及控制部分安全
作者: 747590380 時(shí)間: 2021-4-16 10:03
可以分享一下ad的原理圖嗎
作者: zzh999 時(shí)間: 2021-5-5 12:30
我也想嘗試一下這個(gè)語(yǔ)音模塊。
作者: liesnake 時(shí)間: 2021-5-13 17:52
那個(gè)LD3320不是帶著有開(kāi)關(guān)量輸出口嗎?能不能直接用開(kāi)關(guān)量輸出口,不用單片機(jī)?
作者: hf1974 時(shí)間: 2021-7-2 10:18
還沒(méi)玩過(guò)語(yǔ)音模塊,想試試。
作者: 云天空 時(shí)間: 2022-5-3 10:16
可以分享下原理圖嗎
作者: DoneDone 時(shí)間: 2022-5-4 09:08
曾經(jīng)也嘗試過(guò)LD3320 模塊,但是一個(gè)是貴,另一個(gè)是操作復(fù)雜……現(xiàn)在某一個(gè)寶上十元的模塊超級(jí)好用了
作者: 000111222333@ 時(shí)間: 2022-5-12 18:04
TEXT1.C(2): error C129: missing ';' before 'nAsrStatus'
這是有錯(cuò)嗎,樓主
作者: mln123 時(shí)間: 2022-10-12 16:12
加個(gè)分號(hào)唄
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |