(e)可靠性:ZigBee的MAC層采用了基于時(shí)隙的CSMA/CA協(xié)議,在發(fā)送時(shí)對信道進(jìn)行沖突檢測,并且專門為通信 寬帶業(yè)務(wù)預(yù)留了時(shí)隙,以避免發(fā)送數(shù)據(jù)幀時(shí)可能產(chǎn)生的沖 突與競 爭[2],提高了無線數(shù)據(jù) 傳輸?shù)目煽啃浴?/div>
(f)大容量:ZigBee可以實(shí)現(xiàn)星形、樹簇和網(wǎng)狀三種拓?fù)浣Y(jié)構(gòu),一個(gè)主設(shè)備最多可以連接254個(gè)ZigBee子設(shè)備,而主設(shè)備由上層網(wǎng)絡(luò)父節(jié)點(diǎn)管理,每一個(gè)節(jié)點(diǎn)可以分配到一個(gè)16位的網(wǎng)絡(luò)地址,除去廣播地址0xFFFF,因此最多可以擴(kuò)展到216-1=65535個(gè)節(jié)點(diǎn)。
近年來各種無線通訊技術(shù)層出不窮,發(fā)展迅猛,廣泛應(yīng)用的還有WIFI、藍(lán)牙4.0、GPRS、3G等,他們都有各自的獨(dú)特之處。GPRS(General Packet Radio Service)是2G向3G過渡的一種無線技術(shù),經(jīng)常被描述為2.5G,是一種基于GSM全球手機(jī)系統(tǒng)的數(shù)據(jù)傳輸技術(shù)。3G是第三代移動(dòng)通訊的簡稱,可傳輸音頻、視頻等高速數(shù)據(jù)幀,主要特點(diǎn)是隨時(shí)隨地讓任何人的通信交流成為可能。藍(lán)牙4.0是2012年開發(fā)的新的藍(lán)牙版本,有效連接距離增加很多,功耗也有所降低,是一個(gè)很出色的無線系統(tǒng),包括WIFI,但是伴隨而來的是高復(fù)雜度,和較高成本。
如表2.1所示,是ZigBee技術(shù)與上面所講的其它幾種無線通信技術(shù)的比較,根據(jù)系統(tǒng)需求綜合比較來看,ZigBee技術(shù)最適合應(yīng)用在WSN分布式采集系統(tǒng)中。
伴隨著ZigBee技術(shù)的廣泛應(yīng)用,并能夠在各個(gè)領(lǐng)域展現(xiàn)ZigBee技術(shù)非凡的特點(diǎn),可以預(yù)測在不久的將來,ZigBee技術(shù)的應(yīng)用將會(huì)使我們的生活更加智能化、數(shù)字化,徹底改變?nèi)藗兊纳罘绞健?/div>
2.3.2 串口通信技術(shù)a.串口通信的原理
串口通信(Serial Communications)描述了一種特定模式的信息傳遞方式和傳遞規(guī)則,即串口按照bit完成bit的發(fā)送和接收。雖然,眾所周知在并行通信的模式下,按照比特傳輸比較緩慢,但是串口通信有一個(gè)優(yōu)勢,便是可以用兩根線同時(shí)完成數(shù)據(jù)的傳送和接收。串口通信的原理和結(jié)構(gòu)不僅簡單,并且針對遠(yuǎn)距離通信也有其獨(dú)特的優(yōu)勢。在IEEE488協(xié)議中規(guī)定了并行通信的情況下設(shè)備總線的長度規(guī)格,一般短于20米,同時(shí)任意兩個(gè)設(shè)備之間的距離也有限制,通常低于兩米。然而,對于串口通信而言,距離長度可以長達(dá)1200米。一個(gè)典型的實(shí)例就是串口常用于ASCII碼的傳輸,它由地線、發(fā)送、接收三根通信線組成。又因?yàn)榇谕ㄐ攀钱惒讲僮鳎蚀诰涂梢栽谝桓上發(fā)送數(shù)據(jù)的同時(shí),利用另外一根線來實(shí)現(xiàn)數(shù)據(jù)的接受,其他線還可以用于握手,不過有時(shí)候并不需要。對于串口通信來說,波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)是特別重要的參數(shù),在兩個(gè)端口之間進(jìn)行數(shù)據(jù)傳輸,這幾個(gè)參數(shù)必須是一致的,否則無法實(shí)現(xiàn)端口間的通信。
(1)波特率,描述的是符號的傳輸速率快慢,也可以理解為單位時(shí)間內(nèi)信號的變化次數(shù)。在日常生活中,電話的波特率有14400、28800和36600幾種值。波特率雖然可以很大,但是由于波特率與傳輸距離成反比的關(guān)系,故也有一定的限制,不同的傳輸模式需要選擇合理的波特率。高波特率常用于近距離的設(shè)備通信,例如GPIB設(shè)備通信。
(2)數(shù)據(jù)位,表達(dá)的是信號傳輸中的實(shí)際數(shù)據(jù)位。在計(jì)算機(jī)傳輸數(shù)據(jù)的信息包里,實(shí)際數(shù)據(jù)長度一般情況下不是8位,而是6/7位,這個(gè)數(shù)據(jù)位是可以根據(jù)自己的需求來設(shè)定的。經(jīng)典的例子就是標(biāo)準(zhǔn)的ASCII和擴(kuò)展ASCII數(shù)據(jù)位分別是7位和8位。每個(gè)數(shù)據(jù)包代表一個(gè)字節(jié),數(shù)據(jù)包一般由四部分組成:開始位、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位,其中數(shù)據(jù)位的具體制定依照通信協(xié)議來完成。
(3)停止位,即包的最后一位,用于表示數(shù)據(jù)傳輸?shù)慕刂埂M瑫r(shí),停止位還可以用來同步設(shè)備的時(shí)鐘。
(4)奇偶校驗(yàn)位,是用來進(jìn)行通信檢錯(cuò)的位信息,檢錯(cuò)的具體方式又可以分為四種:奇、偶、高和低。當(dāng)然此位是根據(jù)數(shù)據(jù)傳送的具體實(shí)施辦法來選取的,并不是必須的位。
串口通信,顧名思義,就是以串口的方式進(jìn)行設(shè)備間的數(shù)據(jù)傳輸,并且傳輸?shù)膯挝皇俏弧4谕ㄐ啪哂泻芏鄡?yōu)勢,尤其在遠(yuǎn)距離通信裝置中,數(shù)據(jù)線使用量小為項(xiàng)目節(jié)省了大量成本。
在工業(yè)中,多數(shù)控制計(jì)算機(jī)以及GPIB兼容的設(shè)備都含有RS-232的串口,并且擁有規(guī)范的串口通信協(xié)議,用戶可以很方便的通過串口來獲取遠(yuǎn)距離數(shù)據(jù)采集的數(shù)據(jù)包。
本課題基于串口通信研發(fā)了一套光伏發(fā)電站的監(jiān)控系統(tǒng),利用了串口通信的便捷性和穩(wěn)定性來實(shí)現(xiàn)與上位機(jī)之間的通信,如圖2.2所示,為串口通信協(xié)議的體系結(jié)構(gòu)圖。
圖2.2 串口通信協(xié)議的體系結(jié)構(gòu)圖
b.串口通信的傳輸方式
(1)有線遠(yuǎn)程數(shù)據(jù)傳輸
1) 調(diào)制解調(diào)器技術(shù)支持下的遠(yuǎn)程數(shù)據(jù)傳輸
現(xiàn)代撥號通信方式是基于現(xiàn)有的有線電話網(wǎng)絡(luò),從而實(shí)現(xiàn)計(jì)算機(jī)之間的相互
遠(yuǎn)程通信。然而電話網(wǎng)信號和計(jì)算機(jī)網(wǎng)絡(luò)信號有一定的區(qū)別,那就是電話網(wǎng)只可
以處理和傳輸模擬信號,對于計(jì)算機(jī)和單片機(jī)等微處理器只可以處理和傳輸數(shù)字
信號。因此,當(dāng)數(shù)據(jù)的計(jì)算機(jī)和微處理器通過電話網(wǎng)絡(luò)傳輸,在傳輸?shù)膬啥吮仨毦哂心M信號的調(diào)制和解調(diào)的設(shè)備,經(jīng)過相關(guān)處理得到對應(yīng)的數(shù)字信號,然后再做進(jìn)一步的操作。
具體來說,對于數(shù)據(jù)的發(fā)送端,利用調(diào)制解調(diào)器的調(diào)制功能,實(shí)現(xiàn)數(shù)字信號向模擬信號的轉(zhuǎn)換,如此一來,經(jīng)過調(diào)制的數(shù)字信號就可以在電話網(wǎng)中傳輸。同樣的道理,在數(shù)據(jù)的接收端,利用調(diào)制解調(diào)器的解調(diào)功能,實(shí)現(xiàn)模擬信號向數(shù)字信號的轉(zhuǎn)換,如此使得計(jì)算機(jī)處理接收到的信號非常方便。撥號通信有標(biāo)準(zhǔn)的規(guī)則協(xié)議,現(xiàn)階段由于Hayes公司制定的AT命令支持所有的AT命令,因而成為名副其實(shí)的行業(yè)標(biāo)準(zhǔn)。近年來,隨著計(jì)算機(jī)技術(shù)的深入發(fā)展和不斷普及,尤其是語音撥號通信方式的出現(xiàn),極大的推動(dòng)了電話語音控制技術(shù)的發(fā)展。基于此,美國微軟公司和因特爾公司合作開發(fā)出了一種全新的應(yīng)用程序接口 TAPI,這種接口可以匹配所有的硬件接口,如此一來為相應(yīng)的軟件開發(fā)提供了極大的便利條件,又由于TAPI接口可以提供的許多種功能,所以現(xiàn)階段基于撥號通信的遠(yuǎn)程監(jiān)控技術(shù)體系里面都滯要運(yùn)用到此種接口。
特別的,在所要傳輸?shù)臄?shù)據(jù)量比較小和通信數(shù)據(jù)頻率比較低的情況下,使用撥號通信方式可以極大地降低通信成本費(fèi)用,而且可以在節(jié)約成本的前提下實(shí)現(xiàn)
通信數(shù)據(jù)信息的安全可靠傳輸,進(jìn)而帶來比較可觀的經(jīng)濟(jì)效益。
2) 因特網(wǎng)支持下的遠(yuǎn)程數(shù)據(jù)傳輸
人類社會(huì)發(fā)展進(jìn)入20世紀(jì)以來,計(jì)算機(jī)信息技術(shù)迅猛發(fā)展,特別是隨著因特網(wǎng)的全面普及,極大地改變了人類傳統(tǒng)的生產(chǎn)生活方式,不僅如此,還將向其他科技信息領(lǐng)域滲透,進(jìn)而引發(fā)較大的技術(shù)創(chuàng)新與變革。隨著信息技術(shù)與傳統(tǒng)工業(yè)技術(shù)的深度融合發(fā)展,以因特網(wǎng)為基礎(chǔ)的監(jiān)控技術(shù)引發(fā)了業(yè)內(nèi)人士的廣泛關(guān)注和重視,因此被廣泛地應(yīng)用到傳統(tǒng)工農(nóng)業(yè)生產(chǎn)監(jiān)控過程中。通過互聯(lián)網(wǎng)監(jiān)控新技術(shù)等方法,研發(fā)技術(shù)人員可以輕松實(shí)現(xiàn)生產(chǎn)管理過程的控制與維護(hù),對各個(gè)生產(chǎn)環(huán)節(jié)進(jìn)行優(yōu)化升級,大幅度地提升設(shè)備利用效率,有效降低生產(chǎn)成本,從而進(jìn)一步擴(kuò)大生產(chǎn)規(guī)模,提高經(jīng)濟(jì)效益。
(2)無線遠(yuǎn)程數(shù)據(jù)傳輸
近年來,之所以無線通信技術(shù)和信息技術(shù)的迅猛發(fā)展,是因?yàn)槠浼夹g(shù)體系是建立在已經(jīng)成熟的有線遠(yuǎn)程數(shù)據(jù)傳輸?shù)幕A(chǔ)之上。無線遠(yuǎn)程傳輸技術(shù)異軍突起,日益成為最富有發(fā)展?jié)摿Φ男屡d的監(jiān)控系統(tǒng)主流技術(shù)之一。對于無線數(shù)據(jù)通信技術(shù),其最大的優(yōu)點(diǎn)就是將中央監(jiān)控中心計(jì)算機(jī)與各個(gè)分監(jiān)控中心實(shí)現(xiàn)實(shí)時(shí)連接,而且可以做到整個(gè)監(jiān)控過程不間斷和信息傳遞低延時(shí),因此實(shí)現(xiàn)了真正意義上的中央監(jiān)控對分中心監(jiān)控的實(shí)時(shí)監(jiān)測控制,這一點(diǎn)是有線監(jiān)控技術(shù)一般不能達(dá)到的。
2.4 STM32芯片介紹STM32F103微控制器構(gòu)建與高性能的ARM Cortex-M3內(nèi)核,工作頻率為72MHz,內(nèi)置高速存儲(chǔ)器,豐富的增強(qiáng)型I/O端口。增強(qiáng)型器件都包含ADC、定時(shí)器、PWM定時(shí)器。
成本低、該系列微控制器與常見的8位、16位單片機(jī)在價(jià)格上基本接近。既有32位單片機(jī)的性能,又與8位、16位單片機(jī)價(jià)格相當(dāng),可直接代替8位/16位單片機(jī)應(yīng)用于一些小型控制系統(tǒng)中。
性能高,包含標(biāo)準(zhǔn)和先進(jìn)的通信接口:3個(gè)UART接口、2個(gè)SPI口、2個(gè)I2C接口、一個(gè)USB接口和一個(gè)CAN接口。STM32F103是一個(gè)完整的系列,其成員之間引腳對引腳完全兼容,軟件和功能也兼容。
a.STM32的優(yōu)勢
通過對STM32的系統(tǒng)學(xué)習(xí),詳細(xì)總結(jié)STM32的優(yōu)勢如下所示:
(1)性價(jià)比高。STM32是32位的芯片,但是其價(jià)位幾乎與8位機(jī)持平,成本的考慮也是STM32廣泛應(yīng)用于各種實(shí)際項(xiàng)目中的主要原因之一。
(2)外設(shè)配套齊全。STM32是一款高度集中的主控模塊,模塊中包含SPI、TIMER、IIC、ADC、DAC、RTC等外設(shè),從而讓其具備許多便攜的功能,方便在其平臺(tái)上進(jìn)行開發(fā)。
(3)產(chǎn)品型號多樣。STM32芯片可選擇性很強(qiáng),包含5個(gè)系列的產(chǎn)品,分別針對不同的設(shè)計(jì)需求可以進(jìn)行選型,并且有多種封裝用于選擇。
(4)實(shí)時(shí)性極佳。模塊含有84個(gè)中斷,另外引腳全部可以當(dāng)做中斷,完全滿足大多數(shù)項(xiàng)目的需求,16級可編程優(yōu)先級讓實(shí)現(xiàn)過程更加優(yōu)化。
(5)功耗控制的便攜。STM32的外部設(shè)備均包含獨(dú)立的時(shí)鐘開關(guān),從而可以利用時(shí)鐘開關(guān)來控制整個(gè)系統(tǒng)的功耗。
(6)開發(fā)成本低。項(xiàng)目中常基于STM32做開發(fā),除了其自身成本比較低以外,還有個(gè)很重要的原因就是開發(fā)成本很低,迫切滿足實(shí)用性需求。STM32可以通過串口來實(shí)現(xiàn)程序的下載,方便、快捷,不需要昂貴的仿真器來幫助下載程序,并且SWD和JTAG兩種調(diào)試接口,讓仿真調(diào)試的方式簡化了好多。
b.開發(fā)板特點(diǎn)
在實(shí)際項(xiàng)目中做開發(fā),我們還需要考慮的就是硬件的開發(fā)板特性,因?yàn)殚_發(fā)板的特性有時(shí)決定了是否符合項(xiàng)目的需求,總結(jié)STM32的開發(fā)板特點(diǎn)如下所示:
(1)小巧。整個(gè)板子尺寸為8cm*10cm*2cm(包括液晶屏,但不計(jì)算銅柱的高度)。
(2)靈活。板上除去晶振外,其他IO口全部引出,另外GPIOA和GPIOB的IO口還是按順序引出的,這樣的設(shè)計(jì)很大程度為研發(fā)人員在其基礎(chǔ)上擴(kuò)展開發(fā)提供了便捷。外加的一鍵下載功能,省去了設(shè)置B0/B1的繁瑣,可以用電腦一鍵下載。
(3)資源豐富。板載十多種外設(shè)及接口,可以充分挖掘STM32的潛質(zhì)。
(4)質(zhì)量過硬。沉金PCB+全新優(yōu)質(zhì)元器件+定制全銅鍍金排針/排座+電源TVS保護(hù),堅(jiān)若磐石。
c.開發(fā)板資源
(1)CPU為STM32F103RBT6,擁有128K的FLASH和20K的SRAM;
(2)一個(gè)標(biāo)準(zhǔn)的JTAG/SWD調(diào)試下載口;
(3)1個(gè)電源指示燈(藍(lán)色);
(4)2個(gè)狀態(tài)指示燈(DS0:紅色,DS1:綠色);
(5)1個(gè)紅外接頭,配備一款小巧的紅外遙控器;
(6)1個(gè)IIC接口的EEPROM芯片,24C02,容量256字節(jié);
(7)1個(gè)SPI FLASH芯片,W25X16,容量為2M字節(jié);
(8)1個(gè)DS18B20/DS1820溫度傳感器預(yù)留接口;
(9)1個(gè)標(biāo)準(zhǔn)的2.4/2.8寸LCD接口,支持觸摸屏;
(10)1個(gè)OLED模塊接口;
(11)1個(gè)USB串口,可用于程序下載和代碼調(diào)試;
(12)1個(gè)USB SLAVE接口,用于USB通信;
(13)1個(gè)PS/2接口,可外接鼠標(biāo)、鍵盤;
(14)1組5v電源供應(yīng)/接入口;
(15)1組3.3V電源供應(yīng)/接入口;
(16)1個(gè)啟動(dòng)模式選擇配置接口;
(17)2個(gè)2.4G無線通信接口;
(18)1個(gè)RTC后備電池座,并帶電池;
(19)1個(gè)復(fù)位按鈕,可用于復(fù)位MCU和LCD;
(20)3個(gè)功能按鈕,其中WK_UP兼具喚醒功能;
(21)1個(gè)電源開關(guān),控制整個(gè)電路板的電源;
(22)3.3v與5v電源TVS保護(hù),有效防止燒壞芯片;
3 硬件的設(shè)計(jì)與實(shí)現(xiàn)
3.1 主控模塊總體接口設(shè)計(jì)我們在景區(qū)環(huán)境預(yù)知系統(tǒng)的硬件設(shè)計(jì)中,始終堅(jiān)持開始的方案設(shè)計(jì)分析思路,綜合考慮系統(tǒng)的可靠性、外觀、功耗以及安全性等元素。最終的定論中可以把整個(gè)系統(tǒng)分為兩大部分:主控模塊STM32和外圍通信設(shè)備。外圍的通信包括主芯片STM32跟協(xié)調(diào)器之間的通信和STM32跟上位機(jī)之間的通信,而選擇的方式為串口通信。具體的硬件平臺(tái)框圖如圖3.1所示。
圖3.1 系統(tǒng)的硬件框圖
3.2 硬件電路設(shè)計(jì)
3.2.1 整體原理圖設(shè)計(jì)本節(jié)我們利用Altium Designer軟件畫出系統(tǒng)硬件原理圖。根據(jù)本課題需求,確定了系統(tǒng)結(jié)構(gòu)以及原理設(shè)計(jì),從而在軟件上畫出最終的STM32控制芯片的原理圖,如圖3.2所示。
圖3.3系統(tǒng)外接+5V供電電路
另外,+3.3V也是系統(tǒng)中器件常常需要的一個(gè)電壓值,在電路設(shè)計(jì)中通常采用穩(wěn)壓芯片來進(jìn)行轉(zhuǎn)換,然后穩(wěn)定的輸出所需的+3.3V電壓值,穩(wěn)壓芯片有多種,課題中利用AMS1086CM-3.3來進(jìn)行電壓轉(zhuǎn)換。如圖3.4所示,電路設(shè)計(jì)原理圖,其中電容的配置同樣是為了起到電壓濾波的作用。
經(jīng)過長期的電路設(shè)計(jì)發(fā)展,一些常用的引腳和模塊所需的電壓值也逐步形成一種規(guī)范,例如采用3.3V的電壓為I/O引腳供電,還有zigbee模塊、數(shù)據(jù)采集模塊等都是3.3V供電。如圖3.4所示,5V轉(zhuǎn)3.3V的電路設(shè)計(jì)實(shí)現(xiàn)原理圖。
圖3.4 5V轉(zhuǎn)3.3V電源電路設(shè)計(jì) 3.2.3 復(fù)位電路設(shè)計(jì)復(fù)位電路的設(shè)計(jì)也是十分重要的,如果沒有復(fù)位設(shè)計(jì),當(dāng)上電后程序會(huì)自動(dòng)跑,不便于控制。復(fù)位電路通常由RC電路外加按鍵構(gòu)成,最終實(shí)現(xiàn)兩種復(fù)位模式:上電復(fù)位和手動(dòng)復(fù)位。實(shí)現(xiàn)原理是T-RST引腳的輸入電平逐步由低轉(zhuǎn)高來產(chǎn)生復(fù)位信號。由于STM32F103芯片自身含有上電復(fù)位和電壓檢測復(fù)位,所以我們只需要搭建外部的手動(dòng)復(fù)位電路。如圖3.5所示,復(fù)位電路的原理設(shè)計(jì),其中,復(fù)位鍵S2在按下之前,RESET端的電平信號為高,芯片系統(tǒng)工作正常;按下S2鍵,T-RST端輸入電平由高轉(zhuǎn)低,從而控制完成芯片復(fù)位操作。
圖3.5 復(fù)位電路設(shè)計(jì)
3.2.4 時(shí)鐘電路設(shè)計(jì)若系統(tǒng)想正常工作,都需要時(shí)鐘電源來為芯片內(nèi)部結(jié)構(gòu)供電,時(shí)鐘電源通常由外接晶振來構(gòu)成,時(shí)鐘電路就好比人的心臟,為整個(gè)芯片提供工作必須的能量。STM32可外接兩個(gè)晶振:高速HSM和低速LSM,它們的作用分別為系統(tǒng)提供主頻和為系統(tǒng)提供日歷時(shí)鐘。時(shí)鐘電路的設(shè)計(jì)可以實(shí)現(xiàn)為一些定時(shí)功能提供時(shí)鐘源,保證VBAT可持續(xù)供電,當(dāng)切斷電源時(shí),PTC仍然可以照常工作。如圖3.6所示,時(shí)鐘電路設(shè)計(jì)原理。
圖3.6 時(shí)鐘電路設(shè)計(jì)
3.2.5 UART電路設(shè)計(jì)UART是通用的異步接收/發(fā)送裝置,UART采用并行輸入、串行輸出的方式進(jìn)行通信,是一種傳輸?shù)氖瞻l(fā)機(jī)制,在多數(shù)設(shè)備上已經(jīng)實(shí)現(xiàn)了集成。由于計(jì)算機(jī)內(nèi)部傳輸數(shù)據(jù)是并行模式,故不能直接將數(shù)據(jù)發(fā)到Modem,需要引入U(xiǎn)ART整理后,方才可以實(shí)施異步傳輸。
在接收過程中,UART便從消息幀中去掉起始位和結(jié)束位,并根據(jù)通信協(xié)議的要求,選擇是否進(jìn)行數(shù)據(jù)的奇偶校驗(yàn)檢錯(cuò)步驟,最后將將串行的數(shù)據(jù)字節(jié)轉(zhuǎn)換成并行。同時(shí),UART還會(huì)產(chǎn)生額外信號來顯示數(shù)據(jù)的發(fā)送和接收狀態(tài)。例如,當(dāng)存在一個(gè)奇偶錯(cuò)誤,UART就置位奇偶標(biāo)志,從而便于后期的數(shù)據(jù)糾正。如圖3.7所示,UART接口內(nèi)部結(jié)構(gòu)。
圖3.7 UART接口內(nèi)部結(jié)構(gòu)
UART串口原理圖設(shè)計(jì),保證了數(shù)據(jù)的準(zhǔn)確發(fā)送、傳輸和接收。在景區(qū)環(huán)境預(yù)知系統(tǒng)-主控模塊設(shè)計(jì)中,采用的通信方式皆為串口通信的模式,故串口通信模塊是必不可少的一部分,其原理圖設(shè)計(jì)如圖3.8所示。
圖3.8 串口通信接口設(shè)計(jì)
3.2.6 LCD電路設(shè)計(jì)字符型點(diǎn)陣式LCD模塊是一種專門用于顯示字母、數(shù)字、符號等點(diǎn)陣式液晶顯示模塊,項(xiàng)目中可以用LCD對STM32接收到的數(shù)據(jù)進(jìn)行顯示。LCD與STM32的連接如圖3.9所示。
圖3.9 LCD電路圖設(shè)計(jì)
1
4 系統(tǒng)軟件實(shí)現(xiàn)
4 系統(tǒng)軟件實(shí)現(xiàn)4.1 景區(qū)環(huán)境預(yù)知系統(tǒng)開發(fā)環(huán)境4.1.1 Keil的簡介Keil是一種窗口化的軟件開發(fā)平臺(tái),廣泛應(yīng)用于嵌入式應(yīng)用程序開發(fā)。在此平臺(tái)下我們可以對程序進(jìn)行編輯、調(diào)試和仿真,并且其支持匯編、C語言等多種語言的混合編程。經(jīng)過不斷地更新,Keil的界面功能也越發(fā)健全,便于初學(xué)者上手學(xué)習(xí),并且使用方便。Keil除了編譯器功能強(qiáng)大以外還擁有C編譯器、裝載器等編譯工具。詳細(xì)分析Keil的開發(fā)環(huán)境及其功能組件,總結(jié)其的一些特征如下:
a.源代碼編輯器功能強(qiáng)大
b.針對大部分開發(fā)工具,可以配置對應(yīng)的數(shù)據(jù)庫,從而便于程序的快速開發(fā)
c.擁有工程管理器,可以來創(chuàng)建和維護(hù)工程
d.是集匯編、編譯和鏈接過程于一體的編譯工具
e.可以對開發(fā)工具的對話框進(jìn)行設(shè)置
f.具備外設(shè)模擬器的編碼調(diào)試功能,助于程序的開發(fā)
g.含有高級GDI接口,從而實(shí)現(xiàn)軟硬件的連接
h.可以完成程序下載,即Flash ROM到Flash編程器
i.詳細(xì)的開發(fā)工具介紹,方便用戶學(xué)習(xí)和使用
4.1.2 Keil軟件的工程創(chuàng)建(1)當(dāng)我們打開Keil軟件后,可以單擊Project

New

Vision Project…菜單項(xiàng),從而Vision就會(huì)打開對話框。此處,我們通常對每個(gè)新建工程使用獨(dú)立的文件夾,輸入工程名保存,便實(shí)現(xiàn)了新工程的創(chuàng)建。若如想查閱我們已經(jīng)創(chuàng)建的工程,可以在Project Workspace區(qū)域的Files選項(xiàng)卡里查看,如圖4.1所示。

圖4.1 Keil新建工程
1
西安工業(yè)大學(xué)北方信息工程學(xué)院畢業(yè)設(shè)計(jì)(論文)
(2)此時(shí)Keil會(huì)自動(dòng)彈出對話框,可以根據(jù)目標(biāo)芯片選擇對應(yīng)的CPU主控,此步操作可以實(shí)現(xiàn)對芯片STM32的選取。
(3)Keil會(huì)提示復(fù)制CPU指定的啟動(dòng)代碼到工程中去。工程中需要使用這些啟動(dòng)代碼,選擇“是(Y)”,如果不使用Keil編寫啟動(dòng)代碼可以選擇“否(N)”,如圖4.2所示。
圖4.2 Keil CPU代碼復(fù)制
(4)選擇File

New或者單擊圖標(biāo)以創(chuàng)建一個(gè)新的源文件,會(huì)打開一個(gè)空的編輯窗口,用戶可以在此窗口里輸入源代碼,如圖4.3所示。然后選擇File

Save命令,以擴(kuò)展名*.C保存文件至之前新建的文件夾里以便于以后尋找。

圖4.3 Keil導(dǎo)入*.C文件
(5)完畢后,再在工程工作區(qū)中選擇“Source Group1”右擊選擇Add Files選項(xiàng),出現(xiàn)一個(gè)對話框,在對話框里選擇前面創(chuàng)建的C源文件,然后點(diǎn)擊“Add”,此時(shí)文件已經(jīng)被添加到工程然后點(diǎn)擊“Close”關(guān)閉即可。如圖4.4所示。然后開始輸入程序。
圖4.4 Keil添加文件到工程
(6)在程序完成編譯后,我們在project

Options for Target

Output中選擇Create HEX file選項(xiàng),Keil會(huì)在編譯過程中同時(shí)產(chǎn)生HEX文件。如圖4.5所示,編譯結(jié)束。
圖4.5 HEX文件的生成
4.2 系統(tǒng)軟件設(shè)計(jì) 根據(jù)系統(tǒng)的總體方案設(shè)計(jì),我們可以清晰的了解到整個(gè)系統(tǒng)的數(shù)據(jù)傳輸流程,從而對我們的軟件設(shè)計(jì)提供幫助。首先通過STM32向協(xié)調(diào)器發(fā)送數(shù)據(jù)請求命令,當(dāng)協(xié)調(diào)器收到命令后通過串口向STM32發(fā)送數(shù)據(jù),下一步就是STM32和上位機(jī)之間的通信,以及STM32控制LCD進(jìn)行數(shù)據(jù)顯示。故景區(qū)環(huán)境預(yù)知系統(tǒng)--主控模塊的軟件流程如圖4.6所示。
圖4.6 系統(tǒng)軟件流程圖
4.3 程序?qū)崿F(xiàn)
4.3.1串口初始化
因?yàn)槲覀冃枰獙TM32的引腳進(jìn)行定義,服務(wù)于自己的想法,所以首先要進(jìn)行初始化操作,從而來定義波特率、優(yōu)先級、串口功能等。串口初始化函數(shù)如下所示:
- void InitUart()
- {
- CLKCONCMD &= ~0x40; // 設(shè)置系統(tǒng)時(shí)鐘源
- while(CLKCONSTA & 0x40); // 等待晶振穩(wěn)定
- CLKCONCMD &= ~0x47; // 設(shè)置系統(tǒng)主時(shí)鐘頻率為 32MHZ
- SLEEPCMD|=0x04; //關(guān)閉不用的RC振蕩器
- PERCFG = 0x00; //使用串口1的備用位置1 P0口
- P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5用作串口,第二功能
- P2DIR &= ~0XC0; //P0優(yōu)先作為UART0 ,優(yōu)先級
- U0CSR |= 0x80; //UART 方式
- U0GCR |= 8; //U0GCR與U0BAUD配合
- U0BAUD |= 59; //波特率設(shè)為9600
- UTX0IF = 1; //UART0 TX 中斷標(biāo)志初始置位1 (收發(fā)時(shí)候)
- U0CSR |= 0X40; //允許接收
- IEN0 |= 0x84; //開總中斷,接收中斷
- }
- 4.3.2 LCD驅(qū)動(dòng)
- 想讓LCD工作,首先也要對LCD模塊進(jìn)行初始化如下過程:
- void LcdInit(void) //初始化程序
- {
- LCD_RST = 0;
- delay_us(20);
- LCD_RST = 1;
- delay_us(5);
- LCD_CS1=0;
- LCD_CS2=0;
- LCD_CS3=0;
- WriteCommand(0x3f); //設(shè)置開顯示命令
- WriteCommand(0xc0);//設(shè)置起始位置
- LCD_CS1 = 1;
- LCD_CS2 = 1;
- LCD_CS3 = 1;
- LcdClear(); //清屏
- 初始化完成后,就要編寫LCD模塊的數(shù)據(jù)寫入函數(shù),從而為LCD數(shù)據(jù)的顯示做準(zhǔn)備,LCD的數(shù)據(jù)寫入函數(shù),如下所示:
- void WriteData(u8 dat) //寫數(shù)據(jù)
- {
- LCD_RS=1; //寫數(shù)據(jù)
- //RW=0;
- LCD_DATA(dat); //數(shù)據(jù)輸出到數(shù)據(jù)口
- LCD_E=1; //寫入到LCD
- delay_us(10);
- LCD_E=0;
- }
- 4.3.3 STM32數(shù)據(jù)的接收和發(fā)送
- STM32既然作為主控模塊,那么數(shù)據(jù)的接收和發(fā)送即為其主要功能,下邊編寫其工作狀態(tài)的選擇,具體什么條件下進(jìn)行數(shù)據(jù)的收和發(fā)。
- if(RXTXflag == 1) //接收狀態(tài)
- {
- LED1=1; //接收狀態(tài)指示
- if( temp != 0)
- {
- //'#'被定義為結(jié)束字符,最多能接收50個(gè)字符
- if((temp!='#')&&(datanumber<50))
- {
- Rxdata[datanumber++] = temp;
- }
- else
- {
- RXTXflag = 3; //進(jìn)入發(fā)送狀態(tài)
- LED1=0; //關(guān)指示燈
- }
- temp = 0;
- }
- }
- if(RXTXflag == 3) //發(fā)送狀態(tài)
- {
- LED2= 1;
- U0CSR &= ~0x40; //禁止接收
- Uart_Send_String(Rxdata,datanumber); //發(fā)送已記錄的字符串
- U0CSR |= 0x40; //允許接收
- RXTXflag = 1; //恢復(fù)到接收狀態(tài)
- datanumber = 0; //指針歸0
- LED2 = 0; //關(guān)發(fā)送指示
- }
復(fù)制代碼
4.4 上位機(jī)顯示 本章節(jié)通過JAVA進(jìn)行了上位機(jī)的顯示界面制作,實(shí)現(xiàn)了景區(qū)環(huán)境參數(shù)的簡單顯示,JAVA編寫的初始界面數(shù)據(jù)如圖4.7所示。

圖4.7 初始數(shù)據(jù)顯示界面
接著,對我們本課題需要的煙霧值、雨量、PM2.5、紅外線和人流量數(shù)據(jù)進(jìn)行采集和添加,設(shè)定數(shù)據(jù)的格式,設(shè)計(jì)環(huán)境參數(shù)采集的子界面,如圖4.8所示。


圖4.8 環(huán)境參數(shù)采集和添加界面
上一步驟是將景區(qū)環(huán)境的參數(shù)顯示在對應(yīng)的窗口框里,接下來提交數(shù)據(jù),即完成了一次數(shù)據(jù)的采集和保存,并顯示在主界面上,如圖4.9所示。


圖4.9 主界面數(shù)據(jù)顯示
從而實(shí)現(xiàn)了景區(qū)環(huán)境參數(shù)的上位機(jī)顯示制作,雖然功能簡單,但是可以很便捷的查看環(huán)境參數(shù)信息以及過往采集的數(shù)據(jù)。
5 結(jié)論隨著通信技術(shù)的迅速發(fā)展,以及人們對生活品質(zhì)追求越來越高,景區(qū)環(huán)境的檢測已經(jīng)成了必不可少的部分,本課題針對當(dāng)下景區(qū)管理存在的不便,設(shè)計(jì)實(shí)現(xiàn)了景區(qū)環(huán)境預(yù)知系統(tǒng)的主控模塊設(shè)計(jì),研究內(nèi)容也是智慧城市的重要分支之一。
在本系統(tǒng)的研究、實(shí)現(xiàn)過程中,收獲頗豐,總結(jié)如下:
a.STM32基本原理的學(xué)習(xí)
本系統(tǒng)中選用STM32作為主控芯片,來接收協(xié)調(diào)器的數(shù)據(jù)并將數(shù)據(jù)在LCD上進(jìn)行顯示。通過大量的資料,了解了STM32的幾個(gè)系列產(chǎn)品,對STM32成本低、功耗低等優(yōu)勢進(jìn)行了總結(jié)。
b.LCD顯示和串口通信技術(shù)
首先了解了LCD顯示的原理,并編程實(shí)現(xiàn)了LCD的驅(qū)動(dòng),最后將數(shù)據(jù)在LCD上顯示,便于客戶的觀測。文中STM32收發(fā)數(shù)據(jù)皆通過串口通信的方式進(jìn)行傳輸,故著重了解串口通信的原理。
c.智慧景區(qū)領(lǐng)域相關(guān)技術(shù)的了解
智慧景區(qū)系統(tǒng)的整體實(shí)現(xiàn)包括了zigbee無線通信技術(shù)、STM32控制、LCD顯示和PC機(jī)顯示等技術(shù)。通過深入了解整個(gè)大背景,豐富了作者的知識(shí),最終針對任務(wù)書的要求,對STM32和LCD顯示做了深入研究。
由于各種條件的限制,系統(tǒng)中仍舊有諸多可以改進(jìn)的地方,為了實(shí)現(xiàn)更好的通信技術(shù)服務(wù)于大眾,為了使客戶使用起來更加便利,系統(tǒng)主要體現(xiàn)的不足如下幾點(diǎn):
a.可以擺脫串口傳輸數(shù)據(jù)的物理局限,使用WiFi等方式來實(shí)現(xiàn)。
b.上位機(jī)顯示的方式過于單一,LCD顯示還是不夠便捷,如果數(shù)據(jù)能通過無線網(wǎng)絡(luò)的方式在手機(jī)app上完成實(shí)時(shí)顯示的話,會(huì)讓系統(tǒng)更加滿足實(shí)際要求。
希望通過以后的深入學(xué)習(xí)來克服以上不足,不斷的優(yōu)化系統(tǒng),使景區(qū)環(huán)境預(yù)知系統(tǒng)更加智能化。
致謝在拿到本課題的設(shè)計(jì)時(shí),作者對課題的理解僅停留在表面的認(rèn)知,對景區(qū)環(huán)境預(yù)知系統(tǒng)很是茫然,不知從何入手。在這里,首先要感謝指導(dǎo)導(dǎo)師王鵬教授,通過王老師不厭其煩的一遍遍講解,開始對課題有了進(jìn)一步的認(rèn)識(shí),并且學(xué)會(huì)了看待問題的角度,分析一個(gè)課題首先要分析其背景下的技術(shù)支持,明白了萬變不離其宗的道理。
此后,在了解課題的目標(biāo)和采用的關(guān)鍵技術(shù)后,學(xué)長和舍友的幫助使得作者很快接受諸多相關(guān)知識(shí),大家給予的支持和幫助是畢設(shè)課題順利完成的基本保障。在課題研究過程中涉及了系統(tǒng)的軟件和硬件設(shè)計(jì),軟件方面由于單片機(jī)不能接受JAVA語言,而作者只擅長JAVA語言,所以在C語言程序的涉及中及時(shí)請教了身邊的同學(xué)幫忙輔導(dǎo);在硬件設(shè)計(jì)中,本課題需要進(jìn)行STM32最小系統(tǒng)的原理圖設(shè)計(jì)以及PCB板的繪制,此過程中,出現(xiàn)了諸多難以解決的問題,比如復(fù)位電路的設(shè)計(jì)、STM32的最小系統(tǒng)原理設(shè)計(jì)等,經(jīng)過不斷的在網(wǎng)上搜索資源和借助圖書館等資源,最終還是予以克服。從遇到困難到解決困難的這個(gè)過程使作者成長了很多,使在面對突發(fā)狀況時(shí)更加的沉著冷靜。
最終感謝學(xué)校安排的畢業(yè)設(shè)計(jì),使得理論聯(lián)系實(shí)際,親自動(dòng)手去操作,去尋找方法,畢業(yè)設(shè)計(jì)的完成為我們走入社會(huì)奠定了堅(jiān)實(shí)的基礎(chǔ)。論文的撰寫使得語言表達(dá)能力和對工作的總結(jié)能力得到了提高。總之,感謝從畢業(yè)設(shè)計(jì)過程中學(xué)到知識(shí)的機(jī)會(huì)和身邊老師、同學(xué)身上感受到的溫暖,作者一定會(huì)進(jìn)一步深入學(xué)習(xí),不斷的提高專業(yè)知識(shí),成為社會(huì)的有用之才。
附錄 1 上位機(jī)顯示部分代碼- </head>
- <body bgcolor="sky blue"> //設(shè)置背景顏色
- <div align="center"> //設(shè)置居中格式
- <fieldset style="width: 300px"> //繪制框圖大小
- <legend style="margin-left: 100px">添加環(huán)境信息</legend>
- <form action="EnvironmentAction?action=add" method="post" style="text-align: left;">
- <table>
- <font size="50px">
- <tr><th width="100px">煙霧值:</th><th width="150"><input name="yanWu"></th></tr>
- <tr><th>雨量值:</th><th><input name="yuLiang"></th></tr>
- <tr><th>PM2.5:</th><th><input name="PM2_5"></th></tr>
- <tr><th>紅外線:</th><th><input name="hwx"></th></tr>
- <tr><th>人流量:</th><th><input name="rll"></th></tr>
- </font>
- <tr><th colspan="2"><input type="submit" value="提交數(shù)據(jù)"> <input type="reset" value="重置"></th></tr>
- </table>
- </form>
- </fieldset>
- </div>
- </body></html>
復(fù)制代碼//數(shù)據(jù)處理類
- public class EnvironmentAction extends HttpServlet {
- //使本類具有web方向的一切功能
- List<Environment> environmentList = new ArrayList<Environment>();
- @Override
- 1
- 附錄1上位機(jī)顯示部分代碼
- protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
- throws ServletException, IOException {
- String action = arg0.getParameter("action");
- if ("add".equals(action)) {
- Doadd(arg0, arg1);
- }
- }
- protected void Doadd(HttpServletRequest arg0, HttpServletResponse arg1)
- throws ServletException, IOException {
- String yanWu = arg0.getParameter("yanWu");
- String yuLiang = arg0.getParameter("yuLiang");
- String PM2_5 = arg0.getParameter("PM2_5");
- String rll = arg0.getParameter("rll");
- String hwx = arg0.getParameter("hwx");
- Environment environment = new Environment(yanWu, yuLiang, PM2_5, hwx,rll);
- List<Environment> environmentList = add(environment);
- arg0.setAttribute("environmentList", environmentList);
- arg0.getRequestDispatcher("show.jsp").forward(arg0, arg1);
- }
- private List<Environment> add(Environment environment) {
- environmentList.add(environment);
- return environmentList;
- }
- }
復(fù)制代碼
//數(shù)據(jù)顯示界面
- <body bgcolor="pink">
- <br><br><br>
- <%List<Environment>environmentList=(List<Environment>)request.getAttribute("environmentList"); %> //獲得后臺(tái)傳來的數(shù)據(jù)
- <div align="center">
- <fieldset style="width: 380px">
- <legend style="margin-left: 150px">環(huán)境信息如下</legend>
- <br><br><br>
- <table width="500px">
- <tr><th>煙霧</th><th>雨量</th><th>PM2.5</th><th>紅外線</th><th>人流量</th></tr> //設(shè)置標(biāo)題信息
- <% if(environmentList==null){%> //判斷有無環(huán)境信息
- <tr><th colspan="5">沒有數(shù)據(jù)...</th></tr> //提示信息
- <% } %>
- <c:forEach var="environment" items="${environmentList}">
- <tr>
- <th>${environment.yanWu}</th>
- <th>${environment.yuLiang}</th>
- <th>${environment.PM2_5}</th>
- <th>${environment.hwx}</th>
- <th>${environment.rll}</th>
- </tr>
- </c:forEach>
- </table>
- <br><br><br>
- <a href="add.jsp">繼續(xù)添加數(shù)據(jù)</a><!--模擬傳感器傳來的數(shù)據(jù),并進(jìn)行數(shù)據(jù)錄入 -->
- </fieldset>
- </div>
- </body>
- </html>
復(fù)制代碼
- //數(shù)據(jù)模型:(定義實(shí)體類)
- package com.ddd.entity;
- import java.io.Serializable;
- public class Environment implements Serializable {
- private String yanWu;
- private String yuLiang;
- private String PM2_5;
- private String hwx;
- private String rll;
- public String getYanWu() {
- return yanWu;
- }
- public void setYanWu(String yanWu) {
- this.yanWu = yanWu;
- }
- public String getYuLiang() {
- return yuLiang;
- }
- public void setYuLiang(String yuLiang) {
- this.yuLiang = yuLiang;
- }
- public String getPM2_5() {
- return PM2_5;
- }
- public void setPM2_5(String pM2_5) {
- PM2_5 = pM2_5;
- }
- public String getHwx() {
- return hwx;
- }
- public void setHwx(String hwx) {
- this.hwx = hwx;
- }
- public String getRll() {
- return rll;
- }
- public void setRll(String rll) {
- this.rll = rll;
- }
- public Environment() {
- super();
- // TODO Auto-generated constructor stub
- }
- public Environment(String yanWu, String yuLiang, String pM2_5, String hwx,
- String rll) {
- super();
- this.yanWu = yanWu;
- this.yuLiang = yuLiang;
- PM2_5 = pM2_5;
- this.hwx = hwx;
- this.rll = rll;
- }
- @Override
- public String toString() {
- return "Environment [yanWu=" + yanWu + ", yuLiang=" + yuLiang
- + ", PM2_5=" + PM2_5 + ", hwx=" + hwx + ", rll=" + rll + "]";
- }
- }
復(fù)制代碼
完整論文下載(word格式 可編輯):