目錄 第1章 緒論... 6 1.1 本課題的背景及研究意義... 6 1.2 國內外現狀... 6 1.3 總體設計思路... 7 第2章 總體設計... 7 2.1 方案選擇... 7 2.1.1控制芯片的選擇... 7 2.1.2溫濕度傳感器模塊的選擇... 7 第3章 系統硬件電路設計... 8 3.1 整體方案設計... 8 3.1.1系統概述... 8 3.1.2系統框圖... 8 3.2 單片機最小系統電路... 8 3.2.1單片機介紹... 8 3.2.2單片機最小系統... 11 3.3 DHT11數字傳感器... 12 3.3.1 DHT11數字溫濕度傳感器... 12 3.3.2 DHT11引腳... 12 3.3.3 DHT11電路... 13 3.4 液晶顯示電路... 13 3.4.1 1602液晶簡介... 13 3.4.2液晶引腳說明... 14 3.4.3指令介紹... 15 3.4.4液晶顯示模塊電路... 18 3.6 STC89C52的系統時鐘設計... 19 第4章 軟件設計... 20 4.1 程序語言及開發環境... 20 4.2 程序流程圖... 20 4.2.1總體流程圖... 20 4.2.2 1602液晶程序設計... 21 5.2.4溫度傳感器程序設計... 22 第5章 總結分析... 24 參考文獻... 26 附 錄 27 附錄1 原理圖... 27 附錄2 源程序... 27 附錄3 實物圖(正、反面)... 32 附錄4 元件清單... 33 附錄5 小組分工與合作... 33
第1章 緒論1.1 本課題的背景及研究意義20世紀末,電子技術獲得了飛速的發展,在其推動下,現在電子產品幾乎滲透了社會的各個領域,有力地推動了社會生產力的發展和社會信息化程度的提高,同時也使現代電子產品性能進一步提高,產品更新換代的節奏也越來越快。時間對人們來說總是那么寶貴,工作的忙碌性和繁雜性容易使人忘記當前的時間。忘記了要做的事情,當事情不是很重要的時候,這種遺忘無傷大雅。但是一旦重要事情,一時的耽誤可能釀成大禍。 目前單片機正朝著高性能和多品種方向發展,趨勢將是進一步向著CMOS化、低功耗、小體積、大容量、高性能、低價格和外圍電路內裝化等幾個方面發展。下面是單片機的主要發展趨勢。單片機應用的重要意義在于,它從根本上改變了傳統的控制系統設計思想和設計方法。從前必須由模擬電路或數字電路實現大部分功能,現在已經能用單片機通過軟件方法來實現了。這種軟件代替硬件的控制技術也稱為微控制技術,是傳統控制技術的一次革命。 溫度、濕度和人類的生產、生活有著密切的關系,同時也是工業生產中最常見的基本參數,例如機械、電子、石油、化工等各類工業中廣泛要求對溫度、濕度進行檢測與控制。隨著人們生活水平的提高,人們對自己的生存環境越來越關注,而空氣中溫濕度的變化對人體的舒適度和情緒有著直接的影響,所以對溫濕度的檢測及控制就十分有必要了。 1.2 國內外現狀溫度、濕度是工業農業生產不可求二少的考慮因素,但傳統的方法是用溫度表、毛發溫度表、雙金屬式測量機以及溫度試紙等測試器材,通過人工檢測,對不符合溫度和濕度要求的庫房進行通風、降溫和去濕等工作。這種人工測試方法費時費力、效率低、且測試的溫度及濕度誤差大,又具有較大的不確定性。而含有微型計算機或者微處理器的測量儀器,由于它擁有對數據儲存,運算邏輯判斷及自動化功能,有著只能功能,很快得到人們的青睞和關注。 模擬集成溫度傳感器是在20世紀80年代問世的,他是將溫度傳感器集成一個芯片上,可完成溫度測量及模擬信號輸出功能的專用IC。模擬集成溫度傳感器的主要特點是測量溫度誤差小、價格低、響應速度快、傳輸距離遠、體積小、微功耗等,適合遠距離測溫、控溫,不需要進行非線性校準,外圍電路簡單。他是目前在國內外應用最為普遍的一種集成傳感器。 1.3 總體設計思路選取單片機作為系統的主控部件,根據主控機的指令對溫度進行實時采集并通過液晶顯示部分及時將測量結果顯示出來。因策,如何準確獲得被測信號以及對被控對象狀態的監察是單片機的核心人物。傳感器是實現測量與控制的首要換屆,對于溫濕度計,系統應具有兩大傳感模塊:即溫度傳感器模塊和濕度傳感器模塊。 此外,在微型計算機控制系統中,應該設計液晶顯示模塊,將溫度和濕度的數據顯示出來,為了安全生產,對于一些重要的參數或系統部位,應當設有緊急狀態報警模塊,但由于本設計是一個家用的溫濕度計,因此設計得較為簡潔。 第2章 總體設計2.1 方案選擇2.1.1控制芯片的選擇 方案一:采用STC89C52單片機,支持串口編程,計算速度快,用戶程序空間(flash)8K,內部帶有帶電可擦寫可編程讀寫存儲器(EEPROM)。 方案二:采用AT89C51單片機,只能通過專用硬件編程器編程,用戶程序空間小,性價比低,計算速度較STC89C52單片機慢。 STC89C52是STC公司生產的一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統可編程Flash存儲器。STC89C52使用經典的MCS-51內核,但做了很多的改進使得芯片具有傳統51單片機不具備的功能。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得STC89C52為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。因此本設計用STC89C52單片機作為控制器。 2.1.2溫濕度傳感器模塊的選擇 方案一:采用DTH11 方案二:采用SHT11 方案比較:DHT11核心部件采用濕敏電阻,其成本低,穩定性差,SHT11核心部件采用濕敏電容,成本高,穩定性好。通過成本比較,選擇方案一DTH11。
第3章 系統硬件電路設計3.1 整體方案設計3.1.1系統概述整個系統以STC89C52單片機為核心器件,配合電阻電容晶振等器件,構成單片機的最小系統。其它個模塊圍繞著單片機最小系統展開。溫濕度采集模塊,檢測當前環境的溫度值,并對并把溫濕度數據傳輸給單片機;顯示模塊,采用1602液晶作為顯示模塊,負責顯示測量到的濕度值和溫度值;最后一個是電源模塊,采用5V的USB供電,本系統如需移動測量時,可采用移動電源進行供電。 3.1.2系統框圖file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png 3.2 單片機最小系統電路3.2.1單片機介紹(1)概述 STC89C52是一個低電壓,高性能CMOS 8位單片機,片內含8k bytes的可反復擦寫的Flash只讀程序存儲器和512bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置通用8位中央處理器和Flash存儲單元,功能強大的STC89C52單片機可為您提供許多較復雜系統控制應用場合。 STC89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2個讀寫口線。STC89C52有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應不同產品的需求。 (2)主要功能特性 ◆兼容MCS51指令系統;◆8k可反復擦寫(>1000次)Flash ROM; ◆32個雙向I/O口; ◆512字節RAM ;◆3個16位可編程定時/計數器中斷;◆時鐘頻率0-24MHz; ◆內置4KB EEPROM;◆全雙工串行口◆4個外部中斷源; ◆共8個中斷源;◆2個讀寫中斷口線; ◆3級加密位; ◆低功耗空閑和掉電模式; ◆軟件設置睡眠和喚醒功能; (3)8051單片機的引腳功能 MCS-51系列單片機一般采用40個引腳,雙列直插式封裝,用HMOS工藝制造,其外部引腳排列如圖4-1所示。其中,各引腳的功能為: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.jpg 圖4-1 STC89C52引腳圖 ① 主電源引腳 VCC(40腳),接+5V電源正端; GND(20腳),接+5V電源地端; ② 外接晶體或外部振蕩器引腳 XTAL1(19腳),接外部晶振的一個引腳。在單片機內部,它是一個反相放大器 的輸入端。當采用外部振蕩器時,此引腳應接 地。 XTAL2(18腳),接外部晶振的另一個引腳。在片內接至反相放大器的輸出端和 內部時鐘電路的輸入端。當采用外部振蕩器時,此腳接外部振蕩器的輸出端。 ③ 控制信號線 RESET(9腳),復位信號輸入端,復位/掉電時內部RAM的備用電源輸入端。 ALE(30腳),地址鎖存允許/編程脈沖輸入,用ALE鎖存從P0口輸出的低8 位地址。在對片內EPROM編程時,編程脈沖由此輸入。 PSEN(29腳),外部程序存儲器讀選通信號,低電平有效。 EA(31腳),訪問外部存儲器允許/編程電壓輸入。EA為高電平時,訪問內部存 儲器;低電平時,訪問外部存儲器。 ④ 多功能I/O口引腳 8051單片機設有4個雙向I/O口(P0、P1、P2、P3),每一組I/O口線都可以獨立地用作輸入或輸出口,其中: P0口(32~39腳)——雙向口(三態),可作為輸入/輸出口,可驅動8個LSTTL門電路。實際應用中常作為分時使用的地址/數據總線口,對外部程序或數據存儲器尋址時低8位地址與數據總線分時使用P0口:先送低8位地址信號到P0口,由地址鎖存信號ALE的下降沿將地址信號鎖存到地址鎖存器后,再作為數據總線的口線對數據進行輸入或輸出。 P1口(1~8腳)——準雙向口(三態),可驅動4個LSTTL門電路。用作 輸入線時,口鎖存器必須由單片機先寫入“1”,每一位都可編程為輸入或輸出 線。 P2口(21~28)——準雙向口(三態),可驅動4個LSTTL門電路。可作 為輸入/輸出口,實際應用中一般作為地址總線的高8位,與P0口一起組成16 位地址總線,用于對外部存儲器的接口電路進行尋址。 P3口(10~17腳)——準雙向口(三態),可驅動4個LSTTL門電路。雙 功能口,作為第一功能使用時,與P1口一樣;作為第二功能使用時,每一 位都有特定用途,其特殊用途如表4.1所示: 表4.1 P3口第二用途 端口引腳 | 第二功能 | 注 釋 | P3.0 | RXD | 串行口數據接收端 | P3.1 | TXD | 串行口數據發送端 | P3.2 | /INT0 | 外中斷請求0 | P3.3 | /INT1 | 外中斷請求1 | P3.4 | T0 | 定時/計數器0外部計數信號輸入 | P3.5 | T1 | 定時/計數器1外部計數信號輸入 | P3.6 | /WR | 外部RAM寫選通信號輸出 | P3.7 | /RD | 外部RAM讀選通信號輸出 |
3.2.2單片機最小系統STC89C52的最小系統由三個部分組成,晶振電路部分、復位電路部分、電源電路等三個部分組成。 晶振電路包括2個30pF的電容C2和C3,以及12M的晶振X1。電容的作用在這里是起振作用,幫助晶振更容易的起振,取值范圍是15-33pF。晶振的取值也可以是24M,晶振的取值越高,單片機的執行速度越快。在進行電路設計的時候,晶振部分越靠近單片機越好。 單片機復位電路就好比電腦的重啟部分,當電腦在使用中出現死機,按下重啟按鈕電腦內部的程序從頭開始執行。單片機也一樣,當單片機系統在運行中,受到環境干擾出現程序跑飛的時候,按下復位按鈕內部的程序自動從頭開始執行。 復位電路由10uF的極性電容C1和10K的電阻R4構成。利用電容電壓不能突變的性質,可以知道,當系統一上電,RESET腳將會出現高電平,并且這個高電平持續的時間由電路的RC值來決定。典型的51單片機當RESET腳的高電平持續兩個機器周期以上就將復位,所以適當組合RC的取值就可以保證可靠的復位。 最后一個是電源部分,采用5V的USB直接供電,可采用手機充電器、電腦USB口、移動電源等設備進行供電。 此外,除了單片機最小系統的3個部分之外,這里還多了一些外部電路。 由于STC89C51的P0口是漏極開路輸出,因此在P0口接了一個10K的排阻R1,使得P0口可以作為普通的I/O口使用,本設計用P0口來做液晶的數據口。 特別注意的是,對于31腳(EA),當接高電平時,單片機在復位后從內部ROM的0000H開始執行;當接低電平時,復位后直接從外部ROM的0000H開始執行。由于我們的程序存儲在了單片機內部,所以EA要接高電平,保證單片機是從內部讀取程序去執行的。 3.3DHT11數字傳感器 3.3.1DHT11數字溫濕度傳感器 DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為4針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。 3.3.2 DHT11引腳DHT11有四個引腳,3號引腳一般懸空,如圖2-3所示。DHT11的供電電壓為3—5.5V。傳感器上電后,要等待1s以越過不穩定狀態在此期間無需發送任何指令。電源引腳(VDD,GND)之間可增加一個100nF的電容,用以去耦濾波。建議連接線長度短于20米時用5K上拉電阻,大于20米時根據實際情況使用合適的上拉電阻。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png 3.3.3DHT11電路DHT11一共引出四個引腳,其中一個接VCC,一個接GND,剩下兩個分別接到單片機的IO口。在本設計中,把DHT11的2引腳接到單片機的P21口。電路圖如圖所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image007.jpg 3.4 液晶顯示電路3.4.1 1602液晶簡介液晶顯示器是一種顯示器件,具有小體積、輕重量、低功耗等特色。由于其功耗低、顯示的信息量大(例如,文本,圖形,曲線等)、無電磁輻射、使用壽命長,它已被廣泛應用在便攜式電子產品。 本系統顯示采用了工業字符型液晶模塊1602,可顯示2行16個字符,能方便顯示英文字母大小寫、阿拉伯數字、常用符號等。通過自定義還可顯示簡單的漢字。在通信系統,智能操作儀表和辦公設備的自動化中被廣泛的應用,主要功能是顯示ASCII字符,因此被稱為“字符型顯示裝置”。1602液晶分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應用中并無差別,兩者尺寸差別如下圖(圖4-10)所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg 圖4-10 液晶尺寸說明 1602LCD主要技術參數: ◆顯示容量:16×2個字符 ◆芯片工作電壓:4.5—5.5V ◆工作電流:2.0mA(5.0V) ◆模塊最佳工作電壓:5.0V ◆字符尺寸:2.95×4.35(W×H)mm 3.4.2液晶引腳說明1602的引腳如表4-3所示: 編號 | 符號 | 引腳說明 | 編號 | 符號 | 引腳說明 | 1 | VSS | 電源地 | 9 | D2 | 數據 | 2 | VCC | 電源正極 | 10 | D3 | 數據 | 3 | VO | 液晶顯示偏壓 | 11 | D4 | 數據 | 4 | RS | 數據/命令選擇 | 12 | D5 | 數據 | 5 | R/W | 讀/寫選擇 | 13 | D6 | 數據 | 6 | EN | 使能信號 | 14 | D7 | 數據 | 7 | D0 | 數據 | 15 | BLA | 背光源正極 | 8 | D1 | 數據 | 16 | BLK | 背光源負極 |
表4-3 1602液晶引腳說明 第一腳:接地電源VSS。 第二腳:5V正電源為VCC。 第三腳:VO為液晶顯示器對比度調整的端口,對比度的強弱由接電源的不同決定,對比度的調整可以通過一個10k的電位器。 第四腳:RS是寄存器選擇,高電平表示數據寄存器,低電平表示指令寄存器。 第五腳:R / W的讀和寫信號線,高電平為讀操作,低電平為寫操作。其中RS與R/W的關系決定了當時狀態。例如兩端共同為0時能夠寫入命令或者顯示其地址,當兩端同為1時可以讀忙碌信號,當RS為1,R/W為0時能夠將數據錄入。 第六腳:使能端EN,當EN端由1至0時,液晶模塊中的命令開始被運行。 第七至十四腳:D0-D7為8位雙向數據線。 第十五腳:背光源正極。 第十六腳:背光源負極。 3.4.3指令介紹(1)清屏指令 指令如表4-4所示 表4-4 清屏指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpg 功能: 1)能夠將液晶顯示內容刪除,就是講DDRAM所有內容都添加進“空白”的 ASCI碼20II; 2)能夠使光標回到原始位置,就是把光標重新擺放回液晶顯示屏的左上方; 3)把地址顯示器即AC的數值歸位零 (2)光標歸位指令 指令如表4-5所示 表4-5 光標歸位指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg 功能: 1)將光標重新擺放回顯示器的左上方; 2)地址計數器即AC的數值被設為零; 3)DDRAM所有的內容將保持原內容不會變化; (3)進入模式設置指令 指令如表4-6所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg表4-6 進入模式設置指令功能表 功能: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg當輸入一位數據之后光標移動的方向將被設置,參數設定的情況如下: (4)顯示開關設置指令 指令如表4-7所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg表4-7 顯示開關設置指令功能表 功能: 能夠控制顯示器的開關與否,光標的顯示或者關閉,光標是否需要閃爍,參數 設定的情況如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpg (5)設定顯示屏或光標移動方向指令 指令如表4-8所示 表4-8 設定顯示屏或光標移動方向指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg 功能: 將光標移動或者整個顯示屏幕移動位置,參數設定的情況如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image021.jpg (6)功能設定指令 指令如表4-9所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image023.jpg表4-9 功能設定指令功能表 功能: 數據總線的位數何所顯示出來的行數字型將被設定,參數設定情況如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg (7)設定CGRAM地址指令 指令如表4-10所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg表4-10 設定CGRAM地址指令功能表 功能: 下一次被存入數據的CGRAM地址將被設置,字符號為DB5DB4DB3即未來顯 示此字符的時候被采用的字符的地址(000-111)可同時定義八個字符,行號為 DB2DB1DB0 (000-111)八行。 (8)設定DDRAM地址指令 指令如表4-11所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg表4-11 設定DDRAM地址指令功能表 功能: 下一次要存入數據的DDRAM地址將被設置。 (9)讀取忙或AC地址指令 指令如表4-12所示 表4-12 讀取忙或AC地址指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg 功能: 下一次要存入數據的DDRAM地址將被設置。 1)HF(忙碌信號)讀取,假如液晶顯示器忙碌的時候則BF=1,暫時不能接收被單片機送出的數據和指令,當BF=0的時候則相反。 2)地址計數器(AC)內容被接收。 (10)數據寫入DDRAM或者CGRAM指令 指令如表4-13所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg表4-13 數據寫入DDRAM或者CGRAM指令指令功能表 功能: 1)DREAM被寫入字符碼,液晶顯示屏隨即顯示出相應的字符; 2)OGRAM被存入由使用者設計的圖案 3.4.4液晶顯示模塊電路本液晶模塊的電路的連接圖如圖4-11所示。第1腳和第2腳分別接到了電路的GND和VCC,這2個腳是液晶工作的電源輸入腳。第3腳通過一個10K的電位器連接到地端,可通過調節該電位器來調節液晶的對比度。第4腳是液晶的寄存器控制腳,接到了單片機的P27腳上。第5腳是液晶的讀寫控制腳,直接接地。第6腳是液晶的使能腳,接到了單片機的P26腳上。第7腳到第14腳是液晶的數據/地址8位總線,接到了單片機的P0口上。最后第15腳和第16腳是液晶的背光電源腳,直接連接系統VCC和GND。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg 圖 4-11液晶模塊連接圖 3.6 STC89C52的系統時鐘設計時鐘電路是用來產生89C51單片機工作時所必須的時鐘信號,89C51本身就是一個復雜的同步時序電路,為保證工作方式的實現,89C51在唯一的時鐘信號的控制下嚴格的按時序執行指令進行工作,時鐘的頻率影響單片機的速度和穩定性。通常時鐘由于兩種形式:內部時鐘和外部時鐘。 我們系統采用內部時鐘方式來為系統提供時鐘信號。89C51內部有一個用于構成振蕩器的高增益反向放大器,該放大器的輸入輸出引腳為XTAL1和XTAL2,它們跨接在晶體振蕩器和用于微調的電容,便構成了一個自激勵振蕩器。 電路中的C1、C2的選擇在30PF左右,但電容太小會影響振蕩的頻率、穩定性和快速性。晶振頻率為在1.2MHZ~12MHZ之間,頻率越高單片機的速度就越快,但對存儲器速度要求就高。為了提高穩定性我們采用溫度穩定性好的NPO電容,采用的晶振頻率為12MHZ。時鐘電路如圖所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg 時鐘復位電路 第4章 軟件設計4.1 程序語言及開發環境 C語言是一種計算機程序設計語言,它既具有高級語言的特點,又具有匯編語言的特點。它由美國貝爾實驗室的Dennis M. Ritchie于1972年推出,1978年后,C語言已先后被移植到大、中、小及微型機上,它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬件的應用程序。它的應用范圍廣泛,具備很強的數據處理能力,不僅僅是在軟件開發上,而且各類科研都需要用到C語言,適于編寫系統軟件、三維、二維圖形和動畫,具體應用例如單片機以及嵌入式系統開發。 Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境將這些部分組合在一起。運行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統。如果你使用C語言編程,那么Keil幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環境、強大的軟件仿真調試工具也會令你事半功倍。 4.2 程序流程圖4.2.1總體流程圖程序開始后,先對液晶模塊顯示進行初始化,通過延時一秒等待DHT11溫濕度傳感器啟動。DHT11溫濕度傳感器啟動后,對其進行數據初始化后,進行溫濕度信息的采集、轉化、處理,最后通過液晶顯示器讀出。DHT11溫濕度傳感器經過一次數據采集和處理后需返回次延時程序處理來重新初始化后采集溫濕度數據。具體流程圖如圖所示:
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image038.png |
4.2.2 1602液晶程序設計液晶開始顯示之前,必須先確定一個位置,表示要在哪個地方顯示,比如第1行第5列的位置。在完成坐標定位之后就可以開始顯示內容了。液晶在顯示的時候,是一位一位完成的。比如數字“123”,就會先顯示百位的“1”,然后是十位的“2”,最后是個位的“3”。顯示字符串的話,也是一樣的道理,比如顯示“hello”,也是從最開始的字母“h”開始顯示,一位一位的完成,直到顯示完字母“o”,才完成一次顯示任務。要說明的是,每次顯示一串字符或一個數字的時候,只需在最開始的時候完成一次定位,之后每顯示完一個字符,液晶會自動跳到下一個位置的,無需每個字符都定位一次。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image039.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image040.png 開始
|
|
|
|
|
|
| |
|
| |
|
|
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image041.png |
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image042.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image043.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image044.png file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image045.png
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image046.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image047.png file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image048.png
圖5-2液晶顯示流程圖 液晶顯示子函數:
voidwrite_shu(uchar x,uchar y,uchar num)//數據顯示函數 { uchar s,g; if(y==0) lcd_write_com(0x80+x); else lcd_write_com(0xc0+x); s=num/10;// 數據分離顯示 lcd_write_data(0x30+s); g=num%10;//數據分離顯示 lcd_write_data(0x30+g); } ucharwrite_byte1() //讀一個字節 { uchari,comdata,temp1; for(i=0;i<8;i++) { FLAG=2; while((!dat)&&FLAG++);//判斷數據位是0還是1 Delay_10us(); Delay_10us(); Delay_10us(); temp1=0; if(dat)temp1=1; // 如果高電平高過預定0高電平值則數據位為 1 FLAG=2; while((dat)&&FLAG++);//flag先與后加1 如果dat一直為1 uchar型變量 flag 溢出變為0 再自加1 if(FLAG==1)break; //超時則跳出for循環 comdata<<=1;//左移一位 高位在前 低位在后 comdata|=temp1; } return (comdata); }
5.2.4溫度傳感器程序設計讀取溫度值的流程圖如圖5-4所示,首先是初始化傳感器,相當于是一次復位的過程,由于本設計只接了一個傳感器,因此無需區別傳感器的序列號,直接發一個指令0xcc跳過ROM尋找,接著發一個0x44的指令給傳感器,讓傳感器啟動溫度轉換。然后再次復位傳感器,接著還是一樣的跳過ROM指令0xcc,再往下就是發0xbe給傳感器準備讀取傳感器的檢測結果,最后就是讀取傳感器返回的檢測結果。
|
|
|
|
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image049.png |
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image050.png |
圖5-4 溫度傳感器程序流程圖 溫度傳感器子程序:
void DHT11_5() //讀5個字節數據 兩個字節為溫度數據 兩個字節為濕度數據 最后一個字節為校驗 { uchar i,temp; //主機拉低18ms dat=0; Delay_t(180); dat=1; //總線由上拉電阻拉高 主機延時20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主機設為輸入 判斷從機響應信號 dat=1; //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行 if(!dat) //T ! { FLAG=2; //超時標志位 while((!dat)&&FLAG++);//判斷從機是否發出 80us 的低電平響應信號是否結束 FLAG=2; while( (dat)&&FLAG++);//判斷從機拉高80us是否結束 for(i=0;i<5;i++)//數據接收狀態 { DHT11=write_byte1(); } dat=1; //釋放數據總線 為下一次讀取做好準備 temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]); if(temp==DHT11[4]) //數據校驗 { RTflag=1; } if(RTflag==1) //如果RTflag=1 說明讀取到得數據正確 { RTflag=0; // tm[0]=DATARHT[0]/10; // tm[1]=DATARHT[0]%10; // tm[2]=DATARHT[1]/10; //濕度 // tm[3]=DATARHT[2]/10; // tm[4]=DATARHT[2]%10; // tm[5]=DATARHT[3]/10; //溫度 //write_str(0,0,"measurement");//第一行顯示濕度 write_str(3,0,"shidu:");//第一行顯示濕度 write_shu(9,0,DHT11[0]); write_str(11,0,"%"); //write_str(0,1,"Temperature");//第二行為顯示溫度 write_str(3,1,"wendu:");//第二行為顯示溫度 write_shu(9,1,DHT11[2]); write_str(11,1,"^C"); } } } void lcdinit() { uchar i; lcd_write_com(0x80+2); for(i=0;i<11;i++) { lcd_write_data(table1); delay(50); } lcd_write_com(0x80+0x40+1); for(i=0;i<13;i++) { lcd_write_data(table2); delay(50); } } void main() { lcd_init(); //1602初始化 //delay(1000); //等待DHT11溫濕度傳感器數據穩定 開始激活DHT11 lcdinit(); delay(5000); lcd_write_com(0x01); while(1)//循環讀取 并更新數據顯示 {
目錄 第1章 緒論... 6 1.1 本課題的背景及研究意義... 6 1.2 國內外現狀... 6 1.3 總體設計思路... 7 第2章 總體設計... 7 2.1 方案選擇... 7 2.1.1控制芯片的選擇... 7 2.1.2溫濕度傳感器模塊的選擇... 7 第3章 系統硬件電路設計... 8 3.1 整體方案設計... 8 3.1.1系統概述... 8 3.1.2系統框圖... 8 3.2 單片機最小系統電路... 8 3.2.1單片機介紹... 8 3.2.2單片機最小系統... 11 3.3 DHT11數字傳感器... 12 3.3.1 DHT11數字溫濕度傳感器... 12 3.3.2 DHT11引腳... 12 3.3.3 DHT11電路... 13 3.4 液晶顯示電路... 13 3.4.1 1602液晶簡介... 13 3.4.2液晶引腳說明... 14 3.4.3指令介紹... 15 3.4.4液晶顯示模塊電路... 18 3.6 STC89C52的系統時鐘設計... 19 第4章 軟件設計... 20 4.1 程序語言及開發環境... 20 4.2 程序流程圖... 20 4.2.1總體流程圖... 20 4.2.2 1602液晶程序設計... 21 5.2.4溫度傳感器程序設計... 22 第5章 總結分析... 24 參考文獻... 26 附 錄 27 附錄1 原理圖... 27 附錄2 源程序... 27 附錄3 實物圖(正、反面)... 32 附錄4 元件清單... 33 附錄5 小組分工與合作... 33
第1章 緒論1.1 本課題的背景及研究意義20世紀末,電子技術獲得了飛速的發展,在其推動下,現在電子產品幾乎滲透了社會的各個領域,有力地推動了社會生產力的發展和社會信息化程度的提高,同時也使現代電子產品性能進一步提高,產品更新換代的節奏也越來越快。時間對人們來說總是那么寶貴,工作的忙碌性和繁雜性容易使人忘記當前的時間。忘記了要做的事情,當事情不是很重要的時候,這種遺忘無傷大雅。但是一旦重要事情,一時的耽誤可能釀成大禍。 目前單片機正朝著高性能和多品種方向發展,趨勢將是進一步向著CMOS化、低功耗、小體積、大容量、高性能、低價格和外圍電路內裝化等幾個方面發展。下面是單片機的主要發展趨勢。單片機應用的重要意義在于,它從根本上改變了傳統的控制系統設計思想和設計方法。從前必須由模擬電路或數字電路實現大部分功能,現在已經能用單片機通過軟件方法來實現了。這種軟件代替硬件的控制技術也稱為微控制技術,是傳統控制技術的一次革命。 溫度、濕度和人類的生產、生活有著密切的關系,同時也是工業生產中最常見的基本參數,例如機械、電子、石油、化工等各類工業中廣泛要求對溫度、濕度進行檢測與控制。隨著人們生活水平的提高,人們對自己的生存環境越來越關注,而空氣中溫濕度的變化對人體的舒適度和情緒有著直接的影響,所以對溫濕度的檢測及控制就十分有必要了。 1.2 國內外現狀溫度、濕度是工業農業生產不可求二少的考慮因素,但傳統的方法是用溫度表、毛發溫度表、雙金屬式測量機以及溫度試紙等測試器材,通過人工檢測,對不符合溫度和濕度要求的庫房進行通風、降溫和去濕等工作。這種人工測試方法費時費力、效率低、且測試的溫度及濕度誤差大,又具有較大的不確定性。而含有微型計算機或者微處理器的測量儀器,由于它擁有對數據儲存,運算邏輯判斷及自動化功能,有著只能功能,很快得到人們的青睞和關注。 模擬集成溫度傳感器是在20世紀80年代問世的,他是將溫度傳感器集成一個芯片上,可完成溫度測量及模擬信號輸出功能的專用IC。模擬集成溫度傳感器的主要特點是測量溫度誤差小、價格低、響應速度快、傳輸距離遠、體積小、微功耗等,適合遠距離測溫、控溫,不需要進行非線性校準,外圍電路簡單。他是目前在國內外應用最為普遍的一種集成傳感器。 1.3 總體設計思路選取單片機作為系統的主控部件,根據主控機的指令對溫度進行實時采集并通過液晶顯示部分及時將測量結果顯示出來。因策,如何準確獲得被測信號以及對被控對象狀態的監察是單片機的核心人物。傳感器是實現測量與控制的首要換屆,對于溫濕度計,系統應具有兩大傳感模塊:即溫度傳感器模塊和濕度傳感器模塊。 此外,在微型計算機控制系統中,應該設計液晶顯示模塊,將溫度和濕度的數據顯示出來,為了安全生產,對于一些重要的參數或系統部位,應當設有緊急狀態報警模塊,但由于本設計是一個家用的溫濕度計,因此設計得較為簡潔。 第2章 總體設計2.1 方案選擇2.1.1控制芯片的選擇
方案一:采用STC89C52單片機,支持串口編程,計算速度快,用戶程序空間(flash)8K,內部帶有帶電可擦寫可編程讀寫存儲器(EEPROM)。 方案二:采用AT89C51單片機,只能通過專用硬件編程器編程,用戶程序空間小,性價比低,計算速度較STC89C52單片機慢。 STC89C52是STC公司生產的一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統可編程Flash存儲器。STC89C52使用經典的MCS-51內核,但做了很多的改進使得芯片具有傳統51單片機不具備的功能。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得STC89C52為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。因此本設計用STC89C52單片機作為控制器。 2.1.2溫濕度傳感器模塊的選擇
方案一:采用DTH11 方案二:采用SHT11 方案比較:DHT11核心部件采用濕敏電阻,其成本低,穩定性差,SHT11核心部件采用濕敏電容,成本高,穩定性好。通過成本比較,選擇方案一DTH11。
第3章 系統硬件電路設計3.1 整體方案設計3.1.1系統概述整個系統以STC89C52單片機為核心器件,配合電阻電容晶振等器件,構成單片機的最小系統。其它個模塊圍繞著單片機最小系統展開。溫濕度采集模塊,檢測當前環境的溫度值,并對并把溫濕度數據傳輸給單片機;顯示模塊,采用1602液晶作為顯示模塊,負責顯示測量到的濕度值和溫度值;最后一個是電源模塊,采用5V的USB供電,本系統如需移動測量時,可采用移動電源進行供電。 3.1.2系統框圖file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
3.2 單片機最小系統電路3.2.1單片機介紹(1)概述 STC89C52是一個低電壓,高性能CMOS 8位單片機,片內含8k bytes的可反復擦寫的Flash只讀程序存儲器和512bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置通用8位中央處理器和Flash存儲單元,功能強大的STC89C52單片機可為您提供許多較復雜系統控制應用場合。 STC89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2個讀寫口線。STC89C52有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應不同產品的需求。 (2)主要功能特性 ◆兼容MCS51指令系統;◆8k可反復擦寫(>1000次)Flash ROM; ◆32個雙向I/O口; ◆512字節RAM ;◆3個16位可編程定時/計數器中斷;◆時鐘頻率0-24MHz; ◆內置4KB EEPROM;◆全雙工串行口◆4個外部中斷源; ◆共8個中斷源;◆2個讀寫中斷口線; ◆3級加密位; ◆低功耗空閑和掉電模式; ◆軟件設置睡眠和喚醒功能;
(3)8051單片機的引腳功能 MCS-51系列單片機一般采用40個引腳,雙列直插式封裝,用HMOS工藝制造,其外部引腳排列如圖4-1所示。其中,各引腳的功能為: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.jpg 圖4-1 STC89C52引腳圖 ① 主電源引腳 VCC(40腳),接+5V電源正端; GND(20腳),接+5V電源地端; ② 外接晶體或外部振蕩器引腳 XTAL1(19腳),接外部晶振的一個引腳。在單片機內部,它是一個反相放大器 的輸入端。當采用外部振蕩器時,此引腳應接 地。 XTAL2(18腳),接外部晶振的另一個引腳。在片內接至反相放大器的輸出端和 內部時鐘電路的輸入端。當采用外部振蕩器時,此腳接外部振蕩器的輸出端。 ③ 控制信號線 RESET(9腳),復位信號輸入端,復位/掉電時內部RAM的備用電源輸入端。 ALE(30腳),地址鎖存允許/編程脈沖輸入,用ALE鎖存從P0口輸出的低8 位地址。在對片內EPROM編程時,編程脈沖由此輸入。 PSEN(29腳),外部程序存儲器讀選通信號,低電平有效。 EA(31腳),訪問外部存儲器允許/編程電壓輸入。EA為高電平時,訪問內部存 儲器;低電平時,訪問外部存儲器。 ④ 多功能I/O口引腳 8051單片機設有4個雙向I/O口(P0、P1、P2、P3),每一組I/O口線都可以獨立地用作輸入或輸出口,其中: P0口(32~39腳)——雙向口(三態),可作為輸入/輸出口,可驅動8個LSTTL門電路。實際應用中常作為分時使用的地址/數據總線口,對外部程序或數據存儲器尋址時低8位地址與數據總線分時使用P0口:先送低8位地址信號到P0口,由地址鎖存信號ALE的下降沿將地址信號鎖存到地址鎖存器后,再作為數據總線的口線對數據進行輸入或輸出。 P1口(1~8腳)——準雙向口(三態),可驅動4個LSTTL門電路。用作 輸入線時,口鎖存器必須由單片機先寫入“1”,每一位都可編程為輸入或輸出 線。 P2口(21~28)——準雙向口(三態),可驅動4個LSTTL門電路?勺 為輸入/輸出口,實際應用中一般作為地址總線的高8位,與P0口一起組成16 位地址總線,用于對外部存儲器的接口電路進行尋址。 P3口(10~17腳)——準雙向口(三態),可驅動4個LSTTL門電路。雙 功能口,作為第一功能使用時,與P1口一樣;作為第二功能使用時,每一 位都有特定用途,其特殊用途如表4.1所示: 表4.1 P3口第二用途 端口引腳 | 第二功能 | 注 釋 | P3.0 | RXD | 串行口數據接收端 | P3.1 | TXD | 串行口數據發送端 | P3.2 | /INT0 | 外中斷請求0 | P3.3 | /INT1 | 外中斷請求1 | P3.4 | T0 | 定時/計數器0外部計數信號輸入 | P3.5 | T1 | 定時/計數器1外部計數信號輸入 | P3.6 | /WR | 外部RAM寫選通信號輸出 | P3.7 | /RD | 外部RAM讀選通信號輸出 |
3.2.2單片機最小系統STC89C52的最小系統由三個部分組成,晶振電路部分、復位電路部分、電源電路等三個部分組成。 晶振電路包括2個30pF的電容C2和C3,以及12M的晶振X1。電容的作用在這里是起振作用,幫助晶振更容易的起振,取值范圍是15-33pF。晶振的取值也可以是24M,晶振的取值越高,單片機的執行速度越快。在進行電路設計的時候,晶振部分越靠近單片機越好。 單片機復位電路就好比電腦的重啟部分,當電腦在使用中出現死機,按下重啟按鈕電腦內部的程序從頭開始執行。單片機也一樣,當單片機系統在運行中,受到環境干擾出現程序跑飛的時候,按下復位按鈕內部的程序自動從頭開始執行。 復位電路由10uF的極性電容C1和10K的電阻R4構成。利用電容電壓不能突變的性質,可以知道,當系統一上電,RESET腳將會出現高電平,并且這個高電平持續的時間由電路的RC值來決定。典型的51單片機當RESET腳的高電平持續兩個機器周期以上就將復位,所以適當組合RC的取值就可以保證可靠的復位。 最后一個是電源部分,采用5V的USB直接供電,可采用手機充電器、電腦USB口、移動電源等設備進行供電。 此外,除了單片機最小系統的3個部分之外,這里還多了一些外部電路。 由于STC89C51的P0口是漏極開路輸出,因此在P0口接了一個10K的排阻R1,使得P0口可以作為普通的I/O口使用,本設計用P0口來做液晶的數據口。 特別注意的是,對于31腳(EA),當接高電平時,單片機在復位后從內部ROM的0000H開始執行;當接低電平時,復位后直接從外部ROM的0000H開始執行。由于我們的程序存儲在了單片機內部,所以EA要接高電平,保證單片機是從內部讀取程序去執行的。
3.3DHT11數字傳感器
3.3.1DHT11數字溫濕度傳感器
DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為4針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。 3.3.2 DHT11引腳DHT11有四個引腳,3號引腳一般懸空,如圖2-3所示。DHT11的供電電壓為3—5.5V。傳感器上電后,要等待1s以越過不穩定狀態在此期間無需發送任何指令。電源引腳(VDD,GND)之間可增加一個100nF的電容,用以去耦濾波。建議連接線長度短于20米時用5K上拉電阻,大于20米時根據實際情況使用合適的上拉電阻。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png
3.3.3DHT11電路DHT11一共引出四個引腳,其中一個接VCC,一個接GND,剩下兩個分別接到單片機的IO口。在本設計中,把DHT11的2引腳接到單片機的P21口。電路圖如圖所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image007.jpg
3.4 液晶顯示電路3.4.1 1602液晶簡介液晶顯示器是一種顯示器件,具有小體積、輕重量、低功耗等特色。由于其功耗低、顯示的信息量大(例如,文本,圖形,曲線等)、無電磁輻射、使用壽命長,它已被廣泛應用在便攜式電子產品。 本系統顯示采用了工業字符型液晶模塊1602,可顯示2行16個字符,能方便顯示英文字母大小寫、阿拉伯數字、常用符號等。通過自定義還可顯示簡單的漢字。在通信系統,智能操作儀表和辦公設備的自動化中被廣泛的應用,主要功能是顯示ASCII字符,因此被稱為“字符型顯示裝置”。1602液晶分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應用中并無差別,兩者尺寸差別如下圖(圖4-10)所示:
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg
圖4-10 液晶尺寸說明 1602LCD主要技術參數: ◆顯示容量:16×2個字符 ◆芯片工作電壓:4.5—5.5V ◆工作電流:2.0mA(5.0V) ◆模塊最佳工作電壓:5.0V ◆字符尺寸:2.95×4.35(W×H)mm 3.4.2液晶引腳說明1602的引腳如表4-3所示:
編號 | 符號 | 引腳說明 | 編號 | 符號 | 引腳說明 | 1 | VSS | 電源地 | 9 | D2 | 數據 | 2 | VCC | 電源正極 | 10 | D3 | 數據 | 3 | VO | 液晶顯示偏壓 | 11 | D4 | 數據 | 4 | RS | 數據/命令選擇 | 12 | D5 | 數據 | 5 | R/W | 讀/寫選擇 | 13 | D6 | 數據 | 6 | EN | 使能信號 | 14 | D7 | 數據 | 7 | D0 | 數據 | 15 | BLA | 背光源正極 | 8 | D1 | 數據 | 16 | BLK | 背光源負極 |
表4-3 1602液晶引腳說明
第一腳:接地電源VSS。 第二腳:5V正電源為VCC。 第三腳:VO為液晶顯示器對比度調整的端口,對比度的強弱由接電源的不同決定,對比度的調整可以通過一個10k的電位器。 第四腳:RS是寄存器選擇,高電平表示數據寄存器,低電平表示指令寄存器。 第五腳:R / W的讀和寫信號線,高電平為讀操作,低電平為寫操作。其中RS與R/W的關系決定了當時狀態。例如兩端共同為0時能夠寫入命令或者顯示其地址,當兩端同為1時可以讀忙碌信號,當RS為1,R/W為0時能夠將數據錄入。 第六腳:使能端EN,當EN端由1至0時,液晶模塊中的命令開始被運行。 第七至十四腳:D0-D7為8位雙向數據線。 第十五腳:背光源正極。 第十六腳:背光源負極。 3.4.3指令介紹(1)清屏指令 指令如表4-4所示 表4-4 清屏指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpg
功能: 1)能夠將液晶顯示內容刪除,就是講DDRAM所有內容都添加進“空白”的 ASCI碼20II; 2)能夠使光標回到原始位置,就是把光標重新擺放回液晶顯示屏的左上方; 3)把地址顯示器即AC的數值歸位零 (2)光標歸位指令 指令如表4-5所示 表4-5 光標歸位指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg
功能: 1)將光標重新擺放回顯示器的左上方; 2)地址計數器即AC的數值被設為零; 3)DDRAM所有的內容將保持原內容不會變化; (3)進入模式設置指令 指令如表4-6所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg表4-6 進入模式設置指令功能表
功能: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg當輸入一位數據之后光標移動的方向將被設置,參數設定的情況如下:
(4)顯示開關設置指令 指令如表4-7所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg表4-7 顯示開關設置指令功能表
功能: 能夠控制顯示器的開關與否,光標的顯示或者關閉,光標是否需要閃爍,參數 設定的情況如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpg
(5)設定顯示屏或光標移動方向指令 指令如表4-8所示 表4-8 設定顯示屏或光標移動方向指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
功能: 將光標移動或者整個顯示屏幕移動位置,參數設定的情況如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image021.jpg
(6)功能設定指令 指令如表4-9所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image023.jpg表4-9 功能設定指令功能表
功能: 數據總線的位數何所顯示出來的行數字型將被設定,參數設定情況如下: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
(7)設定CGRAM地址指令 指令如表4-10所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg表4-10 設定CGRAM地址指令功能表
功能: 下一次被存入數據的CGRAM地址將被設置,字符號為DB5DB4DB3即未來顯 示此字符的時候被采用的字符的地址(000-111)可同時定義八個字符,行號為 DB2DB1DB0 (000-111)八行。 (8)設定DDRAM地址指令 指令如表4-11所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg表4-11 設定DDRAM地址指令功能表
功能: 下一次要存入數據的DDRAM地址將被設置。 (9)讀取忙或AC地址指令 指令如表4-12所示 表4-12 讀取忙或AC地址指令功能表 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg
功能: 下一次要存入數據的DDRAM地址將被設置。 1)HF(忙碌信號)讀取,假如液晶顯示器忙碌的時候則BF=1,暫時不能接收被單片機送出的數據和指令,當BF=0的時候則相反。 2)地址計數器(AC)內容被接收。 (10)數據寫入DDRAM或者CGRAM指令 指令如表4-13所示 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg表4-13 數據寫入DDRAM或者CGRAM指令指令功能表
功能: 1)DREAM被寫入字符碼,液晶顯示屏隨即顯示出相應的字符; 2)OGRAM被存入由使用者設計的圖案 3.4.4液晶顯示模塊電路本液晶模塊的電路的連接圖如圖4-11所示。第1腳和第2腳分別接到了電路的GND和VCC,這2個腳是液晶工作的電源輸入腳。第3腳通過一個10K的電位器連接到地端,可通過調節該電位器來調節液晶的對比度。第4腳是液晶的寄存器控制腳,接到了單片機的P27腳上。第5腳是液晶的讀寫控制腳,直接接地。第6腳是液晶的使能腳,接到了單片機的P26腳上。第7腳到第14腳是液晶的數據/地址8位總線,接到了單片機的P0口上。最后第15腳和第16腳是液晶的背光電源腳,直接連接系統VCC和GND。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg
圖 4-11液晶模塊連接圖 3.6 STC89C52的系統時鐘設計時鐘電路是用來產生89C51單片機工作時所必須的時鐘信號,89C51本身就是一個復雜的同步時序電路,為保證工作方式的實現,89C51在唯一的時鐘信號的控制下嚴格的按時序執行指令進行工作,時鐘的頻率影響單片機的速度和穩定性。通常時鐘由于兩種形式:內部時鐘和外部時鐘。 我們系統采用內部時鐘方式來為系統提供時鐘信號。89C51內部有一個用于構成振蕩器的高增益反向放大器,該放大器的輸入輸出引腳為XTAL1和XTAL2,它們跨接在晶體振蕩器和用于微調的電容,便構成了一個自激勵振蕩器。 電路中的C1、C2的選擇在30PF左右,但電容太小會影響振蕩的頻率、穩定性和快速性。晶振頻率為在1.2MHZ~12MHZ之間,頻率越高單片機的速度就越快,但對存儲器速度要求就高。為了提高穩定性我們采用溫度穩定性好的NPO電容,采用的晶振頻率為12MHZ。時鐘電路如圖所示: file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg 時鐘復位電路
第4章 軟件設計4.1 程序語言及開發環境 C語言是一種計算機程序設計語言,它既具有高級語言的特點,又具有匯編語言的特點。它由美國貝爾實驗室的Dennis M. Ritchie于1972年推出,1978年后,C語言已先后被移植到大、中、小及微型機上,它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬件的應用程序。它的應用范圍廣泛,具備很強的數據處理能力,不僅僅是在軟件開發上,而且各類科研都需要用到C語言,適于編寫系統軟件、三維、二維圖形和動畫,具體應用例如單片機以及嵌入式系統開發。 Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境將這些部分組合在一起。運行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統。如果你使用C語言編程,那么Keil幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環境、強大的軟件仿真調試工具也會令你事半功倍。 4.2 程序流程圖4.2.1總體流程圖程序開始后,先對液晶模塊顯示進行初始化,通過延時一秒等待DHT11溫濕度傳感器啟動。DHT11溫濕度傳感器啟動后,對其進行數據初始化后,進行溫濕度信息的采集、轉化、處理,最后通過液晶顯示器讀出。DHT11溫濕度傳感器經過一次數據采集和處理后需返回次延時程序處理來重新初始化后采集溫濕度數據。具體流程圖如圖所示:
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image038.png |
4.2.2 1602液晶程序設計液晶開始顯示之前,必須先確定一個位置,表示要在哪個地方顯示,比如第1行第5列的位置。在完成坐標定位之后就可以開始顯示內容了。液晶在顯示的時候,是一位一位完成的。比如數字“123”,就會先顯示百位的“1”,然后是十位的“2”,最后是個位的“3”。顯示字符串的話,也是一樣的道理,比如顯示“hello”,也是從最開始的字母“h”開始顯示,一位一位的完成,直到顯示完字母“o”,才完成一次顯示任務。要說明的是,每次顯示一串字符或一個數字的時候,只需在最開始的時候完成一次定位,之后每顯示完一個字符,液晶會自動跳到下一個位置的,無需每個字符都定位一次。 file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image039.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image040.png 開始
|
|
|
|
|
|
| |
|
| |
|
|
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image041.png |
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image042.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image043.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image044.png file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image045.png
file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image046.pngfile:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image047.png file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image048.png
圖5-2液晶顯示流程圖 液晶顯示子函數:
voidwrite_shu(uchar x,uchar y,uchar num)//數據顯示函數
{
uchar s,g;
if(y==0)
lcd_write_com(0x80+x);
else
lcd_write_com(0xc0+x);
s=num/10;// 數據分離顯示
lcd_write_data(0x30+s);
g=num%10;//數據分離顯示
lcd_write_data(0x30+g);
}
ucharwrite_byte1() //讀一個字節
{
uchari,comdata,temp1;
for(i=0;i<8;i++)
{
FLAG=2;
while((!dat)&&FLAG++);//判斷數據位是0還是1
Delay_10us();
Delay_10us();
Delay_10us();
temp1=0;
if(dat)temp1=1; // 如果高電平高過預定0高電平值則數據位為 1
FLAG=2;
while((dat)&&FLAG++);//flag先與后加1 如果dat一直為1 uchar型變量 flag 溢出變為0 再自加1
if(FLAG==1)break; //超時則跳出for循環
comdata<<=1;//左移一位 高位在前 低位在后
comdata|=temp1;
}
return (comdata);
}
5.2.4溫度傳感器程序設計讀取溫度值的流程圖如圖5-4所示,首先是初始化傳感器,相當于是一次復位的過程,由于本設計只接了一個傳感器,因此無需區別傳感器的序列號,直接發一個指令0xcc跳過ROM尋找,接著發一個0x44的指令給傳感器,讓傳感器啟動溫度轉換。然后再次復位傳感器,接著還是一樣的跳過ROM指令0xcc,再往下就是發0xbe給傳感器準備讀取傳感器的檢測結果,最后就是讀取傳感器返回的檢測結果。
|
|
|
|
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image049.png |
|
| file:///C:/Users/YEMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image050.png |
圖5-4 溫度傳感器程序流程圖 溫度傳感器子程序:
void DHT11_5() //讀5個字節數據 兩個字節為溫度數據 兩個字節為濕度數據 最后一個字節為校驗
{
uchar i,temp;
//主機拉低18ms
dat=0;
Delay_t(180);
dat=1;
//總線由上拉電阻拉高 主機延時20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機設為輸入 判斷從機響應信號
dat=1;
//判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(!dat) //T !
{
FLAG=2; //超時標志位
while((!dat)&&FLAG++);//判斷從機是否發出 80us 的低電平響應信號是否結束
FLAG=2;
while(
(dat)&&FLAG++);//判斷從機拉高80us是否結束
for(i=0;i<5;i++)//數據接收狀態
{
DHT11=write_byte1();
}
dat=1; //釋放數據總線 為下一次讀取做好準備
temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
if(temp==DHT11[4]) //數據校驗
{
RTflag=1;
}
if(RTflag==1) //如果RTflag=1 說明讀取到得數據正確
{
RTflag=0;
// tm[0]=DATARHT[0]/10;
// tm[1]=DATARHT[0]%10;
// tm[2]=DATARHT[1]/10; //濕度
// tm[3]=DATARHT[2]/10;
// tm[4]=DATARHT[2]%10;
// tm[5]=DATARHT[3]/10; //溫度
//write_str(0,0,"measurement");//第一行顯示濕度 write_str(3,0,"shidu:");//第一行顯示濕度 write_shu(9,0,DHT11[0]);
write_str(11,0,"%");
//write_str(0,1,"Temperature");//第二行為顯示溫度 write_str(3,1,"wendu:");//第二行為顯示溫度 write_shu(9,1,DHT11[2]);
write_str(11,1,"^C"); }
}
} void lcdinit() { uchar i; lcd_write_com(0x80+2); for(i=0;i<11;i++) { lcd_write_data(table1); delay(50); } lcd_write_com(0x80+0x40+1); for(i=0;i<13;i++) { lcd_write_data(table2); delay(50); } } void main()
{
lcd_init(); //1602初始化
//delay(1000); //等待DHT11溫濕度傳感器數據穩定 開始激活DHT11 lcdinit(); delay(5000); lcd_write_com(0x01); while(1)//循環讀取 并更新數據顯示
{
delay(1000);//等待DHT11溫濕度傳感器數據穩定 開始激活DHT11
write_byte1();//讀一個字節
DHT11_5(); //讀數據
delay(1000); //延時等待
}
}
delay(1000);//等待DHT11溫濕度傳感器數據穩定 開始激活DHT11 write_byte1();//讀一個字節 DHT11_5(); //讀數據 delay(1000); //延時等待 } }
|