電熱水器作為一種非常普及的家用電器,使用率非常高。市場上傳統(tǒng)的電熱水器控制精度低、可靠性差。隨著人們生活質(zhì)量的提高,人們對電熱水器的要求越來越趨向于智能化和數(shù)字化。目前市場上出售的電熱水器以貯水式為主,它具有自動恒溫、安全可靠、操作簡單等優(yōu)點(diǎn),深受廣大用戶的青睞。但是電熱水器也普遍存在著這樣一對矛盾:小容量電熱水器的熱水連續(xù)供應(yīng)能力不足,難以滿足用戶沐浴等需求;大容量電熱水器冷態(tài)使用時預(yù)熱時間過長(往往要幾個小時),而且當(dāng)用戶只要少量使用熱水時,大量的冷水也被加熱,能量浪費(fèi)多。為此,我們提出一個新的設(shè)計思路:采用半分隔水箱,結(jié)合單片機(jī)智能控制技術(shù)利用對少量冷水優(yōu)先快速局部加熱,滿足在首次使用時快速供應(yīng)熱水的要求;利用對冷水的預(yù)加熱技術(shù),滿足正常使用后實現(xiàn)連續(xù)大量供應(yīng)熱水的要求,有效地解決傳統(tǒng)電熱水器存在的上述矛盾。
(一)水箱設(shè)計
儲熱式電熱水器又分為敞開式和封閉式兩類。早期的儲熱式電熱水器多為敞開式或開口式的,其結(jié)構(gòu)簡單,體積不大,靠吊在高處的壓力噴淋,水流量較小,但價格較低,適合于人口少,僅做洗浴使用的家庭購買。敞開式電熱水器由于沒有對內(nèi)膽設(shè)計承壓性能,故不能向其他管路多處供水,功能有限。封閉式電熱水器的內(nèi)膽是密封的,水箱內(nèi)水壓很大,其內(nèi)膽可耐壓,故可多路供水。儲熱式電熱水器可自動恒溫保溫,停電時可照樣供應(yīng)熱水。目前國內(nèi)市場上的電熱水器主要是封閉儲熱式電熱水器,它不必分室安裝,不產(chǎn)生有害氣體,干凈衛(wèi)生,且可方便地調(diào)溫。封閉儲熱式電熱水器的工作原理非常簡單,它們使用一根電加熱管,通電之后給水提供熱量。內(nèi)膽儲存熱水并承載壓力0.6MPa(約6kg/cm2),外殼保溫。產(chǎn)品間的區(qū)別首先體現(xiàn)在加熱管上,有浸沒型的,即直接與要加熱的水接觸,也有隔離型的。加熱管由一個溫控器來控制,能設(shè)定所需溫度并保持內(nèi)膽中的水溫恒定,且在50~70℃范圍內(nèi)可調(diào)。鑒于封閉式電熱水器種種優(yōu)點(diǎn),我們決定選擇封閉式的熱水器。
我們設(shè)計的熱水器原理圖如圖1所示。熱水器由上下兩個桶組成,容量各40L,總共80L,其中下桶為主桶,上桶為儲水桶,兩個桶外部填塞保溫材料。當(dāng)熱水器加滿水后,下桶的加熱管對冷水進(jìn)行加熱,加熱的溫度由使用者通過外部的按鈕控制,可設(shè)定的溫度范圍是40~80℃。儲水桶加熱的溫度為固定值,當(dāng)達(dá)到90℃后,自動切換到保溫狀態(tài)。整個熱水器有四個水管,1號管為出水管,2號和4號管為進(jìn)水管,3號管為主桶和儲水桶的連接管。2、3、4號管均由電磁閥控制其打開和關(guān)閉。在熱水器使用時,1號出水管和2號進(jìn)水管打開,3號和4號管關(guān)閉。當(dāng)溫度傳感器檢測到主桶中的水溫降到50℃的時候,由單片機(jī)控制2號進(jìn)水管關(guān)閉,3號管和4號進(jìn)水管打開,從而使儲水桶中高溫度的水進(jìn)入主桶中,延長熱水器可使用的時間。在夏天的時候,由于外界溫度較高,不需要使用很多的熱水,這時可以將儲水桶的加熱管電源斷開,通過控制外部電路將主桶和儲水桶隔離開。此時主桶成為一個獨(dú)立的熱水器,達(dá)到節(jié)能的效果。2號、3號和4號管的端部經(jīng)過特殊設(shè)計,可使得冷水與熱水充分混合。
圖1 熱水器原理圖
圖2 進(jìn)水零件剖面圖
(二)軟硬件設(shè)計
首先,我們通過分析可知這個電路包括電源電路、加熱控制電路、液位控制電路、電磁閥進(jìn)水控制電路、按鍵輸入電路、液晶顯示電路、蜂鳴報警電路和單片機(jī)控制電路等。
圖3 系統(tǒng)設(shè)計框圖
1、電源電路
電源電路采用普通的220V交流電經(jīng)過降壓整流,然后經(jīng)過集成穩(wěn)壓器(7824)穩(wěn)壓輸出+24V電壓。同時該系統(tǒng)還用到12V,5V的電壓,通過分壓即可得到。電路原理圖C5、C6為輸入穩(wěn)定電容,其作用是減少紋波、消振、抑制高頻和脈沖干擾。C7、C8為輸出穩(wěn)定電容,其作用是改善負(fù)載的瞬態(tài)響應(yīng)。由于熱水器周圍環(huán)境溫度過高,使用三端穩(wěn)壓器時要根據(jù)輸出電流的大小選擇散熱器,否則會由于過熱而無法工作到額定電流。
圖4 電源電路原理圖
2、加熱控制電路
加熱絲的加熱功率由雙向晶閘管來控制,一開始我們選擇的是MOC3023,單片機(jī)通過光耦合器給晶閘管觸發(fā)信號,通過控制晶閘管的導(dǎo)通角來控制加熱絲的有效加熱功率。但是由于在電路中添加過零檢測電路,來實現(xiàn)觸發(fā)脈沖的相位延遲,同時在程序編程中加入中斷控制程序,既增加了硬件的復(fù)雜性,也給軟件編程帶來了困難。
經(jīng)過分析,我們選擇用內(nèi)部帶有過零檢測電路的光電耦合器MOC3041作為晶閘管的驅(qū)動器,同時能實現(xiàn)強(qiáng)、弱電的隔離。傳統(tǒng)的加熱電路都采用移相觸發(fā)晶閘管,控制晶閘管的導(dǎo)通角來控制輸出功率,不僅同步檢測電路復(fù)雜,而且在晶閘管導(dǎo)通瞬間會產(chǎn)生高次諧波干擾,造成電網(wǎng)電壓波形畸變,影響其他用電設(shè)備和通訊系統(tǒng)的正常工作,本系統(tǒng)中采用過零觸發(fā)晶閘管導(dǎo)通與關(guān)斷的時間比值來調(diào)節(jié)加熱絲的功率,由于過零觸發(fā)不改變電壓的波形而只改變電壓全波通過的次數(shù),不會對電網(wǎng)造成污染。
同時,本系統(tǒng)采用過零觸發(fā)方式,MOC3041內(nèi)部含有過零檢測電路,當(dāng)輸入引腳1輸入15mA的電流,輸出端6引腳、4引腳之間的電壓稍過零時,內(nèi)部雙向晶閘管導(dǎo)通,觸發(fā)外部晶閘管導(dǎo)通,當(dāng)MOC3041輸入引腳輸入電流為0時,內(nèi)部雙向晶閘管關(guān)斷,從而外部晶閘管也關(guān)斷。另外R7、C2組成浪涌吸收電路,防止浪涌電壓損壞雙向可控硅。R6是雙向可控硅的門極電阻,當(dāng)可控硅靈敏度較高時,門極阻抗也高,并上R6可提高抗干擾的能力。R8是觸發(fā)功率雙向可控硅的限流電阻。
繼電器接成常閉開關(guān)方式,開始處于加熱狀態(tài),當(dāng)溫度過高時關(guān)掉加熱電源,以達(dá)到過溫保護(hù)的目的。繼電器的兩端必須反接二極管,因為斷電瞬間會產(chǎn)生強(qiáng)大的反向電動勢,損壞其他器件。繼電器通過光耦電路(TLP521-1芯片)來驅(qū)動,因為繼電器在開關(guān)迅速閉合斷開的瞬間,會產(chǎn)生很大的電流,極有可能影響到驅(qū)動電路部分,從而進(jìn)一步影響到主板上的其他電路。如果要使光耦系統(tǒng)隔離,就要保證光耦兩側(cè)電路的電源必須是各自獨(dú)立的,從圖5中可看到,光耦左側(cè)是單片機(jī)系統(tǒng),電源為5V,右側(cè)為12V。如果右側(cè)系統(tǒng)出現(xiàn)了問題,即使將光耦內(nèi)部的三極管燒壞,光耦左側(cè)的系統(tǒng)也不會受影響而能夠繼續(xù)正常工作,這就是光耦隔離系統(tǒng)的好處所在。光耦左側(cè)用Q7、R13、R14三個元件來驅(qū)動光耦,用三極管的主要目的是提供給光耦開啟所需的足夠電流。
圖5 加熱控制電路原理圖
3、電磁閥進(jìn)水控制電路
在電磁閥進(jìn)水控制電路中,光耦驅(qū)動電路部分和加熱控制電路部分一樣,不另加分析。P1插針兩端接電磁閥,光耦右側(cè)電路部分是MOS管來控制的,當(dāng)P2.1輸入低電平時,Q1導(dǎo)通,光耦右側(cè)電路處于導(dǎo)通狀態(tài),這時穩(wěn)壓管的上端達(dá)到10V左右,Q2MOS管導(dǎo)通,漏極端為低電平,電磁閥工作,反之不工作。該電路用MOS管也達(dá)到弱電、強(qiáng)電分離的效果。因為電磁閥是大感抗器件,在斷電瞬間產(chǎn)生很大的電流,影響到驅(qū)動電路正常工作。
圖6 電磁閥進(jìn)水控制電路原理圖
4、液位控制電路
ADC0804的VIN+管腳接壓力傳感器的輸出引腳,壓力傳感器將水位的高度轉(zhuǎn)換成一定的壓力,然后轉(zhuǎn)化成模擬電壓輸出,通過AD轉(zhuǎn)換成數(shù)字信號,輸入到單片機(jī)中。單片機(jī)經(jīng)過處理得到具體的液位,從而進(jìn)一步控制電磁閥的通斷。
圖7 液位控制電路原理圖
5、溫度檢測電路
溫度傳感器的選擇:經(jīng)比較,我們選擇DS18B20溫度傳感器。它具有微型化、低功耗、高性能、抗干擾能力強(qiáng)、易配微處理器等優(yōu)點(diǎn),可直接將溫度轉(zhuǎn)化成串行數(shù)字信號供處理器處理。
DS18B20溫度傳感器的特性:
①適應(yīng)電壓范圍寬,電壓范圍在3.0~5.5V。
②測溫范圍-55 ~ +125℃,在-10~+85℃時精度為±0.5℃。
③可編程分辨率為9~12位,對應(yīng)的可分辨溫度分別為0.5℃,0.25℃,0.125℃和0.0625℃,可實現(xiàn)高精度測溫.
④在9位分辨率時,最多在93.75ms內(nèi)把溫度轉(zhuǎn)化成數(shù)字;12位分辨率時,最多在750ms內(nèi)把溫度值轉(zhuǎn)化成數(shù)字。
⑤測量結(jié)果直接輸出數(shù)字溫度信號,以“一線總線”串行傳送給CPU,同時可傳送CRC校驗碼,具有極強(qiáng)的抗干擾糾錯能力。
6、液晶顯示電路
在該系統(tǒng)中將12864與單片機(jī)并行連接,將12864的第5引腳直接接低電平,第15引腳直接接高電平,以便節(jié)省單片機(jī)的I/O口。
圖8 12864并行寫操作時序圖
7、充電電路
在熱水器中使用過程中,我們?yōu)榱顺浞掷盟膭幽埽覀冊陂y門的地方安裝一個葉輪,同時加一個小功率直流發(fā)電機(jī),可以將水的動能轉(zhuǎn)化成電能,儲存在電池中。并且發(fā)電機(jī)電路要用穩(wěn)壓電路,將發(fā)出的電壓恒定在某一個固定值。即使斷電,單片機(jī)也可以使用電池的電能,使得一些功能仍然可以實現(xiàn),比如日期,水位,溫度的顯示等。當(dāng)然這個也可以通過單片機(jī)實現(xiàn)智能充電器的功能,要實現(xiàn)充電器的智能化,需要應(yīng)用單片機(jī)的處理和控制功能。充電的實現(xiàn),是在基本的充電電壓的基礎(chǔ)上,要控制充電過程。
實現(xiàn)的功能模塊如下:
(a)實現(xiàn)充電器智能化控制的單片機(jī)模塊;
(b)采用專用的電池充電芯片實現(xiàn)充電過程控制模塊;
(c)采用電壓轉(zhuǎn)換芯片提供充電電壓模塊。
常用的充電電池有鎳鎘、鎳氫及鋰離子充電電池三種。鎳鎘、鎳氫充電電池在沒有完全放電之后就進(jìn)行充電,幾次之后電池的容量便會減少,這種現(xiàn)象稱為記憶效應(yīng),鋰電池則沒有記憶效應(yīng),所以鋰電池即使在沒有放電完全之后就放電,也不會影響電池的容量。
為單片機(jī)選擇一款合適的充電芯片是非常重要的,需要依照電池類型、電流值、充電方式等幾個標(biāo)準(zhǔn)。
(1)MAX1898芯片
經(jīng)過比較我們選擇了MAX1898作為電池的芯片,實現(xiàn)鋰離子的充電器,充電快速并且具有較強(qiáng)的電池保護(hù)能力。MAX1898配合外部PNP或PMOS三極管可以組成完整的單節(jié)電池的充電。MAX1898提供精確地恒流/恒壓充電,電池電壓調(diào)節(jié)精度為±0.75%,提高了電池性能,延長了使用壽命。
MAX1898的主要功能特性如下:
使用低成本的PNP或PMOS調(diào)整元件;簡單、安全的線性充電方式;內(nèi)置檢流電阻,可編程的充電電流;LED充電狀態(tài)指示;可編程的安全定時器;可選/可調(diào)節(jié)自動重啟;4.5~12V的輸入電壓范圍,輸入電源自動監(jiān)測。
(2)LM7805芯片
該芯片將電壓轉(zhuǎn)換成固定的+5V電壓提供給相關(guān)電路。
(3)6N137芯片
為了降低電源的干擾,保持電路的穩(wěn)定,完成電壓轉(zhuǎn)化之后,需要經(jīng)過一次光耦模塊的處理,通過單片機(jī)對光耦模塊的控制,可以及時關(guān)斷充電電源。這里采用的光耦模塊為6N137光耦合器。
6N137光耦器工作時,信號從引腳2和引腳3輸入,發(fā)光二極管發(fā)光,經(jīng)片內(nèi)光通道傳到光敏二極管,反向偏置的光敏管光照后導(dǎo)通,經(jīng)電流-電壓轉(zhuǎn)換后送到與門的一個輸入端,與門的另外一個輸入端為使能端,當(dāng)使能端為高電平時與門輸出高電平,經(jīng)輸出三極管反向后光電隔離器輸出低電平。當(dāng)輸入電流小于觸發(fā)閾值或使能端為低時,輸出高電平,但這個邏輯高電平時集電極開路的,可針對接收電路加上拉電阻或電壓調(diào)整電路。
8、多機(jī)通信電路
現(xiàn)在的問題是如何使用兩個桶使得兩個桶的效率大于兩個單筒效率的總和。由于單個桶的功能已經(jīng)很清楚,現(xiàn)在著手實現(xiàn)兩個桶就比較簡單。我們將兩個桶上下放置,下桶記為1桶,上桶記為2桶。首先兩個桶自動上水,1桶加接近滿,然后關(guān)閉電磁閥b;2桶加滿,然后關(guān)閉c;在加水的過程中,中間的電磁閥a一直處于關(guān)閉的狀態(tài)。2桶的加熱功率是1桶的兩倍多,但是容量只有1桶的一半。當(dāng)上水完畢后,1桶加熱到50℃,2桶加熱到70℃,然后處于保溫的狀態(tài)。當(dāng)1桶水位下降,根據(jù)出水管流量的大小,調(diào)節(jié)中間電磁閥a的閥門大小,將2桶的熱水源源不斷注入1桶中,同時調(diào)節(jié)2桶的加熱功率,而1桶的加熱功率功率只要達(dá)到輔熱的效果就可以了。當(dāng)然要用兩個單片機(jī)使得兩個桶達(dá)到協(xié)和,這樣既可以增加控制I/O口,使得控制方便,同時也可以使得運(yùn)行效率提高,要實現(xiàn)這個功能就要用到單片機(jī)的多機(jī)通信。
單片機(jī)構(gòu)成的多機(jī)系統(tǒng)常采用總線型主從式結(jié)構(gòu),所謂主從式,即在數(shù)個單片機(jī)中,有一個是主機(jī),其余都是從機(jī),從機(jī)要服從主機(jī)的調(diào)度、支配。51單片機(jī)的串行口方式2和方式3適合于這種主從式通信結(jié)構(gòu)。當(dāng)然,采用不同的通信標(biāo)準(zhǔn)時,還需要進(jìn)行相應(yīng)的電平轉(zhuǎn)換,有時還要對信號進(jìn)行光電隔離。在實際的多機(jī)應(yīng)用系統(tǒng)中,常采用RS-485串行標(biāo)準(zhǔn)。
多機(jī)通信時,通信協(xié)議要遵守以下原則:
⑴ 所有從機(jī)的SM2位置1,處于接收地址幀狀態(tài)。
⑵ 主機(jī)發(fā)送一地址幀,其中8位是地址,第9位為地址/數(shù)據(jù)分區(qū)標(biāo)志,該位置1表示該幀為地址幀。所有從機(jī)收到地址幀后,都將接收的地址與本機(jī)的地址比較。對于地址相符的從機(jī),使自己的SM2位置0(以接收主機(jī)隨機(jī)后發(fā)來的數(shù)據(jù)幀),并把本機(jī)地址發(fā)回主機(jī)作為應(yīng)答;對于地址不符的從機(jī),仍保持SM2=1,對主機(jī)隨后發(fā)來的數(shù)據(jù)幀不予理睬。
⑶ 從機(jī)發(fā)送數(shù)據(jù)結(jié)束后,要發(fā)送一幀效應(yīng)和,并置第9為(TB8)為1,作為從機(jī)數(shù)據(jù)結(jié)束的標(biāo)志。
⑷主機(jī)接收數(shù)據(jù)時先判斷數(shù)據(jù)的接收標(biāo)志(RB8),若RB8=1,表示數(shù)據(jù)傳送結(jié)束,并比較此幀效應(yīng)和,若正確則回送正確信號00H,命令該從機(jī)復(fù)位(即重新等待地址幀);若效應(yīng)和出錯,則發(fā)送信號0FFH,命令該從機(jī)重發(fā)數(shù)據(jù)。若接收幀的RB8=0,則將數(shù)據(jù)存到緩沖區(qū),并準(zhǔn)備接收下一幀信息。
⑸主機(jī)收到從機(jī)應(yīng)答地址后,確認(rèn)地址是否相符,如果地址不符,則發(fā)復(fù)位信號(數(shù)據(jù)幀中TB8=1);如果地址相符,則TB8清0,開始發(fā)送數(shù)據(jù)。從機(jī)收到復(fù)位命令后回到監(jiān)聽地址狀態(tài)(SM2=1),否則開始接收數(shù)據(jù)和命令。
主要代碼如下:
//////#include"BoardConfig.h"
/*液晶接口定義*/
/////#define RS BIT1
/////#define RW BIT2
/////#define LCDEN BIT3
/*溫度傳感器接口操作宏定義*/
#define DQ1 P2OUT |= BIT7
#define DQ0 P2OUT &= ~BIT7
#define DQ_in P2DIR &= ~BIT7
#define DQ_out P2DIR |= BIT7
#define DQ_val (P2IN & BIT7)
/*按鍵定義*/
#define KEY_SEL P1SEL
#define KEY_IN P1IN
#define KEY_OUT P1OUT
#define KEY_DIR P1DIR
/***********/
#define beep_baojing P6OUT^=BIT4
/*定義數(shù)組*/
unsigned char table0[]="當(dāng)前水溫: 度";
unsigned char du[]="度";
unsigned char table1[]="設(shè)定水溫: 度";
unsigned char table2[]="水位";
unsigned char nRes=30;
unsigned char temprature[2]={0x00,0x00};//用于暫時存放從溫度傳感器中讀出的兩個字節(jié)數(shù)據(jù)
/////unsigned char dot_data[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,//存放小數(shù)位的編碼
///// 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
unsigned char temprature_dis[3]={0,0,0};//最終溫度處理結(jié)果
unsigned char temprature1[2]={0,0};
///////unsigned char mytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};//顯示溫度單位的度(圈)
void delay(unsigned int z)//普通延時
{
unsigned int x,y;
for(x=z;--x;)
for(y=200;--y;);
}
void delay2(unsigned int a)
{
while(a--);
}
/*下面是溫度傳感器的操作程序*/
unsigned char ds18b20_init(void)
{
unsigned char flag;
// DQ_out;
_DINT();
DQ0;
delay2(500);
DQ1;
delay2(50);
// DQ_in;
_NOP();
if(DQ_val)
{
flag = 1; //初始化失敗
}
else
{
flag = 0; //初始化成功
}
//DQ_out;
DQ1;
_EINT();
delay2(400);
return flag;
}
unsigned char read8(void)
{
unsigned char i;
unsigned char temp = 0;
_DINT();
for(i = 0;i < 8;i++)
{
temp > >= 1;
DQ0;
delay2(5);; //延時5us
DQ1;
delay2(10); //延時10us
DQ_in;
_NOP();
if(DQ_val)temp |= 0x80;
delay2(45);; //延時45us
DQ_out;
DQ1;
}
_EINT();
return temp;
}
void write8(unsigned char datt)
{
char i,nBit;
for (i=8; i >0; i--)
{
// DQ_out;// 設(shè)定管腳為輸出方向
DQ0;// 將DQ管腳拉低
nBit = datt & 0x01;// 輸出數(shù)據(jù)
if (nBit)
{
DQ1;
}
else
{
DQ0;
}
delay2(50);// 延時50微妙
DQ1;// 將DQ管腳拉高
datt > >= 1;
}
}
void read_temp()
{
ds18b20_init();
write8(0xcc);
write8(0x44);
//delay(500);
ds18b20_init();
write8(0xcc);
write8(0xbe);
temprature[0]=read8();
temprature[1]=read8();
}
void deal_int()
{
///// temprature_dis[2]=(((temprature[1]&0x0f)< 4)|((temprature[0]&0xf0) >>4))/100+0x30;
temprature_dis[1]=(((temprature[1]&0x0f)< 4)|((temprature[0]&0xf0) >>4))%100/10+0x30;
temprature_dis[0]=(((temprature[1]&0x0f)< 4)|((temprature[0]&0xf0) >>4))%100%10/1+0x30;
/////if(temprature_dis[2]==0x30)temprature_dis[2]=0x20;
if(temprature_dis[1]==0x30)temprature_dis[1]=0x20;
}
/*void deal_dot()
{
temprature_dis[0]=dot_data[temprature[0]&0x0f]+0x30;
}*/
/*以下是12864液晶程序*/
void lcd12864_write(unsigned char flag,unsigned char dat)
{
if(flag==1)
{
P3OUT |=BIT1;
}
else if(flag==0)
{
P3OUT&=~BIT1;
}
P3OUT&=~BIT2;
P4OUT=dat;
delay(2);
P3OUT |=BIT3;
delay(2);
P3OUT&=~BIT3;
}
void lcd_init()
{
lcd12864_write(0,0x0f);
delay(1);
lcd12864_write(0,0x30);
delay(1);
lcd12864_write(0,0x0c);
delay(1);
lcd12864_write(0,0x01);
delay(1);
}
void keyPress(void)
{
int nP10;
KEY_SEL&=0Xf0;//設(shè)置P1.0-P1.3為普通IO
KEY_DIR&=0Xf0;//P1.0到p1.3為輸入
KEY_OUT=0X0f;//P1.0到P1.3都輸出高電平
nP10 = KEY_IN & 0x0f ;//讀入P1.0到P1.3的狀態(tài)
/////if (nP10 == 0x0e && nRes < 80) nRes=nRes+1;//P1.0口按鍵按下
/////if (nP10 == 0x0d && nRes >40) nRes=nRes-1;//P1.1口按鍵按下
/////if (nP10 == 0x0b) nRes = 3;//p1.2口按鍵按下
/////if (nP10 == 0x07) nRes = 4;//p1.3口按鍵按下
if(nP10 != 0x0f) //如果有鍵被按下
{
delay(1200); //延時消抖
if(nP10 != 0x0f) //再次檢測按鍵狀態(tài)
{
if (nP10 == 0x0e && nRes < 80) nRes=nRes+1;//P1.0口按鍵按下
if (nP10 == 0x0d && nRes >20) nRes=nRes-1;//P1.1口按鍵按下
}
delay(2400);
}
}
void lcd12864_dis()
{
unsigned char tem;
tem=nRes;
temprature1[0]=tem/10+0x30;
temprature1[1]=tem%10+0x30;
lcd12864_write(0,0x95);
lcd12864_write(1,temprature1[0]);
lcd12864_write(1,temprature1[1]);
lcd12864_write(0,0x85);
/////lcd12864_write(1,temprature_dis[2]);
lcd12864_write(1,temprature_dis[1]);
lcd12864_write(1,temprature_dis[0]);
}
/*報警*/
void baojing()
{ unsigned int n=0;
unsigned int t1;
t1=(temprature_dis[1]-'0')*10+(temprature_dis[0]-'0');
if(t1 >=nRes)
{
for(n=21;--n;)
{
beep_baojing;
delay(22);
}
}
}
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
// BoardConfig(0xbe);
//***********配置時鐘*************//
unsigned int i;
BCSCTL1 &= ~XT2OFF; //打開XT2高頻晶體振蕩器
do
{
IFG1 &= ~OFIFG; //清除晶振失敗標(biāo)志
for (i = 0xff; i > 0; i--); //等待8MHz晶體起振
}
while ((IFG1 & OFIFG)); //晶振失效標(biāo)志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK選擇高頻晶振
TACTL |= TASSEL_2 + ID_3; //計數(shù)時鐘選擇SMLK=8MHz,1/8分頻后為1MHz
//***初始化液晶和溫度傳感器的端口***//
P2DIR|=BIT7;/****************************/
/*初始化溫度數(shù)據(jù)端輸出低電平*/
P2OUT|=BIT7;/****************************/
P3DIR|= (BIT1+BIT2+BIT3);/****************************/
/*初始化液晶命令端輸出低電平*/
P3OUT&=~(BIT1+BIT2+BIT3);/****************************/
P4DIR|=0XFF; /****************************/
/*初始化液晶數(shù)據(jù)端輸出低電平*/
P4OUT&=~0XFF;/****************************/
P6DIR|=BIT4;//初始化蜂鳴器輸出
P6OUT|=BIT4;
lcd_init();//初始化液晶
read_temp();//第一次讀取溫度
delay(5000);
/*12864的第一行顯示“Current Temp is:”*/
lcd12864_write(0,0x80);
i=0;
while(table0[i]!='?')
{
lcd12864_write(1,table0[i]);
i++;
}
lcd12864_write(0,0x90);
i=0;
while(table1[i]!='?')
{
lcd12864_write(1,table1[i]);
i++;
}
lcd12864_write(0,0x89);
i=0;
while(table2[i]!='?')
{
lcd12864_write(1,table2[i]);
i++;
}
while(1)
{
keyPress();
read_temp();//read the temprature
deal_int();//deal the integer
/////deal_dot();//deal the dot
baojing();
lcd12864_dis();
delay(200);
}
}
(三)結(jié)論與展望
從原理樣機(jī)來看,我們設(shè)計的產(chǎn)品性能更高,在相同的時間里能夠產(chǎn)生更多熱量,所以本產(chǎn)品更適用于集體住宿人群,比如高校學(xué)生公寓、公司職員宿舍以及公共洗浴場所等。
當(dāng)然由于時間有限,設(shè)計過程中仍存在一些問題。比如,在上水時,需要排去桶內(nèi)的空氣,并且需要兩個桶中的水一直處于滿的狀態(tài),這就需要設(shè)計排氣孔,另外還需要水位檢測裝置;對于兩個桶的比例,需要建立數(shù)學(xué)模型或者通過實驗,確定最佳比例,以此能獲得最佳節(jié)能效果,后續(xù)我們將進(jìn)一步完善。
-
單片機(jī)
+關(guān)注
關(guān)注
6063文章
44925瀏覽量
647001 -
mcu
+關(guān)注
關(guān)注
146文章
17841瀏覽量
360500 -
電源電路
+關(guān)注
關(guān)注
48文章
1008瀏覽量
65849 -
家用電器
+關(guān)注
關(guān)注
2文章
276瀏覽量
29965 -
熱水器
+關(guān)注
關(guān)注
5文章
218瀏覽量
27514
發(fā)布評論請先 登錄
基于STM32設(shè)計的數(shù)顯熱水器

如何選購一臺稱心如意的熱水器
太空能熱水器介紹—摘自《新型熱水器的使用與維修》
熱水器出現(xiàn)水垢及處理方法
基于FPGA的智能熱水器控制系統(tǒng)分析
免開發(fā)打造智能熱水器,隨心用水,舒適生活 精選資料分享
智能家用電熱水器控制器
空氣能熱水器和電熱水器哪個好?空氣能熱水器和電熱水器有什么不同
智能熱水器加入語音功能的價值
基于FPGA的智能熱水器設(shè)計

評論