久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 28061|回復: 0
收起左側

基于單片機的溫濕度檢測控制系統課設報告

[復制鏈接]
ID:328014 發表于 2018-6-30 04:44 | 顯示全部樓層 |閱讀模式
                        
1章 總體設計概述
1.2 系統實現的主要功能
1.3 系統的工作原理簡介
1.4 總體設計簡介
1.4.1總體設計框圖
1.4.2 總體設計及工作進程
                        
2 系統硬件設計
2.1 主控模塊設計
2.2 DHT11傳感器模塊設計
2.2.1 DHT11傳感器簡介
2.2.2 DHT11傳感器模塊電路設計
2.3 1602液晶顯示模塊設計
2.3.1 1602液晶顯示屏簡介
2.3.2 1602液晶顯示模塊
2.4  閾值設置模塊
2.5 報警模塊
                        
3章 系統軟件設計
3.1 1602液晶顯示模塊程序設計
3.2 傳感器模塊程序設計

4章 系統分析與調試
4.1 程序下載軟件說明
4.2 所遇問題及解決辦法
4.2.1硬件問題及解決方法
4.2.2軟件所遇問題及解決方法
                        
5章 結論與展望
附錄
附錄A 硬件原理圖
附錄B 最終實物圖及簡介
附錄C 程序清單
                                                               
第1章 總體設計概述
                        
1.1 課題的背景和意義
                        
溫度、濕度和人類的生產、生活有著密切的關系,同時也是工業生產中最常見最基本的工藝參數,例如機械、電子、石油、化工等各類工業中廣泛需要對溫度濕度的檢測與控制。并且隨著人們生活水平的提高,人們對自己的生存環境越來越關注。而空氣中溫濕度的變化與人體的舒適度和情緒都有直接的影響,所以對溫度濕度的檢測及控制就非常有必要了。
                        
8051單片機是常用于控制的芯片,在智能儀器儀表、工業檢測控制、機電一體化等方面取得了令人矚目的成果,用其作為溫濕度控制系統的實力也很多。使用8051單片機能夠實現溫濕度全程的自動控制,而且8051單片機易于學習掌握,性價比高。
                        
使用8051型單片機設計溫濕度控制系統,可以即時精確的反應溫室內的溫度以及適度的變化。完成諸如升溫到特定的溫度、降溫到特定的溫度。在溫度上下限范圍內保持恒溫等多種控制方式,在濕度控制方面也是如此。將此系統應用到溫室當中無疑為植被生長提供了更加適宜的環境。對于大棚種植和花圃、花卉栽培,必須在某些特定環境安裝溫濕度裝置對其進行監控。本系統可以及時、精確的反映室內的溫度以及濕度的變化,能夠滿足溫濕度的控制要求。
                        
1.2 系統實現的主要功能
                        
本系統所要實現的功能是:
                        
1.溫濕度實時檢測及顯示。通過LCD1602實時地顯示傳感器DHT11檢測到的溫濕度值,并且固定時間(5s)檢測更新顯示一次。
                        
2.報警閾值的手動設置。通過三個按鍵實現溫濕度閾值的設置,使得系統更加人性化、智能化,具有更高的實用價值。
                        
3.當溫濕度超出閾值時能自動報警。通過蜂鳴器發出聲音實現報警,以提醒用戶做出相應的改進措施。
                        
1.3 系統的工作原理簡介
                        
總體來說,本次設計主要涉及了溫濕度的測量、顯示以及實現簡單控制。硬件方面有五個模塊,即AT89S52單片機主控模塊、傳感器模塊、LCD1602液晶顯示模塊、報警模塊以及閾值設置模塊。其中主控模塊已經給出,我們只需適當增加驅動電路即可。
                        
傳感器模塊使用的是DHT11數字溫濕度傳感器。通過DHT11檢測出當前環境下的溫濕度,將所測數據交給AT單片機進行分析和處理,并分別存入不同數組以便顯示時候用。其中,為了顯示穩定,本系統每間隔5s采集一次數據送入單片機。
                        
1602液晶顯示模塊就是實現溫濕度檢測值和閾值的顯示。其分兩行顯示,上邊一行顯示濕度,下邊顯示溫度值,兩行的末尾兩位是閾值顯示位,正常工作的時候可以通過按鍵將其隱藏,需要調節閾值時,再顯示出來方便調整,相對構建了比較友好的人機交互。
                        
蜂鳴器報警模塊實現了檢測值超過閾值的時候鳴響報警。本系統采用的是有源蜂鳴器,因此無論溫度還是濕度超出范圍蜂鳴器都是以相同頻率的聲音進行報警提示。提醒工作人員此時溫度濕度數據出現異常、需及時調整,及時啟用升溫器、加濕器、降溫風扇以及噴霧器來有效的調整實驗室內溫濕度。
                        
閾值設置模塊通過三個按鍵來實現閾值設置功能的。使得在不同環境下設置閾值提供了極大的方便,不需要每次都在程序里改動然后再燒錄,省去了復雜的過程。
                        
1.4 總體設計簡介
                        
1.4.1總體設計框圖
                        
                                                                按照系統功能的具體要求,在保證實現其功能的然礎上,盡可能降低系統成本。總體設計方案圍繞上述思想,初步確定系統的方案如圖1-1所示
                        
                                                        
                        
11系統總體設計
                        
                        
從圖中可以看出,系統有微處理器模塊、DHT11傳感器模塊、閾值設置模塊、1602字符液晶顯示模塊、報警模塊組成。在方案設計中,外圍模塊采用并行控制,以簡化系統,提高控制精度。該設計以AT89S52單片機為控制核心,實現溫濕度采集及顯示的基本功能。
                        
1.4.2 總體設計工作進程
                                                    本次設計相對而言有兩個部分弄明白了就能夠設計好了。一個是液晶顯示部分,一個是DHT11傳感器部分。傳感器比較陌生,以前沒有接觸太多,液晶相對而言比較容易點。因此這次先攻克了液晶顯示部分,然后再拿下傳感器部分。整個流程如下圖所示:
                        
                        
                                                        
                        
圖1-2 整體設計流程圖
                        
                        

第2章 系統硬件設計
                        
2.1 主控模設計
                                        本次課程設計使用的主控模塊是由老師給出的一個AT89S52為核心的最小系統。使用的時候將P1口作為與液晶的數據傳輸口,P2.0作為與傳感器DHT11通信的數據口,P2.1~P2.3作為閾值模塊中三個按鍵的接口,P2.4~P2.6作為分別于液晶的RS、R/W和E端相連接,以控制液晶顯示,P2.7接蜂鳴器控制端,以控制報警模塊工作。
                        
2.2 DHT11傳感器模塊設計
                        
2.2.1 DHT11傳感器簡介
                        
DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為 4 針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。
                        
DHT11傳感器實物圖如下2-1所示:
                        
                                                        
                        
2-1 DHT11傳感器實物圖
                        
(1)引腳介紹:
                        
Pin1:(VDD),電源引腳,供電電壓為3~5.5V。
                        
Pin2:(DATA),串行數據,單總線。
                        
Pin3:(NC),空腳,請懸浮。
                        
Pin4(VDD),接地端,電源負極。
                        
(2)接口說明 :
                        
建議連接線長度短于20米時用5K上拉電阻,大于20米時根據實際情況使用合適的上拉電阻。
                        
                                                        
                        
圖2-2 DHT11典型應用電路
                        
(3)數據幀的描述:
                        
DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數據格式,一次通訊時間4ms左右,數據分小數部分和整數部分,具體格式在下面說明,當前小數部分用于以后擴展,現讀出為零.操作流程如下:
                        
一次完整的數據傳輸為40bit,高位先出。
                        
數據格式:8bit濕度整數數據+8bit濕度小數數據
                        
+8bit溫度整數數據+8bit溫度小數數據
                        
數據傳送正確時校驗和數據等于“8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據”所得結果的末8位。
                        
(4)電氣特性:VDD=5V,T = 25℃,除非特殊標注
                        
表2-1 DHT11的電氣特性
                        
參數
條件
Min
typ
max
單位
供電
DC
3
5
5.5
V
供電電流
測量
0.5

2.5
mA
平均
0.2

1
mA
待機
100

150
uA
采樣周期
1


                        :采樣周期間隔不得低于1秒鐘。
                        
(5)時序描述:
                        
用戶MCU發送一次開始信號后,DHT11從低功耗模式轉換到高速模式,等待主機開始信號結束后,DHT11發送響應信號,送出40bit的數據,并觸發一次信號采集,用戶可選擇讀取部分數據.從模式下,DHT11接收到開始信號觸發一次溫濕度采集,如果沒有接收到主機發送開始信號,DHT11不會主動進行溫濕度采集.采集數據后轉換到低速模式。
                        
通訊過程如下圖2-3所示:
                        
                                                        
                        
圖2-3通訊過程圖
                        
總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號.主機發送開始信號結束后,延時等待20-40us后, 讀取DHT11的響應信號,主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。
                        
                                                        
                        
圖2-4通訊初始化要求圖
                           
                        
總線為低電平,說明DHT11發送響應信號,DHT11發送響應信號后,再把總線拉高80us,準備發送數據,每一bit數據都以50us低電平時隙開始,高電平的長短定了數據位是0還是1.格式見下面圖示.如果讀取響應信號為高電平,則DHT11沒有響應,請檢查線路是否連接正常.當最后一bit數據傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態。
                        
數字0信號表示方法如下圖2-5所示:
                        
                                                        
                        
圖2-5數字0信號電平變化圖
                        
數字1信號表示方法如下圖2-6所示
                        
                                                        
                        
2-6數字1數據線電平變化圖
                        
2.2.2 DHT11傳感器模塊電路設計
                        
DHT11傳感器連接單片機相對比較簡單。單片機的P2.0口用來發收串行數據,即數據口。連接傳感器的Pin2(單總線,串行數據)。由于測量范圍電路小于20米,加一個5K的上拉電阻,因此在傳感器的Pin2口與電源之間連接一個5K電阻。而傳感器的電源端口Pin1和Pin4分別接單片機的VDD和GND端。傳感器的第三腳懸浮放置。DHT11傳感器原件的電路原理圖如下2-7所示:
                                    
                        
                        
圖2-7 DHT11電路原理圖
                        
2.3 1602液晶顯示模塊設計
                        
2.3.1 1602液晶顯示屏簡介
                        
1602液晶 是一種工業字符型液晶,能夠同時顯示16x02 即32個字符。(16列2行)。在日常生活中,我們對液晶顯示器并不陌生。液晶顯示模塊已作為很多電子產品的通過器件,如在計算器、萬用表、電子表及很多家用電子產品中都可以看到,顯示的主要是數字、專用符號和圖形。在單片機的人機交流界面中,一般的輸出方式有以下幾種:發光管、LED數碼管、液晶顯示器。發光管和LED數碼管比較常用,軟硬件都比較簡單。
                        
                                                        
                        
圖2-8 液晶屏正面
                        
                        2.3.2 1602液晶顯示模塊
                        
液晶顯示的原理是利用液晶的物理特性, 通過電壓對其顯示區域進行控制,有電就有顯示,這樣即可以顯示出圖形。液晶顯示器具有厚度薄、適用于大規模集成電路直接驅動、易于實現全彩色顯示的特點,目前已經被廣泛應用在便攜式電腦、數字攝像機、PDA移動通信工具等眾多領域。
                        
其中Vo腳,即第三引腳加了一個10K的滑動變阻器,該變阻器的目的是調節液晶的顯示對比度,通過調節滑阻改變Vo的電壓值,從而使液晶顯示在最清晰的狀態。
                        
                                                        
                        
                        
2-9 1602顯示模塊原理圖
                        
2.4  閾值設置模塊
                                                                                    從左圖可以看到。從上到下依次設為K1、K2和K3三個按鍵,其連接單片機引腳分別是P2.1~P2.3三個引腳。
                                                    根據該模塊使得閾值設置分為三個模塊,分別是濕度設置模式、溫度設置模式和關閾值顯示模式。K1為模式選擇鍵,按一次為濕度設置模式,按兩次是溫度設置模式,按三次是關閾值顯示模式。K2和K3只有在濕度和溫度設置模式下才有效,分別為閾值增加和閾值減小。
                                                    閾值設置模塊是后來加進來的部分,設置非常人性化,一般人都可以操作,而不用每次設置閾值都到程序里邊去設置
                        
                        
                        
                        
                        
圖2—10 閾值設置模塊原理圖
                        
2.5 報警模塊
                        
                                                        
                        
圖2-11 蜂鳴器原理圖
                        
                                                    系統在設計時候采用的是有源蜂鳴器,只要給蜂鳴器一定的電流值,蜂鳴器就可以按照一定的頻率發聲,但是單片機引腳的驅動電流比較小,不足以驅動蜂鳴器工作,因此采用了一個NPN的三極管C9013來驅動。
                        

第3章 系統軟件設計
                        
在對我們所要設計的課題有了整體的了解之后,需要先建立程序框架的流程圖,對整個設計劃分模塊,逐個模塊實現其功能,最終把各個子模塊合理的連接起來,構成總的程序。
                        
                                                        
                        
3-1 主程序流程圖
                        
                        
                        
3.1 1602液晶顯示模塊程序設計
                        
液晶顯示模塊是一個慢顯示器件,在執行每條指令之前要確認模塊的忙標志為低電平,表示不忙,則此指令失效,要顯示字符時要先輸入顯示字符地址,告訴模塊在哪里現實了字符。1602液晶顯示模塊可與單片機接口直接連接,無需再加驅動。
                        
軟件流程圖及調試結果如圖3-2所示。
                        
                                                                      
                        
3-2 1602液晶顯示模塊程序流程圖及液晶調試結果顯示
                        
                        
3.2 傳感器模塊程序設計
                        
溫濕度模塊DH11數字溫濕傳感器加濕器溫濕度傳感器隨著科技的不斷發展,汽車、空調、除濕器、烘干機等種類繁多的電器都已進入人們的日常生活,而這些電器設備很多都離不開對溫度、濕度等環境因素的要求。因此,溫度、濕度傳感器用途越來越廣泛。新一代的數字傳感器不再需要外置的A D轉換模塊,并具有標準接口,使用方便,得到了越來越多的應用。DHT11作為一種新型的單總線溫濕度數字傳感器,具有更多的優點,它使系統設計更加簡單,控制方便,易于實現。
                        
DHT11傳感器模塊的軟件流程圖及實物調試結果如圖3-3.1和圖3-3.2所示。
                        
                        
圖 3-3.1 DHT11傳感器模塊程序流程圖
                                                                                
                        
圖 3-3.1 DHT11傳感器模塊實物調試結果
                        
第4章 系統分析與調試
                        
4.1 程序下載軟件說明
                        
本設計是在Keil C環境下開發的,Keil C軟件支持C語言的編程及調試,運用方便,當需要編程時這就是是做課程設計的首選。Keil C是我們比較熟悉的軟件了,直接就可以使用,進行程序的編寫,生成十六進制文件以備燒寫用。
                        
                                程序燒寫使用的是Easy 51Pro中的并行數據燒寫模式進行燒寫。軟件運行界面如圖4—1所示。
                        
                        
圖4-1 程序燒寫軟件運行界面圖
                        
在完成對程序的調試及燒錄之后,還需要對其進行演示,把開發板與電腦連上,設置好對應的接口,完成供電及下載。下載完畢,連接好各引腳連線,并開始供電后、稍帶幾秒等1602液晶屏能正常顯示當前溫濕度了之后。觀察當前溫濕度的變化。并且針對與自己設定的限值相比較。若當前溫度沒有超標,即沒有超過限值。可以用手捂住DHT11傳感器,令其溫度的顯示超標。測試能否達到報警,經過測試,完全可行。因而簡單的實現了對溫度的控制。濕度控制原理跟溫度一樣。
                        
4.2 所遇問題及解決辦法
                        
4.2.1硬件問題及解決方法
                                                    硬件和軟件方面的問題相對來說硬件解決得是比較快的一類問題,因為這比較容易檢查不來錯誤。
                                                    1. 單片機EA端沒接高電平。
                        
液晶仿真完成以后,這是剛在實物板上開始調試的時候犯的第一個很低級的錯誤。當然這個問題首先要歸結為不是我們做的最小系統,因此沒有顧及到這個問題,這導致了我們在仿真時候好用的程序在實物板上偶爾會好用一次。
                                                    最后在老師的點撥下,我們找到了這個原因,以后上電的時候單片機就可以實現自動啟動工作,而且讀程序的時候每次都是從片內的最低位開始執行。
                                                    2. 蜂鳴器不響。
                        
后來在加了報警裝置的時候,沒有問老師我們拿的蜂鳴器是有源還是無源,這樣子這個問題友困擾了我們一小段時間。當時以為是無源的,就用了高低電平來驅動,而且還測試了控制引腳輸出電壓的變化,最終沒有響。后來無意間將蜂鳴器直接連接正負極,竟然發聲了,此時才意識到我們忽略了它是有源蜂鳴器。
                                                    但是并沒有就此解決了該問題,因為單單是蜂鳴器的引腳輸出電流還不足以驅動蜂鳴器,后來又加了一個NPN的三極管來驅動蜂鳴器。但是在P2.7接口那里加的電阻比較小的時候還是不能驅動,這可能是因為電阻太小使得鉗位電壓太低了。最開始用的2K的電阻,但是蜂鳴器不能響,換成10K電阻以后蜂鳴器能吱吱的響,但不連續,最后換成24K以后再接上單片機控制端以后就能夠自如的驅動蜂鳴器發聲了。
                        
4.2.2軟件所遇問題及解決方法
                        
                            本次課程設計可以說大部分時間都花在了軟件調試上了,軟件調試的時候畢竟不像硬件那么直觀,對我們來說是個瓶頸,需要我們去突破它。
                        
1.下載程序的時候,對此次的燒寫軟件Easy 51Pro不熟悉。
                        
以前沒使用過該軟件,下載的時候很容易就出問題了。當然解決該問題也就顯得是最簡單的了,直接找了老師,然后老師來給我們演示了一次,這樣問題就解決了。
                        
2. 顯示結果不穩定,一直在很快地變化。
                        
由于剛開始的時候程序里邊一直是在采集數據然后顯示,單片機一直做這個事,這樣就會導致顯示不穩定,尤其是濕度變化特別快,基本上穩定不了。
                        
當然解決問題的方法就是隔固定時間以后采集一次,而不是一直采集。剛開始的時候想的是用延時程序來做,因為這樣思想比較簡單,但是這樣的弊端同時也顯現出來了,那就是他占用單片機資源,使得單片機始終在執行無用的語句來耗時,所以最后跟閾值設置模塊結合考慮以后用了定時器來實現5s的定時。
                        
3.閾值設置模塊加了按鍵以后按鍵始終不能按預期效果工作。
                        
剛開始還以為是硬件部分沒有連接好,于是用萬用表查了很久,但是電平變化都是正確的。在掙扎了一整下午以后晚上回到宿舍依然在想這個問題,主要是這個在仿真上邊可以用,但是實物的時候就不好用,所以我們都以為是硬件出問題了。但是在第二天上午的時候我發現當按鍵時間比較長的時候,比如6s左右,單片機還是可以讀出按鍵的,瞬間就想到了,原來我們的程序里邊單片機不是一直在掃描鍵盤,而是只有一句話在執行掃描,這樣按鍵好用比中五百萬都難。
                        
找到問題了解決起來也就容易多了,后來當單片機在那五秒定時里邊讓單片機始終掃描鍵盤,這樣絕大部分時間按鍵就都是有效的了。
                        

第5章 結論與展望
                        
在這短短幾天時間里自己最大的感受就是:仿真和實物真的有很大的差別。同樣的程序仿真時候能用但是實物板上卻不能用,后來分析其實本來也是不能用的,但是仿真卻給了我們一個錯誤的結果顯示,只能說明仿真只是仿真而已,只能作為我們的一個參考罷了。
                        
經過近兩周的奮斗,從拿到題目,到后來查找資料,理論學習,實驗編程調試,這一切都使我的理論知識和動手能力有了很大的提高。了解了單片機的硬件結構和軟件編程方法,對單片機的工作方式有了很大的認知。同時,對一些外圍設備比如傳感器、液晶屏、鍵盤、蜂鳴器等有了一定的了解!
                        
但因為我們的水平有限,此設計中也存在一定的不足。比如溫濕度的精度是比較低的,這個跟傳感器也有一定的關系,還有就是硬件的布局設計業不夠美觀,以后有機會應該自己做印刷板然后再美化電路板就比較完美了。
                        
溫濕度控制已經成為了21世紀熱門研究話題之一。無論是從生產還是生活,與我們人類都是息息相關的。而智能化的控制溫濕度已經發展成為一種必然。隨著世界經濟的發展,人們生活水平的提高以及社會的進步。我們不可能一直墨守陳規,不能在恪守以前利用人力資源來控制溫濕度的方法。不僅浪費大量的人力資源、財力資源,并且控制系統也更加單一化。而采用自動控制的辦法、既節省了人力資源,更體現了與時俱進的思想、世界在進步、而這種進步就該體現在各個方面。
                        

附錄
                        
附錄A 硬件原理圖
                        
附錄B 最終實物圖及簡介
                        
                                
液晶前邊顯示的內容為溫濕度的實時監測顯示,上下兩行的各后2位為閾值顯示。
                        
中間三個按鍵分別為:最上邊那個是模式切換鍵,按1次是濕度調節模式,按2次是溫度調節模式,按三次試不顯示閾值,每次調節完畢立即生效。下邊兩個鍵分別為增加和減少閾值鍵。
                        
左下角的蜂鳴器是報警裝置。當溫濕度只要有一個超出其閾值蜂鳴器就會報警,提醒人們做相應措施。
                        
液晶前的滑動變阻器為液晶對比度調節用的。
                        
附錄C 程序清單
  1. //****************************************************************//
  2. //單片機 : AT89S52
  3. // 功能  :串口發送溫濕度數據 晶振 12M
  4. //硬件連接: P2.0口為通訊口連接DHT11,DHT11的電源和地連接單片機的電源和地。            
  5. //****************************************************************//
  6. 大連海事大學自動化專業課程設計
  7. #include <reg52.h>
  8. #define LCD_DB P1
  9. unsigned char s1[5];
  10. unsigned char s2[5];
  11. sbit LCD_RS=P2^4;
  12. sbit LCD_RW=P2^5;
  13. sbit LCD_E=P2^6;
  14. sbit P2_0 = P2^0;
  15. sbit moshi=P2^1;
  16. sbit INC=P2^2;
  17. sbit DEC=P2^3;
  18. sbit SPK=P2^7;
  19. /******定義函數****************/
  20. #define uchar unsigned char
  21. #define uint unsigned int
  22. typedef unsigned char  U8;      
  23. /*   無符號8位整型變量    */
  24. typedef unsigned int   U16;   
  25. /*                 無符號16位整型變量 */
  26. uchar count1=70,count2=35;
  27. uchar moshicount=0;
  28. uchar TD=0;//定時次數

  29. U8  U8FLAG;
  30. U8  U8count,U8temp;
  31. U8  U8T_data_H,U8T_data_L,U8RH_data_H,
  32. U8RH_data_L,U8checkdata;
  33. U8  U8T_data_H_temp,U8T_data_L_temp,
  34. U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  35. U8  U8comdata;
  36. void LCD_init(void);//初始化函數
  37. void LCD_write_command(uchar command); //寫指令函數
  38. void LCD_write_data(uchar dat);
  39. //寫數據函數
  40. void LCD_disp_char(uchar x,
  41. uchar y,uchar dat);
  42. //在某個屏幕位置上顯示一個字符,X(0-16),y(1-2)
  43. void delay_n40us(uint n);//延時函數
  44. //********************************
  45. //*******液晶初始化函數***************
  46. void LCD_init(void)
  47. {
  48.               LCD_write_command(0x38);
  49. //設置 8 位格式,2 行,5x7
  50.               LCD_write_command(0x0c);
  51. //整體顯示,關光標,不閃爍
  52.               LCD_write_command(0x06);
  53. //設定輸入方式,增量不移位
  54.               LCD_write_command(0x03);
  55. //清除屏幕顯示
  56.               delay_n40us(100);
  57. }
  58. //********************************

  59. //*******定時器初始化函數**********
  60. void timerinit()
  61. {
  62.               TMOD=0x01;
  63.               TH0=-50000/256;
  64.               TL0=-50000%256;
  65.               EA=1;
  66.               ET0=1;
  67. }
  68. //********************************

  69. //********寫指令函數************
  70. void LCD_write_command(uchar dat)
  71. {
  72.               LCD_DB=dat;
  73.               LCD_RS=0;//指令
  74.               LCD_RW=0;//寫入
  75.               LCD_E=1;//允許
  76.               delay_n40us(1);
  77.               LCD_E=0;
  78.               delay_n40us(1);
  79. }
  80. //*******************************
  81. //********寫數據函數*************
  82. void LCD_write_data(uchar dat)
  83. {
  84.               LCD_DB=dat;
  85.               LCD_RS=1;//數據
  86.               LCD_RW=0;//寫入
  87.               LCD_E=1;//允許
  88.               delay_n40us(1);
  89.               LCD_E=0;
  90.               delay_n40us(1);            
  91. }
  92. //********************************
  93. //*******顯示一個字符函數*********
  94. void LCD_disp_char(uchar x,
  95. uchar y,uchar dat)
  96. {
  97.               uchar address;
  98.               if(y==1)
  99.                               address=0x80+x;
  100.               else
  101.                               address=0xc0+x;
  102.               LCD_write_command(address);
  103.               LCD_write_data(dat);
  104. }
  105. //********************************
  106. //********延時函數***************
  107. void delay_n40us(uint n)
  108. {              
  109.               uint i;
  110.               uchar j;                        
  111.               for(i=n;i>0;i--)
  112.                               for(j=0;j<2;j++);
  113. }
  114. void  Delay_10us(void)
  115. {
  116.    U8 i;
  117.    i--;
  118.     i--;
  119.     i--;
  120.     i--;
  121.     i--;
  122.     i--;
  123. }
  124. void Delay(U16 j)
  125. {     
  126.                             U8 i;
  127.                 for(;j>0;j--)            
  128.                                for(i=0;i<27;i++);
  129. }

  130. //*******一字節數據傳送函數*********
  131. void  COM(void)
  132. {
  133.     U8 i;
  134.      for(i=0;i<8;i++)               
  135.                  {
  136.                                  U8FLAG=2;            
  137.                                   while((!P2_0)&&U8FLAG++);
  138.                                              Delay_10us();
  139.                                 Delay_10us();
  140.                                              Delay_10us();
  141.                                             U8temp=0;
  142.                      if(P2_0)U8temp=1;
  143.                                  U8FLAG=2;
  144.                                  while((P2_0)&&U8FLAG++);
  145.                                    //超時則跳出for循環                             
  146.                                   if(U8FLAG==1)break;
  147.                                    //判斷數據位是0還是1            
  148. // 如果高電平高過預定0高電平值則數據位為 1
  149.                                   U8comdata<<=1;
  150.                                  U8comdata|=U8temp;      
  151.                   }
  152. }

  153. *******單片機與傳感器通信函數*********
  154. void RH(void)
  155. {
  156.               //主機拉低18ms
  157.      P2_0=0;
  158.                  Delay(180);
  159.                  P2_0=1;
  160. //總線由上拉電阻拉高 主機延時20us
  161.                  Delay_10us();
  162.                  Delay_10us();
  163.                  Delay_10us();
  164.                  Delay_10us();
  165.               //主機設為輸入 判斷從機響應信號      
  166.                  P2_0=1;
  167.               //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行               
  168.                  if(!P2_0)                            //T !               
  169.                  {
  170.                     U8FLAG=2;
  171.               //判斷從機是否發出 80us 的低電平響應信號是否結束                  
  172.                     while((!P2_0)&&U8FLAG++);
  173.                     U8FLAG=2;
  174.               //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態              
  175.                      while((P2_0)&&U8FLAG++);
  176.                     //數據接收狀態                           
  177.                     COM();
  178.                     U8RH_data_H_temp=U8comdata;
  179.                     COM();
  180.                      U8RH_data_L_temp=U8comdata;
  181.                      COM();
  182.                      U8T_data_H_temp=U8comdata;
  183.                      COM();
  184.                      U8T_data_L_temp=U8comdata;
  185.                      COM();
  186.                      U8checkdata_temp=U8comdata;
  187.                     P2_0=1;
  188.               //數據校驗                U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  189.                  if(U8temp==U8checkdata_temp)
  190.                  {                                 
  191. U8RH_data_H=U8RH_data_H_temp;                      U8RH_data_L=U8RH_data_L_temp;
  192.                               U8T_data_H=U8T_data_H_temp;
  193.                                  U8T_data_L=U8T_data_L_temp;
  194.                                  U8checkdata=U8checkdata_temp;
  195.                  }
  196.     //濕度整數部分   
  197. s1[0] = (char)(0X30+U8RH_data_H/10);
  198.    s1[1] = (char)(0X30+U8RH_data_H%10);   
  199.    //濕度小數部分
  200.   s1[2] = (char)(0X30+U8RH_data_L/10);
  201.     //溫度整數部分        
  202.   s2[0] = (char)(0X30+U8T_data_H/10);
  203.   s2[1] = (char)(0X30+U8T_data_H%10);      
  204.    //溫度小數部分            
  205.   s2[2] = (char)(0X30+U8T_data_L/10);
  206. }
  207. }
  208. //*******************************

  209. //液晶顯示函數
  210. void disp()
  211. {
  212.                             LCD_disp_char(0,1,'s');
  213.                             LCD_disp_char(1,1,'h');
  214.                             LCD_disp_char(2,1,'i');
  215.                             LCD_disp_char(3,1,'d');
  216.                             LCD_disp_char(4,1,'u');
  217.                             LCD_disp_char(5,1,':');
  218.                             LCD_disp_char(6,1,s1[0]);
  219.                             LCD_disp_char(7,1,s1[1]);
  220.                             LCD_disp_char(8,1,'.');
  221.                             LCD_disp_char(9,1,s1[2]);
  222.     LCD_disp_char(10,1,'%');
  223.      LCD_disp_char(11,1,'R');
  224.     LCD_disp_char(12,1,'H');

  225.                             LCD_disp_char(0,2,'w');
  226.                             LCD_disp_char(1,2,'e');
  227.                             LCD_disp_char(2,2,'n');
  228.                             LCD_disp_char(3,2,'d');
  229.                             LCD_disp_char(4,2,'u');
  230.                             LCD_disp_char(5,2,':');
  231.                             LCD_disp_char(6,2,s2[0]);
  232.                             LCD_disp_char(7,2,s2[1]);
  233.                             LCD_disp_char(8,2,'.');
  234.                             LCD_disp_char(9,2,s2[2]);
  235.                             LCD_disp_char(10,2,0xDF);
  236.                  LCD_disp_char(11,2,'C');
  237. }
  238. //閾值設置函數
  239. void shezhi()
  240. {
  241. //初值
  242. s1[3] = (char)(0X30+count1/10);
  243.                 s1[4] = (char)(0X30+count1%10);
  244.                 //初值
  245.                 s2[3] = (char)(0X30+count2/10);
  246.                 s2[4] = (char)(0X30+count2%10);
  247.   moshi=1;
  248.                 if(moshi==0)
  249.                 {
  250.                                Delay_10us();
  251.                                while(moshi==0);
  252.                                moshicount++;
  253.                  }
  254.                  switch(moshicount)
  255.                  {
  256.                                case 1:
  257.                                {
  258.                                               INC=1;DEC=1;
  259.                                               if(INC==0)
  260.                                               {
  261.                                                              Delay_10us();
  262.                                                              while(INC==0);
  263.                                                              count1++;
  264.                                                }
  265.                                                else if(DEC==0)
  266.                                                {
  267.                                                               Delay_10us();
  268.                                                               while(DEC==0);
  269.                                                               count1--;
  270.                                                 }
  271.                        LCD_disp_char(14,1,s1[3]);
  272.                        LCD_disp_char(15,1,s1[4]);
  273.                                               LCD_disp_char(14,2,s2[3]);
  274.                                               LCD_disp_char(15,2,s2[4]);
  275.                                 }break;
  276.                                 case 2:
  277.                                 {
  278.                                                 //moshicount=0;
  279.                                                 INC=1;DEC=1;
  280.                                                 if(INC==0)
  281.                                                 {
  282.                                                                Delay_10us();
  283.                                                                while(INC==0);
  284.                                                                count2++;
  285.                                                   }
  286.                                                   else if(DEC==0)
  287.                                                   {
  288.                                                                   Delay_10us();
  289.                                                                   while(DEC==0);
  290.                                                                   count2--;
  291.                                                    }
  292.                        LCD_disp_char(14,1,s1[3]);
  293.                       LCD_disp_char(15,1,s1[4]);
  294.                                                LCD_disp_char(14,2,s2[3]);
  295.                                                LCD_disp_char(15,2,s2[4]);
  296.                                 }break;
  297.                                 case 3:
  298.                                 {
  299.                                                moshicount=0;            
  300.                        LCD_disp_char(14,1,' ');
  301.                        LCD_disp_char(15,1,' ');
  302.                                               LCD_disp_char(14,2,' ');
  303.                                               LCD_disp_char(15,2,' ');
  304.                                  }break;
  305.                             default :break;
  306.               }
  307. }
  308. //蜂鳴器報警程序
  309. void laba()
  310. ……………………

  311. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整的Word格式文檔51黑下載地址:
http://m.zg4o1577.cn/bbs/dpj-125422-1.html


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 2019天天干夜夜操 | 龙珠z在线观看 | 亚洲国产精品99久久久久久久久 | 久久精品国产一区 | 国产精品海角社区在线观看 | 日韩精品在线观看免费 | 精品中文字幕一区二区三区 | 国产区在线 | wwwxxx国产 | a毛片 | 天天干天天操天天射 | 成人国产在线视频 | 日本黄色不卡视频 | 国产精品免费一区二区三区四区 | 成人精品| 免费视频二区 | 懂色tv| 91精品久久久久久久久久 | 黄色国产| 99re热精品视频 | 亚洲一区国产 | 欧洲一级毛片 | 欧美xxxx在线 | 亚洲一区二区黄 | 婷婷久 | 久久九 | 青青伊人久久 | 日韩一区二区在线视频 | 国产欧美日韩一区二区三区在线观看 | 人成精品 | 一区二区三区视频在线免费观看 | 在线观看免费av片 | 久久国产亚洲 | 91精品中文字幕一区二区三区 | 国产影音先锋 | 99精品免费| 欧美精品综合 | 一区二区精品 | 亚洲永久字幕 | 性色av一区 | 日韩高清黄色 |