摘 要 溫度和濕度是兩個(gè)最基本的環(huán)境參數(shù),與人們的生活息息相關(guān)。在工農(nóng)業(yè)生產(chǎn)、氣象、環(huán)保、國(guó)防、科研等部門,經(jīng)常需要對(duì)環(huán)境溫度和濕度進(jìn)行測(cè)量和控制。準(zhǔn)確測(cè)量溫濕度在生物制藥、食品加工、造紙等行業(yè)更是至關(guān)重要。因此研究溫濕度的測(cè)量和控制方法具有重要的意義。 本設(shè)計(jì)實(shí)現(xiàn)的是單片機(jī)溫濕度測(cè)量和控制系統(tǒng),通過(guò)LCD顯示所測(cè)量的溫濕度。系統(tǒng)采用集溫濕度傳感器與A/D轉(zhuǎn)換器于一體的SHT11芯片,通過(guò)單片機(jī)進(jìn)行處理顯示,其它模塊包括了實(shí)時(shí)時(shí)鐘/日期產(chǎn)生電路和超限報(bào)警處理電路,對(duì)測(cè)量的值進(jìn)行實(shí)時(shí)顯示和報(bào)警處理。文章介紹了基于ATMEL公司的AT89C51系列單片機(jī)的溫濕度實(shí)時(shí)測(cè)量與控制系統(tǒng)和顯示系統(tǒng)的設(shè)計(jì),包括介紹了硬件結(jié)構(gòu)原理,并分析了相應(yīng)的軟件的設(shè)計(jì)及其要點(diǎn),包括軟件設(shè)計(jì)流程及其程序的實(shí)現(xiàn)。系統(tǒng)結(jié)構(gòu)簡(jiǎn)單、實(shí)用,提高了測(cè)量精度和效率。 關(guān)鍵詞:AT89C51、SHT11、LCD、DS1302、溫濕度控制 ABSTRACT Temperature and humidityare two basic environmental parameters which are closely related to people’slives. In the industrial and agriculture production, meteorology, environmentalprotection, national defense, scientific research and other departments, weoften need to measure and control the temperature and humidity of theenvironment. Accurate measurement of temperature and humidity in thepharmaceutical, food processing, paper making and other sectors is essential. Sothe method of temperature and humidity control and measurement is of greatsignificance. The design implementationof measurement and control temperature and humidity is MCU system, throughwhich the temperature and humidity measurement LCD. System adopts settemperature and humidity sensor and A/D converter for SHT11 chipmicrocontroller processing, through that other modules including real-timedisplay and alarm. The paper introduces the ATMEL company based on AT89C51 single-chip series of temperature andhumidity measurement and control system and real-time display system design,including the hardware structure and principle, and the corresponding softwaredesign, including the design of the software and its key process and procedure.System structure is simple, practical, and improve the measuring precision andefficiency. Key words: AT89c51, SHT11、LCD、DS1302、temperature and humiditycontrol
目 錄
第1章 緒 論 1.1 研究的目的及意義 溫度和濕度與人們的生活息息相關(guān)。在工農(nóng)業(yè)生產(chǎn)、氣象、環(huán)保、國(guó)防、科研等部門,經(jīng)常需要對(duì)環(huán)境溫度與濕度進(jìn)行測(cè)量及控制。準(zhǔn)確測(cè)量溫濕度在生物制藥、食品加工、造紙等行業(yè)都是至關(guān)重要的。傳統(tǒng)的溫度計(jì)是用水銀柱來(lái)顯示的,它的精確度不高,不易讀數(shù)。而采用單片機(jī)對(duì)溫濕度進(jìn)行控制,不僅具有控制方便、簡(jiǎn)單和靈活等優(yōu)點(diǎn),而且可以大幅度提高溫濕度控制的技術(shù)指標(biāo)。用LCD來(lái)顯示溫濕度的數(shù)字看起來(lái)更加直觀。 采用SHT11數(shù)字溫濕度傳感器作為檢測(cè)元件,能夠同時(shí)測(cè)試溫度和濕度。SHT11傳感器可以直接讀出被測(cè)的溫濕度值。同時(shí)單片機(jī)可以把測(cè)量出的數(shù)據(jù)通過(guò)串口傳到計(jì)算機(jī)上,來(lái)完成工業(yè)中的自動(dòng)控制,給工業(yè)生產(chǎn)帶來(lái)了極大的便利。用單片機(jī)控制的溫濕度計(jì)不僅硬件電路簡(jiǎn)單,而且測(cè)量精度比較高。用液晶顯示測(cè)量值看起來(lái)比較美觀。 無(wú)論在日常生活中還是在工業(yè)、農(nóng)業(yè)方面都離不開對(duì)周圍環(huán)境進(jìn)行溫濕度的測(cè)量。因此,研究溫濕度的測(cè)量具有非常重要的意義。 1.2 國(guó)內(nèi)外研究情況 測(cè)量溫濕度的關(guān)鍵是溫濕度傳感器。過(guò)去測(cè)量溫度與濕度是分開的。隨著技術(shù)的進(jìn)步和人們生活的需要出現(xiàn)了溫濕度共測(cè)的傳感器。溫度傳感器的發(fā)展經(jīng)歷了3個(gè)階段:傳統(tǒng)的分立式溫度傳感器、模擬集成溫度傳感器、智能集成溫度傳感器。目前,國(guó)際上新型溫度傳感器正從模擬式向數(shù)字式、從集成化向智能化、網(wǎng)絡(luò)化的方向發(fā)展。溫度傳感器也是經(jīng)歷了這樣一個(gè)階段逐漸走向數(shù)字智能化。 現(xiàn)今國(guó)內(nèi)外用的最多的溫濕度傳感器是SHTXX系列。SHT11溫濕度傳感器應(yīng)用于專利的工業(yè)COMS過(guò)程微加工技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長(zhǎng)期穩(wěn)定性。傳感器包括一個(gè)電容式聚合體測(cè)濕元件和一個(gè)能隙式測(cè)溫元件,并與一個(gè)14位的A/D轉(zhuǎn)換器以及串行接口電路在同一芯片上實(shí)現(xiàn)無(wú)縫鏈接,從而具有超快響應(yīng),抗干擾能力強(qiáng),性價(jià)比極高等優(yōu)點(diǎn)。 采用SHT11數(shù)字溫濕度傳感器與單片機(jī)AT89C51相連比較容易,而且電路比較簡(jiǎn)單,軟件設(shè)計(jì)也比較簡(jiǎn)單。所以,本設(shè)計(jì)以SHT11數(shù)字溫濕度傳感器為例,介紹基于SHT11數(shù)字溫濕度傳感器的設(shè)計(jì),該設(shè)計(jì)適用于人們的日常生活及工農(nóng)業(yè)生產(chǎn)中用于溫濕度的測(cè)量。 1.3系統(tǒng)內(nèi)容的設(shè)計(jì) 1.3.1 系統(tǒng)的主要性能指標(biāo) 根據(jù)生活和一般工業(yè)環(huán)境,設(shè)計(jì)本產(chǎn)品的主要技術(shù)指標(biāo)為: ·測(cè)溫范圍:20—+80℃;濕度測(cè)量范圍為30—90%Rh ·溫度測(cè)量精度:±0.5oC ·濕度測(cè)量誤差:≤4%Rh ·可設(shè)置上、下限報(bào)警值,當(dāng)濕度溫度超限時(shí),發(fā)出報(bào)警信號(hào) ·電源工作范圍:DC4.5~5.5V 1.3.2 主要工作任務(wù) 根據(jù)本畢業(yè)設(shè)計(jì)實(shí)際的任務(wù)要求,選擇合適的溫濕度傳感器,完成溫濕度的測(cè)量,并設(shè)計(jì)顯示電路模塊、時(shí)鐘電路模塊、超限處理模塊、復(fù)位電路模塊的程序。系統(tǒng)開始工作后,根據(jù)初始條件讀取濕度值和溫度值,測(cè)量數(shù)據(jù)經(jīng)處理后,將其與設(shè)定的溫濕度值比較,如果發(fā)現(xiàn)當(dāng)前的溫濕度超限,則發(fā)出報(bào)警信號(hào),未超限時(shí),系統(tǒng)顯示正常的濕溫度度值。 1.4方案論證 方案一:采用單總線的DS18B20的溫度傳感器和HS110X相對(duì)濕度傳感器組成測(cè)量和控制系統(tǒng)。 方案二:采用集溫濕度傳感器和A/D轉(zhuǎn)換器于一體的SHT11芯片構(gòu)成溫濕度的測(cè)量和控制系統(tǒng)。 由于傳統(tǒng)的模擬式溫濕度傳感器一般不僅要設(shè)計(jì)信號(hào)調(diào)理電路,還要進(jìn)行復(fù)雜的校準(zhǔn)和標(biāo)定過(guò)程,其測(cè)量精度難以保證,并且使用分立的溫度傳感器和濕度傳感器測(cè)量電路比較麻煩。而SHT11是具有二線串行接口的單片全校準(zhǔn)數(shù)字式新型相對(duì)濕度和溫度傳感器,集溫濕度傳感器和A/D轉(zhuǎn)換器于一體,可用來(lái)測(cè)量相對(duì)濕度、溫度和露點(diǎn)等參數(shù),具有數(shù)字式輸出、免調(diào)試、免標(biāo)定、免外圍電路及全互換的特點(diǎn),使用起來(lái)比較方便,且電路簡(jiǎn)單。該傳感器將CMOS芯片技術(shù)與傳感器技術(shù)融合,為開發(fā)高集成度、高精度、高可靠性的溫濕度測(cè)控系統(tǒng)提供了解決方案。因此本設(shè)計(jì)采用方案二。 本設(shè)計(jì)核心部件為AT89C51,信號(hào)采集及處理部分由SHT11構(gòu)成,進(jìn)入單片機(jī)經(jīng)處理后通過(guò)LCD1604顯示溫濕度,信號(hào)顯示采用的液晶屏為5×7點(diǎn)陣,一行可顯示16字,四行。其他組成部分為實(shí)時(shí)時(shí)鐘發(fā)生電路,產(chǎn)生與現(xiàn)在相同的時(shí)間和具體日期,通過(guò)LCD1604液晶模塊顯示。 在軟件設(shè)計(jì)部分有對(duì)測(cè)量的溫濕度進(jìn)行上下值的設(shè)定,當(dāng)測(cè)量超過(guò)限定值時(shí),通過(guò)超限報(bào)警處理電路對(duì)其進(jìn)行處理,分別顯示不同的二極管燈亮,蜂鳴器產(chǎn)生長(zhǎng)鳴。 硬件中包括一個(gè)開關(guān),為復(fù)位開關(guān)。開機(jī)后,所有器件初始化,DS1302產(chǎn)生實(shí)時(shí)時(shí)間和日期,溫濕度傳感器SHT11開始進(jìn)行溫濕度測(cè)量和計(jì)算,最后通過(guò)兩個(gè)LCD液晶顯示器顯示結(jié)果。在測(cè)量結(jié)果中有超過(guò)設(shè)定的溫濕度上下限的,通過(guò)超限模塊做出反應(yīng)。 電路主要包括了AT89C51控制模塊、SHT11溫濕度測(cè)量模塊、DS1302時(shí)間模塊、LCD顯示模塊、超限處理模塊。其他是一些附件,比如復(fù)位、晶振電路。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif 圖1.1 整體電路框圖
第2章 工具簡(jiǎn)介 系統(tǒng)單片機(jī)代碼采用C語(yǔ)言編寫,并用Keil軟件檢查程序有無(wú)錯(cuò)誤,在Proteus仿真軟件上進(jìn)行仿真。 2.1 C語(yǔ)言 2.1.1 C語(yǔ)言的優(yōu)點(diǎn) C語(yǔ)言的運(yùn)算符豐富,它包括的范圍相當(dāng)廣泛,使得C語(yǔ)言的運(yùn)算類型極其豐富,并且表達(dá)方式的類型多樣化,能夠?qū)崿F(xiàn)在高級(jí)語(yǔ)言中不能實(shí)現(xiàn)的運(yùn)算,它有32個(gè)關(guān)鍵字,9種控制語(yǔ)句。和匯編語(yǔ)言一樣,它能夠?qū)ξ,字?jié)和地址進(jìn)行操作;數(shù)據(jù)類型很豐富,能實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)類型,同時(shí)還加入了指針的概念,使得效率更高,同時(shí)支持圖形編輯,以及多種顯示器等;它所應(yīng)用的結(jié)構(gòu)式語(yǔ)言,這種方式會(huì)讓程序有層次,一目了然,同時(shí)語(yǔ)法顯示不嚴(yán)格,設(shè)計(jì)自由度高;C語(yǔ)言提供給用戶的方式是一函數(shù)的形式,它們可以方便調(diào)用,使得程序完全結(jié)構(gòu)化;地址的訪問(wèn)上,能夠訪問(wèn)物理地址,對(duì)硬件進(jìn)行直接操作;適用范圍廣,能夠適用于多種操作,例如:DOS、UNIX等,同時(shí)適用于多種機(jī)型。 2.1.2 C語(yǔ)言的缺點(diǎn) 它的缺點(diǎn)主要是數(shù)據(jù)封裝的安全性不高,因此這一點(diǎn)也成為了C語(yǔ)言和C++的最大的區(qū)別,另一方面由于語(yǔ)法以及變量的類型沒(méi)有嚴(yán)格限制,也造成了較低的安全性,再者從應(yīng)用角度來(lái)說(shuō),它比較其他的高級(jí)語(yǔ)言來(lái)說(shuō)較為難以掌握。 2.2Proteus簡(jiǎn)介 Proteus軟件是來(lái)自英國(guó)Labcenter electronics公司的EDA工具軟件,Proteus軟件有十多年的歷史,在全球廣泛使用,除了其具有和其它EDA工具一樣的原理布圖、PCB自動(dòng)或人工布線及電路仿真的功能外,其革命性的功能是,他的電路仿真是互動(dòng)的,針對(duì)微處理器的應(yīng)用,還可以直接在基于原理圖的虛擬原型上編程,并實(shí)現(xiàn)軟件源碼級(jí)的實(shí)時(shí)調(diào)試,如有顯示及輸出,還能看到運(yùn)行后輸入輸出的效果,配合系統(tǒng)配置的虛擬儀器如示波器、邏輯分析儀等。 Proteus組合了高級(jí)原理布圖、混合模式SPICE仿真,PCB設(shè)計(jì)以及自動(dòng)布線來(lái)實(shí)現(xiàn)一個(gè)完整的電子設(shè)計(jì)系統(tǒng)。此系統(tǒng)受益于15年來(lái)的持續(xù)開發(fā),被《電子世界》在其對(duì)PCB設(shè)計(jì)系統(tǒng)的比較文章中評(píng)為最好產(chǎn)品—“The Route to PCB CAD”。Proteus 產(chǎn)品系列也包含了革命性的VSM技術(shù),用戶可以對(duì)基于微控制器的設(shè)計(jì)連同所有的周圍電子器件一起仿真。用戶甚至可以實(shí)時(shí)采用諸如LED/LCD、鍵盤、 RS232終端等動(dòng)態(tài)外設(shè)模型來(lái)對(duì)設(shè)計(jì)進(jìn)行交互仿真。 其功能模塊:一個(gè)易用而又功能強(qiáng)大的ISIS原理布圖工具;PROSPICE混合模型SPICE仿真;ARES PCB設(shè)計(jì)。 PROSPICE 仿真器的一個(gè)擴(kuò)展PROTEUS VSM:便于包括所有相關(guān)的器件的基于微處理器設(shè)計(jì)的協(xié)同仿真。此外,還可以結(jié)合微控制器軟件使用動(dòng)態(tài)的鍵盤,開 關(guān),按鈕,LEDs甚至LCD顯示CPU模型。 · 支持許多通用的微控制器,如PIC,AVR,HC11以及8051. 最新支持ARM · 交互的裝置模型包括:LED和LCD顯示,RS232終端,通用鍵盤,I2C,SPI器件 · 強(qiáng)大的調(diào)試工具,包括寄存器和存儲(chǔ)器,斷點(diǎn)和單步模式 · IAR C-SPY 和Keil uVision2等開發(fā)工具的源層調(diào)試 · 應(yīng)用特殊模型的DLL界面-提供有關(guān)元件庫(kù)的全部文件 最新版支持非常豐富仿真元件共7000多種,還有很多第三方模型。如MMC卡,以太網(wǎng)卡,ATA硬盤,麥克風(fēng),等等。 2.3Keil C51編譯器簡(jiǎn)介 2.3.1 8051開發(fā)工具 KEIL C51標(biāo)準(zhǔn)C編譯器為8051微控制器的軟件開發(fā)提供了C語(yǔ)言環(huán)境,同時(shí)保留了匯編代碼高效,快速的特點(diǎn)。C51編譯器的功能不斷增強(qiáng),使你可以更加貼近CPU本身,及其它的衍生產(chǎn)品。C51已被完全集成到uVision2的集成開發(fā)環(huán)境中,這個(gè)集成開發(fā)環(huán)境包含:編譯器,匯編器,實(shí)時(shí)操作系統(tǒng),項(xiàng)目管理器,調(diào)試器。uVision2 IDE可為它們提供單一而靈活的開發(fā)環(huán)境。 2.3.2 uVision2集成開發(fā)環(huán)境 ① 項(xiàng)目管理 工程(project)是由源文件、開發(fā)工具選項(xiàng)以及編程說(shuō)明三部分組成的。一個(gè)單一的uVision2工程能夠產(chǎn)生一個(gè)或多個(gè)目標(biāo)程序。產(chǎn)生目標(biāo)程序的源文件構(gòu)成“組”。開發(fā)工具選項(xiàng)可以對(duì)應(yīng)目標(biāo),組或單個(gè)文件。 uVision2包含一個(gè)器件數(shù)據(jù)庫(kù)(device database),可以自動(dòng)設(shè)置匯編器、編譯器、連接定位器及調(diào)試器選項(xiàng),來(lái)滿足用戶充分利用特定微控制器的要求。此數(shù)據(jù)庫(kù)包含:片上存儲(chǔ)器和外圍設(shè)備的信息,擴(kuò)展數(shù)據(jù)指針(extra data pointer)或者加速器(math accelerator)的特性。 uVision2可以為片外存儲(chǔ)器產(chǎn)生必要的連接選項(xiàng):確定起始地址和規(guī)模。 ② 編輯器和調(diào)試器 uVision2編輯器包含了所有用戶熟悉的特性。彩色語(yǔ)法顯像和文件辯識(shí)都對(duì)C源代碼進(jìn)行和優(yōu)化?梢栽诰庉嬈鲀(nèi)調(diào)試程序,它能提供一種自然的調(diào)試環(huán)境,使得可以更快速地檢查和修改程序。 ③ C51編譯器 KEILC51編譯器在遵循ANSI標(biāo)準(zhǔn)的同時(shí),為8051微控制器系列特別設(shè)計(jì)。語(yǔ)言上的擴(kuò)展能讓用戶使用應(yīng)用中的所有資源。 1)存儲(chǔ)器和特殊功能寄存器的存取 C51編譯器可以實(shí)現(xiàn)對(duì)8051系列所有資源的操作。SFR的存取由sfr和sbit兩個(gè)關(guān)鍵字來(lái)提供。變量可旋轉(zhuǎn)到任一個(gè)地址空間。用關(guān)鍵字-at-還能把變量放入固定的存儲(chǔ)器存儲(chǔ)模式(大,中,小)決定了變量的存儲(chǔ)類型。連接定位器支持的代碼區(qū)可達(dá)32個(gè),這就允許用戶在原有64K ROM的8015基礎(chǔ)上擴(kuò)展程序。在V2的編譯器和許多高性能仿真器中,可以支持應(yīng)用程序的調(diào)試。 2)中斷功能 C51允許用戶使用C語(yǔ)言編寫中斷服務(wù)程序,快速進(jìn)、出代碼和寄存器區(qū)的轉(zhuǎn)換功能使C語(yǔ)言中斷功能更加高效?稍偃牍δ苁怯藐P(guān)鍵字來(lái)定義的。多任務(wù),中斷或非中斷的代碼要求必須具備可再入功能。 3)靈活的指針 C51提供了靈活高效的指針。 通用指針用3個(gè)字節(jié)來(lái)存儲(chǔ)存儲(chǔ)器類型及目標(biāo)地址,可以在8051的任意存儲(chǔ)區(qū)內(nèi)存取任何變量。 特殊指針在聲明的同時(shí)已指定了存儲(chǔ)器類型,指向某一特定的存儲(chǔ)區(qū)域。由 于地址的存儲(chǔ)只需1-2字節(jié),因此,指針存取非常迅速。
第3章 硬件設(shè)計(jì) 3.1芯片介紹 3.1.1 單片機(jī)——AT89C51 AT89C51是一種帶4k字節(jié)可編程可擦除只讀存儲(chǔ)器(FPEROM—Falsh Programmable and Erasable ReadOnly Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機(jī)。89C2051是一種帶2K字節(jié)可編程可擦除只讀存儲(chǔ)器的單片機(jī)。單片機(jī)的可擦除只讀存儲(chǔ)器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲(chǔ)器組合在單個(gè)芯片中,ATMEL的89C51是一種高效微控制器,89C2051是它的一種精簡(jiǎn)版本。89C51單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。 ① 主要特性:
·與MCS-51 兼容 ·4K字節(jié)可編程閃爍存儲(chǔ)器 ·壽命:1000寫/擦循環(huán) ·數(shù)據(jù)保留時(shí)間:10年 ·全靜態(tài)工作:0Hz-24Hz ·三級(jí)程序存儲(chǔ)器鎖定 ·128*8位內(nèi)部RAM ·32可編程I/O線 ·兩個(gè)16位定時(shí)器/計(jì)數(shù)器 ·5個(gè)中斷源 ·可編程串行通道 ·低功耗的閑置和掉電模式 ·片內(nèi)振蕩器和時(shí)鐘電路
② 管腳說(shuō)明: VCC:供電電壓 GND:接地 P0口:P0口為一個(gè)8位漏級(jí)開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FLASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FLASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。 P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接 收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH 編程和校驗(yàn)時(shí),P1口作為第八位地址接收。 P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作 為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢(shì), 當(dāng)對(duì)外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號(hào)和控制信號(hào)。 P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 P3口也可作為AT89C51的一些特殊功能口,如下表所示: 表3.1.1 P3口管腳備選功能 P3口同時(shí)為閃爍編程和編程校驗(yàn)接收一些控制信號(hào)。 RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。 ALE/PROG:當(dāng)訪問(wèn)外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的 低位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不 變的頻率周期輸出正脈沖信號(hào),此頻率為振蕩器頻率的1/6。因此它可用作對(duì)外 部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲(chǔ)器時(shí), 將跳過(guò)一個(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時(shí), ALE 只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果 微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無(wú)效。 /PSEN:外部程序存儲(chǔ)器的選通信號(hào)。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),這兩次有效的/PSEN信 號(hào)將不出現(xiàn)。 /EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000H-FFFFH), 不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET;當(dāng) /EA端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器。在FLASH編程期間,此引腳也用于 施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。 XTAL2:來(lái)自反向振蕩器的輸出。 ③ 振蕩器特性: XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時(shí)鐘源驅(qū)動(dòng)器件,XTAL2 應(yīng)不接。輸入至內(nèi)部時(shí)鐘信號(hào)要通過(guò)一個(gè)二分頻觸發(fā)器,因此對(duì)外部時(shí)鐘信號(hào)的 脈寬無(wú)任何要求,但必須保證脈沖的高低電平要求的寬度。 ④ 芯片擦除: 整個(gè)PEROM陣列和三個(gè)鎖定位的電擦除可通過(guò)正確的控制信號(hào)組合,并保持ALE管腳處于低電平10ms 來(lái)完成。在芯片擦操作中,代碼陣列全被寫“1”且在任何非空存儲(chǔ)字節(jié)被重復(fù)編程以前,該操作必須被執(zhí)行。 此外,AT89C51設(shè)有穩(wěn)態(tài)邏輯,可以在低到零頻率的條件下靜態(tài)邏輯,支持兩種軟件可選的掉電模式。在閑置模式下,CPU停止工作。但RAM,定時(shí)器,計(jì)數(shù)器、串口和中斷系統(tǒng)仍在工作。在掉電模式下,保存RAM的內(nèi)容并且凍結(jié)振蕩器,禁止所用其他芯片功能,直到下一個(gè)硬件復(fù)位為止。 ⑤ 結(jié)構(gòu)特點(diǎn):
· 8位CPU; · 片內(nèi)振蕩器和時(shí)鐘電路; · 32根I/O線; · 布爾處理器; · 外部存貯器尋址范圍ROM、RAM64K; · 2個(gè)16位的定時(shí)器/計(jì)數(shù)器; · 5個(gè)中斷源,兩個(gè)中斷優(yōu)先級(jí); · 全雙工串行口;
3.1.2 LCD顯示——LCD1604 ① LCD1604原理 1604采用標(biāo)準(zhǔn)的16腳接口,其中: 1腳:VSS為地電源 2腳:VDD接5V正電源 3腳:V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高,對(duì)比度過(guò)高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過(guò)一個(gè)10K的電位器調(diào)整對(duì)比度。 4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。 5腳:RW為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和RW共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平RW為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平RW為低電平時(shí)可以寫入數(shù)據(jù)。 6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令 7~14腳:D0~D7為8位雙向數(shù)據(jù)線 15~16腳:空腳 1604液晶模塊內(nèi)部的控制器共有11條控制指令,如表3.1.2所示, 表3.1.21604液晶指令表 指 令 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 顯示數(shù)據(jù)存儲(chǔ)器地址(ADD) | | | | | | | | | | | | | |
它的讀寫操作、屏幕和光標(biāo)的操作都是通過(guò)指令編程來(lái)實(shí)現(xiàn)的。(說(shuō)明:1為高電平、0為低電平) 指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置 指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H 指令3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無(wú)效 指令4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無(wú)光 標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍 指令5:光標(biāo)或顯示移位 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo) 指令6:功能設(shè)置命令 DL:低電平時(shí)為4位總線,高電平時(shí)為8位總線 N: 低電平時(shí)為單行顯示,高電平時(shí)雙行顯示 F: 低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符 指令7:字符發(fā)生器RAM地址設(shè)置 指令8:DDRAM地址設(shè)置 指令9:讀忙信號(hào)和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊 不能接收命令或者數(shù)據(jù),如果為低電平表示不忙 指令10:寫數(shù)據(jù) 指令11:讀數(shù)據(jù) ② LCD1604初始化 延時(shí)15mS寫指令38H(不檢測(cè)忙信號(hào))、延時(shí)5mS寫指令38H(不檢測(cè)忙信號(hào))、延時(shí)5mS寫指令38H(不檢測(cè)忙信號(hào));以后每次寫指令、讀/寫數(shù)據(jù)操作均需要檢測(cè)忙信號(hào)。 寫指令38H:顯示模式設(shè)置 寫指令08H:顯示關(guān)閉 寫指令01H:顯示清屏 寫指令06H:顯示光標(biāo)移動(dòng)設(shè)置 寫指令0CH:顯示開及光標(biāo)設(shè)置 3.1.3 DS1302原理及應(yīng)用 DS1302是DALLAS公司推出的涓流充電時(shí)鐘芯片,內(nèi)含有一個(gè)實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)靜態(tài)RAM,通過(guò)簡(jiǎn)單的串行接口與單片機(jī)進(jìn)行通信。實(shí)時(shí)時(shí)鐘/日歷電路提供秒分時(shí)日、日期月年的信息。每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整,時(shí)鐘操作可通過(guò)AM/PM指示決定采用24或12小時(shí)格式。DS1302與單片機(jī)之間能簡(jiǎn)單地采用同步串行的方式進(jìn)行通信僅需用到三個(gè)口線:RES復(fù)位、I/O數(shù)據(jù)線、 SCLK串行時(shí)鐘。時(shí)鐘/RAM的讀/寫數(shù)據(jù)以一個(gè)字節(jié)或多達(dá)31個(gè)字節(jié)的字符組方式通信,DS1302工作時(shí)功耗很低,保持?jǐn)?shù)據(jù)和時(shí)鐘信息時(shí)功率小于1mW。 DS1302是由DS1202改進(jìn)而來(lái),增加了以下的特性:雙電源管腳用于主電源和備份電源供應(yīng);Vcc1為可編程涓流充電電源;附加七個(gè)字節(jié)存儲(chǔ)器;它廣泛應(yīng)用于電話傳真便攜式儀器以及電池供電的儀器儀表等產(chǎn)品領(lǐng)域。下面將主要的性能指標(biāo)作一綜合: · 實(shí)時(shí)時(shí)鐘具有能計(jì)算2100年之前的秒分時(shí)日日期星期月年的能力還有閏年調(diào)整的能力 ·31×8位暫存數(shù)據(jù)存儲(chǔ)RAM ·串行I/O口方式使得管腳數(shù)量最少 ·寬范圍工作電壓2.0-5.5V ·工作電流2.0V時(shí),小于300nA ·讀/寫時(shí)鐘或RAM數(shù)據(jù)時(shí)有兩種傳送方式單字節(jié)傳送和多字節(jié)傳送字符組方式 ·8腳DIP封裝或可選的8腳SOIC封裝根據(jù)表面裝配 ·簡(jiǎn)單3線接口 ·與TTL兼容(Vcc=5V) ·可選工業(yè)級(jí)溫度范圍-40~+85 ·與DS1202兼容 ·在DS1202基礎(chǔ)上增加的特性 --對(duì)Vcc1有可選的涓流充電能力 --雙電源管用于主電源和備份電源供應(yīng) --備份電源管腳可由電池或大容量電容輸入 --附加的7 字節(jié)暫存存儲(chǔ)器 ① DS1302的基本組成和工作原理 DS1302的管腳排列(圖3.1.1)及描述如下: 1)管腳描述:
X1、X2:32.768KHz晶振管腳 GND:地 RST:復(fù)位腳 I/O:數(shù)據(jù)輸入/輸出引腳 SCLK:串行時(shí)鐘 Vcc1、Vcc2:電源供電管腳
file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif 圖3.1.1 DS1302引腳圖 2) DS1302內(nèi)部寄存器 CH: 時(shí)鐘停止位 寄存器2 的第7 位12/24 小時(shí)標(biāo)志 CH=0 振蕩器工作允許 bit7=1,12 小時(shí)模式 CH=1 振蕩器停止 bit7=0,24 小時(shí)模式 WP: 寫保護(hù)位 寄存器2 的第5 位:AM/PM 定義 WP=0 寄存器數(shù)據(jù)能夠?qū)懭?nbsp; AP=1 下午模式 WP=1 寄存器數(shù)據(jù)不能寫入 AP=0 上午模式 TCS: 涓流充電選擇 DS: 二極管選擇位 TCS=1010使能涓流充電 DS=01 選擇一個(gè)二極管 TCS=其它 禁止涓流充電 DS=10 選擇兩個(gè)二極管 DS=00或11, 即使TCS=1010, 充電功能也被禁止 ② DS1302與微控制器的接口軟件及功能應(yīng)用舉例 下面首先給出基本的接口軟件然后舉例說(shuō)明各種功能的應(yīng)用 1) 寫保護(hù)寄存器操作 當(dāng)寫保護(hù)寄存器的最高位為0時(shí),允許數(shù)據(jù)寫入寄存器寫保護(hù),寄存器可以 通過(guò)命令字節(jié)8E、8F來(lái)規(guī)定禁止寫入/讀出寫保護(hù)位不能在多字節(jié)傳送模式下寫 入。 Write_Enable: MOVCommand,#8Eh;命令字節(jié)為8E MOVByteCnt,#1;單字節(jié)傳送模式 MOVR0,#XmtDat;數(shù)據(jù)地址覆給R0 MOVXmtDat,#00h;數(shù)據(jù)內(nèi)容為0 寫入允許 ACALLSend_Byte;調(diào)用寫入數(shù)據(jù)子程序 RET 返回調(diào)用本子程序處 當(dāng)寫保護(hù)寄存器的最高位為1時(shí)禁止數(shù)據(jù)寫入寄存器 Write_Disable: MOVCommand,#8Eh;命令字節(jié)為8E MOVByteCnt,#1;單字節(jié)傳送模式 MOVR0,#XmtDat;數(shù)據(jù)地址覆給R0 MOVXmtDat,#80h;數(shù)據(jù)內(nèi)容為80h 禁止寫入 ACALLSend_Byte;調(diào)用寫入數(shù)據(jù)子程序 RET 返回調(diào)用本子程序處 2) 時(shí)鐘停止位操作 當(dāng)把秒寄存器的第7位時(shí)鐘停止位設(shè)置為0時(shí)起動(dòng)時(shí)鐘開始。 Osc_Enable: MOVCommand,#80h;命令字節(jié)為80 MOVByteCnt,#1;單字節(jié)傳送模式 MOVR0,#XmtDat;數(shù)據(jù)地址覆給R0 MOVXmtDat,#00h;數(shù)據(jù)內(nèi)容為0 振蕩器工作允許 ACALLSend_Byte;調(diào)用寫入數(shù)據(jù)子程序 RET 返回調(diào)用本子程序處 當(dāng)把秒寄存器的第7位時(shí)鐘停止位設(shè)置為1時(shí),時(shí)鐘振蕩器停止HT1380進(jìn)入低功耗方式。 Osc_Disable: MOVCommand,#80h;命令字節(jié)為80 MOVByteCnt,#1;單字節(jié)傳送模式 MOVR0,#XmtDat;數(shù)據(jù)地址覆給R0 MOVXmtDat,#80h;數(shù)據(jù)內(nèi)容為80h 振蕩器停止 ACALLSend_Byte;調(diào)用寫入數(shù)據(jù)子程序 RET 返回調(diào)用本子程序處 3) 多字節(jié)傳送方式 當(dāng)命令字節(jié)為BE或BF時(shí),DS1302工作在多字節(jié)傳送模式,8個(gè)時(shí)鐘/日歷寄存器從寄存器0地址開始連續(xù)讀寫從0位開始的數(shù)據(jù)。當(dāng)命令字節(jié)為FE或FF時(shí),DS1302工作在多字節(jié)RAM傳送模式,31個(gè)RAM寄存器從0地址開始連續(xù)讀寫從0位開始的數(shù)據(jù)。例如寫入00年6月21日星期三13時(shí)59分59秒程序,設(shè)置如下: Write_Multiplebyte: MOVCommand,#0Beh;命令字節(jié)為BEh MOVByteCnt,#8;多字節(jié)寫入模式此模塊為8 個(gè) MOVR0,#XmtDat;數(shù)據(jù)地址覆給R0 MOVXmtDat,#59h;秒單元內(nèi)容為59h MOVXmtDat+1,#59h;分單元內(nèi)容為59h MOVXmtDat+2,#13h;時(shí)單元內(nèi)容為13h MOVXmtDat+3,#21h;日期單元內(nèi)容為21h MOVXmtDat+4,#06h;月單元內(nèi)容為06h MOVXmtDat+5,#03h;星期單元內(nèi)容為03h MOVXmtDat+6,#0;年單元內(nèi)容為00h MOVXmtDat+7,#0;寫保護(hù)單元內(nèi)容為00h ACALLSend_Byte;調(diào)用寫入數(shù)據(jù)子程序 RET 返回調(diào)用本子程序處 讀出寄存器0-7的內(nèi)容程序設(shè)置如下: Read_Multiplebyte; MOVCommand,#0BFh;命令字節(jié)為BFh MOVByteCnt,#8;多字節(jié)讀出模式此模塊為8 個(gè) MOVR1,#RcvDat;數(shù)據(jù)地址覆給R1 ACALLReceive_Byte;調(diào)用讀出數(shù)據(jù)子程序 RET返回調(diào)用本子程序處 以上程序調(diào)用了基本數(shù)據(jù)接收(Receive_Byte)模塊及一些內(nèi)存單元定義, 其源程序清單在附錄中給出下面的程序亦使用了這個(gè)模塊。 4) 單字節(jié)傳送方式 例如寫入8時(shí)12小時(shí)模式程序設(shè)置如下: Write_Singlebyte: MOVCommand,#84h;命令字節(jié)為84h MOVByteCnt,#1;單字節(jié)傳送模式 MOVR0,#XmtDat;數(shù)據(jù)地址覆給R0 MOVXmtDat,#88h;數(shù)據(jù)內(nèi)容為88h ACALLSend_Byte;調(diào)用寫入數(shù)據(jù)子程序 RET 返回調(diào)用本子程序處 上面所列出的程序模塊Write_Enable、 Write_Disable 、Osc_Enable 、 Osc_Disable與單字節(jié)寫入模塊Write_Singlebyte的程序架構(gòu)完全相同,僅只是幾個(gè)入口參數(shù)不同。此介紹是為了強(qiáng)調(diào)功能使用的不同才將其分為不同模塊,另外,與涓流充電相關(guān)的設(shè)定也是單字節(jié)操作方式,這里就不再單獨(dú)列出,用戶在使用中可靈活簡(jiǎn)略。下面模塊舉例說(shuō)明如何單字節(jié)讀出小時(shí)單元的內(nèi)容: Read_Singlebyte: MOVCommand,#85h; 命令字節(jié)為85h MOVByteCnt,#1;單字節(jié)傳送模式 MOVR1,#RcvDat;數(shù)據(jù)地址覆給R1 ACALLReceive_Byte;調(diào)用讀出數(shù)據(jù)子程序 RET 返回調(diào)用本子程序處 3.1.4溫濕度傳感器SHT11 ① SHT11簡(jiǎn)介 SHT11是瑞士Scnsirion 公司推出的一款數(shù)字溫濕度傳感器芯片。它集溫度傳感器和濕度傳感器于一體,因此采用SHT11 進(jìn)行溫濕度實(shí)時(shí)監(jiān)測(cè)的系統(tǒng)具有精度高、成本低、體積小、接口簡(jiǎn)單等優(yōu)點(diǎn);另外SHT11芯片內(nèi)部集成了14位A/D 轉(zhuǎn)換器,且采用數(shù)字信號(hào)輸出,因此抗干擾能力也比同類芯片高。該芯片在溫濕度監(jiān)測(cè)、自動(dòng)控制等領(lǐng)域均已得到廣泛應(yīng)用。其主要特點(diǎn)如下: ·高度集成,將溫度感測(cè)、濕度感測(cè)、信號(hào)變換、A/D 轉(zhuǎn)換和加熱器等功能集成到一個(gè)芯片上; ·提供二線數(shù)字串行接口SCK和DATA,接口簡(jiǎn)單,支持CRC 傳輸校驗(yàn),傳輸可靠性高; ·測(cè)量精度可編程調(diào)節(jié),內(nèi)置A/D 轉(zhuǎn)換器(分辨率為8~12位,可以通過(guò)對(duì)芯片內(nèi)部寄存器編程選擇); ·測(cè)量精確度高,由于同時(shí)集成溫濕度傳感器,可以提供溫度補(bǔ)償?shù)臐穸葴y(cè)量值和高質(zhì)量的露點(diǎn)計(jì)算功能; ·封裝尺寸超小(7.62 mm×5.08mm×2.5 mm),測(cè)量和通信結(jié)束后,自動(dòng)轉(zhuǎn)入低功耗模式; ·高可靠性,采用CMOSens工藝,測(cè)量時(shí)可將感測(cè)頭完全浸于水中。 ② SHT11引腳功能 SHT11溫濕度傳感器采用SMD(LCC)表面貼片封裝形式,接口非常簡(jiǎn)單,引腳 名稱及排列順序如圖3.1.2所示。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image003.gif 圖3.1.2 SHT11引腳圖 各引腳的功能如下: ·腳1和4--信號(hào)地和電源,其工作電壓范圍是2.4~5.5 V; ·腳2和腳3--二線串行數(shù)字接口,其中DA-TA為數(shù)據(jù)線,SCK為時(shí)鐘線; ·腳5~8--未連接。 ③ SHT11的內(nèi)部結(jié)構(gòu)和工作原理 溫濕度傳感器SHT11將溫度感測(cè)、濕度感測(cè)、信號(hào)變換、A/D轉(zhuǎn)換和加熱器等功能集成到一個(gè)芯片上,其內(nèi)部結(jié)構(gòu)如圖3.1.3所示。該芯片包括一個(gè)電容性聚合體濕度敏感元件和一個(gè)用能隙材料制成的溫度敏感元件。這兩個(gè)敏感元件分別將濕度和溫度轉(zhuǎn)換成電信號(hào),該電信號(hào)首先進(jìn)入微弱信號(hào)放大器進(jìn)行放大;然后進(jìn)入一個(gè)14位的A/D 轉(zhuǎn)換器;最后經(jīng)過(guò)二線串行數(shù)字接口輸出數(shù)字信號(hào)。SHT11在出廠前,都會(huì)在恒濕或恒溫環(huán)境巾進(jìn)行校準(zhǔn),校準(zhǔn)系數(shù)存儲(chǔ)在校準(zhǔn)寄存器中;在測(cè)量過(guò)程中,校準(zhǔn)系數(shù)會(huì)自動(dòng)校準(zhǔn)來(lái)自傳感器的信號(hào)。此外,SHT11內(nèi)部還集成了一個(gè)加熱元件,加熱元件接通后可以將SHT11 的溫度升高5℃左右,同時(shí)功耗也會(huì)有所增加。此功能主要為了比較加熱前后的溫度和濕度值,可以綜合驗(yàn)證兩個(gè)傳感器元件的性能。在高濕(>95%RH)環(huán)境中,加熱傳感器可預(yù)防傳感器結(jié)露,同時(shí)縮短響應(yīng)時(shí)間,提高精度。加熱后SHT11溫度升高、相對(duì)濕度降低,較加熱前,測(cè)量值會(huì)略有差異。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image004.gif 圖3.1.3 SHT內(nèi)部結(jié)構(gòu) 微處理器是通過(guò)二線串行數(shù)字接口與SHT11進(jìn)行通信的。微處理器對(duì)SHT11的控制是通過(guò)5個(gè)5位命令代碼來(lái)實(shí)現(xiàn)的,命令代碼的含義如表3.1.3所列。 表3.1.3 SHT11控制命令代碼 命令代碼 | | | | | | | | | | | 復(fù)位命令,使內(nèi)部寄存器恢復(fù)默認(rèn)值。下一次命令前至少等待11ms | | |
④ SHT11傳輸特性 1)濕度值輸出 SHT11可通過(guò)DATA數(shù)據(jù)總線直接輸出數(shù)字量濕度值。該濕度值稱為“相對(duì)濕度”,需要進(jìn)行線性補(bǔ)償和溫度補(bǔ)償后才能得到較為準(zhǔn)確的濕度值。由于相對(duì)濕度數(shù)字輸出特性呈一定的非線性,因此為了補(bǔ)償濕度傳感器的非線性,可按下式修正濕度值:file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif= file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image008.gif+file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image010.gif×file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image012.gif+file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image014.gif×file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image016.gif 式中:file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif為經(jīng)過(guò)線性補(bǔ)償后的濕度值,file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image012.gif為相對(duì)濕度測(cè)量值,C1、C2、C3 為線性補(bǔ)償系數(shù),取值如表3.1.4所列。 由于溫度對(duì)濕度的影響十分明顯,而實(shí)際溫度和測(cè)試參考溫度25℃有所不同,所以對(duì)線性補(bǔ)償后的濕度值進(jìn)行溫度補(bǔ)償很有必要。補(bǔ)償公式如下: file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image019.gif= (T-25)×(file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image021.gif+file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image023.gif×file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image012.gif)+file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif 式中:file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image019.gif為經(jīng)過(guò)線性補(bǔ)償和溫度補(bǔ)償后的濕度值,file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image027.gif為測(cè)試濕度值時(shí)的溫度(℃),file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image021.gif和file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image023.gif為溫度補(bǔ)償系數(shù),取值如表3.1.5所列。 表3.1.4 濕度線性補(bǔ)償系數(shù) 表3.1.5濕度值溫度補(bǔ)償系數(shù)
file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image012.gif | | | | | | | -2.8×file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image032.gif | | | | -7.2×file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image034.gif |
2)溫度值輸出 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image012.gif | file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image021.gif | file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image023.gif | | | | | | |
由于SHT11是采用PTAT能隙材料制成的溫度敏感元件,因而具有很好的線性輸出。實(shí)際溫度值可由下式算得: Temperature=d1+d2×SOT 式中:d1和d2為特定系數(shù),d1取值與SHT11工作電壓有關(guān),d2的取值則與SHT11內(nèi)部A/D轉(zhuǎn)換器采用的分辨率有關(guān),其對(duì)應(yīng)關(guān)系分別如表3.1.6和表3.1.7。 表3.1.6 d1與工作電壓的對(duì)應(yīng)關(guān)系
file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image039.gif | file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image041.gif℃ | file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image041.gif℉ | | | | | | | | | | | | | | | |
表3.1.7 d2與分辨率的對(duì)應(yīng)關(guān)系 S0 | file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image044.gif℃ | file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image044.gif℉ | | | | | | |
3)露點(diǎn)計(jì)算 露點(diǎn)是一個(gè)特殊的溫度值,是空氣保持某一定濕度必須達(dá)到的最低溫度。當(dāng)空氣的溫度低于露點(diǎn)時(shí),空氣容納不了過(guò)多的水分,這些水分會(huì)變成霧、露水或霜。露點(diǎn)可以根據(jù)當(dāng)前相對(duì)濕度值和溫度值計(jì)算得出,具體的計(jì)算公式如下: LogEW=0.66077+7.5×T/(237.3+T)+log10(file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image012.gif)-2 Dp=((0.66077-logEW)×237.3)/(logEW-8.16077) 式中:T為當(dāng)前溫度值,SORH為相對(duì)濕度值,Dp為露點(diǎn)。 3.2模塊功能介紹 3.2.1 復(fù)位電路部分 這種復(fù)位電路的工作原理是:?jiǎn)纹瑱C(jī)的復(fù)位電路在剛接通電時(shí),剛開始電容是沒(méi)有電的,電容內(nèi)的電阻很低,通電后,5V的電通過(guò)電阻給電容進(jìn)行充電,電容兩端的電會(huì)由0V慢慢的升到4V左右(此時(shí)間很短一般小于0.3秒),RC構(gòu)成的微分電路在上電瞬間產(chǎn)生一個(gè)微分脈沖,其寬度大于兩個(gè)機(jī)器周期,89C51將復(fù)位。正因?yàn)檫@樣,復(fù)位腳的電由低電位升到高電位,引起了內(nèi)部電路的復(fù)位工作,RST端電壓慢慢下降,降到一定電壓值以后,即為低電平,單片機(jī)開始正常工作(這是單片機(jī)的上電復(fù)位,也叫初始化復(fù)位);當(dāng)按下復(fù)位鍵時(shí),電容兩 端放電,電容又回到0V了,于是又進(jìn)行了一次復(fù)位工作(這是手動(dòng)復(fù)位原理)。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image046.jpg 圖3.2.1 手動(dòng)復(fù)位及晶振電路 3.2.2 DS1302時(shí)鐘電路模塊 此模塊是系統(tǒng)時(shí)間的實(shí)時(shí)顯示而設(shè)計(jì)的,主要由芯片DS1302構(gòu)成,其中引腳RST、CLK、I/O分別接單片機(jī)P3.0、P3.1、P3.2口,屬于控制引腳。此模塊是產(chǎn)生實(shí)時(shí)的系統(tǒng)時(shí)間和日歷,能對(duì)某個(gè)確定環(huán)境的實(shí)時(shí)溫濕度控制起到一定的作用。芯片連接電路簡(jiǎn)單,時(shí)間日期準(zhǔn)確。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image048.jpg 圖3.2.2 DS1302時(shí)鐘電路模塊 3.2.3 SHT11傳感器模塊 此模塊是整個(gè)電路設(shè)計(jì)的信號(hào)采集及初步處理的模塊,由溫濕度傳感器芯片SHT11構(gòu)成,主要的功能結(jié)構(gòu)在前面的芯片介紹中已有,這里不重新介紹。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image050.jpg 圖3.2.3 SHT11傳感器模塊 3.2.4 顯示電路模塊 此模塊分為兩個(gè)顯示部分,一個(gè)部分是由LCD1604芯片組成的日期時(shí)間和實(shí)時(shí)溫濕度顯示的電路部分,另一部分是由LCD128×64液晶顯示模塊組成的電路部分。LCD1604是一個(gè)四行每行16字的液晶顯示屏,D0-D7接P0口,RS、RW、E 接P3.5、P3.6、P3.7起控制作用。LCD128×64組成部分是用來(lái)顯示“溫度和濕度的控制與測(cè)量”的,其作用是讓人了解此實(shí)驗(yàn)的目的,作用不明顯,這里不做 重點(diǎn)介紹。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image052.jpg圖3.2.4 LCD1604(左)和LCD128×64(右)顯示及其連接電路 3.2.5 超限處理電路模塊 此部分電路是由5個(gè)發(fā)光二極管和一個(gè)蜂鳴報(bào)警器構(gòu)成,分別是D1、D2、D3、D4和D5,蜂鳴器接單片機(jī)的P1.0口,發(fā)光二極管與單片機(jī)的連接部分如圖3.2.5所示。D1、D2、D3、D4、D5分別代表著發(fā)光、降溫、加熱、干燥和加濕,一旦傳感器測(cè)定的溫濕度超過(guò)設(shè)定的限額,就會(huì)產(chǎn)生不同的發(fā)光反應(yīng),起警示作用,同時(shí)蜂鳴報(bào)警器連續(xù)發(fā)出“滴”的聲音。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image054.jpg 圖3.2.5 超限處理電路模塊 3.3整體電路圖 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image056.jpg 圖3.3.1 整體電路圖
第4章 軟件設(shè)計(jì) 編程軟件采用的是Keil uvision3軟件,程序采用C語(yǔ)言編程。軟件部分在Keil上運(yùn)行后,能正確顯示結(jié)果。具體模塊由一個(gè)C主函數(shù)文件和9個(gè)H文件構(gòu)成。 H文件如下所示:
reg51.h;(8051的相關(guān)參數(shù)初始化) absacc.h; intrins.h;(偽本征函數(shù)) math.h;(數(shù)學(xué)公式函數(shù)) 12864.h;(128×64液晶顯示函數(shù))LCD1604.h;(1604液晶顯示函數(shù)) DS1302.h;(實(shí)時(shí)時(shí)間/日期產(chǎn)生函數(shù)) SHT11.h;(溫濕度采集計(jì)算函數(shù)) set_key.h;(限額報(bào)警函數(shù))
4.1程序框圖 4.1.1 主程序框圖: file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image057.gif 圖4.1.1 主程序框圖 4.1.2 溫濕度采集及處理框圖: file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image058.gif 圖4.1.2 溫濕度采集及處理框圖 4.1.3 LCD顯示框圖: file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image059.gif 圖4.1.3 LCD顯示框圖 4.2主函數(shù)解析 #include<reg51.h> #include<absacc.h> #include<intrins.h> #include<math.h> #include<12864.h> #include<LCD1604.h> #include<DS1302.h> #include<SHT11.h> #include<set_key.h> void Delay1ms(unsigned intcount) //延時(shí)函數(shù) { unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); } main() { SYSTEMTIME CurrentTime; //定義時(shí)間日期結(jié)構(gòu)體 SHT_dat aa; //定義溫濕度測(cè)量處理結(jié)構(gòu)體 Init_12864(); //12864的顯示*/ Initial_DS1302(); //DS1302初始化*/ LCD_Initial(); //LCD初始化 GotoXY(0,0); //LCD顯示函數(shù) Print("Date:"); GotoXY(16,0); Print("Temper:"); GotoXY(0,1); Print("Time:"); GotoXY(16,1); Print("Humidi:"); while(1) { convert_SHT(&aa,TEMP); //溫度轉(zhuǎn)換 convert_SHT(&aa,HUMI); //濕度轉(zhuǎn)換 caculation_SHT(&aa); //溫度和濕度的補(bǔ)償 float_convert(&aa); //將浮點(diǎn)數(shù)轉(zhuǎn)換成整型,各個(gè)位的數(shù)分別保存 doing_temp(&aa); //檢測(cè)溫度是否超限 doing_humi(&aa); //檢測(cè)濕度是否超限 DS1302_GetTime(&CurrentTime); DateToStr(&CurrentTime); TimeToStr(&CurrentTime); GotoXY(5,0); //第一行顯示日期 Print(CurrentTime.DateString); GotoXY(23,0); //第三行顯示溫度 Print(aa.num_temp); GotoXY(28,0); Print(" "); GotoXY(5,1); //第二行顯示時(shí)間 Print(CurrentTime.TimeString); GotoXY(23,1); //第四行顯示濕度 Print(aa.num_humi); GotoXY(28,1); Print(" "); Delay1ms(300); //延時(shí) } }
第5章 仿真與調(diào)試 整個(gè)軟件通過(guò)C語(yǔ)言編程,先在Keil C51集成開發(fā)環(huán)境下將編好的程序進(jìn)行 編譯、調(diào)試,調(diào)試通過(guò)后會(huì)生成.HEX文件。具體過(guò)程如下: 新建一個(gè)項(xiàng)目文件,然后新建一個(gè)C語(yǔ)言程序,并把新建的C語(yǔ)言程序加 到項(xiàng)目中,然后編譯項(xiàng)目。 建立第一個(gè)C項(xiàng)目: ① 點(diǎn)擊 Project 菜單,選擇彈出的下拉式菜單中的 New Project,如圖。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image061.jpg 圖5.1 新建項(xiàng)目文件 ② 選擇所要的單片機(jī),本設(shè)計(jì)選擇常用的 Ateml 公司的 AT89C51。 ③ 在項(xiàng)目中創(chuàng)建新的程序文件。執(zhí)行File->New新建一個(gè)文件,然后在文件中進(jìn)行程序的編寫。 ④ 執(zhí)行File-->Save將編寫的程序進(jìn)行保存。將第一個(gè)程序命名為main.c,將文件保存在項(xiàng)目所在的目錄中。選“Add Fileto Group ‘Source Group 1’”彈出文件窗口,選擇剛剛保存的文件,按 ADD 按鈕,關(guān)閉文件窗,程序文件已加到項(xiàng)目中了。這時(shí)在 Source Group1 文件夾圖標(biāo)左邊出現(xiàn)了一個(gè)小+號(hào),說(shuō)明 文件組中有了文件,點(diǎn)擊它可以展開查看。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image063.jpg 圖5.2 添加文件 ⑤ 文件加載到項(xiàng)目之后,開始進(jìn)行編譯運(yùn)行,生成.hex文件。編譯結(jié)果如下圖: file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image065.jpg 圖5.3 生成.hex文件 編譯顯示沒(méi)有錯(cuò)誤,說(shuō)明編譯順利通過(guò),已經(jīng)生成了所需要的.hex文件。接下來(lái)在PROTEUS中進(jìn)行仿真。打開已經(jīng)繪制好的仿真電路原理圖,選中單片機(jī)AT89C51,右鍵單擊AT89C51,出現(xiàn)相應(yīng)的對(duì)話框,找到編譯好的“*.HEX”文件,然后單擊“OK”就可以進(jìn)行仿真。在下邊的圖形中,給出了不同的溫濕度的顯示值,實(shí)際溫濕度與理論溫濕度的差值在誤差允許范圍之內(nèi)(圖5.4,溫度和濕度分別為60℃和80﹪,顯示為60.03℃和82.37﹪;圖5.5,溫度和濕度分別為68℃和70﹪,顯示為68.06℃和74.35﹪;圖5.6,溫度和濕度分別為48℃和31﹪,顯示為48.65℃和32.66﹪),說(shuō)明設(shè)計(jì)成功。仿真結(jié)果如圖所示。 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image067.jpg 圖5.4 溫濕度顯示一 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image069.jpg 圖5.5 溫濕度顯示二 file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image071.jpg 圖5.6 整體顯示
結(jié) 論 單片機(jī)的應(yīng)用如今已經(jīng)在工業(yè)、電子等方方面面展示出了它的優(yōu)越性,利用單片機(jī)在設(shè)計(jì)電路逐漸成了趨勢(shì),它與外圍的簡(jiǎn)單電路再加上優(yōu)化程序就可以構(gòu)建任意的產(chǎn)品,使得本設(shè)計(jì)成為現(xiàn)實(shí)。隨著單片機(jī)的日益發(fā)展,它必將在未來(lái)顯示出更大的活力,為電子設(shè)計(jì)增加更多精彩。 本次設(shè)計(jì)是基于PROTEUS的數(shù)字溫濕度的設(shè)計(jì),包括硬件電路和軟件兩部分。設(shè)計(jì)采用的是高效單片機(jī)作為核心,集溫度傳感器和濕度傳感器于一體的SHT11作為主要的采集與測(cè)量系統(tǒng),其中它自帶的A/D轉(zhuǎn)換器,使得溫濕度測(cè)量具有精度高、成本低、體積小、接口簡(jiǎn)單等優(yōu)點(diǎn),還具有良好抗干擾能力。加上優(yōu)化程序,使得本系統(tǒng)具有很高的實(shí)用性。由AT89C51單片機(jī)、晶振等組成的最小系統(tǒng),可以使整個(gè)系統(tǒng)正常穩(wěn)定的工作起來(lái)。由LCD為核心的顯示電路可以直觀的顯示測(cè)量結(jié)果。報(bào)警電路的設(shè)計(jì)采用了聲光并用的方式。為了實(shí)現(xiàn)系統(tǒng)的智能化,系統(tǒng)采用模塊設(shè)計(jì),在軟件上設(shè)計(jì)了系統(tǒng)主程序,溫濕度采集和處理電路子程序,報(bào)警電路子程序,液晶顯示子程序,實(shí)時(shí)的時(shí)間日期子程序。 由于學(xué)習(xí)的知識(shí)有限,加上時(shí)間的倉(cāng)促和經(jīng)驗(yàn)的缺乏,本設(shè)計(jì)整體上的性能還不是十分完善,設(shè)計(jì)中存在一些需要改進(jìn)和優(yōu)化的地方。測(cè)量精度有待進(jìn)一步提高,軟件設(shè)計(jì)也存在不合理之處。但從設(shè)計(jì)過(guò)程中,學(xué)到了幾種芯片的使用,如:DS1302時(shí)鐘芯片,LCD1604,SHT11等。對(duì)于單片機(jī)也有了更進(jìn)一步的認(rèn)識(shí),對(duì)用于單片機(jī)仿真的軟件操作能力也明顯提高,通過(guò)此設(shè)計(jì),本人受益頗豐。
致 謝 經(jīng)過(guò)近兩個(gè)多月的努力,在陳英老師的悉心指導(dǎo)下我順利的完成了畢業(yè)設(shè)計(jì)。此次的畢業(yè)設(shè)計(jì)使我受益匪淺。做畢業(yè)設(shè)計(jì)不僅是對(duì)我所學(xué)知識(shí)的一次檢驗(yàn),更是對(duì)我能力的一個(gè)挑戰(zhàn)。從接觸到畢業(yè)設(shè)計(jì)題目的那一刻起,我就開始仔細(xì)認(rèn)真的查找相關(guān)資料和文獻(xiàn),我一直都在盡自己最大的努力去完成它。完成畢業(yè)設(shè)計(jì)后,我發(fā)現(xiàn)自己不僅拓寬了專業(yè)理論知識(shí),而且專業(yè)外的知識(shí)也豐富了不少,實(shí)際動(dòng)手能力更是提高了很多。 在做畢業(yè)設(shè)計(jì)的過(guò)程中,陳英老師不僅給我提了許多指導(dǎo)性的意見,還傾注了大量的心血。她兢兢業(yè)業(yè)的工作作風(fēng)、科學(xué)嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度和寬以待人、認(rèn)真負(fù)責(zé)的優(yōu)秀品質(zhì)給我留下了非常深刻的印象。沒(méi)有陳英老師方向性的指導(dǎo)和幫助,我是不可能按時(shí)完成畢業(yè)設(shè)計(jì)的。感謝陳英老師在百忙之中給予我的精心指導(dǎo)和幫助。在做畢業(yè)設(shè)計(jì)的過(guò)程中,陳英老師幫助我解決了許多新的疑點(diǎn)和難點(diǎn),使我順利的完成了畢業(yè)設(shè)計(jì)。除此之外從陳老師那里,我還學(xué)到了嚴(yán)謹(jǐn)?shù)墓ぷ鲬B(tài)度和科學(xué)的學(xué)習(xí)方法,也學(xué)會(huì)了如何做人的道理,所有這些對(duì)我今后的成長(zhǎng)成才都將產(chǎn)生深遠(yuǎn)的影響。在此,我要向我的導(dǎo)師陳英老師表示最衷心的感謝!另外,本設(shè)計(jì)也得到了其他老師、同學(xué)的支持和幫助,謹(jǐn)在此一并感謝!
參考文獻(xiàn) [1]劉文濤.單片機(jī)語(yǔ)言C51典型應(yīng)用設(shè)計(jì)[M].北京:人民郵電出版社,2001,12:25-29 [2]周靈彬.基于Proteus的電路與PCB設(shè)計(jì)[M].北京:電子工業(yè)出版社,2010.8 [3]張毅剛主編.單片機(jī)原理及應(yīng)用[M].北京:高等教育出版社,2009 [4]李光飛,樓然苗,胡佳文等.單片機(jī)課程設(shè)計(jì)實(shí)例指導(dǎo)[M].北京:北京航空航天大學(xué)出版社,2004,105-125 [5]凌玉華.單片機(jī)原理及應(yīng)用系統(tǒng)設(shè)計(jì)[M].長(zhǎng)沙:中南大學(xué)出版社,2006,222-228 [6]錢顯毅.傳感器原理與應(yīng)用[M].東南大學(xué)出版社,2008.7 [7]馮建華,趙亮.單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)與產(chǎn)品開發(fā)[M].北京:人民郵電出版社, 2004.11 [8]譚浩強(qiáng).C程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,2005.7 [9]常喜茂,孔英會(huì),付小寧.C51基礎(chǔ)與應(yīng)用實(shí)例[M].北京:電子工業(yè)出版社 2009. [10]孫余凱,吳鳴山,項(xiàng)綺明.傳感器應(yīng)用電路300例[M].北京:電子工業(yè)出版社,2008.3 [11]康華光,陳大欽.模擬電子電路[M].北京:高教育出版社,2004:335-336. [12]趙茂泰.智能儀器原理及應(yīng)用[M].北京:電子工業(yè)出版社,2006:130-132. [13]李光飛,樓然苗,胡佳文等.單片機(jī)課程設(shè)計(jì)實(shí)例指導(dǎo)[M].北京:北京航空航天大學(xué)出版社,2004,105-125 [14]佟玲,楊玉芬,張本華.智能溫濕度監(jiān)控系統(tǒng)的組成與發(fā)展[J].沈陽(yáng)農(nóng)業(yè)大學(xué)工程學(xué)院學(xué)報(bào).2006,23(4);25-30 [15]PualHorowitz and Winfield.The Art of Electronics.2nd ed[M].Cambridge UniversityPress,1999:1-1125. [16]Allan R.Hambley.Electronics.2nd ed[M].PrenticeHall Inc.2000:1-461. [17]hnsonD E, Johnson J R. Moore H P.A handbook of active filters[M].NewJersry,1980:1-72.
附錄A 系統(tǒng)源程序 DS1302.h #ifndef _REAL_TIMER_DS1302 #define _REAL_TIMER_DS1302 sbit DS1302_CLK = P3^1; //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 sbit DS1302_IO = P3^2; //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 sbit DS1302_RST = P3^0; //實(shí)時(shí)時(shí)鐘復(fù)位線引腳 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; typedef struct__SYSTEMTIME__ { unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString[9]; unsigned char TimeString[9]; }SYSTEMTIME; //定義的時(shí)間類型 #define AM(X) X #define PM(X) (X+12) // 轉(zhuǎn)成24小時(shí)制 #define DS1302_SECOND 0x80 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define DS1302_RAM(X)(0xC0+(X)*2) //用于計(jì)算 DS1302_RAM 地址的宏 voidDS1302InputByte(unsigned char d) //實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù)) { unsigned char i; ACC = d; for(i=8; i>0; i--) { DS1302_IO = ACC0; //相當(dāng)于匯編中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } } unsigned charDS1302OutputByte(void) //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù)) { unsigned char i; for(i=8; i>0; i--) { ACC = ACC >>1; //相當(dāng)于匯編中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; } return(ACC); } void Write1302(unsigned charucAddr, unsigned char ucDa) //ucAddr: DS1302地, ucData: { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 寫1Byte數(shù)據(jù) DS1302_CLK = 1; DS1302_RST = 0; } unsigned charRead1302(unsigned char ucAddr) //讀取DS1302某地址的數(shù)據(jù) { unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 讀1Byte數(shù)據(jù) DS1302_CLK = 1; DS1302_RST = 0; return(ucData); } void DS1302_SetProtect(bitflag) //是否寫保護(hù) { if(flag) Write1302(0x8E,0x10); else Write1302(0x8E,0x00); } void DS1302_SetTime(unsignedchar Address, unsigned char Value) // 設(shè)置時(shí)間函數(shù) { DS1302_SetProtect(0); Write1302(Address, ((Value/10)<<4 | (Value%10))); void DateToStr(SYSTEMTIME*Time) { Time->DateString[0] = Time->Year/10 +'0'; Time->DateString[1] = Time->Year%10 +'0'; Time->DateString[2] = '-'; Time->DateString[3] = Time->Month/10 +'0'; Time->DateString[4] = Time->Month%10 +'0'; Time->DateString[5] = '-'; Time->DateString[6] = Time->Day/10 +'0'; Time->DateString[7] =Time->Day%10 + '0'; Time->DateString[8] = '\0'; } void TimeToStr(SYSTEMTIME*Time) { Time->TimeString[0] =Time->Hour/10 + '0'; Time->TimeString[1] = Time->Hour%10 +'0'; Time->TimeString[2] = ':'; Time->TimeString[3] = Time->Minute/10 +'0'; Time->TimeString[4] = Time->Minute%10 +'0'; Time->TimeString[5] = ':'; Time->TimeString[6] = Time->Second/10 +'0'; Time->TimeString[7] = Time->Second%10 +'0'; Time->DateString[8] = '\0'; } voidDS1302_GetTime(SYSTEMTIME *Time) { unsigned char ReadValue; ReadValue = Read1302(DS1302_SECOND); Time->Second =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MINUTE); Time->Minute =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_HOUR); Time->Hour =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_DAY); Time->Day =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MONTH); Time->Month =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_YEAR); Time->Year =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); } void Initial_DS1302(void) { unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) DS1302_SetTime(DS1302_SECOND,0); } /*******************************************************************voidBurstWrite1302(unsigned char *pWClock) //往DS1302寫入時(shí)鐘數(shù)據(jù)(多字節(jié)方式) { unsigned char i; Write1302(0x8e,0x00); // 控制命令,WP=0,寫操作? DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(0xbe); // 0xbe:時(shí)鐘多字節(jié)寫命令 for (i = 8;i>0; i--) //8Byte = 7Byte 時(shí)鐘數(shù)據(jù) + 1Byte 控制{ DS1302InputByte(*pWClock); // 寫1Byte數(shù)據(jù) pWClock++; } DS1302_CLK = 1; DS1302_RST = 0; } void BurstRead1302(unsignedchar *pRClock) //讀取DS1302時(shí)鐘數(shù)據(jù)(時(shí)鐘多字節(jié)方式) { unsigned char i; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(0xbf); // 0xbf:時(shí)鐘多字節(jié)讀命令 for (i=8; i>0; i--) { *pRClock = DS1302OutputByte(); // 讀1Byte數(shù)據(jù) pRClock++; } DS1302_CLK = 1; DS1302_RST = 0; } void DS1302_TimeStop(bitflag) // 是否將時(shí)鐘停止 { unsigned char Data; Data=Read1302(DS1302_SECOND); DS1302_SetProtect(0); if(flag) Write1302(DS1302_SECOND, Data|0x80); else Write1302(DS1302_SECOND, Data&0x7F); } /******************************************************************/ #endif LCD1604.h #ifndef LCD_CHAR_1604 #define LCD_CHAR_1604 #include <intrins.h> //Port Definition*************************************************** sbit LcdRs = P3^5; sbit LcdRw = P3^6; sbit LcdEn = P3^7; sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口 //內(nèi)部等待函數(shù)************************************************** unsigned char LCD_Wait(void) { LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); //while(DBPort&0x80);// LcdEn=0; return DBPort; } //向LCD寫入命令或數(shù)據(jù)*************************************** #define LCD_COMMAND 0 // Command #define LCD_DATA 1 // Data #define LCD_CLEAR_SCREEN0x01 // 清屏 #define LCD_HOMING 0x02 // 光標(biāo)返回原點(diǎn) void LCD_Write(bit style,unsigned char input) { LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input; _nop_();//注意順序 LcdEn=1; _nop_();//注意順序 LcdEn=0; _nop_(); LCD_Wait(); } //設(shè)置顯示模式************************************************ #define LCD_SHOW 0x04 //顯示開 #define LCD_HIDE 0x00 //顯示關(guān) #define LCD_CURSOR 0x02 //顯示光標(biāo) #define LCD_NO_CURSOR 0x00 //無(wú)光標(biāo) #define LCD_FLASH 0x01 //光標(biāo)閃動(dòng) #define LCD_NO_FLASH 0x00 //光標(biāo)不閃動(dòng) void LCD_SetDisplay(unsignedchar DisplayMode) { LCD_Write(LCD_COMMAND, 0x08|DisplayMode); } //設(shè)置輸入模式********************************************* #define LCD_AC_UP 0x02 #define LCD_AC_DOWN 0x00 // default #define LCD_MOVE 0x01 // 畫面可平移 #define LCD_NO_MOVE 0x00 //default void LCD_SetInput(unsignedchar InputMode) { LCD_Write(LCD_COMMAND, 0x04|InputMode); } //移動(dòng)光標(biāo)或屏幕******************************************** /* #define LCD_CURSOR 0x02 #define LCD_SCREEN 0x08 #define LCD_LEFT 0x00 #define LCD_RIGHT 0x04 void LCD_Move(unsigned charobject, unsigned char direction) { if(object==LCD_CURSOR) LCD_Write(LCD_COMMAND,0x10|direction); if(object==LCD_SCREEN) LCD_Write(LCD_COMMAND,0x18|direction); } */ //初始化**************************************************** void LCD_Initial() { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無(wú)光標(biāo) LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動(dòng) } //******************************************************************/ void GotoXY(unsigned char x,unsigned char y) //x列,y行 { if(y==0) LCD_Write(LCD_COMMAND,0x80|x); if(y==1) LCD_Write(LCD_COMMAND,0x80|(x-0x40)); } void Print(unsigned char*str) { while(*str!='\0') { LCD_Write(LCD_DATA,*str); str++; } } /* void LCD_LoadChar(unsignedchar user[8], unsigned char place) { unsigned char i; LCD_Write(LCD_COMMAND,0x40|(place*8)); for(i=0; i<8; i++) LCD_Write(LCD_DATA,user); } */ //******************************************************************/ #endif set_key.h #ifndef _setkey_h_ #define _setkey_h_ #include<SHT11.h> floatsetwen_h,setwen_l,setshi_h,setshi_l; sbit hot =P1^4;// 加熱 sbit cold =P1^3;// 降溫 sbit speek =P1^2;// 發(fā)光 sbit ganzao =P1^5;//干燥 sbit jiashi =P1^6;//加濕 sbit speaker =P1^0;// 報(bào)警 void Delay_xMs(unsigned intx) { unsigned int i,j; for( i =0;i < x;i++ ) { for( j =0;j<50;j++ ); } } void Speaker(void) //報(bào)警程序 { unsigned int i; for(i=0;i<80;i++ ) { speaker=~speaker; Delay_xMs(2); } } void doing_temp(SHT_dat *s) {float xianshi_temp; setwen_h=80.00; setwen_l=20.00; xianshi_temp=s->temperature; if((xianshi_temp<setwen_h)&(xianshi_temp>setwen_l)) { cold=0;hot=0;speek=0;speaker=0;ganzao=0;jiashi=0;} if(xianshi_temp>setwen_h) {cold=1;hot=0;speek=1;Speaker();Delay_xMs(200);speaker=0;} if(xianshi_temp<setwen_l) {cold=0;hot=1;speek=1;Speaker();Delay_xMs(200);speaker=0;} } void doing_humi(SHT_dat *s) {float xianshi_humi; setshi_h=90.00; setshi_l=30.00; xianshi_humi=s->humidity; if((xianshi_humi<setshi_h)&(xianshi_humi>setshi_l)) {cold=0;hot=0;speek=0;speaker=0;ganzao=0;jiashi=0;} if(xianshi_humi>setshi_h) {ganzao=1;jiashi=0;speek=1;Speaker();Delay_xMs(200);speaker=0;} if(xianshi_humi<setshi_l) {ganzao=0;jiashi=1;speek=1;Speaker();Delay_xMs(200);speaker=0;} } #endif SHT11.h #ifndef #define _SHT11_h_ #define uchar unsigned char #define uint unsigned int #define NOP() _nop_() #define TEMP 0 #define HUMI 1 sbit DQ=P2^7; //端口定義 sbit SCK=P2^6; typedef struct { float temperature; float humidity; float crc_temp; float crc_humi; uchar num_temp[5]; uchar num_humi[5]; }SHT_dat; /*========================================= 啟動(dòng)函數(shù) =========================================*/ void init_SHT() { DQ=1; SCK=0; NOP(); SCK=1; NOP(); DQ=0; NOP(); SCK=0; NOP(); NOP(); NOP(); SCK=1; NOP(); DQ=1; NOP(); SCK=0; } /*========================================= 字節(jié)傳送函數(shù) =========================================*/ uchar write_byte(ucharvalue) { uchar i,error=0; for(i=0x80;i>0;i/=2) //高位先傳送 { if(i & value)DQ=1; //循環(huán)相與,結(jié)果即為要發(fā)送的位 else DQ=0; SCK=1; NOP(); NOP(); NOP(); SCK=0; } DQ=1; //釋放總線 SCK=1; if(DQ==1) error=1; //檢查應(yīng)答,確認(rèn)通訊正常 SCK=0; return error; //error=1,通訊有誤 } /*========================================= 讀數(shù)據(jù)函數(shù) =========================================*/ uchar read_byte(uchar dat) { uchar i,val=0; DQ=1; for(i=0x80;i>0;i/=2) { SCK=1; if(DQ) val=(val | i); SCK=0; } DQ=dat; SCK=1; NOP(); NOP(); NOP(); SCK=0; DQ=1; return val; } /*========================================= 復(fù)位函數(shù) =========================================*/ void reset_SHT() { uchar i; DQ=1; SCK=0; for(i=0;i<9;i++) //DATA保持高電平,SCK時(shí)鐘出發(fā)9次復(fù)位 { SCK=1; NOP(); SCK=0; } init_SHT(); } /*========================================= 發(fā)送指令到SHT11執(zhí)行溫度和濕度的測(cè)量轉(zhuǎn)換 =========================================*/ convert_SHT(SHT_dat *s,ucharmode) { uchar i,ack=0; uchar valueM,valueL,checksum; float com; do{reset_SHT(); switch(mode) { case TEMP: ack=write_byte(0x03);break; case HUMI: ack=write_byte(0x05);break; default: break;} }while(ack==1); for(i=0;i<65535;i++) //等待測(cè)量結(jié)束 { if(DQ==0)break; } //若長(zhǎng)時(shí)間數(shù)據(jù)線DQ沒(méi)拉低,則說(shuō)明測(cè)量有錯(cuò)誤 valueM=read_byte(0); //數(shù)據(jù)的高字節(jié) valueL=read_byte(0); //數(shù)據(jù)的低字節(jié) checksum=read_byte(1); //CRC校驗(yàn)碼 com=(float)valueM*256+(float)valueL; if(mode==TEMP) { s->temperature=com; s->crc_temp=(float)checksum; } if(mode==HUMI) { s->humidity=com; s->crc_humi=(float)checksum; } } /*========================================= 溫度和濕度補(bǔ)償及輸出溫度值和相對(duì)濕度值 =========================================*/ void caculation_SHT(SHT_dat*s) { const float c1=-4.0; const float c2=+0.0405; const float c3=-0.0000028; //以上為12位濕度修正公示取值 const float t1=+0.01; const float t2=+0.00008; //以上為14位溫度修正公示取值 float t=s->temperature; float rh=s->humidity; float rh_lin; float rh_ture; float t_c; t_c=t * 0.01 - 40; //溫度的補(bǔ)償 rh_lin=c3*rh*rh + c2*rh + c1; //相對(duì)濕度非線性補(bǔ)償 rh_ture=( t_c - 25 ) * ( t1 + t2*rh ) +rh_lin; //相對(duì)濕度對(duì)于溫度依賴性補(bǔ)償 if( rh_ture > 100 ) rh_ture=100; //相對(duì)濕度最大值修正 if( rh_ture < 0.1 ) rh_ture=0.1; //相對(duì)濕度最小值修正 if(t_c<0)t_c=0; s->temperature=t_c; //保存溫度補(bǔ)償后的結(jié)果 s->humidity=rh_ture; //保存相對(duì)濕度補(bǔ)償后的結(jié)果 } /*========================================= 計(jì)算絕對(duì)濕度值 ========================================= float calc_dewpoint(floath,float t) { float logEx,dew_point; logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2); dew_point = (logEx -0.66077)*237.3/(0.66077+7.5-logEx); return dew_point; } /*========================================= 浮點(diǎn)數(shù)數(shù)據(jù)處理 =========================================*/ void float_convert(SHT_dat*s) { float com; uint dat; com=s->temperature; com*=100; dat=(uint)com; s->num_temp[0]=dat/1000+0x30; //十位 s->num_temp[1]=dat%1000/100+0x30; //個(gè)位 s->num_temp[2]=0x2e; s->num_temp[3]=dat%100/10+0x30; //小數(shù)點(diǎn)第一位 s->num_temp[4]=dat%10+0x30; //小數(shù)點(diǎn)第二位 com=s->humidity; com*=100; dat=(uint)com; s->num_humi[0]=dat/1000+0x30; //十位 s->num_humi[1]=dat%1000/100+0x30; //個(gè)位 s->num_humi[2]=0x2e; s->num_humi[3]=dat%100/10+0x30; //小數(shù)點(diǎn)第一位 s->num_humi[4]=dat%10+0x30; //小數(shù)點(diǎn)第二位 } #endif 12864.h #ifndef _12864_h_ #define _12864_h_ #define uchar unsigned char #define uint unsigned int #define PORT P0 sbit CS1=P2^4; //端口定義 sbit CS2=P2^3; sbit RS=P2^1; sbit RW=P2^2; sbit E=P2^0; sbit bflag=P0^7; //P0口的最高位 /*====================================== "溫度與濕度的測(cè)量與控制"的取模建表 ======================================*/ uchar code Str[]={ /*---------------溫----------------*/ 0x10,0x30,0x32,0x3C,0x66,0x0F,0x0C,0x60,0x00,0x7F,0x7E,0x7F,0x7E,0x63,0x56,0x7F, 0x56,0x63,0x56,0x63,0x56,0x7F,0x7E,0x63,0x7E,0x7F,0x00,0x7F,0x00,0x60,0x00,0x00, /*---------------度----------------*/ 0x00,0x60,0xFE,0x7F,0xFE,0x1F,0x06,0x40,0x36,0x46,0x36,0x66,0xFE,0x6E,0xFF,0x3E, 0xB7,0x36,0xB6,0x36,0xFE,0x7E,0xFE,0x6E,0x36,0x46,0x36,0x40,0x00,0x00,0x00,0x00, /*---------------和----------------*/ 0x60,0x0C,0x66,0x06,0x66,0x03,0xFE,0x7F,0xFE,0x7F,0x63,0x01,0x63,0x03,0x60,0x02, 0xFC,0x1F,0xFC,0x1F,0x0C,0x0C,0x0C,0x0C,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00, /*---------------濕----------------*/ 0x20,0x20,0x62,0x78,0xC6,0x1E,0x8C,0x06,0x00,0x60,0xFE,0x66,0xFE,0x6C,0xD6,0x7F, 0xD6,0x7F,0xD6,0x60,0xD6,0x7F,0xD6,0x7F,0xFE,0x68,0xFE,0x6E,0x00,0x66,0x00,0x00, /*---------------度----------------*/ 0x00,0x60,0xFE,0x7F,0xFE,0x1F,0x06,0x40,0x36,0x46,0x36,0x66,0xFE,0x6E,0xFF,0x3E, 0xB7,0x36,0xB6,0x36,0xFE,0x7E,0xFE,0x6E,0x36,0x46,0x36,0x40,0x00,0x00,0x00,0x00, /*---------------的----------------*/ 0x00,0x00,0xF8,0x3F,0xFC,0x3F,0x9F,0x19,0x9B,0x19,0xF8,0x3F,0xF8,0x3F,0x40,0x00, 0x70,0x00,0xBF,0x03,0x9F,0x63,0x18,0x60,0xF8,0x7F,0xF8,0x3F,0x00,0x00,0x00,0x00, /*---------------測(cè)----------------*/ 0x00,0x00,0x66,0x70,0xCC,0x1E,0x00,0x00,0xFE,0x63,0x06,0x38,0xF6,0x0F,0x06,0x00, 0xFE,0x1B,0x00,0x30,0xFC,0x07,0x00,0x60,0xFF,0x7F,0xFF,0x3F,0x00,0x00,0x00,0x00, /*---------------量----------------*/ 0x00,0x00,0x40,0x40,0x40,0x50,0xDF,0x57,0xDF,0x57,0x55,0x55,0x55,0x55,0xD5,0x7F, 0xD5,0x7F,0x55,0x55,0x55,0x55,0xDF,0x57,0xDF,0x57,0x40,0x50,0x40,0x40,0x00,0x00, /*---------------與----------------*/ 0x00,0x00,0x00,0x06,0x00,0x06,0xF0,0x06,0xFF,0x06,0xCF,0x06,0xCC,0x06,0xCC,0x06, 0xCC,0x06,0xCC,0x66,0xCC,0x60,0xCC,0x7F,0xCC,0x3F,0x0C,0x00,0x00,0x00,0x00,0x00, /*---------------控----------------*/ 0x30,0x03,0x30,0x63,0xFF,0x7F,0xFF,0x3F,0xB0,0x01,0x1C,0x60,0xDC,0x66,0x6C,0x66, 0x2D,0x66,0x0F,0x7E,0x0E,0x7E,0x2C,0x66,0x6C,0x66,0xDC,0x66,0x1C,0x60,0x00,0x00, /*---------------制----------------*/ 0x78,0x00,0x6E,0x3F,0x6E,0x3F,0x6C,0x03,0xFF,0x7F,0xFF,0x7F,0x6C,0x33,0x6C,0x3F, 0x60,0x1F,0x00,0x00,0xFC,0x0F,0x00,0x60,0xFF,0x7F,0xFF,0x3F,0x00,0x00,0x00,0x00, /*---------------:----------------*/ 0x00,0x00,0xC0,0x30,0xC0,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*---------------%----------------*/ 0xF0,0x00,0x08,0x31,0xF0,0x0E,0x80,0x01,0x70,0x1E,0x08,0x21,0x00,0x1E,0x00,0x00, /*---------------℃----------------*/0x00,0x00,0x0E,0x00,0x0A,0x00,0x0E,0x00,0xE0,0x03,0x10,0x04,0x08,0x08,0x04,0x10, 0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x08,0x38,0x04,0x00,0x00,0x00,0x00, }; /*========================== 函數(shù)聲明 ==========================*/ void Ready_12864(); void Left(); void Right(); void Wreg(uchar c); void Wdata(uchar c); void Busy_12864(); void Pagefirst(uchar c); void Linefirst(uchar c); void Display(uchar *s,ucharpage,uchar line,uchar com,uchar dat); void Init_12864(); void Delay1s(); void Delay1s(void) { uchar h,i,j,k; for(h=5;h>0;h--) for(i=4;i>0;i--) for(j=116;j>0;j--) for(k=214;k>0;k--); } void Ready_12864() { uint i,j; Left(); Wreg(0x3f); Right(); Wreg(0x3f); //開顯示,指令代碼為0x3f Left(); //清左屏幕 for(i=0;i<8;i++) { Pagefirst(i); Linefirst(0x00); for(j=0;j<64;j++) { Wdata(0x00); } } Right(); //清右屏幕 for(i=0;i<8;i++) { Pagefirst(i); Linefirst(0x00); for(j=0;j<64;j++) { Wdata(0x00); } } } void Left() { CS1=0; CS2=1; } void Right() { CS1=1; CS2=0; } void Wreg(uchar c) /*向12864的寄存器中寫入指令代碼*/ { Busy_12864(); RS=0; RW=0; PORT=c; E=1; E=0; } void Wdata(uchar c) /*向12864的緩沖器中寫入顯示數(shù)據(jù)*/ { Busy_12864(); RS=1; RW=0; PORT=c; E=1; E=0; } void Busy_12864() /*判忙程序*/ { do{E=0; RS=0; RW=1; PORT=0xff; E=1; E=0;}while(bflag); } void Pagefirst(uchar c) /*控制將要顯示的數(shù)據(jù)在12864中的頁(yè)數(shù)*/ { uchar i; i=c; c=i|0xb8; Busy_12864(); Wreg(c); } void Linefirst(uchar c) /*控制將要顯示的數(shù)據(jù)在12864中的列數(shù)*/ { uchar i; i=c; c=i|0x40; Busy_12864(); Wreg(c); } /*========================================= Display(s,page,line,com,dat) 參 數(shù):參數(shù)s 為保存在內(nèi)存中的數(shù)據(jù)的首地址 參數(shù)page 為要顯示的字符在12864中的頁(yè)碼 參數(shù)line 為要顯示的字符在12864中的列數(shù) 參數(shù)com 為要顯示的字符在12864中顯示多少列 參數(shù)dat dat=0,是16×16的漢字顯示; dat=1,是24×24的漢字顯示 功能描述: 在12864的指定的頁(yè)碼和列數(shù)中顯示字符,并由dat來(lái)選擇 是顯示16×16的字或者是24×24的字符 需要注意的是該函數(shù)針對(duì)的字符取模方式是縱向取模,字節(jié)倒序 =========================================*/ void Display(uchar *s,ucharpage,uchar line,uchar com,uchar dat) { uchar i; for(i=0;i<com;i++) { Pagefirst(page); Linefirst(line+i); Wdata(*s); s++; Pagefirst(page+1); Linefirst(line+i); Wdata(*s); s++; if(dat==0)continue; else { Pagefirst(page+2); Linefirst(line+i); Wdata(*s); s++; } } } void Init_12864() /*在液晶顯示屏上顯示"溫度和濕度的測(cè)量與控制"*/ { Ready_12864(); /************溫度和濕度的測(cè)量和控制********************/ Left(); Display(Str,1,16,16,0); Display(Str+32,1,32,16,0); Display(Str+64,1,48,16,0); Display(Str+160,3,48,16,0); Display(Str+192,5,16,16,0); Display(Str+224,5,32,16,0); Display(Str+256,5,48,16,0); Right(); Display(Str+96,1,0,16,0); Display(Str+128,1,16,16,0); Display(Str+288,5,0,16,0); Display(Str+320,5,16,16,0); Delay1s(); Delay1s(); Ready_12864(); /************溫度:和 濕度:和單位***************************/ Left(); Display(Str,2,24,16,0); Display(Str+32,2,40,16,0); Display(Str+352,2,56,8,0); Display(Str+96,4,24,16,0); Display(Str+128,4,40,16,0); Display(Str+352,4,56,8,0); Right(); Display(Str+364,4,8,10,0); //% Display(Str+384,2,8,16,0); //℃ } #endif
file:///C:/Users/gaoyu/AppData/Local/Temp/msohtmlclip1/01/clip_image073.jpg附錄B 系統(tǒng)原理圖
|