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