摘要
自然語音作為人機交互在目前得以廣泛的應用以及極大的發展前景。該設計介紹了基于非指定人語音芯片LD3320的語音控制器結構及其實現語音控制的方法。該語音控制器利用STM32F103C8T6單片機作為主要控制器,控制芯片對輸入的進行語音識別并處理,根據語音指令產生相對應的脈沖序列,替代按鍵式遙控器,實現對電路的語音控制。本次設計采用了ICRPUTE公司的?LD3320語音識別芯片和相關控制電路,設計實現一款語音控制系統,該系統可以通過語音控制操作,同時按鍵也可以進行同時控制家用電器工作的功能。
關鍵詞:LD3320;語音識別;STM32單片機
Abstract
As a human-computer interaction, natural speech has been widely used and has great development prospects. The design introduces the structure of voice controller based on non designated person voice chip ld3320 and the method of realizing voice control. The voice controller uses stm32f103c8t6 single chip microcomputer as the main controller. The control chip recognizes and processes the input voice, generates the corresponding pulse sequence according to the voice command, replaces the key remote controller, and realizes the voice control of the circuit. This design uses the ld3320 speech recognition chip and related control circuit of icrput company to design and implement a speech control system. The system can operate through speech control, and the key can also control the work of household appliances at the same time。
Key words:?LD3320; Speech recognition; STM32 single chip microcompute.
目錄
摘要?1
第一章?緒論?3
1.1 ?課題的背景?3
1.2??發展現狀?3
1.3??設計研究內容?4
第二章?硬件設計?5
2.1?系統框架?5
2.2?主控芯片簡介?5
2.2?步進電機簡介?8
2.3 WT588語音播報簡介?11
2.4?紅外熱射電傳感器簡介?12
2.4?薄膜壓力傳感器簡介?13
2.5 GSM SIM 800簡介?14
第三章?軟件設計?17
3.1?智能導盲拐杖軟件設計?17
3.2?系統軟件設計語言?17
3.1?系統軟件設計心得?17
參考文獻?18
致?謝?19
附錄?A?20
附錄?B?22
?
?
第一章?緒論
- ?課題的背景
語音識別是人機交互通信的一種重要技術,20世紀60年代,計算機的應用推動了語音識別的發展。這時期的重要成果對于語音識別的發展產生了深遠影響。 隨著語音識別理論研究的深入和數字信號處理軟,硬件技術的發展。語音識別技術應用的研究越來越受到人們的關注。智能語音家電控制系統實質上就是一個替代傳統手動開關的收聲控的電子開關。 ???
語音識別作為人類與機器之間的溝通中很重要的環節,它的應用領域十分廣闊。集成電路的迅速發展有利于將擁有多種功能的語音識別系統嵌入到芯片或模塊上,使得語音識別這一技術在各個方面都得以利用,而嵌入式語音識別技術開發也會變得更有價值。
- 3??設計研究內容
本次畢業設計主要以STM32F103C8T6單片機和LD3320語音芯片為核心控制器件,對語音芯片LD3320外界的麥克風采集聲音信號,在通過LD3320語音芯片進行頻譜分析,在提取語音特征之后和關鍵詞語列表中的關鍵詞進行對比匹配,最后找出得分最高的關鍵詞作為識別結果,輸出給單片機,單片機進行處理后,在輸出信號來控制繼電器,或者燈,風扇,步進電機等外接設備,從而達到語音識別控制設備。
主要內容包括:
(1)語音可以正確識別對應的指令
(2)OLED可以正常顯示數據
(3)可以正確讀取DHT11溫濕度傳感器測量的數據
(5)WT588語音模塊可以正確的播放語音
??(6)步進電機驅動電路的設計
第二章?硬件設計
- ?系統框架
硬件主要以STM32單片機以及LD3320語音識別模塊為核心,通過軟件和硬件的結合實現語音下發指令檢測到正確語音,或者檢測到對應的按鍵按下,單片機可以控制相應的外設進行工作同時WT588語音芯片可以語音相應的語音播報,并且OLED液晶顯示屏可以顯示對應的外設的狀態,以及通過DHT11溫濕度傳感器實時檢測到的當前室內的溫濕度數據。
本設計的系統總框圖如圖所示。
?
- .1單片機的功能及最小系統的電路設計
本系統基于STM32F103系列單片機來實現功能,因為系統沒有其它高標準的要求,我們最終選擇了比較普遍的STM32F103C8T6單片機來實現系統設計。
STM32F103C8系列使用高性能的ARM??Cortex?-M3?32位的RISC內核,工作頻率為72MHz,內置高速存儲器(高達128K字節的閃存和20K字節的SRAM),豐富的增強I/O端口和聯接到兩條APB總線的外設。所有型號的器件都包含2個12位的ADC、3個通用16位定時器和1個PWM定時器,還包含標準和先進的通信接口:多達2個I2C接口和SPI接口、3個USART接口、一個USB接口和一個CAN接口。STM32F103列產品供電電壓為2.0V至3.6V,包含-40°C至+85°C溫度范圍和-40°C至+105°C的擴展溫度范圍。一系列的省電模式保證低功耗應用的要求。
STM32F103系列產品提供包括從36腳至100腳的6種不同封裝形式;根據不同的封裝形式,器件中的外設配置不盡相同。下面給出了該系列產品中所有外設的基本介紹。這些豐富的外設配置,使得STM32F103系列微控制器適合于多種應用場合:
電機驅動和應用控制
醫療和手持設備
PC游戲外設和GPS平臺
工業應用:可編程控制器(PLC)、變頻器、打印機和掃描儀等
單片機的電路圖如下圖所示:
?
ARM?的Cortex?-M3核心并內嵌閃存和SRAM
ARM的Cortex?-M3處理器是最新一代的嵌入式ARM處理器,它為實現MCU的需要提供了低成本的平臺、縮減的引腳數目、降低的系統功耗,同時提供卓越的計算性能和先進的中斷系統響應。
ARM的Cortex?-M3是32位的RISC處理器,提供額外的代碼效率,在通常8和16位系統的存儲空間上發揮了ARM內核的高性能。
STM32系列擁有內置的ARM核心,因此它與所有的ARM工具和軟件兼容。
內置閃存存儲器
64K字節的內置閃存存儲器,用于存放程序和數據。
2.1.1 CRC計算單元
CRC(循環冗余校驗)計算單元使用一個固定的多項式發生器,從一個32位的數據字產生一個在眾多的應用中,基于CRC的技術被用于驗證數據傳輸或存儲的一致性。在EN/IEC 60335-1標準的范圍內,它提供了一種檢測閃存存儲器錯誤的手段,CRC計算單元可以用于實時地計算軟件的簽名, 并與在鏈接和生成該軟件時產生的簽名對比。
2.1.2內置SRAM
20K字節的內置SRAM,CPU能以0等待周期訪問(讀/寫)。
2.1.3?嵌套的向量式中斷控制器(NVIC)
STM32產品內置嵌套的向量式中斷控制器,能夠處理多達43個可屏蔽中斷通道(不包括16個Cortex?-M3的中斷線)和16個優先級。
緊耦合的NVIC能夠達到低延遲的中斷響應處理
中斷向量入口地址直接進入內核
緊耦合的NVIC接口
允許中斷的早期處理
處理晚到的較高優先級中斷
支持中斷尾部鏈接功能
自動保存處理器狀態
中斷返回時自動恢復,無需額外指令開銷
該模塊以最小的中斷延遲提供靈活的中斷管理功能。
2.1.5部中斷/時間控制器
部中斷/事件控制器包含19個邊沿檢測器,用于產生中斷/事件請求。每個中斷線都可以立地配置它的觸發事件(上升沿或下降沿或雙邊沿),并能夠單獨地被屏蔽;有一個掛起寄存器維持所有中斷請求的狀態。EXTI可以檢測到脈沖寬度小于內部APB2的時鐘周期。多達80個通用I/O口連接到16個外部中斷線。
2.1.6?時鐘和啟動
系統時鐘的選擇是在啟動時進行,復位時內部8MHz的RC振蕩器被選為默認的CPU時鐘隨后可以選擇外部的、具失效監控的4~16MHz時鐘;當檢測到外部時鐘失效時,它將被隔離,系統將自動地切換到內部的RC振蕩器,如果使能了中斷,軟件可以接收到相應的中斷。同樣,在需要時可以采取對PLL時鐘完全的中斷管理(如當一個間接使用的外部振蕩器失效時)。多個預分頻器用于配置AHB的頻率、高速APB(APB2)和低速APB(APB1)區域。AHB和高速APB的最高頻率是72MHz,低速APB的最高頻率為36MHz
2.1.7供電方案
VDD?=?2.0~3.6V:VDD引腳為I/O引腳和內部調壓器供電。
VSSA,VDDA?=?2.0~3.6V:為ADC、復位模塊、RC振蕩器和PLL的模擬部分提供供電。使用ADC時,VDDA不得小于2.4V。VDDA和VSSA必須分別連接到VDD和VSS。
VBAT?=?1.8~3.6V:當關閉VDD時,(通過內部電源切換器)為RTC、外部32kHz振蕩器和后備寄存器供電。
2.1.8供電監控器
內部集成了上電復位(POR)/掉電復位(PDR)電路,該電路始終處于工作狀態,保證系統在供電超過2V時工作;當VDD低于設定的閥值(VPOR/PDR)時,置器件于復位狀態,而不必使用外部復位電路。器件中還有一個可編程電壓監測器(PVD),它監視VDD/VDDA供電并與閥值VPVD比較,當VDD低于或高于閥值VPVD時產生中斷,中斷處理程序可以發出警告信息或將微控制器轉入安全模式。PVD功能需要通過程序開啟。
2.1.9電壓調壓器
調壓器有三個操作模式:主模式(MR)、低功耗模式(LPR)和關斷模式
主模式(MR)用于正常的運行操作低功耗模式(LPR)用于CPU的停機模式
關斷模式用于CPU的待機模式:調壓器的輸出為高阻狀態,內核電路的供電切斷,調壓器處于零消耗狀態(但寄存器和SRAM的內容將丟失),該調壓器在復位后始終處于工作狀態,在待機模式下關閉處于高阻輸出。
低功耗模式
STM32F103xC、STM32F103xD和STM32F103xE增強型產品支持三種低功耗模式,可以在要求低功耗、短啟動時間和多種喚醒事件之間達到最佳的平衡。
睡眠模式
在睡眠模式,只有CPU停止,所有外設處于工作狀態并可在發生中斷/事件時喚醒CPU。
停機模式
在保持SRAM和寄存器內容不丟失的情況下,停機模式可以達到最低的電能消耗。在停機模式下,停止所有內部1.8V部分的供電,PLL、HSI的RC振蕩器和HSE晶體振蕩器被關閉,調壓器可以被置于普通模式或低功耗模式。
可以通過任一配置成EXTI的信號把微控制器從停機模式中喚醒,EXTI信號可以是16個外部I/O 口之一、PVD的輸出、RTC鬧鐘或USB的喚醒信號。
待機模式
在待機模式下可以達到最低的電能消耗。內部的電壓調壓器被關閉,因此所有內部1.8V部分的供電被切斷;PLL、HSI的RC振蕩器和HSE晶體振蕩器也被關閉;進入待機模式后,SRAM和寄存器的內容將消失,但后備寄存器的內容仍然保留,待機電路仍工作。
從待機模式退出的條件是:NRST上的外部復位信號、IWDG復位、WKUP引腳上的一個上升邊沿或RTC的鬧鐘到時。
2.1.10 DMA
靈活的7路通用DMA可以管理存儲器到存儲器、設備到存儲器和存儲器到設備的數據傳輸;DMA控制器支持環形緩沖區的管理,避免了控制器傳輸到達緩沖區結尾時所產生的中斷。每個通道都有專門的硬件DMA請求邏輯,同時可以由軟件觸發每個通道;傳輸的長度、傳輸的源地址和目標地址都可以通過軟件單獨設置。DMA可以用于主要的外設:SPI、I2C、USART,通用、基本和高級控制定時器TIMx和ADC。
2.1.11 RTC和后備寄存器
RTC和后備寄存器通過一個開關供電,在VDD有效時該開關選擇VDD供電,否則由VBAT引腳供電。后備寄存器(10個16位的寄存器)可以用于在關閉VDD時,保存20個字節的用戶應用數據。RTC和后備寄存器不會被系統或電源復位源復位;當從待機模式喚醒時,也不會被復位。
實時時鐘具有一組連續運行的計數器,可以通過適當的軟件提供日歷時鐘功能,還具有鬧鐘中斷和?階段性中斷功能。RTC的驅動時鐘可以是一個使用外部晶體的32.768kHz的振蕩器、內部低功耗RC 振蕩器或高速的外部時鐘經128分頻。內部低功耗RC振蕩器的典型頻率為40kHz。為補償天然晶體的偏差,可以通過輸出一個512Hz的信號對RTC的時鐘進行校準。RTC具有一個32位的可編程計數器,使用比較寄存器可以進行長時間的測量。有一個20位的預分頻器用于時基時鐘,默認情況下時鐘為32.768kHz時,它將產生一個1秒長的時間基準。
2.1.12電壓調壓器定時器和看門狗
中等容量的STM32F103xx增強型系列產品包含1個高級控制定時器、3個普通定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。下表比較了高級控制定時器、普通定時器和基本定時器的功能:
定時器
計數器分辯率
計數器類型
預分頻系數
產生DMA請求
捕獲/比較通道
互補輸出
TIM1
16位
向上,向下, 向上/下
1~65536之間的任意整數
可以
4
有
TIM2 TIM3 TIM4
16位
向上,向下, 向上/下
1~65536之間的任意整數
可以
4
沒有
?
?
- ?步進電機簡介
步進電機作為執行原件是機電一體化的關鍵產品之一, 廣泛應用在各種自動化控制系統中。隨著微電子和計算機技術的發展,步進電機的需求量與日俱增,在各個國民經濟領域都有應用。
步進電機是一種將電脈沖轉化為角位移的執行機構。當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度(稱為“步距角”),它的旋轉是以固定的角度一步一步運行的。可以通過控制脈沖個數來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。步進電機可以作為一種控制用的特種電機,利用其沒有積累誤差(精度為100%)的特點,廣泛應用于各種開環控制。
現在比較常用的步進電機包括反應式步進電機(vr)、永磁式步進電機(pm)、混合式步進電機(hb)和單相式步進電機等。永磁式步進電機一般為兩相,轉矩和體積較小,步進角一般為7.5度 或15度;反應式步進電機一般為三相,可實現大轉矩輸出,步進角一般為1.5度,但噪聲和振動都很大。反應式步進電機的轉子磁路由軟磁材料制成,定子上有多相勵磁繞組,利用磁導的變化產生轉矩。
本設計采用的步進電機是混合式步進電機。混合式步進電機混合了永磁式和反應式步進電機的優點它又分為兩相和五相:兩相步進角一般為1.8度而五相步進角一般為 0.72度。這種步進電機的應用最為廣泛。所以,本設計采用此種步進電機。
步進電機28BYJ-48型四相八拍電機,電壓為DC5V—DC12V。當對步進電機施加一系列連續不斷的控制脈沖時,它可以連續不斷地轉動。每一個脈沖信號對應步進電機的某一相或者兩相繞組的通電狀態改變一次,也就對應轉子轉過一定的角度(一個步距角)。當通電狀態改變完成一個循環時,轉子轉過一個齒距。四相步進電機可以在不同的通電方式下運行,常見的通電方式有單(單相繞組通電)四拍(A-B-C-D-A。。。),雙(雙相繞組通電)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)
驅動方式:
表3.1?步進電機驅動方式
導線顏色
1
2
3
4
5
6
7
8
5紅
+
+
+
+
+
+
+
+
4橙
—
—
?
?
?
?
?
?
3黃
?
—
—
—
?
?
?
?
2粉
?
?
?
—
—
—
?
?
1藍
?
?
?
?
?
—
—
—
紅線接電源5V,橙色電線接P1.3口,黃色電線接P1.2口,粉色電線接P1.1口,藍色接P1.0口。
由于單片機接口信號不夠大需要通過ULN2003放大再連接到相應的電機接口。
ULN2003晶體管陣列:
ULN2003是一個單片高電壓、高電流的達林頓晶體管陣列集成電路。它是由7對NPN達林頓管組成的,它的高電壓輸出特性和陰極箝位二極管可以轉換感應負載。單個達林頓對的集電極電流是500mA。達林頓管并聯可以承受更大的電流。此電路主要應用于繼電器驅動器,字錘驅動器,燈驅動器,顯示驅動器(LED氣體放電),線路驅動器和邏輯緩沖器。ULN2003的每對達林頓管都有一個2.7kΩ串聯電阻,可以直接和TTL或5V CMOS裝置。ULN2003的主要特點:
(1)500mA 額定集電極電流(單個輸出)。
(2)高電壓輸出:50V。
(3)輸入和各種邏輯類型兼容。
(4)步進電機驅動器。
利用ULN2003與單片機引腳相連,可以驅動步進電機。ULN2003的作用主要在于放大驅動電流,驅動28BYJ-48步進電機。ULN2003驅動的電機供電接口可以連接到單片機的GND和5V取電,“IN0~IN4”連接單片機的4個I/O口。
當對步進電機施加一系列連續不斷的控制脈沖時,它可以連續不斷地轉動。每一個脈沖信號對應步進電機的某一相或兩相繞組的通電狀態改變一次,也就對應轉子轉過一定的角度(一個步距角)。當通電狀態的改變完成一個循環時,轉子轉過一個齒距。四相步進電機可以在不同的通電方式下運行。
28BYJ-48步進電機的齒輪減速比為64:1,轉速約15轉/分鐘,一些軟件采用某些手段和高電壓電源(如12伏直流)也能達到約25轉/分鐘的轉速。4步控制信號序列:11.25度/步,32步旋轉一周。8步控制信號序列:5.625度/步,64步旋轉一周。正常情況下,4步模式下旋轉一周將用:32(步/周)x64(齒輪比)=2048步。
步進電機控制系統電路如圖3.9所示:
圖3.9???步進電機控制系統電路圖
在實用兩相混合式步進電機時需注意,該種電機在低速運轉時有振動和噪聲,是其固有的缺點、一般可采用以下方案來克服:????
(1)如步進電機正好工作在共振區,可通過改變減速比等機械傳動避開共振區;
(2)采用帶有細分功能的驅動器,這是最常用的、最簡便的方法;
(3)換成步距角更小的步進電機,如三相或五相步進電機;
(4)換成交流伺服電機,幾乎可以完全克服震動和噪聲,但成本較高;
(5)在電機軸上加磁性阻尼器,市場上已有這種產品,但機械結構改變較大。該模塊采用四項五線步進電機,該電機是將電脈沖信號轉變為角位移或線位移的開環控制元件。程序開始后,首先判斷正反轉,若為正轉,則產生正轉脈沖,判斷是否完成,若未完成,則繼續發出正轉脈沖,若完成,則結束;若為反轉,則發出反轉脈沖,判斷是否完成,若未完成,則繼續發送反轉脈沖,若完成,則結束。在本設計中步進電機驅動的部分原理圖框圖如下:???????????????????
?
2.3 WT588語音播報簡介??
WT588D是一款具有單片機內核的語音芯片,因此,可以冠名為WT588D系列語音單片機。WT588D系列語音單片機是廣州唯創科技有限公司聯合臺灣華邦共同研發出來的集單片機和語音電路于一體的可編輯語音芯片,功能強大的可重復擦除燒寫的語音單片機芯片。內置13bit/DA轉換器,以及12bit/PWM輸出,音質好;PWM輸出可直接推動0.5W/8Ω揚聲器。
WT588D模塊14腳串聯了兩個二極管作用是14腳VCC使用3.3V供電,所以串聯了兩個二極管分壓,10、11、12直接接單片機引腳。BUSY輸出:忙信號輸出端,單片機可從BUSY輸出來判斷是否有音頻輸出。可設置為播放狀態輸出為高電平或低電平。高電平時電壓接近VDD供電電壓。
該模塊采用WT588語音芯片,該芯片采用SPI三線接口與CPU進行同步通信。進入程序后,首先進行系統初始化設置;之后判斷是否播報,若為否,則繼續判斷,若為是,則發送相應的命令;進行播報語音。在本設計中超聲波測距的部分原理圖框圖如下:?????
?
???
????
?
2.4?溫濕度傳感器
DHT11傳感器連接單片機相對比較簡單。單片機的PA11口用來發收串行數據,即數據口。連接傳感器的Pin2(單總線,串行數據)。由于測量范圍電路小于20米,建議加一個3K的上拉電阻,因此在傳感器的Pin2口與電源之間連接一個3K電阻。而傳感器的電源端口Pin1和Pin4分別接單片機的VDD和GND端。傳感器的第三腳懸浮放置。
DHT11的供電電壓為3-5.5V,傳感器上電后,要等待1s以越過不穩定狀態在此期間無需發送任何指令。電源引腳(VDD,GND)之間也可增加一個100nF的電容,用以去耦濾波。數據用于微處理器與DHT11之間的通訊和同步,采用單總線數據格式,一次通訊時間4ms左右。DHT11與單片機連接圖如下圖所示:
?
DHT11主要通過單總線數據傳輸,DHT11第二引腳DOUT與單片機IO口相連,進行數據傳輸。當進入程序后,首先進行初始化,延時1S后,發送讀取溫濕度指令;之后延時4ms,再4ms內完成讀取;通過單總線方式將數據傳送給單片機,分析數據,得出溫濕度值。其對應的程序流程圖如下所示:
?
2.5 LD3320語音模塊
LD3320芯片是一款“語音識別”專用芯片,由ICRoute公司設計生產。該芯片集成了語音識別處理器和一些外部電路,包括AD、DA轉換器、麥克風接口、聲音輸出接口等。該芯片在設計上注重節能與高效,不需要外接任何的輔助芯片如Flash、RAM等,直接集成在現有的產品中即可以實現語音識別、聲控、人機對話功能。并且,識別的關鍵詞語列表是可以任意動態編輯的。
只需要把識別的關鍵詞語以字符串的形式傳送進芯片,即可以在下次識別中立即生效。比如,在單片機的編程中,簡單地通過設置芯片的寄存器,把“你好”這樣的識別關鍵詞的內容動態地傳入芯片中,芯片就可以識別這樣設定的關鍵詞語了。
原理圖中加入了一個LED發光二極管,當LD3320發送給單片機語音信號時,LED點亮。用來提示有聲音發送。
?
進入程序后,首先進行初始化設置,寫入關鍵詞,之后循環檢測口令,判斷口令是否正確,若為否,則重新開始循環檢測口令。若為是,則開始定時,判斷定時是否結束,若是,則重新開始循環檢測口令,若為否,則判斷是否有聲音輸入,若為否,則重新開始循環檢測口令,若為是,則進行算法匹配,判斷是否匹配出最佳結果,若為否,則重新開始循環檢測口令,若為是,則發送最佳結果。
2.6 OLED液晶顯示
有機發光二極管(縮寫:OLED)又稱有機電激發光顯示(縮寫:OLED)、有機發光半導體,OLED技術最早于1950年代和1960年代由法國人和美國人研究,其后索尼、三星和LG等公司于21世紀開始量產,與薄膜晶體管液晶顯示器為不同類型的產品,前者具有自發光性、廣視角、高對比、低耗電、高反應速率、全彩化及制程簡單等優點,但相對的在大面板價格、技術選擇性?、壽命、分辨率、色彩還原方面便無法與后者匹敵,有機發光二極管顯示器可分單色、多彩及全彩等種類,而其中以全彩制作技術最為困難,有機發光二極管顯示器依驅動方式的不同又可分為被動式與主動式有機發光二極管可簡單分為有機發光二極管和聚合物發光二極管(polymer light-emitting diodes, PLED)兩種類型,目前均已開發出成熟產品。聚合物發光二極管相對于有機發光二極管的主要優勢是其柔性大面積顯示。但由于產品壽命問題,目前市面上的產品仍以有機發光二極管為主要應用。
OLED顯示技術具有自發光的特性,采用非常薄的有機材料涂層和玻璃基板,當有電流通過時,這些有機材料就會發光,而且OLED顯示屏幕可視角度大,并且能夠節省電能,從2003年開始這種顯示設備在MP3播放器上得到了應用。?以OLED使用的有機發光材料來看,一是以染料及顏料為材料的小分子器件系統,另一則以共軛性高分子為材料的高分子器件系統。同時由于有機電致發光器件具有發光二極管整流與發光的特性,因此小分子有機電致發光器件亦被稱為OLED(Organic Light Emitting Diode),高分子有機電致發光器件則被稱為PLED (Polymer Light-emitting Diode)。小分子及高分子OLED在材料特性上可說是各有千秋,但以現有技術發展來看,如作為監視器的信賴性上,及電氣特性、生產安定性上來看,小分子OLED處于領先地位。當前投入量產的OLED組件,全是使用小分子有機發光材料。系統中OLED的電路圖如下圖所示:
液晶顯示模塊采用OLED顯示屏,該模塊采用四線SPI接口方式和單片機通信。程序開始后,首先對OLED進行初始化設置,之后進入顯示函數,首先選擇OLED顯示的位,然后找到對應這個位置需顯示的數據,最后,在這個位置打印出數據。一次只顯示一個位,因為刷新速度較快,我們人眼看到的就是能顯示出好多位。
?
?
?
?
第三章?軟件設計
3.1?開發環境
STM32單片機軟件開發平臺為Keil5,和STM32CubeMx,Keil5是美國Keil?Software公司出品的32系列兼容單片機C語言軟件開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。Keil5提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境(uVision)將這些部分組合在一起。運行Keil5軟件需要WIN98、NT、WIN2000、WINXP等操作系統。
STM32CubeMX是一個圖形化的工具,也是配置和初始化C代碼生成器(STM32 configuration and initialization C code generation ) ,也就是自動生成開發初期關于芯片相關的一些初始化代碼。它包含了STM32所有系列的芯片,包含示例和樣本( Examples and demos )、中間組件( MiddlewareComponents )、硬件抽象層(Hardwaree abstraction layer )。
STM32CubeMX是ST意法半導體的主動原創工具,它可以減輕開發的時間和費用。STM32CubeMX集成了一個全面的軟件平臺,支持STM32每一個系列的MCU開發。這個平臺包括STM32Cube HAL(一個STM32的抽象層集成軟件,確保STM32系列最大的移植性)。再加上兼容的一套中間件(RTOS、USB、TCPI/IP和圖形),所有內嵌軟件組件附帶了全套例程。其特性如下所示:
1、直觀的選擇STM32微控制器。2、微控制器圖形化配置
3、C代碼工程生成器覆蓋了STM32微控制器初始化編譯軟件,如IAR,Keil,GCC。
4、可獨立使用或作為Eclipse使用。
3.2?系統軟件設計語言
本次設計用C語言作為程序軟件設計語言它的特點就是可以盡量減少你對硬件進行操作C語言具有良好的程序結構適用于模塊化程序設計,因此采用C語言設計單片機應用系統程序時,首先要盡可能地采用結構化的程序設計方法將功能模塊化由不同的模塊完成不同的功能這樣可使整個應用系統程序結構比較清晰,易于調試和維護。不同的功能模塊分別指定相應的入口參數和出口參數對于一些要重復調用的程序一般把其編成函數。這樣可以減少程序代碼的長度又便于整個程序的管理還可增強可讀性和移植性。?
3.3??Altium Designer應用
Altium Designer是PORTEL公司在80年代末推出的EDA軟件。Altium Designer是應用于Windows9X/2000/NT操作系統下的EDA設計軟件,采用設計庫管理模式,可以網設計,具有很強的數據交換能力和開放性及3D模擬功能,是一個32位的設計軟件,可以完成電路原理圖設計,印制電路板設計和可編程邏輯器件設計等工作,可以設計32個信號層,16個電源--地層和16個機加工層。
Altium Designer軟件的特點:
可生成30多種格式的電氣連接網絡表;?
強大的全局編輯功能;
在原理圖中選擇一級器件,PCB中同樣的器件也將被選中;?
同時運行原理圖和PCB,在打開的原理圖和PCB圖間允許雙向交叉查找元器件、引腳、網絡?
既可以進行正向注釋元器件標號(由原理圖到PCB),也可以進行反向注釋(由PCB到原理圖),以保持電氣原理圖和PCB在設計上的一致性;?
滿足國際化設計要求(包括國標標題欄輸出,GB4728國標庫); * 方便易用的數模混合仿真(兼容SPICE 3f5);?
支持用CUPL語言和原理圖設計PLD,生成標準的JED下載文件; * PCB可設計32個信號層,16個電源-地層和16個機加工層;?
強大的“規則驅動”設計環境,符合在線的和批處理的設計規則檢查;?
智能覆銅功能,覆鈾可以自動重鋪;
提供大量的工業化標準電路板做為設計模版;
放置漢字功能;
可以輸入和輸出DXF、DWG格式文件,實現和AutoCAD等軟件的數據交換;
智能封裝導航(對于建立復雜的PGA、BGA封裝很有用);?
方便的打印預覽功能,不用修改PCB文件就可以直接控制打印結果;
3.4?系統軟件設計心得
程序設計有其規律和共同點。在編寫程序時采取如下幾個步驟?
1明確設計所要實現的功能將軟件的設計分成若干個獨立的模塊。便于編程和修改查詢。根據時序關系和功能關系設計出最合理的軟件總體結構?
2依照所設定的程序流程圖和指令系統編寫程序,注意在程序相關部位標注注釋。提升程序的可讀性。?
3系統資源合理的分配,按照要實現的功能選擇。?
4通過編輯軟件編輯出的源程序,必須用編譯程序匯編后生成目標的代碼。如果源程序有語法錯誤那么需修改源文件后繼續編譯,直到無語法錯誤為止然后利用目標代碼通。過仿真器進行程序調試排除設計和編程中的錯誤直到成。?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
參考文獻
[1] ?朱清慧 編著 .基于Proteus顯示控制系統設計與實例.北京:清華大學出版社,2011
[2] ?清華大學電子學教研組編 . 楊素行主編 . 模擬電子技術基礎簡明教程 . 3版 .北京:高等教育出版社,2005
[3] 張亞華. 電子電路計算機輔助分析與輔助設計. 北京 航空工業出版社,2004
[4] 莫正康. 電力電子應用技術. 北京:機械工業出版社,2009
[5] 曾曉宏. 數字電子技術. 北京:機械工業出版社,2008
[6] 江曉安. 模擬電子技術. 陜西:西安電子科技大學出版社,2007
[7]蔣輝平 周國雄. 基于Proteus的單片機系統設計與仿真實例 北京:機械工業出版社,2009
[8]王宗培.步進電動機及其控制系統[M].哈爾濱:哈爾濱工業大學出版社,2009
[9]余永權.單片機應用系統的功率接口技術[M].北京:北京航空航天大學出版社,2006
[10]陳理壁.步進電機及其應用[M].上海:上海科學技術出版社,2009
[11] 王曉明、 胡曉柏,電動機的單片機控制[M].北京航空航天大學出版社,2002年5月第1版:181-208
[12] 劉寶延、 程樹康,步進電動機及其驅動控制系統 [M] .2007年11月第一版:134-167
[13] 史敬灼, 步進電動機伺服控制技術[M] .2007年3月第2版:23-35
[14]劉國永, 陳杰平. 單片機控制步進電機系統設計. 安徽: 安徽技術師范學院學報, 2012, 16 (4) : 61-63.
[15]孫笑輝,韓曾晉. 減少感應電動機直接轉矩控制系統轉矩脈動的方法[J]. 電氣傳動, 2011 (1) : 8-11.
致?謝這篇論文的制作歷時了兩個月的時間,在論文的寫作過程中遇到了無數的困難和障礙,都在同學和老師的幫助下度過了。尤其要強烈感謝同學們,在整個論文實踐和論文寫作的過程中,他們都對我進行了無私的指導和幫助,有的同學手把手教我焊電路板,由于我不熟練,焊壞了好幾塊板子,可他們還是鼓勵我。還有的同學幫我調試程序,有時一個程序要連續調好幾個小時,他們很有耐心,一邊調試一邊給我講程序的道理,我獲益匪淺。另外,在校圖書館查找資料的時候,圖書館的老師也給我提供了很多方面的支持與幫助。還要感謝指導老師關學忠教授及學長不厭其煩的幫助我進行論文的修改和改進。還有我大學四年來教導過我的所有老師,為我打下了專業知識的基礎,在此向所有幫助和指導過我的各位老師表示最衷心的感謝!
感謝這篇論文所涉及到的各位學者。本文引用了許多學者的研究文獻,如果沒有各位學者的研究成果的幫助和啟發,我將很難完成本篇論文的寫作。
最后,衷心的感謝在百忙之中評閱論文和參加答辯的各位老師,請您們對論文的不足進行批評和指正。
?
?
附錄?A
圖A1?系統總體電路圖
圖A2?系統總體PCB圖
?
?
?
?
?
附錄?B
main.c
/* USER CODE BEGIN Header */
/**
??******************************************************************************
??* @file ??????????: main.c
??* @brief ?????????: Main program body
??******************************************************************************
??* @attention
??*
??* <h2><center>? Copyright (c) 2020 STMicroelectronics.
??* All rights reserved.</center></h2>
??*
??* This software component is licensed by ST under BSD 3-Clause license,
??* the "License"; You may not use this file except in compliance with the
??* License. You may obtain a copy of the License at:
??* ???????????????????????opensource.org/licenses/BSD-3-Clause
??*
??******************************************************************************
??*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
?
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
?
#include "stdio.h"
#include "oledisp.h"?//?
#include "step.h"
#include "bsp_DHT11.h"
#include "wt588.h"
#include "FLSH.h"
?
?
/* USER CODE END Includes */
?
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
?
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
?
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
?
/* USER CODE END PM */
?
/* Private variables ---------------------------------------------------------*/
?
/* USER CODE BEGIN PV */
?
/* USER CODE END PV */
?
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
uint16_t TSnum= 0 ;
?
?
uint8_t ?reckey = 0; ??//串口接收語音指令
?
?
?
?
void key()
{
static uint8_t keyF1 = 0 ,keyF2 = 0 ,keyF3 = 0 ,keyF4 = 0 ,keyF5 = 0 ;?//防止連按標志位
if(key1 == 0 )
{
if(keyF1)
{
keyF1 = 0 ;
ledwut;?//控制霧燈
if(ledwuR )
{
Send_threelines(17);?//燈已關
}
else
{
Send_threelines(18);?//燈已開
}
writeF = 1 ;?//開始存儲
}
}
else
{
keyF1 = 1 ;
}
?
if(key2 == 0 )
{
if(keyF2)
{
keyF2 = 0 ;
fant;?//控制風扇
if(fanR == 0 )
{
Send_threelines(19);?//已關
}
else
{
Send_threelines(20);?//已開
}
writeF = 1 ;?//開始存儲
?
}
}
else
{
keyF2 = 1 ;
}
?
if(key3 == 0 )
{
if(keyF3)
{
keyF3 = 0 ;
direction =! direction;?//控制窗簾
if(direction )
{
Send_threelines(12);?//已關
}
else
{
Send_threelines(13);?//已開
}
writeF = 1 ;?//開始存儲
}
}
else
{
keyF3 = 1 ;
}
?
if(key4 == 0 )
{
if(keyF4)
{
keyF4 = 0 ;
JDQt;?//控制開關
if(JDQR == 0 )
{
Send_threelines(21);?//已關
}
else
{
Send_threelines(22);?//已開
}
?
writeF = 1 ;?//開始存儲
?
}
}
else
{
keyF4 = 1 ;
}
?
if(key5 == 0 )
{
if(keyF5)
{
keyF5 = 0 ;?//
??Send_threelines(15);?//?當前溫度為
if(DHT11Now.temperature > 9 )
{
if(DHT11Now.temperature/10%10 > 1 ) Send_threelines( DHT11Now.temperature/10%10);?//
Send_threelines(10);?//
??}
if((DHT11Now.temperature > 9 ?&& DHT11Now.temperature%10 >0)|| DHT11Now.temperature < 10)
{
Send_threelines( DHT11Now.temperature%10);?//
??}
Send_threelines(16);?//
?
Send_threelines(14);?//?當前濕度為
Send_threelines(11);?//
if(DHT11Now.humidity ?> 9 )
{
if(DHT11Now.humidity/10%10 > 1 ) Send_threelines( DHT11Now.humidity/10%10);?//
Send_threelines(10);?//
??}
if((DHT11Now.humidity > 9 ?&& DHT11Now.humidity%10 >0)|| DHT11Now.humidity < 10)
{
Send_threelines( DHT11Now.humidity%10);?//
??}
?
}
}
else
{
keyF5 = 1 ;
}
?
}
?
?
?
void display()
{
char TS[10] = {0} ;
?
location(0,0) ;?//設置顯示位置
display_GB2312_string(" ???溫度:");?//顯示字符
sprintf(TS,"%d℃", DHT11Now.temperature ) ;
display_GB2312_string(TS);?//顯示字?符
location(1,0) ;?//設置顯示位置
display_GB2312_string(" ???濕度:");?//顯示字符
sprintf(TS,"%d", DHT11Now.humidity ?) ;
display_GB2312_string(TS);?//顯示字符
display_GB2312_string("%");?//顯示字符
?
location(2,0) ;?//設置顯示位置
display_GB2312_string(" ?燈:");?//燈
if(ledwuR)
{
display_GB2312_string("關?");?//
}
else
{
display_GB2312_string("開?");?//
}
?
display_GB2312_string("?風扇:");?//
if(fanR == 0 )
{
display_GB2312_string("關");?//
}
else
{
display_GB2312_string("開");?//
}
?
location(3,0) ;?//
display_GB2312_string("窗簾:");?//
if(direction)
{
display_GB2312_string("關?");?//顯示字符
}
else
{
display_GB2312_string("開?");?//顯示字符
}
?
display_GB2312_string("?開關:");?//顯示字符
if( JDQR == 0 ?)
{
display_GB2312_string("關");?//顯示字符
}
else
{
display_GB2312_string("開");?//顯示字符
}
?
?
}
?
?
?
?
/* USER CODE END PFP */
?
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
?
?
/********************************************
可以在任何地方添加定時器回調函數
***********************************************/
?
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint16_t timCount = 0 ;
if(htim == &htim1)
{
timCount = (timCount + ?1)%10000 ;
if(timCount%6 == 0)
{
?
?
}
if(timCount%20 == 0)
{
?
}
?
?
}
if(htim == &htim2)
{
motor();?//放定時器中斷,驅動點擊
?
?
}
}
?
?
?
/*?使能接收,進入中斷回調函數 接收到一個字節進入中斷*/
?
?
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart3)
{
HAL_UART_Receive_IT(&huart3,&reckey,1);
}
?
}
?
void uartback()
{
static uint32_t getTS = 0 ;
if((HAL_GetTick() - getTS ) < 8000)?//三秒內可以接收指令
{
switch(reckey )
{
case 1 :?//開燈
ledwu(0)
Send_threelines(18);?//燈已開
??break ;
?
case 2 :?//關燈
ledwu(1)
?
Send_threelines(17);?//燈已關
break ;
?
case 3 :?//打開風扇
fan(1)
Send_threelines(20);?//已開
?
break ;
?
case 4 :?//關閉風扇
fan(0)
Send_threelines(19);?//已關
?
break ;
?
case 5 :?//打開窗簾
direction = 0 ;
Send_threelines(13);?//已開
break ;
?
case 6 :?//關閉窗簾
direction = 1 ;
?
Send_threelines(12);?//已關
break ;
?
case 7 :?//打開開關
JDQ(1)
Send_threelines(22);?//已開
break ;
?
case 8 :?//關閉開關
JDQ(0)
Send_threelines(21);?//已關
break ;
?
case 9 :?//打開所有設備
ledwu(0)
JDQ(1)
fan(1)
direction = 0 ;
Send_threelines(24);?//已關
?
break ;
?
case 10 :?//關閉所有設備
ledwu(1)
JDQ(0)
fan(0)
direction = 1 ;
Send_threelines(25);?//已關
?
?
break ;
case 11 :
??Send_threelines(15);?//?當前溫度為
if(DHT11Now.temperature > 9 )
{
if(DHT11Now.temperature/10%10 > 1 ) Send_threelines( DHT11Now.temperature/10%10);?//
Send_threelines(10);?//
??}
if((DHT11Now.temperature > 9 ?&& DHT11Now.temperature%10 >0)|| DHT11Now.temperature < 10)
{
Send_threelines( DHT11Now.temperature%10);?//
??}
Send_threelines(16);?//
?
Send_threelines(14);?//?當前濕度為
Send_threelines(11);?//
if(DHT11Now.humidity ?> 9 )
{
if(DHT11Now.humidity/10%10 > 1 ) Send_threelines( DHT11Now.humidity/10%10);?//
Send_threelines(10);?//
??}
if((DHT11Now.humidity > 9 ?&& DHT11Now.humidity%10 >0)|| DHT11Now.humidity < 10)
{
Send_threelines( DHT11Now.humidity%10);?//
??}
break ;
default:
break ;
?
}
?
?
?
?
?
}
else
{
ledyy(1)
?
}
if(reckey== 66 )?//收到喚醒詞
{
getTS = HAL_GetTick() ;
ledyy(0)
Send_threelines(23);?//在呢
?
}
if(reckey < 12 &&reckey ?)
{
ledyy(1)
writeF = 1 ;?//開始存儲
getTS = 0 ;
?
}
reckey = 0 ;?//沒有語音喚醒時,強制清零
?
?
?
?
}
?
?
/* USER CODE END 0 */
?
/**
??* @brief ?The application entry point.
??* @retval int
??*/
int main(void)
{
/* USER CODE BEGIN 1 */
?
/* USER CODE END 1 */
?
/* MCU Configuration--------------------------------------------------------*/
?
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
?
/* USER CODE BEGIN Init */
?
/* USER CODE END Init */
?
/* Configure the system clock */
SystemClock_Config();
?
/* USER CODE BEGIN SysInit */
?
/* USER CODE END SysInit */
?
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_USART3_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
?
/* Infinite loop */
/* USER CODE BEGIN WHILE */
?
HAL_UART_Receive_IT(&huart3,&reckey,1);
HAL_TIM_Base_Start_IT(&htim1);?//主函數中添加打開定時器中斷
HAL_TIM_Base_Start_IT(&htim2);?//主函數中添加打開定時器中斷
?
WT588_GPIO_Init();?//初始化WT588用到的IO口
?
step_GPIO_Init() ;?//步進電機IO口 初始化
initial_lcd();?//初始化lcd
readMomerr() ;?//上電讀取存儲值
?
while (1)
{
uartback() ;
key() ;
display();
DHT11_Read_TempAndHumidity(&DHT11Now);?//檢測溫濕度
writeMomerr();?//等待存儲
?
/* USER CODE END WHILE */
?
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
?
/**
??* @brief System Clock Configuration
??* @retval None
??*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
?
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
??????????????????????????????|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
?
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
?
/* USER CODE BEGIN 4 */
int fputc(int ch,FILE *f)
{
uint8_t temp[1] = {ch};//
HAL_UART_Transmit(&huart3,temp,1,500);
return ch ;
}
/* USER CODE END 4 */
?
/**
??* @brief ?This function is executed in case of error occurrence.
??* @retval None
??*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
?
/* USER CODE END Error_Handler_Debug */
}
?
#ifdef ?USE_FULL_ASSERT
/**
??* @brief ?Reports the name of the source file and the source line number
??* ????????where the assert_param error has occurred.
??* @param ?file: pointer to the source file name
??* @param ?line: assert_param error line source number
??* @retval None
??*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
???tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
?
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
?