標(biāo)題: 單片機(jī)電熱水器控制系統(tǒng)設(shè)計文檔 已經(jīng)制作成品成功 [打印本頁]

作者: 154099131    時間: 2017-6-9 18:05
標(biāo)題: 單片機(jī)電熱水器控制系統(tǒng)設(shè)計文檔 已經(jīng)制作成品成功

摘要


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


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


  •                  緒  論

1.1引言

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

1.2選題背景與意義

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

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

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

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

1.5本文結(jié)構(gòu)

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


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

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

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

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

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

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

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


2.4方案論證

按照前面的課題要求,我們首先確定運(yùn)用單片機(jī)AT89S52作為本次設(shè)計的核心部件。
在溫度采集方面有多種選擇,常見的溫度傳感器分為以下幾種:熱敏電阻式溫度傳感器、熱電阻式溫度傳感器、熱電偶式溫度傳感器、模擬集成溫度傳感器、智能溫度傳感器。本次設(shè)計原本選擇的是pt1000鉑電阻溫度傳感器,其作為高精度的溫度敏感元件,具有測溫范圍大,測溫精度高,穩(wěn)定性好,示值復(fù)現(xiàn)性高與耐氧化等特點(diǎn),常被用作0℃~926℃溫度區(qū)間內(nèi)的標(biāo)準(zhǔn)溫度計,其特性曲線為:-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作為本次設(shè)計的元件,還需要語氣配套的傳感器測量電路與放大電路兩部分,具體電路如圖2.2所示。[12]
但是在實際購買時發(fā)現(xiàn)pt1000電阻由于價格過高,所以在最終設(shè)計中并沒有采用pt1000作為測溫元件來使用,同時,在同組同學(xué)推薦下采用了另一種集成式溫度傳感器DS18B20作為測溫元件,DS18B20雖然測溫范圍比pt1000小,但是在滿足本設(shè)計要求的基礎(chǔ)上,其價格不到pt1000的一半,并且其硬件電路由于舍去了普通傳感器所需附帶的A/D電路的設(shè)計,所以其硬件電路的設(shè)計更加簡單,所以采用了DS18B20作為最終設(shè)計中的測溫元件。[11]

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

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



第三章 主要元件介紹

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

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

3.1.1 AT89S52單片機(jī)的主要性能

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

3.1.2 AT89S52管腳功能說明

AT89S52引腳如圖3.1所示。


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


P1口:P1 口是一個具有內(nèi)部上拉電阻的8 位雙向I/O 口,P1 輸出緩沖器能驅(qū)動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 輸出緩沖器能驅(qū)動4個TTL 邏輯電平。對P2 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。在訪問外部程序存儲器或用16位地址讀取外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX @DPTR)時,P2 口送出高八位地址。在這種應(yīng)用中,P2 口使用很強(qiáng)的內(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 輸出緩沖器能驅(qū)動4個TTL 邏輯電平。對P3 端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。P3口亦作為AT89S52特殊功能(第二功能)使用,如表3.2所示。在flash編程和校驗時,P3口也接收一些控制信號。
表3.2  P3口第二功能


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

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

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

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

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


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

3.2溫度檢測模塊

3.2.1 DS18B20的主要功能及特點(diǎn)

DS18B20溫度傳感器是美國達(dá)拉斯(DALLAS)半導(dǎo)體公司推出的應(yīng)用單總線技術(shù)的數(shù)字溫度傳感器。該器件將半導(dǎo)體溫敏器件、A/D轉(zhuǎn)換器、存儲器等做在一個很小的集成電路芯片上。它具有微型化、低功耗、高性能、抗干擾能力強(qiáng)、易配微處理器等優(yōu)點(diǎn),可直接將溫度轉(zhuǎn)化成串行數(shù)字信號供處理器處理。[8]
DS18B20具有以下特性:
獨(dú)特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線。
每個設(shè)備都有一個唯一的64位序列碼,存儲在ROM中。
簡單的多點(diǎn)分布式測溫應(yīng)用。
在使用中不需要任何外圍元件。
可以從數(shù)據(jù)線供電。電源范圍為3.0V~ 5.5V。
測溫范圍 -55℃~+125℃。
在—10℃~+85℃間,測溫分辨率為0.5℃。
溫度計分辨率可由用戶選擇,9至12位之間。
在750毫秒內(nèi)將溫度轉(zhuǎn)換為12位字。
用戶可自定義非易失性報警的設(shè)置。
報警搜索命令定義和存儲的設(shè)備,其溫度不收程序限制(溫度報警狀態(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ī)格
*以上指出的器件在進(jìn)行正常焊接操作時所需要的環(huán)境條件,可能還有部分為能說明但是在操作規(guī)格中已經(jīng)暗示器件可正常運(yùn)行的環(huán)境。長期工作在極限條件下可能會影響器件的可靠性。

3.2.2DS18B20的內(nèi)部結(jié)構(gòu)

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


圖3.5  DS18B20內(nèi)部結(jié)構(gòu)圖
每只DS18B20都有一個唯一存儲在ROM中的64位編碼。最前面8位是單線系列編碼,接著的49位是唯一的序列號,最后8位是以上56位的CRC編碼。當(dāng)一條總線上皆有多個DS18B20時,就通過序列號對其加以區(qū)分。
主機(jī)操作ROM的指令有5種:
33H——讀ROM。讀DS18B20溫度傳感器ROM中的編碼。
55H——匹配ROM。發(fā)出此命令后,接著發(fā)出64位ROM編碼,訪問單總線上與該編碼相對應(yīng)的DS18B20并使之做出響應(yīng),為下一步對該DS18B20的讀寫做準(zhǔn)備。
F0H——搜索ROM。用于確定掛接在同一總線上DS18B20的個數(shù),識別64位ROM地址,位操作各期間做好準(zhǔn)備。
CCH——跳過ROM。忽略64位ROM地址,直接向18B20發(fā)溫度變換命令。
ECH——告警搜索命令。執(zhí)行后只有溫度超過設(shè)定值上限或下限的芯片才做出響應(yīng)。
高速暫存器RAM由9個字節(jié)組成。其組成如圖3.8所示。包括兩個溫度顯示位,兩個復(fù)制的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——溫度轉(zhuǎn)換。啟動DS18B20進(jìn)行溫度轉(zhuǎn)換,結(jié)果存入RAM。
BEH——讀暫存器。讀內(nèi)部RAM中的溫度數(shù)據(jù)。
4EH——寫暫存器。發(fā)出像內(nèi)部RAM寫上、下限溫度數(shù)據(jù)指令,緊跟該命令之后傳送2字節(jié)的數(shù)據(jù)。
48H——復(fù)制暫存器。將RAM中的TH、TL復(fù)制到E2PROM中。
B8H——重調(diào)E2PROM。將E2PROM中內(nèi)容恢復(fù)到中。
B4H——讀供電方式。寄生供電時,DS18B20發(fā)送0,外界電源供電時,DS18B20發(fā)送1。

3.2.3 DS18B20的工作時序

DS18B20需要嚴(yán)格的單總線協(xié)議以確保數(shù)據(jù)的完整性,主要包括初始化系列,讀序列,寫序列,所有時序都是講主機(jī)作為主設(shè)備,單總線設(shè)備作為從設(shè)備。每一次命令和數(shù)據(jù)的傳輸都是從主機(jī)啟動寫時序開始,如果要求單總線器件會送數(shù)據(jù),在進(jìn)行寫命令后,主機(jī)需啟動讀時序?qū)懲陻?shù)據(jù)將接受。數(shù)據(jù)和命令的傳輸都是地位在先。
初始化時序:
1)先將數(shù)據(jù)線置高電平1。
2)延時(該時間要求不是很嚴(yán)格,但是要盡可能短一點(diǎn))。
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后,還要進(jìn)行延時,其延時的時間從發(fā)出高電平算起至少要480us.
8)將數(shù)據(jù)線再次拉到高電平1后結(jié)束。如圖3.6所示。



圖3.6  初始化時序圖

寫時序:
1)數(shù)據(jù)線先置低電平0。
2)延時確定的時間為15us。
3)按從低位到高位的順序發(fā)送數(shù)據(jù)。
4)延時時間為45us。
5)將數(shù)據(jù)線拉到高電平1。
6)重復(fù)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)位,并進(jìn)行數(shù)據(jù)處理。
8)延時30us。
9)重復(fù)1~7步驟,直到讀取完一個字節(jié)。如圖3.8所示。

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



第四章 硬件模塊的設(shè)計

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

圖4.1 硬件模塊設(shè)計框圖

4.1 溫度采集模塊

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

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

4.2實時時鐘電路模塊

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

4.2.1 DS1302的介紹

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

圖4.3 DS1302引腳圖

圖4.4 DS1302內(nèi)部結(jié)構(gòu)圖

4.2.2實時時鐘模塊原理圖

電路原理圖如圖4.5所示,DS1302與單片機(jī)的連接也僅需要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燒水時間設(shè)定按鈕
S5“+”功能鍵
S6“—”功能鍵


圖4.6鍵盤輸入模塊原理圖

4.4繼電器加熱模塊

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


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

圖4.8 繼電器設(shè)計原理圖

4.5 LCD顯示模塊設(shè)計

4.5.1 LCD模塊概述

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

4.5.2 LCD模塊硬件說明

1)接口說明
表4.1 LCD1602接口說明
管腳序
名稱
電平
功能描述
1
VSS
0V
電源地
2
VCC
5.0V
電源輸入
3
V0
LCD驅(qū)動電壓輸入
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
背光負(fù)極(LEDA﹑BLA)

備注:第3 腳V0 用來調(diào)節(jié)對比度,LCD 的驅(qū)動電壓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驅(qū)動電壓(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
光標(biāo)返回
0
0
0
0
0
0
0
0
1
*
3
置輸入模式
0
0
0
0
0
0
0
1
I/D
S
4
顯示開/關(guān)控制
0
0
0
0
0
0
1
D
C
B
5
光標(biāo)或字符移位
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
讀忙標(biāo)志或地址
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顯示硬件設(shè)計原理圖


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



圖4.9 液晶顯示模塊原理圖

4.6其余硬件模塊設(shè)計



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



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

5.1主程序模塊

主程序主要完成的是對個全局變量進(jìn)行定義,對時鐘與時間的初始化,調(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測溫模塊

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

具體程序如下:

(具體程序詳見附件)

5.3實時時鐘模塊

實時時鐘模塊完成時間的設(shè)定與時間的讀取,包括年、月、日、時、分、秒。
具體流程圖如圖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è)置為數(shù)據(jù)選擇口
sbit rw=              P2^6;    //將P2.6設(shè)置為讀寫選擇口
sbit en=                            P2^5;   //將P2.5設(shè)置為使能信號口
(具體程序詳見附件)

5.5鍵址返回程序

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

unsigned char keyscan()    //定義鍵址返回程序
{
    if(k1==0)     //當(dāng)按鍵1按下
                 {
                 delayms(10);   //消抖 延時
                   if(k1==0)  
                            {
                            while(k1==0);
                            return 1;    //返回鍵址1
                            }
                 }
    else if(k2==0)  //當(dāng)按鍵2按下
                 {
                 delayms(10);
                   if(k2==0)
                            {
                            while(k2==0);
                            return 2;   //返回鍵址2
                            }
                 }
    else if(k3==0)    //當(dāng)按鍵3按下
                 {
                 delayms(10);
                   if(k3==0)
                            {
                            while(k3==0);
                            return 3;      //返回鍵址3
                            }
                 }
    else if(k4==0)    //當(dāng)按鍵4按下
                 {
                 delayms(10);
                   if(k4==0)
                            {
                            while(k4==0);
                            return 4;      //返回鍵址4
                            }
                 }
    else if(k5==0)    //當(dāng)按鍵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,,光標(biāo)閃爍,進(jìn)入時鐘校準(zhǔn)模式,如圖5.6所示
圖5.6
時鐘校準(zhǔn)
3)按下按鍵3,系統(tǒng)顯示當(dāng)前溫度,按下按鍵5,按鍵6調(diào)節(jié)燒水溫度,當(dāng)水箱內(nèi)溫度低于目標(biāo)溫度時,LED燈亮,表示繼電器斷開,加熱電路工作。,如圖5.7所示。
圖5 .7加熱模式
4)當(dāng)水箱內(nèi)溫度達(dá)到加熱溫度時,LED燈熄滅,加熱電路停止工作,在溫度降到設(shè)定溫度以下,繼電器斷開,繼續(xù)加熱。如圖5.8所示

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

圖5.9 定時燒水

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

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


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


附錄A 硬件設(shè)計原理圖與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;   //顯示光標(biāo)


  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 按下表示進(jìn)入加熱控制模式*******************************/
  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;                 //用于 退出當(dāng)前的模式
  88.                                                         }

  89.                             if(aj==3)                                            //調(diào)節(jié)設(shè)定的溫度值
  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);              //光標(biāo)顯示位子
  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)      //開始進(jìn)行倒計時 燒水
  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.                                                                                       }//開始進(jìn)行倒計時 燒水

  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黑下載附件…………

復(fù)制代碼

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




作者: zdmjjp    時間: 2017-6-16 08:42
謝謝樓主分享!
作者: zdmjjp    時間: 2017-6-16 08:45
謝謝樓主分享!學(xué)習(xí)C程序
作者: djnodt    時間: 2017-6-19 00:58
本帖最后由 djnodt 于 2017-6-22 22:11 編輯

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

作者: 3760609865    時間: 2017-6-20 06:46
下載研究一下,謝謝樓主分享。
作者: yyfpy    時間: 2017-12-18 13:29
謝謝樓主分享!學(xué)習(xí)!
作者: ray372liu    時間: 2017-12-18 15:31
謝謝樓主
作者: 201730645473    時間: 2018-4-16 22:34
謝謝樓主分享!
作者: 201730645473    時間: 2018-4-17 21:47
厲害。W(xué)習(xí)了
作者: 201730645473    時間: 2018-4-17 21:52
不過好像沒辦法下載哦~
作者: -惟勝-    時間: 2018-6-4 20:42
挺不錯的,就是沒有仿真
作者: Maserati    時間: 2018-7-21 19:32
樓主太強(qiáng)大了,剛好借鑒一下,謝謝樓主
作者: zjw2685661    時間: 2018-12-10 10:26
不錯的
作者: 半夜起床偷西瓜    時間: 2019-4-19 21:07
謝謝樓主分享
作者: yyhlsf    時間: 2019-4-26 23:43
謝謝分享謝謝分享
作者: 小小小白小    時間: 2020-6-16 13:42
201730645473 發(fā)表于 2018-4-17 21:52
不過好像沒辦法下載哦~

能下載嗎?我這下載了一半不動了
作者: 麋鹿1212    時間: 2020-6-26 22:41
可以下載嘛

作者: morealong    時間: 2021-3-28 17:03
謝謝大佬分享,我這個好難,還要預(yù)約定時加熱,自動記錄主人使用習(xí)慣
作者: shenyuqiu    時間: 2021-3-29 11:34
謝謝大佬分享,很齊全的資料
作者: 老小學(xué)生    時間: 2021-3-29 13:35
樓主厲害,謝謝分享。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1