《基于單片機(jī)的溫度采集及顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》11000字(論文)_第1頁
《基于單片機(jī)的溫度采集及顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》11000字(論文)_第2頁
《基于單片機(jī)的溫度采集及顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》11000字(論文)_第3頁
《基于單片機(jī)的溫度采集及顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》11000字(論文)_第4頁
《基于單片機(jī)的溫度采集及顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》11000字(論文)_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

基于單片機(jī)的溫度采集及顯示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)摘要在現(xiàn)代生活中溫度、濕度和人們的生產(chǎn)、生活有著密切的關(guān)系。所以糧食的貯藏和保護(hù)也是必須要關(guān)心的。要想保護(hù)好糧食,溫度與濕度則是先決條件。溫濕度的采集和數(shù)據(jù)傳輸伴隨著現(xiàn)代社會(huì)高新技術(shù)的迅猛發(fā)展也有著重大的突破,打破了以前的技術(shù)上的壁壘,提高了技術(shù)效率。本次設(shè)計(jì)是選擇了以STC89C52系列的單片機(jī)做為整個(gè)系統(tǒng)的主要控制單元,以DHT11數(shù)字式溫濕度傳感器做為溫度、濕度的采集單元。用NRF24L01做為無線傳輸模塊來傳輸所采集的溫濕度數(shù)值,最后通過單片機(jī)由LCD1602液晶顯示模塊將所得數(shù)據(jù)呈現(xiàn)出來,以此達(dá)到監(jiān)控系統(tǒng)的設(shè)計(jì)。關(guān)鍵詞:溫濕度;傳感器;無線傳輸;單片機(jī)目錄TOC\o"1-3"\h\u167491概述 概述1.1課題研究的意義糧食是我們的必需品是人類賴以生存的根本保證。因此糧食的安全保障是非常重要的,而溫度和濕度就是關(guān)鍵,糧食的科學(xué)貯藏是具有非常重要的戰(zhàn)略意義和經(jīng)濟(jì)意義。大多數(shù)糧庫是以人工測(cè)量溫度和濕度的方法,這不僅使得存在施工勞動(dòng)強(qiáng)度大、效率低的問題,如果是大型的糧庫則測(cè)量的溫度和濕度的作業(yè)量將是十分龐大的,人工的耗費(fèi)量也是巨大的,若不及時(shí)完成將可能造成大量糧食的邊和和浪費(fèi)。隨著生產(chǎn)技術(shù)的迅速發(fā)展,一個(gè)成本低而且有準(zhǔn)確度高的測(cè)量?jī)x器勢(shì)必能夠在行業(yè)中占得有利位置,而且基于無線傳輸方便攜帶的溫濕度測(cè)量?jī)x會(huì)取得廣大人民的親賴。新的無線通信技術(shù)不斷地發(fā)現(xiàn),現(xiàn)在生活里的人們可以享受高科技帶來的優(yōu)質(zhì)服務(wù)。尤其是應(yīng)用在民用及工業(yè)的數(shù)據(jù)采集上。隨著社會(huì)的進(jìn)步人們逐漸意識(shí)到了無線傳輸技術(shù)的重要性和帶來的便利,也突破了無線傳輸布線困難的技術(shù)壁壘,也節(jié)省了大量的人力和物力,也使得移動(dòng)設(shè)備的越做越小、占地小而且價(jià)格便宜。1.2研究的現(xiàn)狀及發(fā)展趨勢(shì)由于技術(shù)限制,傳感器并不能同時(shí)實(shí)現(xiàn)測(cè)量溫度和濕度這兩個(gè)功能,思索不得不同時(shí)使用溫度傳感器和濕度傳感器。溫度傳感器早在十九世紀(jì)就被發(fā)明出來了,最先運(yùn)用在德國(guó),它可以將溫度這個(gè)摸不著的東西轉(zhuǎn)變成為變成電信號(hào),物理學(xué)家賽貝為熱電偶傳感器做出了杰出的貢獻(xiàn)。隨著新興技術(shù)發(fā)展,半導(dǎo)體技術(shù)愈發(fā)成熟,二十世紀(jì)之后多種溫度傳感器相繼被開發(fā)出了,例如半導(dǎo)體熱電偶傳感器和相關(guān)集成溫度傳感器。還有根據(jù)不同的物理規(guī)律,在各個(gè)領(lǐng)域研發(fā)出來的傳感器,聲學(xué)里的溫度傳感器,光學(xué)里的紅外傳感器等等。得益于傳感器成熟且迅速的發(fā)展,電子溫度計(jì)在人們生產(chǎn)生活中廣泛應(yīng)用。智能化的溫度傳感器在上個(gè)世紀(jì)九十年代中期面世。它的出現(xiàn)歸功于微電子技術(shù)和模塊化自動(dòng)測(cè)溫技術(shù)的。日前,具有高效優(yōu)良性能的智能溫度傳感器已經(jīng)在國(guó)際上發(fā)行。濕度傳感器并沒有像溫度傳感器那么早被發(fā)明,等到九十年代才有相關(guān)產(chǎn)品的出現(xiàn),屬于新起行業(yè)。濕度傳感器的構(gòu)造也并不難,就是在電容或者電阻上涂覆感濕材料,感濕材料形成的感濕膜就可以采集濕度。現(xiàn)代化的農(nóng)業(yè)生產(chǎn)是需要科學(xué)技術(shù)的支撐,而糧庫的溫濕度環(huán)境保護(hù)跟是需要科學(xué)技術(shù)的大力支持,現(xiàn)代科技使得網(wǎng)絡(luò)和通信技術(shù)極速向前,互聯(lián)網(wǎng)早已在人們生活中不可或缺基于無線傳輸?shù)氖謾C(jī)更是深入人心。

所到之處隨處人們拿著手機(jī),使得人們的生活多姿多彩。1.3課題研究的內(nèi)容1、利用DHT11溫濕度傳感器實(shí)時(shí)檢測(cè)溫濕度。并將采集來的數(shù)據(jù)處理后傳送到單片機(jī)。2、通過無線通信把從單片機(jī)傳輸過來的溫濕度數(shù)據(jù)從主機(jī)的nRF24L01傳送到從機(jī)的nRF24L01接收。接收數(shù)據(jù)后將數(shù)據(jù)傳送到從機(jī)單片機(jī)。3、在12864液晶顯示屏上顯示出溫濕度,以及周圍環(huán)境為安全還是要進(jìn)行高溫報(bào)警。4、超出程序設(shè)定的范圍時(shí)蜂鳴器響進(jìn)行報(bào)警。2系統(tǒng)硬件設(shè)計(jì)近年來由于無線傳輸技術(shù)、傳感器技術(shù)的高速發(fā)展,使監(jiān)控系統(tǒng)的廣泛應(yīng)用于各種領(lǐng)域。2.1系統(tǒng)總體設(shè)計(jì)本系統(tǒng)設(shè)計(jì)是以為STC89C52單片機(jī)為核心,通過DHT11溫濕度傳感器采集溫濕度的值由NRF24L01模塊傳輸并對(duì)其進(jìn)行處理,最后顯示在1602液晶顯示上。程序?qū)懭霚貪穸鹊姆秶?,如果DHT11檢測(cè)得到的值超過了程序設(shè)定的范圍,那么程序控制蜂鳴器響報(bào)警啟動(dòng)。單片機(jī)將溫濕度數(shù)據(jù)通過兩塊NRF24L01模塊實(shí)行收發(fā)功能。其中系統(tǒng)電源為正5V供電。2.1.1發(fā)送端原理框圖發(fā)送端:發(fā)送端:由DHT11溫濕度傳感器收集到數(shù)據(jù)通過單片機(jī)和nrf24l01無線傳輸模塊執(zhí)行傳輸后由LCD1602顯示出數(shù)值在發(fā)送到接收端。MCS-51MCS-51電源模塊nRF2401無線模塊LCD1602顯示模塊DHT11溫濕度傳感器圖2-1發(fā)送端系統(tǒng)方框圖2.1.2接收端原理框圖接收端:接收端:通過nrf24l01接受數(shù)據(jù)再經(jīng)過單片機(jī)和按鍵電路以及聲光報(bào)警電路的監(jiān)測(cè)最后顯示在lcd1602顯示模塊上。MCS-51MCS-51LCD1602顯示模塊nRF2401無線模塊按鍵電路聲光報(bào)警電路圖2-2接收端系統(tǒng)方框圖2.2方案論證2.2.1主控芯片方案方案一:采用STC89C52單片機(jī)是低功耗、高性能CMOS8位微控制器,具有8K字節(jié)系統(tǒng)可編程\t"/item/STC89C52/_blank"Flash存儲(chǔ)器在單芯片上,擁有靈巧的8位\t"/item/STC89C52/_blank"CPU?和在系統(tǒng)可\t"/item/STC89C52/_blank"編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。方案二:采用MSP430F149系列單片機(jī)作為主控芯片。其焊接引腳是極其細(xì)小,很容易折斷,制版成本高且沒有現(xiàn)成的儀器,耽誤制作時(shí)間。

方案三:采用STC12C5A60S2增強(qiáng)型51單片機(jī)作為主控芯片。該功能強(qiáng)大,但是難掌握,操作復(fù)雜。。

綜合考慮對(duì)于單片機(jī)的掌握熟練和性價(jià)比選擇方案一,即使采用STC89C52來控制整個(gè)系統(tǒng)。2.2.2無線傳輸模塊方案

方案一:采用NRF24L01模塊,其協(xié)議簡(jiǎn)單,容易操作,體積小內(nèi)部電路簡(jiǎn)單,外部接線也比較簡(jiǎn)單,雖然體積小但是處理數(shù)據(jù)能力強(qiáng),能夠及時(shí)完成發(fā)送和接受,理論傳輸距離200米,實(shí)際應(yīng)用中還不止。方案二:采用NRF905是由頻率合成器、功率合成器、晶體振蕩器和調(diào)制器組成。它有很少的外圍元件,不需要外部聲表面振蕩器。但由于該系統(tǒng)應(yīng)用于農(nóng)牧業(yè),應(yīng)用環(huán)境非常龐大,不能滿足設(shè)計(jì)的需要。依據(jù)設(shè)計(jì)的要求以及操作可行性,選擇方案一,采用NRF24L01作為本系統(tǒng)的通信模塊。2.2.3溫濕度傳感器模塊方案方案一:采用HMP45D溫濕度傳感器,溫度為鉑電阻溫度傳感器,濕度為濕敏電容濕度傳感器。濕敏電容器不應(yīng)長(zhǎng)期暴露在含有化學(xué)物質(zhì)的氣體中,否則會(huì)改變其性能。需要應(yīng)定期拆下并清潔濾紙或更換新的濾紙。所以這是不合適的。方案二:采用DHT11溫濕度傳感器。能夠與多款單片機(jī)連接。該產(chǎn)品具有很多優(yōu)點(diǎn),包括響應(yīng)快、體積超小、功耗超低。在許多場(chǎng)合都受用,特別是條件苛刻的應(yīng)用場(chǎng)合。考慮到成本以及操作性,選擇DHT11檢測(cè)周圍環(huán)境的溫濕度。2.2.4顯示模塊方案

方案一:采用LED數(shù)碼顯示管。優(yōu)點(diǎn)是成本低,但點(diǎn)陣顯示的精度不夠,不能顯示字符。方案二:LCD1602用于顯示信息。是一種通用字符液晶顯示模塊,可以顯示字符和數(shù)字,價(jià)格便宜,易于控制。結(jié)合實(shí)際考慮到成本、精度、美觀等方面的因素,選擇較為符合的方案二

3硬件電路設(shè)計(jì)3.1STC8952單片機(jī)的簡(jiǎn)介STC89C51RC系列單片機(jī)是基于Intel標(biāo)準(zhǔn)的8052,指令代碼完全兼容傳統(tǒng)的8051系列單片機(jī),12時(shí)鐘/機(jī)器周期和6時(shí)鐘/機(jī)器周期可任意選擇,最新的D版本內(nèi)集成MAX810專用復(fù)位電路。使用高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。3.1.1STC8952引腳說明VCC(40引腳):電源電壓

VSS(20引腳):接地P3.0:RXD,串行通信輸入。P3.1:TXD,串行通信輸出。P3.2:INT0,外部中斷0輸入。P3.3:INT1,外部中斷1輸入。P3.4:T0,計(jì)時(shí)計(jì)數(shù)器0輸入。P3.5:T1,計(jì)時(shí)計(jì)數(shù)器1輸入。P3.6:WR,寫入信號(hào)。P3.7:RD,讀取信號(hào)。RST(9引腳):復(fù)位輸入。圖3-1STC89C52的引腳圖3.1.2STC8952特性參數(shù)主要特性:工作電壓:5.5V~3.3V(5V單片機(jī))/3.8V~2.0V(3V單片機(jī))

2、工作頻率范圍:0~40MHz,相當(dāng)于普通8051的0~80MHz,實(shí)際工作頻率可達(dá)48MHz

3、通用I/O口(32個(gè)),復(fù)位后為:P1/P2/P3是準(zhǔn)雙向口/弱上拉,P0口是漏極開路輸出,作為總線擴(kuò)展用時(shí),不用加上拉電阻。4、片上集成512字節(jié)RAM

5、ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程),無需專用編程器,無需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數(shù)秒即可完成一片。

6、共3個(gè)16位定時(shí)器/計(jì)數(shù)器。即定時(shí)器T0、T1、T2

7、外部中斷4路,下降沿中斷或低電平觸發(fā)電路,PowerDown模式可由外部中斷低電平觸發(fā)中斷方式喚醒。

3.1.3單片機(jī)的最小系統(tǒng)單片機(jī)的最小系統(tǒng)就是指單片機(jī)能正常工作最簡(jiǎn)單的電路。包括:電源、單片機(jī)、時(shí)鐘電路和復(fù)位電路。圖3-2單片機(jī)的最小系統(tǒng)3.2DHT11傳感器設(shè)計(jì)溫濕度模塊DH11溫濕傳感器伴隨著科技的不斷發(fā)展,而許多電器設(shè)備很多都離不開對(duì)溫度、濕度等環(huán)境因素的要求。因此,溫度、濕度傳感器用途越來越廣泛。新一代的數(shù)字傳感器不再需要外置的AD轉(zhuǎn)換模塊。目前常用的微機(jī)與外設(shè)之間進(jìn)行數(shù)據(jù)傳輸?shù)拇锌偩€主要有I2C總線、SPI總線和SCI總線。3.2.1DHT11溫濕度傳感器簡(jiǎn)介:DHT11數(shù)字溫濕度傳感器是一種具有校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器。傳感器采用特殊的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有高可靠性和優(yōu)良的長(zhǎng)期穩(wěn)定性。DHT11傳感器由電阻式濕度傳感器和NTC溫度傳感器組成,并與高性能8位MCU相連。因此,該產(chǎn)品具有質(zhì)量?jī)?yōu)良、響應(yīng)速度超快、抗干擾能力強(qiáng)、性價(jià)比高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器在非常精確的濕度校準(zhǔn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式存儲(chǔ)在OTP存儲(chǔ)器中,在傳感器內(nèi)部的信號(hào)處理過程中調(diào)用。采用單線串行接口,使系統(tǒng)集成簡(jiǎn)單快捷,具有體積小、功耗極低的特點(diǎn)。信號(hào)傳輸距離可達(dá)20m以上。當(dāng)連接線長(zhǎng)度小于20m時(shí),應(yīng)采用5KΩ當(dāng)上拉電阻大于20m時(shí),應(yīng)根據(jù)情況選用合適的上拉電阻,使其成為各種應(yīng)用甚至最苛刻應(yīng)用的最佳選擇。產(chǎn)品為4針單排包裝。連接方便,可根據(jù)用戶需要提供特殊的包裝形式。應(yīng)用領(lǐng)域:暖通空調(diào)、檢測(cè)儀器、汽車、數(shù)據(jù)記錄儀、日用消費(fèi)品、自動(dòng)控制、氣象站、家用電器、濕度調(diào)節(jié)器、醫(yī)療、除濕機(jī)。圖2-5DHT11外形圖3.2.2引腳說明RST(9引腳):復(fù)位輸入。高電平。XTAL1(19引腳):振蕩器反相放大器和內(nèi)部時(shí)鐘發(fā)生電路的輸入端。3.2.3參數(shù)特性1、不僅能夠檢測(cè)相對(duì)濕度和而且能夠?qū)囟冗M(jìn)行測(cè)量,這是因?yàn)槠鋬?nèi)部一體化結(jié)構(gòu)方式,節(jié)省空間。2、可以直接進(jìn)行數(shù)字信號(hào)的輸出,避免用戶對(duì)電信號(hào)的苦惱,解除信號(hào)預(yù)處理帶來的負(fù)擔(dān)。3、極大程度的為用戶控制器節(jié)省I/O口資源,內(nèi)部結(jié)構(gòu)簡(jiǎn)單,而且不再需要多余的電器元件。4、穩(wěn)定性好,超低功耗。5、體積面積小。6、各個(gè)型號(hào)的管腳都可以互換。降低錯(cuò)誤率7、適用范圍很廣,在食品、藥品、工控等各個(gè)行業(yè)均可以用到。3.3顯示電路設(shè)計(jì)3.3.11602液晶1602液晶是用來顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊,它是由若干個(gè)5乘以7或者5乘以11點(diǎn)陣字符位組成,特點(diǎn)是:零輻射、低功耗、散熱小、體積小、圖像還原精確、字符顯示銳利等。同時(shí)還具有背光和字符對(duì)比度調(diào)節(jié)功能。LCD1602液晶顯示模塊可以只用D4-D7作為四位數(shù)據(jù)分兩次傳送。這樣的話,可以節(jié)省MCU的I/O口資源。lcd1602可以顯示2行16個(gè)字符,有8為數(shù)據(jù)總線D0-D7,和RS、R/W、EN三個(gè)控制端口,工作電壓為5V,并且?guī)в凶址麑?duì)比度調(diào)節(jié)和背光軟件。1602液晶顯示模塊的各種操作包括:讀寫、光標(biāo)和屏幕操作都是通過指令編程來實(shí)現(xiàn)的。3.3.2技術(shù)參數(shù)1602LCD主要技術(shù)參數(shù):顯示容量:16×2個(gè)字符;工作電流:2.0mA(5.0V);模塊最佳工作電壓:5.0V;有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM;字符尺寸:2.95×4.35(W×H)mm。+5V電壓,2、引腳功能說明表3-1引腳說明表引腳符號(hào)說明引腳符號(hào)說明1VSS電源地9D2數(shù)據(jù)2VDD電源正極10D3數(shù)據(jù)3VL液晶顯示偏壓11D4數(shù)據(jù)4RS數(shù)據(jù)/命令選擇12D5數(shù)據(jù)5R/W讀/寫選擇13D6數(shù)據(jù)6E使能信號(hào)14D7數(shù)據(jù)7D0數(shù)據(jù)15BLA背光源正極8D1數(shù)據(jù)16BLK背光源負(fù)極第1腳:VSS為地電源。第2腳:VDD接5V正電源。第3腳:RS為寄存器選擇第15腳:背光源正極。第16腳:背光源負(fù)極。圖3-3顯示電路3.4報(bào)警電路設(shè)計(jì)報(bào)警電路結(jié)構(gòu)是由三極管和蜂鳴器組成的。是為了更加完善系統(tǒng)的功能。圖3-4蜂鳴器報(bào)警電路按鍵電路采用三個(gè)獨(dú)立按鍵實(shí)現(xiàn)對(duì)環(huán)境溫度、濕度參數(shù)閾值設(shè)定,按鍵S1為設(shè)置按鍵、S2為操作數(shù)值參數(shù)加上升功能,S3為數(shù)值參數(shù)操作下降功能,S2和S3的使用條件是,系統(tǒng)需要處于數(shù)值調(diào)整界面下。圖3-8按鍵控制電路3.5無線收發(fā)模塊本系統(tǒng)利用該模塊對(duì)采集來的溫濕度進(jìn)行傳輸,分為兩個(gè)部分,主機(jī)上的該模塊發(fā)送信息,在從機(jī)上接受最后在顯示屏上顯示溫濕度。3.5.1nRF24L01概述nRF24L01是擁有著自己的一套協(xié)議,主要是由20個(gè)引腳組成的數(shù)字射頻芯片,有內(nèi)部和外部之分。其內(nèi)部有若干寄存器,外部留有spi接口,外部單片機(jī)通過spi接口配置此芯片內(nèi)部的寄存器。內(nèi)部寄存器大概分為控制寄存器和數(shù)據(jù)寄存器。我們可以利用用單片機(jī)把它配置為接收模式或發(fā)送模式,還可以配置頻道、地址、每次發(fā)送的字節(jié)數(shù)、是否帶CRC校驗(yàn)、功率等。配置成發(fā)送模式以后,用單片機(jī)把要發(fā)送的數(shù)據(jù)寫進(jìn)去,它就會(huì)自動(dòng)把數(shù)據(jù)發(fā)出去;配置成接收模式以后,單片機(jī)通過觀察它的IRQ引腳,就可以知道是否接收到了數(shù)據(jù),IRQ為低電平,說明接收到了數(shù)據(jù),單片機(jī)可以通過SPI口把接收到數(shù)據(jù)取出來。無論是發(fā)送信號(hào)還是接受信號(hào)的過程中工作電流都非常小。1GND2VCC3CE4CSN5SCK6MOSI7MISO8IRQ圖3-5nRF24L01引腳模塊3.5.2nRF24L01引腳介紹CE:使能發(fā)射或接收;

CSN,SCK,MOSI,MISO:SPI:微處理器可通過此引腳設(shè)置模塊:

IRQ:中斷標(biāo)志位;

VDD:電源輸入端;VSS:電源地;

XC2,XC1:晶體振蕩器引腳;

ANT1,ANT2:天線接口;

圖3-6nRF24L01引腳封裝3.5.3nRF24L01工作模式表3-1nRF24L01各工作模式模式上電接收芯片使能寄存器狀態(tài)接收模式111-發(fā)送模式101數(shù)據(jù)在TXFIFO寄存器中待機(jī)模式II101-0TXFIFO為空待機(jī)模式I1-1無數(shù)據(jù)傳輸?shù)綦娔J?-0-待機(jī)模式1:該模式用于降低芯片損耗,但是雖然為待機(jī)狀態(tài),但是晶體振器依然在工作;

待機(jī)模式下,無線模塊的損耗最小這就是它功耗低的原因,當(dāng)然此模塊也不工作,但原先配置寄存器的值不會(huì)消失,依舊存有。4系統(tǒng)軟件設(shè)計(jì)4.1軟件開發(fā)平臺(tái)及開發(fā)語言介紹4.1.1Keil開發(fā)平臺(tái)在單片機(jī)的開發(fā)設(shè)計(jì)中除了硬件還有軟件,Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境(μVision)將這些部分組合在一起。4.1.2C語言介紹C語言是國(guó)際上廣泛流行的計(jì)算機(jī)高級(jí)語言。盡管C語言提供了許多低級(jí)處理的\t"/item/c%E8%AF%AD%E8%A8%80/_blank"功能,但仍然保持著跨平臺(tái)的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫出的C語言程序可在包括類似\t"/item/c%E8%AF%AD%E8%A8%80/_blank"嵌入式處理器以及超級(jí)計(jì)算機(jī)平臺(tái)上進(jìn)行編譯,進(jìn)行程序設(shè)計(jì)。C語言既保持了BCPL和B語言的優(yōu)點(diǎn),又克服了他們的缺點(diǎn),開發(fā)C語言的目的在于盡可能降低用它縮寫的軟件對(duì)硬件品臺(tái)的依賴程度,使之局域可移植性。C語言的優(yōu)點(diǎn)有:C語言具備高級(jí)語言和低級(jí)語言的特征;含有多種數(shù)據(jù)類型;運(yùn)算符豐富;有while、for等多種控制語句可以嵌套使用;C語言適用范圍大4.2系統(tǒng)主程序設(shè)計(jì)本系統(tǒng)具體工作過程是由:發(fā)送端DHT11傳感進(jìn)行溫濕度采集并測(cè)量,將測(cè)量得到的數(shù)據(jù)送入STC89C52單片機(jī)進(jìn)行處理,然后通過無線模塊nRF24L01將數(shù)據(jù)遠(yuǎn)傳到接收端,同時(shí)控制液晶1602顯示即時(shí)的溫度數(shù)值,并與程序中設(shè)定的報(bào)警溫濕度上、下限值進(jìn)行比較。當(dāng)檢測(cè)到溫濕度界于上下限溫度范圍之間時(shí),蜂鳴器不響,液晶正常顯示實(shí)時(shí)溫濕度,如果低于設(shè)定的下限值,蜂鳴器發(fā)出報(bào)警,同時(shí)藍(lán)色LED點(diǎn)亮。該系統(tǒng)主程序流程圖如圖4-1所示圖4-1系統(tǒng)主程序流程圖4.3無線傳輸模塊設(shè)計(jì)在發(fā)射數(shù)據(jù)時(shí),按照時(shí)序把要發(fā)送的數(shù)據(jù)和接收機(jī)的地址傳送給無線模塊,然后判斷MCU是否將TRX_CE引腳置高,如果是,那么nRF24L01就進(jìn)入ShockBurstTX模式,此時(shí)便可以發(fā)送數(shù)據(jù)了。當(dāng)數(shù)據(jù)發(fā)送完畢時(shí),DR引腳被置高,nRF24L01停止發(fā)送數(shù)據(jù),TRX_CE引腳也隨之置低讓nRF24L01進(jìn)入空閑模式。最后發(fā)射成功時(shí),若CE為低則nRF24L01進(jìn)入空閑模式1;若發(fā)送堆棧中有數(shù)據(jù)且CE為高,則進(jìn)入下一次發(fā)射;若發(fā)送堆棧中無數(shù)據(jù)且CE為高,則進(jìn)入空閑模式2。在接收數(shù)據(jù)時(shí),當(dāng)設(shè)置TRX_CE為高,TX_EN為低時(shí),nRF24L01處于ShockBurstRX模式,此時(shí)便可以可以接收數(shù)據(jù)了。等待一段時(shí)間后,nRF24L01將不斷監(jiān)測(cè),等待接收數(shù)據(jù),然后等待載波檢測(cè)引腳CD被置高,當(dāng)接收到地址數(shù)據(jù)后AM引腳被置高,隨之無線接收模塊開始接收數(shù)據(jù),并進(jìn)行CRC校驗(yàn),等到接收完真確的數(shù)據(jù)包后,nRF24L01的各引腳會(huì)做出相應(yīng)的變化,將DR引腳置高,TRX_CE置低,然后進(jìn)入空閑模式,而無線接收部分的單片機(jī)則通過SPI接口將接收到的數(shù)據(jù)移入單片機(jī)內(nèi)部,當(dāng)單片機(jī)將本次接收到的數(shù)據(jù)存入內(nèi)部后就再次進(jìn)入接收模式。圖4-1SPI讀操作圖4-2SPI寫操作圖4-3nRF24L01無線傳輸模塊操作圖4.41602液晶顯示模塊設(shè)計(jì)圖4-61602液晶顯示模塊程序流程圖4.5DHT11傳感器模塊設(shè)計(jì)圖4-5DHT11傳感器模塊程序流程圖4.6溫濕度報(bào)警模塊設(shè)計(jì)溫濕度報(bào)警限制的調(diào)整主要是通過三個(gè)按鍵來進(jìn)行調(diào)整,一個(gè)按鍵為上下限確定按鍵,另外兩個(gè)按鍵分別為加按鍵和減按鍵。開始開始是否調(diào)整報(bào)警限值否溫度下限調(diào)整是檢測(cè)溫濕度溫度下限是否調(diào)整溫度上限調(diào)整溫度上限是否調(diào)整濕度下限是否調(diào)整濕度下限調(diào)整濕度上限是否調(diào)整濕度上限調(diào)整否否否否是是是是圖4-7溫濕度報(bào)警限值調(diào)整流程圖5仿真與調(diào)試5.1仿真軟件與仿真結(jié)果5.1.1Proteus仿真軟件Proteus軟件是電路分析與實(shí)物仿真軟件。運(yùn)行于Windows操作系統(tǒng)上,可以仿真、分析各種模擬器件和集成電路。比較好的仿真單片機(jī)及外圍器件的工具。迄今為止是世界上唯一將電路仿真軟件、PCB設(shè)計(jì)軟件和虛擬模型仿真軟件三合一的設(shè)計(jì)平臺(tái),其處理器模型支持8051、HC11、等,2010年增加Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。Proteus仿真軟件的特點(diǎn)是:能實(shí)現(xiàn)單片機(jī)仿真和spice電路仿真結(jié)合。支持第三方軟件編譯和調(diào)試環(huán)境,如kill等軟件提供軟件調(diào)試功能。。具有強(qiáng)大的原理圖繪制功能。5.1.2仿真結(jié)果由于無線傳輸模塊nrf24l01在模擬仿真中無法實(shí)現(xiàn)所以采用雙機(jī)通信原理實(shí)現(xiàn)部分仿真。圖5-1硬件仿真圖5.2系統(tǒng)功能測(cè)試為了保證無線通信信號(hào)的可靠傳輸。使用時(shí),先打開接收主機(jī)電源,再打開測(cè)量子機(jī)電源;依次打開兩塊電路板電源后,3秒內(nèi)將看到測(cè)量子機(jī)的溫度和濕度信息,通過無線通信方式遠(yuǎn)傳到接收主機(jī)液晶顯示屏;如下圖所示。圖5-2接收端正面圖5-2測(cè)量端正面接收端可以由用戶自行設(shè)置好溫度和濕度報(bào)警的上限和下限報(bào)警閾值,一旦接收到的溫度處于非閾值范圍內(nèi),接收端立即產(chǎn)生對(duì)應(yīng)類型的聲光報(bào)警信號(hào)。用戶可以實(shí)時(shí)掌握測(cè)量端的溫度和濕度測(cè)量數(shù)據(jù),便于實(shí)現(xiàn)遠(yuǎn)程的溫度和濕度信息監(jiān)控。本次課程設(shè)計(jì)由測(cè)量端和接收端構(gòu)成,其溫度范圍:上限30度-下限10度;濕度范圍:上限90%-下限20%報(bào)警方式:超過溫度上限時(shí)D1燈亮,蜂鳴器響 低于溫度下限時(shí)D2燈亮,蜂鳴器響 超過濕度上限時(shí)D3燈亮,蜂鳴器響;低于濕度下限時(shí)D4燈亮;蜂鳴器響; 正常溫濕度范圍值時(shí),D1D2D3D4燈不亮我們對(duì)著測(cè)量端的DHT11傳感器哈氣時(shí),接收端的溫濕度就會(huì)有所變換。當(dāng)濕度超過設(shè)點(diǎn)范圍時(shí),D3燈亮并且蜂鳴器響起,如下圖所示。圖5-3濕度超限當(dāng)溫度、濕度都沒有超出設(shè)點(diǎn)范圍時(shí),燈不亮并且蜂鳴器也不響起,如下圖所示。圖5-4溫濕度未超限5.3調(diào)試5.3.1硬件調(diào)試本次設(shè)計(jì)中,主控模塊是非常重要的部分,它不僅是本次設(shè)計(jì)的核心,在本次硬件調(diào)試中也遇到了問題,接上電源的時(shí)候,液晶顯示亮了,但沒有任何顯示,于是做了如下的工作:1.首先應(yīng)當(dāng)檢查是否接通電源,使用萬用表檢測(cè)各個(gè)芯片是否正常通點(diǎn)。2.測(cè)出電位器出現(xiàn)漏焊,關(guān)閉電源重新焊接。5.3.2軟件調(diào)試當(dāng)硬件制作完成后,軟件調(diào)試依據(jù)模塊的流程圖確定好軟件的流程,然后開始寫程序中的一些子程序。調(diào)試中應(yīng)當(dāng)分步合并,不可一下將全部程序合并在一起調(diào)試。結(jié)論本文是以STC89C52單片機(jī)為核心單元的無線溫濕度監(jiān)控系統(tǒng)設(shè)計(jì),用DHT11溫濕度傳感器做為數(shù)據(jù)信號(hào)的采集,然后通過NRF24L01模塊的無線傳輸傳送給單片機(jī)從而實(shí)現(xiàn)測(cè)量并且監(jiān)控溫濕度的作用。系統(tǒng)設(shè)計(jì)過程中分為幾個(gè)方面進(jìn)行。關(guān)于系統(tǒng)方案設(shè)計(jì)與選擇方面:根據(jù)各項(xiàng)功能的實(shí)現(xiàn)方法以及硬件連接方式,將整個(gè)系統(tǒng)劃分為數(shù)據(jù)采集模塊、單片機(jī)模塊、無線通信模塊、液晶顯示模塊和電源模塊系統(tǒng)以硬件軟件兩個(gè)部分組成,硬件的設(shè)計(jì)主要包括了單片機(jī)的控制單元、溫濕度采集單元、無線傳輸單元、顯示單元等部分組成。軟件部分的設(shè)計(jì),分別用Proteus、Keil等軟件對(duì)DHT11傳感器模塊、NRF24L01無線通信模塊以及1602液晶顯示模塊等程序的設(shè)計(jì)。本設(shè)計(jì)主要的產(chǎn)物是以單片機(jī)為主的實(shí)物,講各個(gè)硬件模塊完好的連接,在單片機(jī)中燒入程序,然后再運(yùn)行程序,在實(shí)物測(cè)試中發(fā)現(xiàn)硬件電路與軟件的不協(xié)調(diào)之處,并修正。驗(yàn)證各個(gè)模塊功能的完整性,達(dá)到預(yù)期的效果,最后完成整個(gè)系統(tǒng)的調(diào)試。參考文獻(xiàn)[1]徐新艷.單片機(jī)原理、應(yīng)用與實(shí)踐[M].北京:高等教育出版社,2005.[2]盧允偉.溫濕度檢測(cè)無線傳感網(wǎng)的節(jié)能數(shù)據(jù)收集技術(shù)[D];浙江工業(yè)大學(xué);2012[3]林澤.黃際巍,張書經(jīng).分布式無線糧情監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)與應(yīng)用[J].電子工程師,2013,34(07):71-73.[4]尹海宏.陳雷.基于單片機(jī)的數(shù)據(jù)采集系統(tǒng)[J].信息技術(shù)報(bào).2010,05(3):36-38.[5]張連華.單片機(jī)系統(tǒng)設(shè)計(jì)方法[J].科學(xué)之友,2010,07(5):38-42.[6]侯俊才,胡耀華.數(shù)字式糧倉溫濕度監(jiān)測(cè)系統(tǒng)設(shè)計(jì)[J].農(nóng)機(jī)化研究,2012(9):103-106.[7]田素貞,屈芳升.基于單片機(jī)的糧倉溫濕度檢測(cè)系統(tǒng)的設(shè)計(jì)與研究[J].河南科學(xué),2012,30(1):90-93[8]王冬霞,張玉輝,洪耀球.溫濕度傳感器SHT15及其在嵌入式系統(tǒng)中的應(yīng)用[J].電子設(shè)計(jì)工程,2011,19(2):40-43.[9]向紅軍,雷彬.基于SHT15型智能傳感器的彈藥庫溫/濕度監(jiān)控系統(tǒng)的設(shè)計(jì)[J].國(guó)外電子元器件,2012(1):64-66.[10]楊海.基于AT89C52單片機(jī)的藥品庫房溫濕度控制系統(tǒng)設(shè)計(jì)[J].機(jī)械與電子,2010(7):82-83.[11]肖坤.無線糧倉溫度監(jiān)控系統(tǒng)的設(shè)計(jì)[M].合肥:合肥工業(yè)大學(xué),2008[12]閆金瑞,胡原凱,張立輝.糧倉溫濕度無線監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)[J].技術(shù)市場(chǎng),2017(3).[13]盧超.糧倉無線溫濕度監(jiān)控系統(tǒng)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2011(09):161-164.[14]劉雪梅,李建勇,宋孟華.基于無線通信的糧倉溫濕度監(jiān)測(cè)系統(tǒng)設(shè)計(jì)[J].機(jī)電信息,2017(27).[15][16]徐敏;諸葛振榮等.基于1-Wire技術(shù)的數(shù)字溫度儀[J].機(jī)電工程.2007(04-:20-21[17]秦珀石,李琳,王生耀等.測(cè)控溫度數(shù)據(jù)采集管理軟件設(shè)計(jì)[J].電子質(zhì).2005(09):30-32[18]王何宇,朱莉.基于nRF905的溫濕度無線數(shù)據(jù)傳輸系統(tǒng)[J].微處理器與可編程器件應(yīng)用.2011,25(05):78-81[19]倪天龍.單總線傳感器DHT11在溫濕度測(cè)控中的應(yīng)用[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2010,(5):60-62.[20]英慶,王代華,張志杰.基于nRF24L0l的無線數(shù)據(jù)傳輸系統(tǒng)[J].現(xiàn)代電子技術(shù)2008.附錄一:附錄二:/*******************************************發(fā)送端程序?qū)崿F(xiàn)功能:顯示溫濕度。濕度20-90溫度0-50按鍵K1、K2、K3設(shè)置上下限 初始濕度:上限60%下限20% 初始溫度:上限30度下限10度 低于溫度下限時(shí)D2燈亮,蜂鳴器響 超過濕度上限時(shí)D3燈亮,蜂鳴器響;低于濕度下限時(shí)D4燈亮;蜂鳴器響; *******************************************/#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitDQ=P3^7; sbitCE=P1^0;//發(fā)送或接受模式選擇端sbitCSN=P1^1;//SPI片選信號(hào)sbitSCK=P1^2;//SPI時(shí)鐘線sbitMOSI=P1^3;//數(shù)據(jù)輸出端sbitMISO=P1^4;//數(shù)據(jù)接收端sbitIRQ=P1^5;//可屏蔽中斷腳sbitlcden=P2^5; sbitlcdrs=P2^7; sbitlcdrw=P2^6; uintwendu;uintshidu;//*********************************************NRF24L01*************************************#defineTX_ADR_WIDTH5 //5uintsTXaddresswidth#defineRX_ADR_WIDTH5 //5uintsRXaddresswidth//***************************************NRF24L01寄存器指令*******************************************************#defineREAD_REG0x00 //讀寄存器指令#defineWRITE_REG0x20 //寫寄存器指令#defineRD_RX_PLOAD0x61 //讀取接收數(shù)據(jù)指令#defineWR_TX_PLOAD0xA0 //寫待發(fā)數(shù)據(jù)指令#defineFLUSH_TX0xE1 //沖洗發(fā)送FIFO指令#defineNOP0xFF //保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#defineEN_RXADDR0x02//可用信道設(shè)置#defineSETUP_AW0x03//收發(fā)地址寬度設(shè)置#defineSETUP_RETR0x04//自動(dòng)重發(fā)功能設(shè)置#defineRF_CH0x05//工作頻率設(shè)置#defineSTATUS0x07//狀態(tài)寄存器#defineOBSERVE_TX0x08//發(fā)送監(jiān)測(cè)功能#defineCD0x09//地址檢測(cè)#defineRX_ADDR_P00x0A//頻道0接收數(shù)據(jù)地址#defineRX_ADDR_P10x0B//頻道1接收數(shù)據(jù)地址#defineRX_ADDR_P50x0F//頻道5接收數(shù)據(jù)地址#defineTX_ADDR0x10//發(fā)送地址寄存器voidDelay(uints);voidinerDelay_us(ucharn);voidinit_NRF24L01(void);ucharSPI_RW(ucharbyte);ucharSPI_Read(ucharreg);voidSetRX_Mode(void);ucharSPI_RW_Reg(ucharreg,ucharvalue);ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);ucharnRF24L01_RxPacket(uchar*rx_buf);voidnRF24L01_TxPacket(uchar*tx_buf);//******************************************************************************************uchar bdatasta;//狀態(tài)標(biāo)志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;/*************************延時(shí)函數(shù)********************/voidinerDelay_us(ucharn){ for(;n>0;n--) _nop_();}/**********NRF24L01初始化****************************/voidinit_NRF24L01(void){inerDelay_us(100); CE=0;//chipenable CSN=1;//Spidisable SCK=0;// SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); SPI_RW_Reg(WRITE_REG+RF_CH,0); SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07); }/****************************************************************************************************/*函數(shù):uintSPI_RW(uintuchar)/****************************************************************************************************/ucharSPI_RW(ucharbyte){ ucharbit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++)//output8-bit { MOSI=(byte&0x80);//output'uchar',MSBtoMOSI byte=(byte<<1);//shiftnextbitintoMSB.. SCK=1;//SetSCKhigh.. byte|=MISO; //capturecurrentMISObit SCK=0; //..thensetSCKlowagain }return(byte); //returnreaduchar}/****************************************************************************************************/*函數(shù):ucharSPI_Read(ucharreg)/*功能:NRF24L01的SPI時(shí)序/****************************************************************************************************/ucharSPI_Read(ucharreg){ ucharreg_val; CSN=0;//CSNlow,initializeSPIcommunication... SPI_RW(reg);//Selectregistertoreadfrom.. reg_val=SPI_RW(0);//..thenreadregistervalue CSN=1;//CSNhigh,terminateSPIcommunication return(reg_val);//returnregistervalue}/****************************************************************************************************/ucharSPI_RW_Reg(ucharreg,ucharvalue){ ucharstatus; CSN=0;//CSNlow,initSPItransaction status=SPI_RW(reg);//selectregister SPI_RW(value);//..andwritevaluetoit.. CSN=1;//CSNhighagain return(status);//returnnRF24L01statusuchar}/*********************************************************************************************************/*函數(shù):uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)/*********************************************************************************************************/ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars){ ucharstatus,uchar_ctr; CSN=0;//SPI使能 status=SPI_RW(reg); for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)// SPI_RW(*pBuf++); CSN=1;//關(guān)閉SPI return(status);//}/***********************************************************************************************************/*函數(shù):voidnRF24L01_TxPacket(unsignedchar*tx_buf)/*功能:發(fā)送tx_buf中數(shù)據(jù)/**********************************************************************************************************/voidnRF24L01_TxPacket(uchar*tx_buf){ CE=0; //StandByI模式 SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG+CONFIG,0x0e); CE=1; //置高CE,激發(fā)數(shù)據(jù)發(fā)送 inerDelay_us(20); }/********************延時(shí)函數(shù),延時(shí)一毫秒************************/voiddelay1ms(uintz){ uintx,y; for(x=z;x>0;x--) for(y=114;y>0;y--);}voidwrite_com(ucharcom)//1602液晶寫命令函數(shù){ lcdrs=0; P0=com; delay1ms(5); lcden=1; delay1ms(5); lcden=0;}voidwrite_data(uchardate)//1602液晶寫數(shù)據(jù)函數(shù){ lcdrs=1; P0=date; delay1ms(5); lcden=1; delay1ms(5); lcden=0;}voidwrite_str(uchar*str)//1602液晶寫字符串函數(shù){while(*str!='\0')//未結(jié)束{write_data(*str++);delay1ms(1);}}/***************************1602液晶初始化命令******************************/voidinit_1602(){// ucharnum; uchartable[16]={0}; uchartable1[16]={0}; write_com(0x80);lcdrw=0;//先將RW拉低 lcden=0;//再把EN拉低 write_com(0x38);//顯示模式設(shè)置 write_com(0x0c); write_com(0x06); write_com(0x01);//清除屏幕 write_com(0x80);}/**************************DTH11驅(qū)動(dòng)程序部分*************************/bitinit_DTH11(){ bitflag; ucharnum; DQ=0; delay1ms(19); //>18ms DQ=1; for(num=0;num<10;num++); //20-40us 34.7us for(num=0;num<12;num++); flag=DQ; for(num=0;num<11;num++); //DTH響應(yīng)80us for(num=0;num<24;num++); //DTH拉高80us returnflag;}ucharDTH11_RD_CHAR(){ ucharbyte=0; ucharnum; ucharnum1; while(DQ==1); for(num1=0;num1<8;num1++) { while(DQ==0); byte<<=1; //高位在前 for(num=0;DQ==1;num++); if(num<10) byte|=0x00; else byte|=0x01; } returnbyte;}voidDTH11_DUSHU(){ ucharnum; if(init_DTH11()==0) { shidu=DTH11_RD_CHAR(); DTH11_RD_CHAR(); wendu=DTH11_RD_CHAR()-3;//比正常值高3度左右 DTH11_RD_CHAR(); }}/***************************主函數(shù)**************************/voidmain(){ ucharTxBuf[20]={0}; init_NRF24L01(); wendu=0;//溫度初始數(shù)值0 shidu=0;//濕度初始數(shù)值0 delay1ms(1000); //DTH11開始1s有錯(cuò)誤輸出 init_1602();//1602液晶初始化函數(shù) while(1) { DTH11_DUSHU();//調(diào)用讀取溫濕度數(shù)值函數(shù) write_com(0x80);write_str("SendingData");write_com(0x80+0x40);write_str("TEM"); write_data(':'); write_data(wendu%10+48);write_data(0xdf); write_data('C');write_str("HUM");write_data(':'); write_data(shidu/10%10+48); write_data(shidu%10+48); write_data('%'); TxBuf[1]=wendu/256; //將高八位裝入 TxBuf[2]=wendu%256; //裝入低八位 TxBuf[3]=shidu/256; //將高八位裝入 TxBuf[4]=shidu%256; //裝入低八位 TxBuf[2]=0x00;//緩存器2內(nèi)容清零 TxBuf[3]=0x00;//緩存器1內(nèi)容清零 TxBuf[4]=0x00;//緩存器2內(nèi)容清零 delay1ms(500); sta=SPI_Read(STATUS); SPI_RW_Reg(WRITE_REG+STATUS,sta); CSN=0; SPI_RW(FLUSH_TX);//清空發(fā)送緩沖 CSN=1; }}/***********************************************************接收端程序?qū)崿F(xiàn)功能:顯示溫濕度。濕度20-90溫度0-50按鍵K1、K2、K3設(shè)置上下限 初始濕度:上限60%下限20% 初始溫度:上限30度下限10度 低于溫度下限時(shí)D2燈亮,蜂鳴器響 超過濕度上限時(shí)D3燈亮,蜂鳴器響;低于濕度下限時(shí)D4燈亮;蜂鳴器響; ***********************************************************/ #include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitCE=P1^0;//發(fā)送或接受模式選擇端sbitCSN=P1^1;//SPI片選信號(hào)sbitSCK=P1^2;//SPI時(shí)鐘線sbitMOSI=P1^3;//數(shù)據(jù)輸出端sbitMISO=P1^4;//數(shù)據(jù)接收端sbitIRQ=P1^5;//可屏蔽中斷腳sbitlcden=P2^5; sbitlcdrs=P2^7; sbitlcdrw=P2^6; uintwendu;uintshidu;sbitD1=P1^6; sbitD2=P1^7; sbitD3=P3^0; sbitD4=P3^1; sbitBELL=P2^0; //蜂鳴器報(bào)警控制端sbitK1=P3^5; //設(shè)置鍵/確定鍵sbitK2=P3^6; //數(shù)字調(diào)整鍵加1sbitK3=P3^7; //數(shù)字調(diào)整鍵減1uintwendu,shidu;//溫濕度變量/********************延時(shí)函數(shù),延時(shí)一毫秒************************/voiddelay(uintz){ uintx,y; for(x=112;x>0;x--) for(y=z;y>0;y--);}//*********************************************NRF24L01*************************************#defineTX_ADR_WIDTH5 //5uintsTXaddresswidth#defineRX_ADR_WIDTH5 //5uintsRXaddresswidth//***************************************NRF24L01寄存器指令*******************************************************#defineREAD_REG0x00 //讀寄存器指令#defineWRITE_REG0x20 //寫寄存器指令#defineRD_RX_PLOAD0x61 //讀取接收數(shù)據(jù)指令#defineWR_TX_PLOAD0xA0 //寫待發(fā)數(shù)據(jù)指令#defineFLUSH_TX0xE1 //沖洗發(fā)送FIFO指令//*************************************SPI(nRF24L01)寄存器地址****************************************************#defineEN_RXADDR0x02//可用信道設(shè)置#defineSETUP_AW0x03//收發(fā)地址寬度設(shè)置#defineSETUP_RETR0x04//自動(dòng)重發(fā)功能設(shè)置#defineRF_CH0x05//工作頻率設(shè)置#defineSTATUS0x07//狀態(tài)寄存器#defineOBSERVE_TX0x08//發(fā)送監(jiān)測(cè)功能#defineCD0x09//地址檢測(cè)#defineRX_ADDR_P00x0A//頻道0接收數(shù)據(jù)地址#defineRX_ADDR_P10x0B//頻道1接收數(shù)據(jù)地址#defineRX_ADDR_P50x0F//頻道5接收數(shù)據(jù)地址#defineTX_ADDR0x10//發(fā)送地址寄存器//**************************************************************************************voidinerDelay_us(ucharn);voidinit_NRF24L01(void);ucharSPI_RW(ucharbyte);ucharSPI_Read(ucharreg);ucharSPI_RW_Reg(ucharreg,ucharvalue);ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);ucharnRF24L01_RxPacket(uchar*rx_buf);voidnRF24L01_TxPacket(uchar*tx_buf);//******************************************************************************************uchar bdatasta;//狀態(tài)標(biāo)志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;/******************************************************************************************/*延時(shí)函數(shù)/******************************************************************************************/voidinerDelay_us(ucharn){ for(;n>0;n--) _nop_();}/**************************1602顯示****************************/voidwrite_cmd(charcmd)//寫指令函數(shù){ lcdrs=0; P0=cmd; delay(1); lcden=1; delay(1); lcden=0;}voidwrite_data(uchardat)//寫數(shù)據(jù)函數(shù){ lcdrs=1; P0=dat; delay(1); lcden=1; delay(1); lcden=0;}voidwrite_str(uchar*str)//寫字符串函數(shù){ while(*str!='\0') { write_data(*str++); delay(5); }}voidinit_1602()//1602初始化函數(shù){ lcdrw=0; lcden=0; write_cmd(0x38);//顯示模式設(shè)置 write_cmd(0x0c);//顯示開關(guān),光標(biāo)關(guān)閉 write_cmd(0x06);//顯示光標(biāo)移動(dòng)設(shè)置 write_cmd(0x01);//清除屏幕write_cmd(0x80);;//數(shù)據(jù)指針移到第一行第一個(gè)位置}//****************************************************************************************/*NRF24L01初始化//***************************************************************************************/voidinit_NRF24L01(void){inerDelay_us(100);CE=0;//chipenableCSN=1;//SpidisableSCK=0;//SpiclocklineinithighSPI_RW_Reg(WRITE_REG+EN_AA,0x03);SPI_RW_Reg(WRITE_REG+RF_CH,0);SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);CE=1;//chipdisable}/****************************************************************************************************/*函數(shù):uintSPI_RW(uintuchar)/****************************************************************************************************/ucharSPI_RW(ucharbyte){ ucharbit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++)//output8-bit { MOSI=(byte&0x80);//output'uchar',MSBtoMOSI byte=(byte<<1);//shiftnextbitintoMSB.. SCK=1;//SetSCKhigh.. byte|=MISO; //capturecurrentMISObit SCK=0; //..thensetSCKlowagain }return(byte); //returnreaduchar}/****************************************************************************************************/*函數(shù):ucharSPI_Read(ucharreg)/*功能:NRF24L01的SPI時(shí)序/****************************************************************************************************/ucharSPI_Read(ucharreg){ ucharreg_val; CSN=0;//CSNlow,initializeSPIcommunication... SPI_RW(reg);//Selectregistertoreadfrom.. reg_val=SPI_RW(0);//..thenreadregistervalue CSN=1;//CSNhigh,terminateSPIcommunication return(reg_val);//returnregistervalue}/****************************************************************************************************/ucharSPI_RW_Reg(ucharreg,ucharvalue){ ucharstatus; CSN=0;//CSNlow,initSPItransaction status=SPI_RW(reg);//selectregister SPI_RW(value);//..andwritevaluetoit.. CSN=1;//CSNhighagain return(status);//returnnRF24L01statusuchar}/****************************************************************************************************//*函數(shù):uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)/****************************************************************************************************/ucharSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars){ ucharstatus,uchar_ctr; CSN=0; //SetCSNlow,initSPItranaction for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) pBuf[uchar_ctr]=SPI_RW(0);// CSN=1; return(status);//returnnRF24L01statusuchar}/*********************************************************************************************************/*函數(shù):uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)/*********************************************************************************************************/ucharSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars){ ucharstatus,uchar_ctr; CSN=0;//SPI使能 status=SPI_RW(reg); for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)// SPI_RW(*pBuf++); CSN=1;//關(guān)閉SPI return(status);//}/******************************************************************************************************//*函數(shù):unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf)/******************************************************************************************************/ucharnRF24L01_RxPacket(uchar*rx_buf){ ucharrevale=0; SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); CE=0; SPI_RW_Reg(WRITE_REG+CONFIG,0x0f); CE=1; inerDelay_us(130); { CE=0; //SPI使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//readreceivepayloadfromRX_FIFObuffer revale=1; //讀取數(shù)據(jù)完成標(biāo)志 wendu=rx_buf[1]*256+rx_buf[2]; shidu=rx_buf[3]*256+rx_buf[4]; write_cmd(0x84);//在第一行顯示 write_data((rx_buf[1]*256+rx_buf[2])/10%10+48);//+48的作用是實(shí)現(xiàn)十進(jìn)制和ASCII碼之間的轉(zhuǎn)換,目的是使1602液晶正常顯示十進(jìn)制數(shù) write_data((rx_buf[1]*256+rx_buf[2])%10+48); write_cmd(0xc4);//在第二行顯示 write_data((rx_buf[3]*256+rx_buf[4])%

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論