找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 30278|回復: 19
打印 上一主題 下一主題
收起左側

單片機電熱水器控制系統(tǒng)設計文檔 已經(jīng)制作成品成功

  [復制鏈接]
跳轉到指定樓層
樓主
ID:209627 發(fā)表于 2017-6-9 18:05 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

摘要


電熱水器作為人們生活中不可或缺的家用電器之一,對我們的生活水平有著重要的影響,常用的熱水器主要分為以下三種:燃氣式熱水器,太陽能熱水器以及電熱水器。
太陽能熱水器雖然有沒有污染的優(yōu)點,但是其使用受到天氣與位置的較大限制,加之其不能對溫度進行有效控制;燃氣熱水器雖然不用受到上面的限制,但是人們通常會對其使用過程中的一些危險,如一氧化碳中毒和燃氣泄漏的擔心,加之其安裝過程非常繁瑣,也漸漸淡出人們的視線;而電熱水器在具有其上優(yōu)點的同時,其安裝十分方便,同時在當今時代,電熱水器的各方面的研發(fā)已經(jīng)十分的成熟,安全性也能很好的得到保證。
而隨著科技的發(fā)展,傳統(tǒng)的機械式控制系統(tǒng)一難以滿足人們對高生活水平的要求,而在微處理器技術、傳感器技術的進一步成熟的現(xiàn)今社會,電熱水器開始摒棄傳統(tǒng)的機械式的控制方式,轉而采用全新的控制方式,,以微處理器為核心,通過傳感器測溫,然后再通過顯示屏顯示,輔以友好的人機界面,從而實現(xiàn)熱水器的智能使控制方法。
本文完成的控制系統(tǒng)是利用AT89S52單片機作為控制核心的,然后利用其現(xiàn)有接口外接各種硬件模塊,主要有:溫度測量電路,實時時鐘電路,鍵盤,看門狗電路,加熱開關,LED顯示電路。
軟件部分主要是為實現(xiàn)系統(tǒng)功能而進行的C語言編程。
本系統(tǒng)為一款智能式電熱水器,使用獨立鍵盤輸入各種指令,使用DS18B20測量溫度,測量溫度精度可達到0.01℃,采用一塊LCD顯示屏顯示所需要顯示的各種數(shù)據(jù),便于用戶的操作,通過用戶的各種事先指令,對單片機進行操作,達到控制熱水器的加熱系統(tǒng)的工作狀態(tài),基本達到了對熱水器的控制的目的。


目錄
第一章 緒論1
1.1引言              1
1.2選題背景與意義              1
1.3研究現(xiàn)狀              2
1.4研究內(nèi)容              2
1.5本文結構              4
第二章 電熱水器控制系統(tǒng)設計方案4
2.1系統(tǒng)功能說明
2.2系統(tǒng)主要實現(xiàn)功能
2.3系統(tǒng)整體設計方案
2.4方案論證
第三章 主要元件介紹
3.1單片機系統(tǒng)模塊介紹
3.1.1 AT89S52單片機的主要性能
3.1.2 AT89S52管腳功能說明
3.1.3單片機的最小系統(tǒng)
3.2溫度檢測模塊
3.2.1 DS18B20的主要功能及特點
3.2.2DS18B20的內(nèi)部結構
3.2.3 DS18B20的工作時序
第四章 硬件模塊的設計
4.1 溫度采集模塊
4.2實時時鐘電路模塊
4.2.1 DS1302的介紹
4.2.2實時時鐘模塊原理圖
4.3鍵盤輸入模塊
4.4繼電器加熱模塊
4.5 LCD顯示模塊設計
4.5.1 LCD模塊概述
4.5.2 LCD模塊硬件說明
4.5.3 內(nèi)部控制指令
4.5.4顯示硬件設計原理圖
4.6其余硬件模塊設計
第五章系統(tǒng)軟件設計
5.1主程序模塊
5.2 DS18B20測溫模塊
5.3實時時鐘模塊
5.4 LCD顯示模塊            
5.5鍵址返回程序
5.6測試及性能分析            


  •                  緒  論

1.1引言

我國作為熱水器生產(chǎn)的大國,近年來熱水器的發(fā)展十分迅速,而熱水器主要有三個研究方向:太陽能,燃氣式與電熱式。近年來因為單片機技術的發(fā)展,傳感器技術的漸漸成熟,電熱水器的數(shù)字化與精確控制已經(jīng)變成可能。
作為一種需要在浴室,洗手間與廚房中使用的電器,這種電熱水器采用水電分離的控制方式,即采用小電流低電壓的控制電路來控制高電壓大電流的加熱電路,一般情況下,使用十分安全。并且在安全可靠的基礎上,這種熱水器還提供清楚的溫度顯示與方便的溫度調(diào)節(jié)裝置,所以在目前的市場上十分受到歡迎。

1.2選題背景與意義

本文對電熱水器的控制系統(tǒng)進行可研究,具體研究的意義如下:
1) 隨著傳感器測量技術的漸漸成熟,這種技術被廣泛的運用在了在傳統(tǒng)測溫方式不便于溫度測量的場合,而且傳感器作為測量元件其相較于傳統(tǒng)測溫系統(tǒng),測量精度與可靠性得到了進一步的提升,這一技術在當時與以后的時間里得到了發(fā)展與完善,迅速的顯示出來其對于傳統(tǒng)的物理式的溫度測量系統(tǒng)的優(yōu)越性。[1]
2) 在這一系統(tǒng)中(溫度采集與控制),我們要求對溫度進行實時控制,單片機具有極強的處理能力,將其運用在溫度控制系統(tǒng)中就具備了傳統(tǒng)的控制電路所不具有的實時控制能力,隨著單片機技術的發(fā)展成熟以及周邊元件的開發(fā),其控制方式變得越來越簡單,并且其相較于傳統(tǒng)控制電路,可以大幅度的提高溫度控制的精度,從而達到更高的技術要求。
3)單片機由于體積小重量輕、價格便宜、功耗低,控制能力強及運算速度快等特點,因而采用其作為主控芯片,使整個系統(tǒng)設計簡單易行,成本低廉,使用方便。
4)就目前來看,隨著天然氣價格上漲以及高層住房的普及,燃氣式熱水器與太陽能式熱水器因為其自身的缺陷而失去市場占有率,而電熱水器由于其自身不會受到這種限制,并且電熱水器由于其小巧的外形、快速的加熱速度、節(jié)能的設計、可靠地安全性等特點所以在今后的熱水器市場上必將作為一種主流熱水器出現(xiàn)。
所以選取電熱水器的控制系統(tǒng)作為此次的研究課題是具有十分重要的意義的。

1.3研究現(xiàn)狀
    電熱水器在中國的歷史已經(jīng)有10多年了,期間也經(jīng)歷了數(shù)次起落的過程,在上個世紀的最后幾年,隨著國外品牌的進入和國內(nèi)一些大家電廠的目光轉向電熱水器,儲水式電熱水器能適應任何天氣變化,普通家庭可直接安裝使用,長時間通電可以大流量供熱水。使用時不產(chǎn)生廢氣,既安全又衛(wèi)生。目前市場上銷售的電熱水器多數(shù)還帶有防觸電裝置。干凈衛(wèi)生,不必分室安裝,調(diào)溫方便。隨著技術的成熟,今后將朝著保溫層整體發(fā)泡技術、溫控器置入內(nèi)膽、加熱管下潛式設計、節(jié)能免更換幾個方面發(fā)展。
熱水器是一種可供浴室,洗手間及廚房使用的家用電器。據(jù)國務院發(fā)展研究中心市場經(jīng)濟研究所統(tǒng)計數(shù)據(jù)表明:近年來我國熱水器的銷量每年以 25%的速度上升,在未來五年內(nèi),銷售額每年可達近500億以上。眾所周知,燃氣熱水器因其安全隱患及越來越高的使用成本正漸漸淡出熱水器市場,而太陽能熱水器也因其嚴格受天氣氣候及安裝條件影響而很難占據(jù)更大的市場份額,所以電熱水器迅速崛起而不斷壯大。為了滿足人們對現(xiàn)代電器的智能化的要求,利用目前電子技術的最新成果改善電熱水器的性能已經(jīng)完全可能和必要。本課題將以單片機為控制核心,實現(xiàn)對熱水器的自動控制,設計出一款具有自動化、智能化、易于操作、控制精度高、性價比高的電熱水器控制系統(tǒng)。

1.4本文研究內(nèi)容

1)本文所研究的電熱水器控制系統(tǒng)由7個部分組成:單片機以及外部電路、電源電路、按鍵輸入電路、LED數(shù)碼管及指示燈電路、報警電路、加熱控制電路和溫度采集電路。
2)作為最重要的主控芯片,我們選用51系列單片機作為核心來進行此次的設計。單片機作為微型計算機的一種,是嵌入式微機系統(tǒng),是作為其他系統(tǒng)的組成部分使用的,在物理結構上嵌于其它系統(tǒng)之中,英文為Embedded Systems。嵌入式系統(tǒng)將計算機硬件和軟件結合起來,構成一個專門的計算裝置,實現(xiàn)特定的功能。它是一個大系統(tǒng)或大的電子設備中的一部分,工作在一個與外界發(fā)生交互并受時間約束的環(huán)境中,在沒有人工干預的情況下進行實時控制。自從20世紀70年代以來,單片機經(jīng)歷了初級、發(fā)展、高速發(fā)展三個階段。單片機性能不斷地完善,性能價格比顯著提高,種類和型號快速增加。從性能和用途上看,單片機正朝著面向多層次用戶的多品種多規(guī)格方向發(fā)展,哪一個應用領域前景廣闊,就有這個領域的特殊單片機出現(xiàn)。近幾年來,單片機以其集成度和性價比高、體積小等優(yōu)點,在工業(yè)自動化、過程控制、數(shù)字儀器儀表、通信系統(tǒng)以及家用電器產(chǎn)品中有著不可替代的作用。
3)220V交流電加熱裝置的通斷由繼電器控制,其中繼電器中的保險絲會在溫度過高的情況下會熔斷,防止加熱管干燒,并且在單片機上還加上發(fā)光二極管顯示加熱電路的工作情況。

1.5本文結構

本文以對單片機的研究作為基礎,對DS18B20及單片機控制顯示,輸入輸出等方面進行了研究,全文分為6章,各章內(nèi)容如下:
第一章主要介紹了電熱水器控制系統(tǒng)的基本概念、特點研究現(xiàn)狀,闡述了電熱水器的研究背景以及研究意義,概括的闡述了本次設計的主要內(nèi)容。
第二章表明了本次設計的技術指標要求,主要介紹了采用的幾個設計方案與各自的優(yōu)缺點,并在最后表明了本次設計最終所采用的方案。
第三章闡述所選擇的幾個重要元件的特點與性能第四章主要介紹了電熱水器控制系統(tǒng)的硬件電路的設計,主要介紹了各模塊的設計方案。
第四章對系統(tǒng)的硬件模塊的設計進行闡述,對各硬件的原理及主要參數(shù)進行了描述。
第五章對系統(tǒng)的軟件設計進行闡述,以流程圖為線索對各個模塊的軟件程序的設計方案進行了介紹。
第六章總結了全文的研究工作,給出了存在的問題與進一步的研究方向。


第二章 電熱水器控制系統(tǒng)設計方案

2.1系統(tǒng)功能說明

本設計采用AT89S52單片機作為主控芯片,利用數(shù)字式溫度傳感器DS18B20作為溫度采集裝置采集溫度,將溫度信號傳送給單片機后通過一片液晶顯示屏顯示出來。
系統(tǒng)工作的溫度可以通過電路板上的按鍵自主進行設定。
系統(tǒng)采用了一個繼電器,用單片機為主的控制系統(tǒng)控制繼電器觸電的吸合,來控制交流電加熱電路,達到以弱電控制強電的目的。
系統(tǒng)必須設置溫度報警系統(tǒng),即達到設定溫度的上限時揚聲器報警,系統(tǒng)自動斷電,當溫度恢復時,系統(tǒng)重新恢復工作。

2.2系統(tǒng)主要實現(xiàn)功能

系統(tǒng)主要功能如下:
1)測量熱水器內(nèi)的溫度,并通過顯示屏實時顯示溫度值,顯示范圍為0℃~70℃。
2)正常狀態(tài)下顯示系統(tǒng)時鐘。
3)可手動設定時鐘時間即對時鐘進行校準。
4)可以人工設定熱水器內(nèi)的燒水溫度,范圍在20℃~70℃之間,也可以無需設定,打開后自動燒水,溫度上限為70℃。
5)具備定時功能,限定燒水時間。
6)可以立即開機或在24小時內(nèi)任意設定開機時間。
7)當熱水器內(nèi)沒有水時,有報警提示,并開關自動關閉,即有防止干燒功能。
8)要求熱水器有一定的抗干擾的功能。

2.3系統(tǒng)整體設計方案

電熱水器控制系統(tǒng)的整體設計方案包括硬件設計與軟件設計方案,硬件方案主要是指以單片機為核心,包括外接的溫度采集電路,實時時鐘電路,鍵盤,熱水器加熱開關,液晶顯示電路,報警電路以及復位電路。具體硬件框圖如圖2.1所示


2.4方案論證

按照前面的課題要求,我們首先確定運用單片機AT89S52作為本次設計的核心部件。
在溫度采集方面有多種選擇,常見的溫度傳感器分為以下幾種:熱敏電阻式溫度傳感器、熱電阻式溫度傳感器、熱電偶式溫度傳感器、模擬集成溫度傳感器、智能溫度傳感器。本次設計原本選擇的是pt1000鉑電阻溫度傳感器,其作為高精度的溫度敏感元件,具有測溫范圍大,測溫精度高,穩(wěn)定性好,示值復現(xiàn)性高與耐氧化等特點,常被用作0℃~926℃溫度區(qū)間內(nèi)的標準溫度計,其特性曲線為:-200°C~0°C時,Rt=R0[1+At+Bt2+c(t-100)t3];0°C~650°C時,Rt=R0[1+At+Bt2]。(Rt為溫度為t°C時熱電阻的阻值,R0為0°C時的阻值,A、B、C為實驗測定的常數(shù),A=3.90802×10-2,B=5.802×10-7,C=-4.22×10-7)本系統(tǒng)使用的R0為1000Ω。而要將pt1000作為本次設計的元件,還需要語氣配套的傳感器測量電路與放大電路兩部分,具體電路如圖2.2所示。[12]
但是在實際購買時發(fā)現(xiàn)pt1000電阻由于價格過高,所以在最終設計中并沒有采用pt1000作為測溫元件來使用,同時,在同組同學推薦下采用了另一種集成式溫度傳感器DS18B20作為測溫元件,DS18B20雖然測溫范圍比pt1000小,但是在滿足本設計要求的基礎上,其價格不到pt1000的一半,并且其硬件電路由于舍去了普通傳感器所需附帶的A/D電路的設計,所以其硬件電路的設計更加簡單,所以采用了DS18B20作為最終設計中的測溫元件。[11]

本次設計的要求是選擇51單片機作為核心的處理器,但是市場上做51單片機的廠商有很多家,其中比較著名的有STC公司、MICROCHIP公司、德州儀器公司、Intel公司、ATMEL公司、Philips公司、Siemens公司。[9]
其中STC公司的STC單片機主要是基于8051內(nèi)核,是新一代增強型單片機,指令代碼完全兼容傳統(tǒng)8051,速度快8~12倍,帶ADC,4路PWM,雙串口,有全球唯一ID號,加密性好,抗干擾強。
還有MICROCHIP公司的PIC單片機,其突出的特點是體積小,功耗低,精簡指令集,抗干擾性好,可靠性高,有較強的模擬接口,代碼保密性好,大部分芯片有其兼容的FLASH程序存儲器的芯片.
PHILIPS公司的PHLIPIS 51LPC系列單片機是基于80C51內(nèi)核的單片機,嵌入了掉電檢測、模擬以及片內(nèi)RC振蕩器等功能,這使51LPC在高集成度、低成本、低功耗的應用設計中可以滿足多方面的性能要求。
ATMEl公司的8位單片機有AT89、AT90兩個系列,AT89系列是8位Flash單片機,與8051系列單片機相兼容,靜態(tài)時鐘模式;AT90系列單片機是增強RISC結構、全靜態(tài)工作方式、內(nèi)載在線可編程Flash的單片機,也叫AVR單片機。
而作為第一次使用單片機做獨立設計,我選用的是ATMEL公司的AT89S52單片機,AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統(tǒng)可編程Flash 儲存器。使用Atmel 公司高密度非易失性儲存器技術制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序編程器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52在眾多嵌入式控制應用系統(tǒng)中得到廣泛應用。

眾所周知,單片機的程序寫入過程不是一帆風順的,其常常需要多次的寫入與調(diào)試的過程,這里采用AT89S52的優(yōu)點就是AT89S52額外添加了8k在系統(tǒng)可編程(即ISP)Flash存儲器,特意設計為方便在線編程,使得其下載線電路簡單,且可實現(xiàn)并行和或者串行模式的在線編程,使得每一次的程序下載與調(diào)試不必將單片機從PCB板上拔下,這樣不僅使程序調(diào)試變得更加方便,其次還會大大延長單片機與PCB板的壽命。
由于本次設計需要有定時開關機的功能,而單片機其內(nèi)部時鐘只能作為其內(nèi)部程序運行的基準而不能滿足設計的要求,所以外接了一個時鐘芯片來滿足本次設計的要求。[10]
市面上的主流的時鐘芯片有DS1302、 DS1307、PCF8485、SB2068等等。這些芯片結構簡單,價格低廉,而實時時鐘電路DS1302是DALLAS公司的一種具有涓細電流充電能力的電路,主要特點是采用串行數(shù)據(jù)傳輸,可為掉電保護電源提供可編程的充電功能,并且可以關閉充電功能。采用普通32.768kHz晶振。
在顯示方面采用一個液晶顯示屏來顯示主要的參數(shù),液晶顯示屏相對于LED數(shù)碼管雖然編程方面更加繁瑣,但是相對的其還具有更多的優(yōu)點,其除了可以順利的顯示數(shù)字之外,還可以對顯示的數(shù)字進行簡單的注釋,使得人機操作界面變得更加友好,其次在有關網(wǎng)站上也可以順利的查找到有關DS1302的信號顯示程序,本次顯示界面除了有溫度的顯示還需要有時間的顯示,定時操作信號的顯示,采用LCD顯示屏使操作顯得更加方便。[6]
在鍵盤的選擇上,有兩種選擇:一是采用獨立式按鍵鍵盤,第二種是采用矩陣式鍵盤。矩陣式一般鍵盤采用4*4式鍵盤,而本次設計中并不需要如此多的功能按鍵,所以本次設計,選擇了獨立式按鍵,本次總共使用了6個按鍵。其中按鍵1的功能是系統(tǒng)的復位,按鍵2的功能是實現(xiàn)實時時鐘的時間校準功能,按鍵3實現(xiàn)的功能是實現(xiàn)燒水溫度的設置功能,按鍵4實現(xiàn)的功能是燒水定時功能的設置,按鍵5與按鍵6分別是“+”“—”功能鍵。
然后本次設計中還加入了一個發(fā)光二極管與蜂鳴器。
發(fā)光二極管用來顯示繼電器的閉合狀況,使得加熱電路的通斷能夠被更直接的觀察。
而加入蜂鳴器的作用是在進行某項操作時進行指示作用,還有在達到燒水溫度或者定時時間到的時候起到報警作用。



第三章 主要元件介紹

3.1單片機系統(tǒng)模塊介紹

AT89S52是一種低功耗、高性能CMOS 8位微控制器,具有8K在線可編程Flash 存儲器,使用Atmel公司高密度非易失性存儲器技術制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲器在線可編程,亦適于常規(guī)編程器。在一個芯片上,擁有靈巧的8 位CPU 和在線可編程Flash,使得AT89S52為眾多嵌入式控制應用系統(tǒng)提供高靈活、超有效的解決方案。[1]
AT89S52具有以下標準功能:8K字節(jié)的Flash,256字節(jié)的RAM,32 位I/O 口,看門狗定時器,2個數(shù)據(jù)指針,三個16 位定時器/計數(shù)器,一個6向量2級中斷結構,全雙工串行口,片內(nèi)晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件,可選擇節(jié)電模式?臻e模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作;掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。

3.1.1 AT89S52單片機的主要性能

與MCS-51單片機產(chǎn)品兼容
8K字節(jié)在系統(tǒng)可編程Flash存儲器
1000次擦寫周期
全靜態(tài)操作:0Hz~33Hz
三級加密程序存儲器
32個可編程I/O口線
三個16位定時器/計數(shù)器
八個中斷源
全雙工UART串行通道
低功耗空閑和掉電模式
掉電后中斷可喚醒
看門狗定時器
雙數(shù)據(jù)指針
掉電標識符

3.1.2 AT89S52管腳功能說明

AT89S52引腳如圖3.1所示。


圖3.1  AT89S52引腳結構圖
VCC :電源
GND : 接地
P0口: P0口是一個8位漏極開路的雙向I/O口。作為輸出口,每位能驅動8個TTL邏輯電平。對P0端口寫“1”時,引腳用作高阻抗輸入。當訪問外部程序和數(shù)據(jù)存儲器時,P0口也被作為低8位地址/數(shù)據(jù)復用,在這種模式下,P0具有內(nèi)部上拉電阻。在flash編程時,P0口也用來接收指令字節(jié),在程序校驗時,輸出指令字節(jié)。程序校驗時,P0口需要外部上拉電阻。
表3.1 P1口第二功能


P1口:P1 口是一個具有內(nèi)部上拉電阻的8 位雙向I/O 口,P1 輸出緩沖器能驅動4個TTL 邏輯電平。對P1 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。此外,P1.0和P1.2分別作定時器/計數(shù)器2的外部計數(shù)輸入(P1.0/T2)和時器/計數(shù)器2的觸發(fā)輸入(P1.1/T2EX),具體如表3.1所示。在flash編程和校驗時,P1口接收低8位地址字節(jié)。
P2口:P2 口是一個具有內(nèi)部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅動4個TTL 邏輯電平。對P2 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。在訪問外部程序存儲器或用16位地址讀取外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX @DPTR)時,P2 口送出高八位地址。在這種應用中,P2 口使用很強的內(nèi)部上拉發(fā)送1。在使用8位地址(如MOVX @RI)訪問外部數(shù)據(jù)存儲器時,P2口輸出P2鎖存器的內(nèi)容。在flash編程和校驗時,P2口也接收高8位地址字節(jié)和一些控制信號。
P3口:P3 口是一個有內(nèi)部上拉電阻的8 位雙向I/O 口,P3 輸出緩沖器能驅動4個TTL 邏輯電平。對P3 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。P3口亦作為AT89S52特殊功能(第二功能)使用,如表3.2所示。在flash編程和校驗時,P3口也接收一些控制信號。
表3.2  P3口第二功能


RST:復位輸入。晶振工作時,RST腳持續(xù)2個機器周期高電平將使單片機復位。看門狗計時完成后,RST 腳輸出96個晶振周期的高電平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能無效。DISRTO默認狀態(tài)下,復位高電平有效。
ALE/PROG:地址鎖存控制信號(ALE)是訪問外部程序存儲器時,鎖存低8 位地址的輸出脈沖。在flash編程時,此引腳(PROG)也用作編程輸入脈沖。在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或時鐘使用。然而,特別強調(diào),在每次訪問外部數(shù)據(jù)存儲器時,ALE脈沖將會跳過。如果需要,通過將地址為8EH的SFR的第0位置“1”,ALE操作將無效。這一位置 “1”,ALE 僅在執(zhí)行MOVX 或MOVC指令時有效。否則,ALE 將被微弱拉高。這個ALE 使能標志位(地址為8EH的SFR的第0位)的設置對微控制器處于外部執(zhí)行模式下無效。
PSEN:外部程序存儲器選通信號(PSEN)是外部程序存儲器選通信號。當AT89S52從外部程序存儲器執(zhí)行外部代碼時,PSEN在每個機器周期被激活兩次,而在訪問外部數(shù)據(jù)存儲器時,PSEN將不被激活。
EA/VPP:訪問外部程序存儲器控制信號。為使能從0000H 到FFFFH的外部程序存儲器讀取指令,EA必須接GND.為了執(zhí)行內(nèi)部程序指令,EA應該接VCC。在flash編程期間,EA也接收12V的VPP電壓。
XTAL1:振蕩器反相放大器和內(nèi)部時鐘發(fā)生電路的輸入端。
XTAL2:振蕩器反相放大器的輸出端。[7]

3.1.3單片機的最小系統(tǒng)

單片機的最小系統(tǒng)是指運用最少的元件使單片機運行的系統(tǒng),一般包括一下的幾個部分:晶振電路、復位電路、電源電路和串口電路。
晶振是電路中常用用的時鐘元件,全稱是叫晶體震蕩器,在單片機系統(tǒng)里晶振的作用非常大,他結合單片機內(nèi)部的電路,產(chǎn)生單片機所必須的時鐘頻率,單片機的一切指令的執(zhí)行都是建立在這個基礎上的,晶振的提供的時鐘頻率越高,那單片機的運行速度也就越快。[2]
晶振的作用是為系統(tǒng)提供基本的時鐘信號。通常一個系統(tǒng)共用一個晶振,便于各部分保持同步。有些通訊系統(tǒng)的基頻和射頻使用不同的晶振,而通過電子調(diào)整頻率的方法保持同步。
而晶振由于會與單片機的XTAL1與XTAL2腳構成的振蕩電路中會產(chǎn)生諧波,從而降低電路時鐘振蕩器的穩(wěn)定性,所以一般會匹配兩個30pf的電容來消減諧波對于電路穩(wěn)定性的影響。
晶振電路如圖3.2所示:,XTAL1 和XTAL2 分別是放大器的輸入、輸出端
圖3.2 晶振電路

系統(tǒng)復位有兩種方式:上電復位與手動復位。[3]
上電復位:上電瞬間,電容充電電流最大,電容相當于短路,RST端為高電平,自動復位;電容兩端的電壓達到電源電壓時,電容充電電流為零,電容相當于開路,RST端為低電平,程序正常運行。

手動復位:首先經(jīng)過上電復位,當按下按鍵時,RST直接與VCC相連,為
圖3.3復位電路


高電平形成復位,同時電解電容被短路放電;按鍵松開時,VCC對電容充電,充電電流在電阻上,RST依然為高電平,仍然是復位,充電完成后,電容相當于開路,RST為低電平,正常工作。[5]
一般采用手動復位,其對于上電復位方式更加方便,不需要切斷電源便可對系統(tǒng)進行復位,復位電路如圖3.3所示

3.2溫度檢測模塊

3.2.1 DS18B20的主要功能及特點

DS18B20溫度傳感器是美國達拉斯(DALLAS)半導體公司推出的應用單總線技術的數(shù)字溫度傳感器。該器件將半導體溫敏器件、A/D轉換器、存儲器等做在一個很小的集成電路芯片上。它具有微型化、低功耗、高性能、抗干擾能力強、易配微處理器等優(yōu)點,可直接將溫度轉化成串行數(shù)字信號供處理器處理。[8]
DS18B20具有以下特性:
獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線。
每個設備都有一個唯一的64位序列碼,存儲在ROM中。
簡單的多點分布式測溫應用。
在使用中不需要任何外圍元件。
可以從數(shù)據(jù)線供電。電源范圍為3.0V~ 5.5V。
測溫范圍 -55℃~+125℃。
在—10℃~+85℃間,測溫分辨率為0.5℃。
溫度計分辨率可由用戶選擇,9至12位之間。
在750毫秒內(nèi)將溫度轉換為12位字。
用戶可自定義非易失性報警的設置。
報警搜索命令定義和存儲的設備,其溫度不收程序限制(溫度報警狀態(tài))。
采用8引腳SOP和3引腳TO- 92封裝。
軟件與DS1822兼容。
其引腳如圖3.4所示:





圖3.4 DS18B20引腳圖
引腳說明:
GND - 接地
DQ  - 輸入/輸出數(shù)據(jù)
VDD - 電源電壓
NC  - 無連接

DS18B20的極限使用條件
各引腳對地電壓: -0.5V~+0.6V
工作溫度:  -55℃~125℃
儲存溫度:  -55℃~+125℃
焊接溫度參見J-STD-020A的規(guī)格
*以上指出的器件在進行正常焊接操作時所需要的環(huán)境條件,可能還有部分為能說明但是在操作規(guī)格中已經(jīng)暗示器件可正常運行的環(huán)境。長期工作在極限條件下可能會影響器件的可靠性。

3.2.2DS18B20的內(nèi)部結構

DS18B20的內(nèi)部存儲資源分為8個字節(jié)的ROM,9個字節(jié)的高速暫存器RAM,3個字節(jié)的EEPROM。如圖3.5所示。


圖3.5  DS18B20內(nèi)部結構圖
每只DS18B20都有一個唯一存儲在ROM中的64位編碼。最前面8位是單線系列編碼,接著的49位是唯一的序列號,最后8位是以上56位的CRC編碼。當一條總線上皆有多個DS18B20時,就通過序列號對其加以區(qū)分。
主機操作ROM的指令有5種:
33H——讀ROM。讀DS18B20溫度傳感器ROM中的編碼。
55H——匹配ROM。發(fā)出此命令后,接著發(fā)出64位ROM編碼,訪問單總線上與該編碼相對應的DS18B20并使之做出響應,為下一步對該DS18B20的讀寫做準備。
F0H——搜索ROM。用于確定掛接在同一總線上DS18B20的個數(shù),識別64位ROM地址,位操作各期間做好準備。
CCH——跳過ROM。忽略64位ROM地址,直接向18B20發(fā)溫度變換命令。
ECH——告警搜索命令。執(zhí)行后只有溫度超過設定值上限或下限的芯片才做出響應。
高速暫存器RAM由9個字節(jié)組成。其組成如圖3.8所示。包括兩個溫度顯示位,兩個復制的TH和TL,一個配置寄存器和三個保留位,一個CRC校驗值?呻姴罞2PROM又包括溫度觸發(fā)器TH和TL,以及一個配置寄存器。

表3.3  高速暫存器RAM組成
寄存器內(nèi)容
字節(jié)地址
溫度值地位(LSB)
0
溫度值高位(MSB)
1
高溫限值(TH)
2
低溫限值(TL)
3
配置寄存器
4
保留
5
保留
6
保留
7
CRC校驗值
8

操作RAM的指令主要有:
44H——溫度轉換。啟動DS18B20進行溫度轉換,結果存入RAM。
BEH——讀暫存器。讀內(nèi)部RAM中的溫度數(shù)據(jù)。
4EH——寫暫存器。發(fā)出像內(nèi)部RAM寫上、下限溫度數(shù)據(jù)指令,緊跟該命令之后傳送2字節(jié)的數(shù)據(jù)。
48H——復制暫存器。將RAM中的TH、TL復制到E2PROM中。
B8H——重調(diào)E2PROM。將E2PROM中內(nèi)容恢復到中。
B4H——讀供電方式。寄生供電時,DS18B20發(fā)送0,外界電源供電時,DS18B20發(fā)送1。

3.2.3 DS18B20的工作時序

DS18B20需要嚴格的單總線協(xié)議以確保數(shù)據(jù)的完整性,主要包括初始化系列,讀序列,寫序列,所有時序都是講主機作為主設備,單總線設備作為從設備。每一次命令和數(shù)據(jù)的傳輸都是從主機啟動寫時序開始,如果要求單總線器件會送數(shù)據(jù),在進行寫命令后,主機需啟動讀時序寫完數(shù)據(jù)將接受。數(shù)據(jù)和命令的傳輸都是地位在先。
初始化時序:
1)先將數(shù)據(jù)線置高電平1。
2)延時(該時間要求不是很嚴格,但是要盡可能短一點)。
3)數(shù)據(jù)線拉到低電平0。
4)延時750us(該時間范圍可以在480~960us)。
5)數(shù)據(jù)線拉到高電平。
6)延時等待。如果初始化成功,則在15~60ms內(nèi)產(chǎn)生一個由DS18B20返回的低電平0,據(jù)該狀態(tài)可以確定它的存在。
7)若CPU讀到數(shù)據(jù)線上的低電平0后,還要進行延時,其延時的時間從發(fā)出高電平算起至少要480us.
8)將數(shù)據(jù)線再次拉到高電平1后結束。如圖3.6所示。



圖3.6  初始化時序圖

寫時序:
1)數(shù)據(jù)線先置低電平0。
2)延時確定的時間為15us。
3)按從低位到高位的順序發(fā)送數(shù)據(jù)。
4)延時時間為45us。
5)將數(shù)據(jù)線拉到高電平1。
6)重復1)~5)步驟,直到發(fā)送完整個字節(jié)。
7)最后將數(shù)據(jù)線拉高到1。如圖3.7所示。

圖3.7  寫數(shù)據(jù)時序圖
讀時序:
1)將數(shù)據(jù)線拉高到1。
2)延時2us。
3)將數(shù)據(jù)線拉低到0。
4)延時6 us。
5)將數(shù)據(jù)線拉高到1。
6)延時4 us。
7)讀數(shù)據(jù)線的狀態(tài)得到一個狀態(tài)位,并進行數(shù)據(jù)處理。
8)延時30us。
9)重復1~7步驟,直到讀取完一個字節(jié)。如圖3.8所示。

圖3.8  讀數(shù)據(jù)時序圖



第四章 硬件模塊的設計

在第二章已經(jīng)提到硬件件模塊的設計主要是指以單片機為核心,包括外接的溫度采集電路,實時時鐘電路,鍵盤,熱水器加熱開關,液晶顯示電路,報警電路以及復位電路的設計。

圖4.1 硬件模塊設計框圖

4.1 溫度采集模塊

首先我們選擇DS18B20作為本次設計的測溫元件。
由第三章有關內(nèi)容可知DS18B20溫度傳感器可以將溫度這一模擬信號轉化為數(shù)字信號供處理器進行處理,從而省去了電阻電感式傳統(tǒng)溫度傳感器的信號運放模塊與A/D轉換模塊。
DS18B20只有三根外引線:單線數(shù)據(jù)傳輸總線端口DQ (2),外供電源線VDD(3),共用地線GND(1)。DS18B20有兩種供電方式:一種為數(shù)據(jù)線供電方式,此時VDD接地,它是通過內(nèi)部電容在空閑時從數(shù)據(jù)線獲取能量,來完成溫度轉換,相應的完成溫度轉換的時間較長。這種情況下,用單片機的一個I/O口來完成對DS18B20總線的上拉。另一種是外部供電方式(VDD接+5V),相應的完成溫度測量的時間較短。

在本設計中采用外部供電方式實現(xiàn)DS18B20傳感器與單片機的連接,具體的接口電路如圖4.2所示。
圖4.2溫度傳感器接口電路

4.2實時時鐘電路模塊

本次設計采用的外接時鐘模塊芯片是美國DALLAS公司的DS1302時鐘芯片。

4.2.1 DS1302的介紹

其作為一款高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設置備用電源充電方式,提供了對后背電源進行涓細電流充電的能力。DS1302的外部引腳分配如圖1所示及內(nèi)部結構如圖2所示。DS1302用于數(shù)據(jù)記錄,特別是對某些具有特殊意義的數(shù)據(jù)點的記錄上,能實現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時間同時記錄,因此廣泛應用于測量系統(tǒng)中。
各引腳的功能為:
Vcc1:主電源;Vcc2:備份電源。當Vcc2>Vcc1+0.2V時,由Vcc2DS1302供電,當Vcc2< Vcc1時,由Vcc1DS1302供電。
SCLK:串行時鐘,輸入,控制數(shù)據(jù)的輸入與輸出;
I/O:三線接口時的雙向數(shù)據(jù)線;
CE:輸入信號,在讀、寫數(shù)據(jù)期間,必須為高。該引腳有兩個功能:第一,CE開始控制字訪問移位寄存器的控制邏輯;其次,
CE提供結束單字節(jié)或多字節(jié)數(shù)據(jù)傳輸?shù)姆椒ā?/div>
具體引腳圖如圖4.3所示

圖4.3 DS1302引腳圖

圖4.4 DS1302內(nèi)部結構圖

4.2.2實時時鐘模塊原理圖

電路原理圖如圖4.5所示,DS1302與單片機的連接也僅需要3條線:CE引腳、SCLK串行時鐘引腳、I/O串行數(shù)據(jù)引腳,Vcc2為備用電源,外接12MHz晶振,為芯片提供計時脈沖。


圖4.5 DS1302實時時鐘電路接線電路

4.3鍵盤輸入模塊

鍵盤輸入原理圖如圖4.6所示:
P3.3~P3.7分別接按鍵S1~S6
按鍵的功能分別是:
S1時間調(diào)整按鈕
S3燒水開始按鈕與燒水溫度調(diào)整按鈕
S4燒水時間設定按鈕
S5“+”功能鍵
S6“—”功能鍵


圖4.6鍵盤輸入模塊原理圖

4.4繼電器加熱模塊

繼電器的定義是當輸入量(激勵量)的變化達到規(guī)定要求時,在電氣輸出電路中使被控量發(fā)生預定的階躍變化的一種電器,它具有控制系統(tǒng)(又稱輸入回路)和被控制系統(tǒng)(又稱輸出回路)之間的互動關系。通常應用于自動化的控制電路中,它實際上是用小電流去控制大電流運作的一種“自動開關”。故在電路中起著自動調(diào)節(jié)、安全保護、轉換電路等作用。
本設計所用的為型號SRD-05VDC-SL-C的繼電器。線圈電壓為直流5V,為一單刀雙擲繼電器,其引腳結構如圖4.7所示。


圖4.7 繼電器引腳圖
除線圈外,另三個引腳構成一個單刀雙擲開關,當線圈通電時,開關達到另一邊,原來的開觸點吸和,閉觸點斷開。本設計中,目的是用繼電器吸和,接通外接的以加熱設備,從而起到溫度控制的作用,只需用到一組常開觸點,則另一端空置。
本次繼電器模塊的設計原理圖如圖4.8所示:

圖4.8 繼電器設計原理圖

4.5 LCD顯示模塊設計

4.5.1 LCD模塊概述

本次設計采用的是一塊1602LCD液晶模塊,其共可以顯示2 行×16 個字符,每個字符是由5×8點陣組成的字符塊集。字符型液晶顯示模塊由字符型液晶顯示屏(LCD),控制驅動主芯片SPLC780C 及其擴展驅動芯片SPLC1OO,配以少量外圍阻﹑容元件結構件等裝配在PCB 板上而成。YB1602A 采用COB 工藝制作,結構穩(wěn)定,使用壽命長。
其主要特性如下:
8位并行數(shù)據(jù)串口,適配M6800系列時序;
可選為并行數(shù)據(jù)方式;
具有字符發(fā)生器ROM,含10880位;
192中5*8點字符
64種5*10點字體字符
低功耗,高可靠性;

4.5.2 LCD模塊硬件說明

1)接口說明
表4.1 LCD1602接口說明
管腳序
名稱
電平
功能描述
1
VSS
0V
電源地
2
VCC
5.0V
電源輸入
3
V0
LCD驅動電壓輸入
4
RS
H/L
RS=H,表示DB0-DB7 為顯示數(shù)據(jù)
RS=L,表示DB0-DB7 為指令
5
R/W
H,H→L
R/W=H,數(shù)據(jù)被讀到DB9-DB7
R/W=L, 數(shù)據(jù)被寫到DB9-DB7
6
E
H/L
使能信號
7
DB0
H/L
數(shù)據(jù)線
8
DB1
H/L
數(shù)據(jù)線
9
DB2
H/L
數(shù)據(jù)線
10
DB3
H/L
數(shù)據(jù)線
11
DB4
H/L
數(shù)據(jù)線
12
DB5
H/L
數(shù)據(jù)線
13
DB6
H/L
數(shù)據(jù)線
14
DB7
H/L
數(shù)據(jù)線
15
BLA
5.0V
背光正極(LEDK﹑BLK)
16
BLK
0V
背光負極(LEDA﹑BLA)

備注:第3 腳V0 用來調(diào)節(jié)對比度,LCD 的驅動電壓Vop=VDD-V0,YB1602 的Vop是4.8V,此時顯示最佳對比度,故在5.0V 供電模式下,可以在V0 與電源地(0V)之間接一個10K 的可調(diào)電位器來調(diào)節(jié)對比度。
2)最大工作范圍
邏輯工作電壓(VDD):4.5V~5.5V
電源地(VSS):0V
LCD驅動電壓(Vop):-0.2V~+0.3V

4.5.3 內(nèi)部控制指令

表4.2 LCD內(nèi)部指令表
序號
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清顯示
0
0
0
0
0
0
0
0
0
1
2
光標返回
0
0
0
0
0
0
0
0
1
*
3
置輸入模式
0
0
0
0
0
0
0
1
I/D
S
4
顯示開/關控制
0
0
0
0
0
0
1
D
C
B
5
光標或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符發(fā)生存貯器地址
0
0
0
1
字符發(fā)生存貯器地址
8
置數(shù)據(jù)存貯器地址
0
0
1
顯示數(shù)據(jù)存貯器地址
9
讀忙標志或地址
0
1
BF
計數(shù)器地址
10
寫數(shù)到CGRAM或DDRAM)
1
0
要寫的數(shù)據(jù)內(nèi)容
11
從CGRAM或DDRAM讀數(shù)
1
1
讀出的數(shù)據(jù)內(nèi)容

4.5.4顯示硬件設計原理圖


根據(jù)設計要求與液晶控制方式,采用并行工作方式,將單片機的P0口作為數(shù)據(jù)傳輸口,而又由于單片機的P0口內(nèi)部沒有上拉功能,P0口作為I/O口輸出的時候時 輸出低電平為0 輸出高電平為高組態(tài)(并非5V,相當于懸空狀態(tài))。也就是說P0 口不能真正的輸出高電平,給所接的負載提供電流,因此必須接上拉電阻[4](即外接一排阻連接到VCC上,如圖4-8所示)。其硬件顯示模塊如圖4.9所示。[16]



圖4.9 液晶顯示模塊原理圖

4.6其余硬件模塊設計



蜂鳴器電路在輸入為低電平時導通,作為某些按鍵按下的指示音。
LED燈在繼電器斷開即加熱工作時亮,在加熱電路斷開時,LED燈熄滅。



第五章系統(tǒng)軟件設計
根據(jù)系統(tǒng)所需要實現(xiàn)的功能,軟件設計主要分為如下的幾個模塊:主程序、溫度讀取模塊設計、實時時鐘模塊設計、LCD顯示模塊設計、鍵盤掃描程序以及按鍵消抖程序。
本系統(tǒng)的工作流程是:系統(tǒng)上電后,對電路板上的各部分初始化;然后按下按鍵2,對時間進行設定;按下按鍵3之后,對燒水溫度進行設定;按下按鍵4后,對燒水時間進行設定,當溫度超過設定的溫度之后,蜂鳴器工作,系統(tǒng)停止工作;在系統(tǒng)受到較強干擾時,按下按鍵1可以對單片機進行復位。

5.1主程序模塊

主程序主要完成的是對個全局變量進行定義,對時鐘與時間的初始化,調(diào)用子函數(shù)功能。
具體流程圖如圖5.1所示。
主程序清單如下:
void main()
{
              bit bz=0;
              float ttt;         
              char we[6];
              unsigned int i;
              int te;
              delayms(1);
              chushishizhong();                //初始時鐘
              chushishijian();                 //初始時間

              //writetime();
kaishi:
    writecom(0x01);      //清零
              while(1)
              {
                            readtime();              //讀取時間
                            t[0]=shijian[4]/10+0x30;              //時間數(shù)據(jù)處理
                            t[1]=shijian[4]%10+0x30;


5.2 DS18B20測溫模塊

此模塊主要任務是對DS18B20進行初始化,然后再進行讀字節(jié)、寫字節(jié)的工作,最后將讀得的16進制溫度傳送到處理器內(nèi)進行處理。
DS18B20測溫流程圖如圖5.2所示

具體程序如下:

(具體程序詳見附件)

5.3實時時鐘模塊

實時時鐘模塊完成時間的設定與時間的讀取,包括年、月、日、時、分、秒。
具體流程圖如圖5.3所示

具體程序如下:
#define uchar unsigned char

sbit  res=                              P2^0;    //數(shù)據(jù)命令口選擇
sbit clo=              P2^2;        //脈沖信號口選擇
sbit io=P2^1;            //數(shù)據(jù)口選擇

#define miao               0x80//秒


5.4 LCD顯示模塊

LCD顯示模塊主要實現(xiàn)各個數(shù)據(jù)的顯示功能,包括時間的顯示與溫度以及提示字的顯示。
顯示模塊的流程圖如圖5.4所示。




具體程序如下:

#define port P0
#define uchar unsigned char
#define uint unsigned int

sbit rs=P2^7;        //將P2.0設置為數(shù)據(jù)選擇口
sbit rw=              P2^6;    //將P2.6設置為讀寫選擇口
sbit en=                            P2^5;   //將P2.5設置為使能信號口
(具體程序詳見附件)

5.5鍵址返回程序

鍵盤掃描程序的功能是逐個掃描各個功能鍵和“+”“—”鍵是否被按下,若按下某個按鍵,則返回相應的鍵址。
其按鍵掃描程序如下:
sbit k1=P3^3;    //定義每個按鍵的數(shù)據(jù)口 P3.3為S1按鍵
sbit k2=P3^4;    //P3.4對應S2按鍵
sbit k3=P3^5;    //P3.5對應S3按鍵
sbit k4=P3^6;    //P3.6對應S4按鍵
sbit k5=P3^7;   //P3.7對應S5按鍵

unsigned char keyscan()    //定義鍵址返回程序
{
    if(k1==0)     //當按鍵1按下
                 {
                 delayms(10);   //消抖 延時
                   if(k1==0)  
                            {
                            while(k1==0);
                            return 1;    //返回鍵址1
                            }
                 }
    else if(k2==0)  //當按鍵2按下
                 {
                 delayms(10);
                   if(k2==0)
                            {
                            while(k2==0);
                            return 2;   //返回鍵址2
                            }
                 }
    else if(k3==0)    //當按鍵3按下
                 {
                 delayms(10);
                   if(k3==0)
                            {
                            while(k3==0);
                            return 3;      //返回鍵址3
                            }
                 }
    else if(k4==0)    //當按鍵4按下
                 {
                 delayms(10);
                   if(k4==0)
                            {
                            while(k4==0);
                            return 4;      //返回鍵址4
                            }
                 }
    else if(k5==0)    //當按鍵5按下
                 {
                 delayms(10);
                   if(k5==0)
                            {
                            while(k5==0);
                            return 5;       //返回鍵址5
                            }
                 }
                 else
              return 0;        //若沒有按鍵按下則返回0

}

5.6測試及性能分析

實際硬件測試圖如下:
1)接通電源,系統(tǒng)正常顯示時鐘,如圖5.5所示
圖5.5
實時時鐘顯示
2)按下按鍵2,,光標閃爍,進入時鐘校準模式,如圖5.6所示
圖5.6
時鐘校準
3)按下按鍵3,系統(tǒng)顯示當前溫度,按下按鍵5,按鍵6調(diào)節(jié)燒水溫度,當水箱內(nèi)溫度低于目標溫度時,LED燈亮,表示繼電器斷開,加熱電路工作。,如圖5.7所示。
圖5 .7加熱模式
4)當水箱內(nèi)溫度達到加熱溫度時,LED燈熄滅,加熱電路停止工作,在溫度降到設定溫度以下,繼電器斷開,繼續(xù)加熱。如圖5.8所示

圖5.8 繼續(xù)燒水
5)按下按鍵4,進入加熱時間設定,再按下按鍵4則進入定時燒水模式。如圖5.9所示

圖5.9 定時燒水

6)按下按鍵1,則對系統(tǒng)進行復位操作,系統(tǒng)初始化到時間顯示畫面,如圖5.10所示
圖5.10 復位操作

結論:成品經(jīng)實際測試,基本達到本次設計的各項要求。


第六章 結論
本文主要闡述了以51系列單片機為核心處理器完成電熱水器控制系統(tǒng)的設計。
本次設計主要完成的任務有:
1)51單片機最小系統(tǒng)的研究,了解了51系列單片機的兩種復位方式;
2)本文研究了兩種方式鍵盤設計的優(yōu)劣,并且了解了如何運用軟件對抖動現(xiàn)象的消除;
3)本文闡述了LCD液晶顯示屏的顯示原理,并且研究了液晶顯示屏的動態(tài)數(shù)字的顯示方式;
4)本次設計詳細闡述了DS18B20溫度采集芯片的詳細參數(shù),工作原理與和單片機的連接電路,以及如何對其進行軟件編程以完成所需要的操作編程方法。
本次設計在初期時曾由于設計經(jīng)驗的不足,而導致在初步設計完成之后,編程與購買各芯片進行硬件組裝,制作實物時,發(fā)現(xiàn)很多芯片價格過于昂貴,或者某些芯片由于型號過老而難以購買,同時在對某些芯片進行軟件模塊編程時發(fā)現(xiàn)某些芯片的編程相對有些困難,于是在后期又進行一次設計方案的改變,但是由于時間過緊,此次設計還有定時開關機功能沒有實現(xiàn)。并且由于設計經(jīng)驗的不足,單片機在某些時候會由于不確定因素出現(xiàn)死機的狀況,在復位之后又能進行正常的工作。
本次設計使我自己對所學的專業(yè)知識得到了進一步的鞏固,也讓我發(fā)現(xiàn)了在之前的課程學習中所未掌握的部分,從而使得自己在專業(yè)知識方面得到了一次提高,同時也讓對自己的專業(yè)有了一個全新的認識,此次的設計,不僅鍛煉了自己分析問題與處理問題的能力,還提高了自己的動手能力,這次設計對于現(xiàn)在即將走上工作崗位的大學生來說,是一個十分寶貴的經(jīng)驗。


附錄A 硬件設計原理圖與PCB圖



附錄B軟件程序清單
附錄C 實物圖

源碼:

  1. //ds1302 shuju shuru wei 0
  2. //數(shù)據(jù)輸出 最后一位為0
  3. //上升沿和下降沿的制造
  4. //寫數(shù)據(jù),數(shù)據(jù)輸入是從低位開始 0位
  5. //讀數(shù)據(jù)從高位開始

  6. #include<reg52.h>
  7. #include<stdio.h>
  8. #include"delay.h"
  9. #include"lcd.h"
  10. #include"dsds1302.h"
  11. #include"key.h"
  12. #include"ds18b20.h"

  13. sbit fm=P1^3;
  14. sbit jd=P1^2;
  15. sbit de=P1^1;

  16. unsigned char tt[]="2012-01-01";
  17. unsigned char  t[]="00:00:00";
  18. unsigned char fw[]="70 c    -> 00:30";
  19. unsigned char sj=70;
  20. unsigned char dfen,dmiao=30;


  21. unsigned char aj=0;                //按鍵返回值
  22. unsigned char gb=0;   //顯示光標


  23. void main()
  24. {
  25.               bit bz=0;
  26.               float ttt;
  27.               char we[6];
  28.               unsigned int i;
  29.               int te;
  30.               delayms(1);
  31.               chushishizhong();                //初始時鐘
  32.               chushishijian();                    //初始時間

  33.               //writetime();
  34. kaishi:
  35.     writecom(0x01);
  36.               while(1)
  37.               {
  38.                             readtime();              //讀取時間
  39.                             t[0]=shijian[4]/10+0x30;              //時間數(shù)據(jù)處理
  40.                             t[1]=shijian[4]%10+0x30;
  41.                             t[3]=shijian[5]/10+0x30;
  42.                             t[4]=shijian[5]%10+0x30;
  43.                             t[6]=shijian[6]/10+0x30;
  44.                             t[7]=shijian[6]%10+0x30;
  45.                             tt[2]=shijian[1]/10+0x30;
  46.                             tt[3]=shijian[1]%10+0x30;
  47.                             tt[5]=shijian[2]/10+0x30;
  48.                             tt[6]=shijian[2]%10+0x30;
  49.                             tt[8]=shijian[3]/10+0x30;
  50.                             tt[9]=shijian[3]%10+0x30;
  51.                             writestr(0,0,tt);                              //顯示時間 處理
  52.                             writestr(0,10," >data");
  53.                             writestr(1,0,t);
  54.                             writestr(1,10," >time");



  55.                             aj=keyscan();                            //檢測按鍵函數(shù)
  56. /**********************按鍵2 按下表示進入加熱控制模式*******************************/
  57.                               if(aj==2)
  58.                               {
  59.                                fm=0;   // 0  表示閉合繼電器 閉合
  60.                                de=0;
  61.                                delayms(100);
  62.                                fm=1;
  63.                                jd=0;   //打開自動燒水

  64.                                writecom(0x01);                 //清除屏幕
  65.                                while(1)
  66.                                  {
  67.                                              if(i==500)
  68.                                              {
  69.                                                 i=0;                                                        //溫度讀取函數(shù)  以及 溫度的處理
  70.                                                           te=duwendu();
  71.                                                           ttt=(float)te*0.0625;
  72.                                                           sprintf(we,"%6.2f",ttt);
  73.                                                           writestr(0,0,"Temp:");  //顯示 溫度值
  74.                                                           writestr(0,5,we);
  75.                                                           writestr(1,0,fw);
  76.                                              }
  77.                                                           i++;

  78.                                              aj=keyscan();                              //檢測按鍵

  79.                   if(aj==2)
  80.                                               {
  81.                                                            de=1; //熄滅led燈
  82.                                                            jd=1;//斷開繼電器
  83.                                                            fm=0;
  84.                                                            delayms(100);                //蜂鳴器響一聲
  85.                                                            fm=1;
  86.                                                            writecom(0x01);

  87.                                                                       break;                 //用于 退出當前的模式
  88.                                                         }

  89.                             if(aj==3)                                            //調(diào)節(jié)設定的溫度值
  90.                                     {
  91.                                              fm=0;
  92.                                              delayms(100);
  93.                                              fm=1;
  94.                                                                          jd=1;
  95.                                                                          de=1;
  96.                                                                          delayms(20);
  97.                                              writecom(0x0f);
  98.                                              writecom(0xc0+12);              //光標顯示位子
  99.                                              while(1)
  100.                                                {
  101.                                                                         aj=keyscan();
  102.                                                                         if(aj==3)
  103.                                                                           {
  104.                                                                          writecom(0x0c);
  105.                                                                          delayms(20);
  106.                                                                          writecom(0x01);                                                                                                                                                
  107.                                                                          fm=0;
  108.                                                                          delayms(100);
  109.                                                                          fm=1;

  110.                                                                          jd=0;
  111.                                                                          de=0;
  112.                                                                          delayms(20);                                                                        
  113.                                                                                       while(1)      //開始進行倒計時 燒水
  114.                                                                                       {
  115.                                                                                                   if(dfen==0 && dmiao==0)
  116.                                                                                                   {
  117.                                                                                                      for(i=10;i;i--)
  118.                                                                                                       {
  119.                                                                                                                 fm=~fm;
  120.                                                                                                                 de=~de;
  121.                                                                                                                 delayms(100);
  122.                                                                                                                 }
  123.                                                                                                                 jd=1;
  124.                                                                                                                 de=1;
  125.                                                                                                                 writecom(0x80);
  126.                                                                                                                 delayms(20);
  127.                                                                                                                 writecom(0x01);delayms(20);
  128.                                                                                                                 writestr(0,0,"ALL ok");
  129.                                                                                                                 writestr(1,0,"press KEY3 back ");
  130.                                                                                                                 delayms(200);
  131.                                                                                                       while(1)
  132.                                                                                                                 {                              
  133.                                                                                                                               aj=keyscan();
  134.                                                                                                                               if(aj==3)
  135.                                                                                                                                  {
  136.                                                                                                                                  fm=0;
  137.                                                                                                                                  delayms(100);
  138.                                                                                                                                  fm=1;
  139.                                                                                                                                  goto  kaishi;              //返回函數(shù)開始
  140.                                                                                                                 }                 }
  141.                                                                                                   }
  142.                                                                                                   delayms(200);delayms(200);delayms(200);delayms(200);  //1s
  143.                                                                                                 
  144.                                                                                                   if(dmiao==0)
  145.                                                                                                     {
  146.                                                                                                     if(dfen!=0)
  147.                                                                                                       {
  148.                                                                                                                 dfen--;
  149.                                                                                                                 dmiao=60;
  150.                                                                                                                 }
  151.                                                                                                     }
  152.                                                                                                     dmiao--;
  153.                                                                                                     fw[11]=dfen/10+0x30;
  154.                                                                                                     fw[12]=dfen%10+0x30;
  155.                                                                                                     fw[14]=dmiao/10+0x30;
  156.                                                                                                     fw[15]=dmiao%10+0x30;
  157.                                                                                                     writestr(0,0," ** boiling **  ");
  158.                                                                                                     writestr(1,0,fw);
  159.                                                                                                     writestr(1,0,"     ");
  160.                                                                                       }//開始進行倒計時 燒水

  161.                                                                                     }

  162.                                                                          if(aj==4)              //時間調(diào)節(jié)
  163.                                                                           {
  164.                                                                                     if(gb==0)
  165.                                                                                     if(dfen<60)
  166.                                                                                        dfen++;
  167.                                                                                     else
  168.                                                                                        {
  169.                                                                                                   fm=0;
  170.                                                                                                   delayms(100);
  171.                                                                                                   fm=1;
  172.                                                                                        }
  173.                                                                         fw[11]=dfen/10+0x30;              //顯示時間處理
  174.                                                                         fw[12]=dfen%10+0x30;
  175.                                                                         writestr(1,0,fw);
  176.                                                                         writecom(0xc0+12);
  177.                                                                                     }

  178.                                                                          if(aj==5)
  179.                                                                           {
  180.                                                                                     if(dfen>0)
  181.                                                                                        dfen--;
  182.                                                                                     else
  183.                                                                                        {
  184.                                                                                                   fm=0;
  185.                                                                                                   delayms(100);
  186.                                                                                                   fm=1;
  187.                                                                                        }
  188.                                                                         fw[11]=dfen/10+0x30;
  189.                                                                         fw[12]=dfen%10+0x30;
  190.                                                                         writestr(1,0,fw);

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

復制代碼

完整文檔下載(word格式 可編輯):
基于51單片機的電熱水器控制系統(tǒng)設計.doc (6.57 MB, 下載次數(shù): 272)



評分

參與人數(shù) 3黑幣 +63 收起 理由
ZONE-9 + 8 共享資料的黑幣獎勵!
Eleven_1ing + 5 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏16 分享淘帖 頂3 踩

相關帖子

回復

使用道具 舉報

沙發(fā)
ID:23303 發(fā)表于 2017-6-16 08:42 | 只看該作者
謝謝樓主分享!
回復

使用道具 舉報

板凳
ID:23303 發(fā)表于 2017-6-16 08:45 | 只看該作者
謝謝樓主分享!學習C程序
回復

使用道具 舉報

地板
ID:212410 發(fā)表于 2017-6-19 00:58 | 只看該作者
本帖最后由 djnodt 于 2017-6-22 22:11 編輯

請問樓主,串口通訊模塊是用什么元件的,起什么作用
回復

使用道具 舉報

5#
ID:159139 發(fā)表于 2017-6-20 06:46 來自觸屏版 | 只看該作者
下載研究一下,謝謝樓主分享。
回復

使用道具 舉報

6#
ID:95509 發(fā)表于 2017-12-18 13:29 | 只看該作者
謝謝樓主分享!學習!
回復

使用道具 舉報

7#
ID:263148 發(fā)表于 2017-12-18 15:31 | 只看該作者
謝謝樓主
回復

使用道具 舉報

8#
ID:241772 發(fā)表于 2018-4-16 22:34 | 只看該作者
謝謝樓主分享!
回復

使用道具 舉報

9#
ID:241772 發(fā)表于 2018-4-17 21:47 | 只看該作者
厲害!學習了
回復

使用道具 舉報

10#
ID:241772 發(fā)表于 2018-4-17 21:52 | 只看該作者
不過好像沒辦法下載哦~
回復

使用道具 舉報

11#
ID:344887 發(fā)表于 2018-6-4 20:42 | 只看該作者
挺不錯的,就是沒有仿真
回復

使用道具 舉報

12#
ID:376301 發(fā)表于 2018-7-21 19:32 | 只看該作者
樓主太強大了,剛好借鑒一下,謝謝樓主
回復

使用道具 舉報

13#
ID:443101 發(fā)表于 2018-12-10 10:26 | 只看該作者
不錯的
回復

使用道具 舉報

14#
ID:483909 發(fā)表于 2019-4-19 21:07 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

15#
ID:375715 發(fā)表于 2019-4-26 23:43 來自觸屏版 | 只看該作者
謝謝分享謝謝分享
回復

使用道具 舉報

16#
ID:770243 發(fā)表于 2020-6-16 13:42 | 只看該作者
201730645473 發(fā)表于 2018-4-17 21:52
不過好像沒辦法下載哦~

能下載嗎?我這下載了一半不動了
回復

使用道具 舉報

17#
ID:788871 發(fā)表于 2020-6-26 22:41 | 只看該作者
可以下載嘛
回復

使用道具 舉報

18#
ID:875228 發(fā)表于 2021-3-28 17:03 | 只看該作者
謝謝大佬分享,我這個好難,還要預約定時加熱,自動記錄主人使用習慣
回復

使用道具 舉報

19#
ID:385637 發(fā)表于 2021-3-29 11:34 | 只看該作者
謝謝大佬分享,很齊全的資料
回復

使用道具 舉報

20#
ID:537743 發(fā)表于 2021-3-29 13:35 | 只看該作者
樓主厲害,謝謝分享。
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表