久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機電熱水器控制系統設計文檔 已經制作成品成功

  [復制鏈接]
跳轉到指定樓層
樓主

摘要


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


目錄
第一章 緒論1
1.1引言              1
1.2選題背景與意義              1
1.3研究現狀              2
1.4研究內容              2
1.5本文結構              4
第二章 電熱水器控制系統設計方案4
2.1系統功能說明
2.2系統主要實現功能
2.3系統整體設計方案
2.4方案論證
第三章 主要元件介紹
3.1單片機系統模塊介紹
3.1.1 AT89S52單片機的主要性能
3.1.2 AT89S52管腳功能說明
3.1.3單片機的最小系統
3.2溫度檢測模塊
3.2.1 DS18B20的主要功能及特點
3.2.2DS18B20的內部結構
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 內部控制指令
4.5.4顯示硬件設計原理圖
4.6其余硬件模塊設計
第五章系統軟件設計
5.1主程序模塊
5.2 DS18B20測溫模塊
5.3實時時鐘模塊
5.4 LCD顯示模塊            
5.5鍵址返回程序
5.6測試及性能分析            


  •                  緒  論

1.1引言

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

1.2選題背景與意義

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

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

1.4本文研究內容

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

1.5本文結構

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


第二章 電熱水器控制系統設計方案

2.1系統功能說明

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

2.2系統主要實現功能

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

2.3系統整體設計方案

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


2.4方案論證

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

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

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



第三章 主要元件介紹

3.1單片機系統模塊介紹

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

3.1.1 AT89S52單片機的主要性能

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

3.1.2 AT89S52管腳功能說明

AT89S52引腳如圖3.1所示。


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


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


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

3.1.3單片機的最小系統

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

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

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


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

3.2溫度檢測模塊

3.2.1 DS18B20的主要功能及特點

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





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

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

3.2.2DS18B20的內部結構

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


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

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

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

3.2.3 DS18B20的工作時序

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



圖3.6  初始化時序圖

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

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

圖3.8  讀數據時序圖



第四章 硬件模塊的設計

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

圖4.1 硬件模塊設計框圖

4.1 溫度采集模塊

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

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

4.2實時時鐘電路模塊

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

4.2.1 DS1302的介紹

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

圖4.3 DS1302引腳圖

圖4.4 DS1302內部結構圖

4.2.2實時時鐘模塊原理圖

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


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

4.3鍵盤輸入模塊

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


圖4.6鍵盤輸入模塊原理圖

4.4繼電器加熱模塊

繼電器的定義是當輸入量(激勵量)的變化達到規定要求時,在電氣輸出電路中使被控量發生預定的階躍變化的一種電器,它具有控制系統(又稱輸入回路)和被控制系統(又稱輸出回路)之間的互動關系。通常應用于自動化的控制電路中,它實際上是用小電流去控制大電流運作的一種“自動開關”。故在電路中起著自動調節、安全保護、轉換電路等作用。
本設計所用的為型號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 工藝制作,結構穩定,使用壽命長。
其主要特性如下:
8位并行數據串口,適配M6800系列時序;
可選為并行數據方式;
具有字符發生器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 為顯示數據
RS=L,表示DB0-DB7 為指令
5
R/W
H,H→L
R/W=H,數據被讀到DB9-DB7
R/W=L, 數據被寫到DB9-DB7
6
E
H/L
使能信號
7
DB0
H/L
數據線
8
DB1
H/L
數據線
9
DB2
H/L
數據線
10
DB3
H/L
數據線
11
DB4
H/L
數據線
12
DB5
H/L
數據線
13
DB6
H/L
數據線
14
DB7
H/L
數據線
15
BLA
5.0V
背光正極(LEDK﹑BLK)
16
BLK
0V
背光負極(LEDA﹑BLA)

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

4.5.3 內部控制指令

表4.2 LCD內部指令表
序號
指令
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
置字符發生存貯器地址
0
0
0
1
字符發生存貯器地址
8
置數據存貯器地址
0
0
1
顯示數據存貯器地址
9
讀忙標志或地址
0
1
BF
計數器地址
10
寫數到CGRAM或DDRAM)
1
0
要寫的數據內容
11
從CGRAM或DDRAM讀數
1
1
讀出的數據內容

4.5.4顯示硬件設計原理圖


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



圖4.9 液晶顯示模塊原理圖

4.6其余硬件模塊設計



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



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

5.1主程序模塊

主程序主要完成的是對個全局變量進行定義,對時鐘與時間的初始化,調用子函數功能。
具體流程圖如圖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;              //時間數據處理
                            t[1]=shijian[4]%10+0x30;


5.2 DS18B20測溫模塊

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

具體程序如下:

(具體程序詳見附件)

5.3實時時鐘模塊

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

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

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

#define miao               0x80//秒


5.4 LCD顯示模塊

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




具體程序如下:

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

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

5.5鍵址返回程序

鍵盤掃描程序的功能是逐個掃描各個功能鍵和“+”“—”鍵是否被按下,若按下某個按鍵,則返回相應的鍵址。
其按鍵掃描程序如下:
sbit k1=P3^3;    //定義每個按鍵的數據口 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)接通電源,系統正常顯示時鐘,如圖5.5所示
圖5.5
實時時鐘顯示
2)按下按鍵2,,光標閃爍,進入時鐘校準模式,如圖5.6所示
圖5.6
時鐘校準
3)按下按鍵3,系統顯示當前溫度,按下按鍵5,按鍵6調節燒水溫度,當水箱內溫度低于目標溫度時,LED燈亮,表示繼電器斷開,加熱電路工作。,如圖5.7所示。
圖5 .7加熱模式
4)當水箱內溫度達到加熱溫度時,LED燈熄滅,加熱電路停止工作,在溫度降到設定溫度以下,繼電器斷開,繼續加熱。如圖5.8所示

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

圖5.9 定時燒水

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

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


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


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



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

源碼:

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

  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;              //時間數據處理
  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();                            //檢測按鍵函數
  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;                                                        //溫度讀取函數  以及 溫度的處理
  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)                                            //調節設定的溫度值
  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;              //返回函數開始
  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)              //時間調節
  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單片機的電熱水器控制系統設計.doc (6.57 MB, 下載次數: 272)



評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

15#
ID:375715 發表于 2019-4-26 23:43 來自手機 | 只看該作者
謝謝分享謝謝分享
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产不卡视频 | 欧美国产激情二区三区 | 欧美视频免费在线 | 国产在线精品一区 | 欧美一级黄视频 | 日韩男人天堂 | 日韩精品一区二区三区中文在线 | 午夜视频在线 | 色视频欧美 | 久久精品视频一区二区 | 成人精品在线观看 | 欧美亚洲网站 | 欧美日韩视频在线播放 | 久久国产视频一区 | 欧美成人一区二区 | 老司机67194精品线观看 | 国产精品久久久久久久久久软件 | 中文字幕加勒比 | 成人网av| 国产激情一区二区三区 | 欧美精品在线免费观看 | 日本特黄特色aaa大片免费 | 国产成人精品一区二区三区在线 | 日本电影免费完整观看 | 黄色高清视频 | 超碰操| 国产精品一区在线播放 | 欧美专区在线 | 亚洲精品成人在线 | 一区二区三区免费 | 日韩中文字幕一区二区 | 噜噜噜噜狠狠狠7777视频 | 精品永久 | 中文字幕欧美在线观看 | 伊人在线视频 | 精品国产精品三级精品av网址 | 一区视频在线播放 | 97精品久久 | 日韩 国产 在线 | 在线观看国产视频 | 新91|