標(biāo)題: 單片機(jī)洗衣機(jī)節(jié)水控制系統(tǒng)的設(shè)計(jì)論文 [打印本頁(yè)]
作者: 小米大猴 時(shí)間: 2018-5-10 06:50
標(biāo)題: 單片機(jī)洗衣機(jī)節(jié)水控制系統(tǒng)的設(shè)計(jì)論文
摘要
自動(dòng)化和節(jié)能化是目前洗衣機(jī)發(fā)展的主流趨勢(shì)。本文根據(jù)對(duì)洗衣機(jī)節(jié)能指標(biāo)的要求,通過(guò)方案對(duì)比,選擇89C52單片機(jī)作為控制核心,實(shí)施以節(jié)水為主要目標(biāo)的節(jié)能洗衣機(jī)理念的設(shè)計(jì)與實(shí)現(xiàn)。
本文詳細(xì)闡述了系統(tǒng)的各個(gè)功能模塊及其工作過(guò)程。洗衣機(jī)由鍵盤設(shè)定洗衣模式,并采用傳感器檢測(cè)洗衣過(guò)程中的水量、水的混濁程度等參數(shù),通過(guò)單片機(jī)的八個(gè)子程序的處理,實(shí)現(xiàn)對(duì)洗衣機(jī)自動(dòng)識(shí)別水量,自動(dòng)識(shí)別濁度,自動(dòng)決定漂洗時(shí)間和漂洗次數(shù)等功能的控制。
1 緒論
1.1 課題背景
1.2 課題的意義
1.3 設(shè)計(jì)內(nèi)容
2 系統(tǒng)硬件設(shè)計(jì)
2.1 方案選擇
2.2 系統(tǒng)總體結(jié)構(gòu)設(shè)計(jì)
2.3 模塊電路設(shè)計(jì)與元件選擇
3 系統(tǒng)軟件設(shè)計(jì)
3.1 系統(tǒng)主程序
3.2 計(jì)算時(shí)間子程序
3.3 中斷程序
3.4 顯示時(shí)間子程序
3.5 濁度數(shù)據(jù)AD轉(zhuǎn)換及漂洗控制子程序
3.6 鍵盤掃描子程序
3.7 鍵盤服務(wù)子程序
3.8 工作模式設(shè)定程序
3.9 系統(tǒng)動(dòng)作服務(wù)程序
4 系統(tǒng)調(diào)試與分析
5 總結(jié)
參考文獻(xiàn)
致 謝
附錄一 系統(tǒng)原理圖
附錄二 源程序
本系統(tǒng)實(shí)現(xiàn)了對(duì)洗衣機(jī)整個(gè)洗衣過(guò)程的控制,包括用戶參數(shù)輸入,洗滌,漂洗,濁度檢測(cè),脫水等幾大步驟。洗衣機(jī)就會(huì)在每次漂洗完成后智能判斷洗滌水的混濁情況,對(duì)于不同的污濁度設(shè)計(jì)了不同的漂洗時(shí)間。若在任何一次漂洗結(jié)束時(shí)進(jìn)行的濁度檢測(cè)結(jié)果表明洗滌水已足夠清凈,程序就會(huì)直接跳轉(zhuǎn)至“脫水”模式進(jìn)行衣物脫水,從而節(jié)約了大量的冗余漂洗時(shí)間和能源。波輪式全自動(dòng)洗衣機(jī)的結(jié)構(gòu)如圖2.2所示[10]。
2.3 模塊電路設(shè)計(jì)與元件選擇2.3.1 電源設(shè)計(jì)電源模塊是為整個(gè)電路系統(tǒng)和伺服機(jī)構(gòu)提供能源和動(dòng)力的重要保證。一般的直流穩(wěn)壓電源由整流電路、濾波電路和穩(wěn)壓電路等幾部分組成[11]。
本機(jī)電源采用雙路輸出+5V和+12V,分別用于提供電子電路工作電源和電磁閥驅(qū)動(dòng)電源。使用交流變壓器將220V市電降壓至15V,經(jīng)過(guò)二極管整流橋整流、電容濾波和穩(wěn)壓管穩(wěn)壓,能輸出穩(wěn)定的直流5V和12V電壓。電源模塊的電路原理圖如圖2.3所示。
圖2.3 雙路穩(wěn)壓電源模塊
2.3.3 LED燈顯示與74HC573鎖存器節(jié)能洗衣機(jī)系統(tǒng)有六個(gè)基本的狀態(tài),分別是厚物洗滌,薄物洗滌,漂洗,脫水,暫停,停止和報(bào)警。本系統(tǒng)用六個(gè)發(fā)光二極管作為狀態(tài)指示燈,使用共陽(yáng)極接法,由單片機(jī)P1口通過(guò)一個(gè)鎖存器來(lái)控制它們的亮滅。LED燈的電路接法如圖2.6所示。 BACK

圖2.6 LED狀態(tài)指示燈
鎖存器(Latch)是一種對(duì)脈沖電平敏感的存儲(chǔ)單元電路,它們可以在特定輸入脈沖電平作用下改變狀態(tài)。典型的鎖存器邏輯電路是 D 觸發(fā)器電路[13]。本設(shè)計(jì)使用的74HC573鎖存器的真值表如表2.2所示。 BACK
表2.2 鎖存器的真值表
74HC573的八個(gè)鎖存器都是透明的D型鎖存器,當(dāng)使能引腳LE為高電平時(shí),Q輸出將隨數(shù)據(jù)D輸入而變化;反之,鎖存器進(jìn)入鎖存狀態(tài),D將保持原有信號(hào)的輸出而不受輸入信號(hào)變化的影響[14]。鎖存器的引腳功能與封裝如圖2.7所示。
圖2.7 鎖存器的引腳及其功能
在在本課題的應(yīng)用中,單片機(jī)P0口和P1口的八路 I/O 口上分別需要外接鎖存器,這是為了實(shí)現(xiàn)數(shù)據(jù)和地址在I/O口上的復(fù)用。BACK
2.3.4 七段數(shù)碼管顯示LED(Light Emiting Diode)是發(fā)光二極管英文名稱的縮寫。常用的LED有共陽(yáng)極和共陰極2種。共陰極LED顯示器的發(fā)光二極管的陰極連在一起,通常此公共陰極接地[15]。本次設(shè)計(jì)是用于顯示時(shí)間,采用共陰極LED顯示就可以有較好的顯示效果。
在多位LED顯示時(shí),通常將所有位的段碼線相應(yīng)段并聯(lián)在一起,由1個(gè)8位I/O口控制,形成段碼線的多路復(fù)用,而各位的共陰極或共陽(yáng)極分別由相應(yīng)的地址線控制,形成各位的分時(shí)選通[16]。七段數(shù)碼管電路如圖2.8所示。 BACK
圖2.8 七段數(shù)碼管顯示
2.3.5 濁度檢測(cè)模塊設(shè)計(jì)TS濁度傳感器是GE公司開(kāi)發(fā)的一種專門用于家電產(chǎn)品的低成本傳感器,主要用于洗衣機(jī)、洗碗機(jī)等產(chǎn)品的水污濁程度的測(cè)量,其內(nèi)部結(jié)構(gòu)原理圖如圖2.9所示。此種濁度傳感器體積小,兼容TTL電平,使用方便[17],故本次設(shè)計(jì)采用TS濁度傳感器。 BACK

圖2.9 TS濁度傳感器結(jié)構(gòu)原理圖
濁度傳感器的工作原理是:當(dāng)光線穿過(guò)一定量的水時(shí),光線的透過(guò)量取決于該水的污濁程度:水越污濁,透過(guò)的光就越少。光接收端把透過(guò)的光強(qiáng)度轉(zhuǎn)換為對(duì)應(yīng)的電壓大小。通過(guò)測(cè)量接收端的電壓,就可以計(jì)算出水的污濁程度。洗滌水的透光度與洗滌時(shí)間t的關(guān)系曲線如圖2.10所示。 BACK
(a)圖為洗滌全過(guò)程的濁度變化 (b)圖為輕污和重污的透光度比較
圖2.10 洗滌水的透光度與洗滌時(shí)間t的關(guān)系曲線
在節(jié)能洗衣機(jī)系統(tǒng)中,濁度傳感器安裝在洗衣機(jī)的排水管口附近,如圖2.11所示,在洗衣機(jī)開(kāi)始排水時(shí)啟動(dòng)數(shù)據(jù)采集進(jìn)行水質(zhì)檢測(cè),并將檢測(cè)結(jié)果送單片機(jī)。

圖2.11 濁度傳感器的工作示意圖
濁度值是由TS濁度傳感器測(cè)得濁度數(shù)據(jù),送ADC0804進(jìn)行模數(shù)轉(zhuǎn)換后所得的數(shù)值。實(shí)際應(yīng)用中,應(yīng)根據(jù)不同容量的洗衣機(jī)進(jìn)行實(shí)驗(yàn)來(lái)確定更準(zhǔn)確的濁度值與對(duì)應(yīng)的洗滌時(shí)間。表2.3表明衣物濁度與洗滌參考時(shí)間的關(guān)系。 BACK
表2.3 洗滌水濁度與洗滌參考時(shí)間的關(guān)系
ADC0804是用CMOS集成工藝制成的逐次比較型摸數(shù)轉(zhuǎn)換芯片。該芯片內(nèi)有輸出數(shù)據(jù)鎖存器,當(dāng)與控制器連接時(shí),無(wú)須附加邏輯接口電路。逐次比較型AD由一個(gè)比較器和DA轉(zhuǎn)換器通過(guò)逐次比較邏輯構(gòu)成,從MSB開(kāi)始,順序地對(duì)每一位將輸入電壓與內(nèi)置DA轉(zhuǎn)換器輸出進(jìn)行比較,經(jīng)多次比較而輸出數(shù)字值。其優(yōu)點(diǎn)是速度高、功耗低。ADC0804引腳如圖2.12所示。 BACK
圖2.12 ADC0804引腳功能
在本系統(tǒng)中,濁度信號(hào)轉(zhuǎn)換為0V~5V電壓信號(hào),濁度傳感器連接ADC0804的輸入接口進(jìn)行采樣處理,然后將電壓信號(hào)轉(zhuǎn)換為8位數(shù)值0x00~0xff送入單片機(jī)P1口。TS濁度傳感器及其數(shù)據(jù)AD采樣電路如圖2.13所示。 BACK
圖2.13 TS濁度傳感器及其數(shù)據(jù)AD采樣電路
2.3.6 電機(jī)控制本設(shè)計(jì)采用家用洗衣機(jī)常用的單相交流電機(jī),這種電機(jī)有兩個(gè)繞組:主繞組和副繞組,兩個(gè)繞組在空間上相差90度。在啟動(dòng)繞組上串聯(lián)一個(gè)容量較大的啟動(dòng)電容,由于電容器作用使啟動(dòng)繞組中的電流在時(shí)間上比運(yùn)行繞組超前90度角,先到達(dá)最大值。在時(shí)間和空間上形成兩個(gè)相同的脈沖磁場(chǎng),使定子與轉(zhuǎn)子之間產(chǎn)生一個(gè)旋轉(zhuǎn)磁場(chǎng),電機(jī)轉(zhuǎn)子中產(chǎn)生感應(yīng)電流,與旋轉(zhuǎn)磁場(chǎng)互相作用產(chǎn)生電磁場(chǎng)轉(zhuǎn)矩,使電機(jī)旋轉(zhuǎn)起來(lái)。 BACK
普通單相電機(jī)這兩個(gè)繞組完全一樣,互相可以交換。要使電機(jī)反轉(zhuǎn),只要交換兩個(gè)繞組中的一個(gè)繞組的首尾接線就可反轉(zhuǎn)。電機(jī)的調(diào)速是通過(guò)一個(gè)串接線圈實(shí)現(xiàn)。單相交流電機(jī)的正反轉(zhuǎn)控制原理如圖2.14所示。 BACK
圖2.14 單相交流電機(jī)的正反轉(zhuǎn)控制
在本設(shè)計(jì)中,采用兩只HJR1-2C電磁繼電器控制電機(jī)正反轉(zhuǎn),一只HRS2H-S電磁繼電器控制電機(jī)的旁路繞阻以實(shí)現(xiàn)脫水時(shí)電機(jī)的高轉(zhuǎn)速工作。電機(jī)控制部分的電路原理圖如圖2.15所示。

圖2.15 電機(jī)控制部分
2.3.7 水閥水閥的動(dòng)作采用電磁閥控制,使用兩只HRS2H-S電磁繼電器耦合來(lái)控制兩個(gè)大功率電磁閥。進(jìn)水或排水時(shí),由單片機(jī)發(fā)出指令,使繼電器觸點(diǎn)吸合,接通水閥的電磁鐵,帶動(dòng)閥門執(zhí)行進(jìn)水或排水操作。水閥電路如圖2.16所示。
BACK
圖2.16 水閥控制電路
2.3.8 水位傳感器 水位傳感器采用吸簧式浮子傳感器,它本身輸出的就是數(shù)字信號(hào)。當(dāng)水位有變化時(shí),浮子隨著水位上下浮動(dòng),內(nèi)置磁石使對(duì)應(yīng)高度的簧片吸合,觸點(diǎn)導(dǎo)通;浮子離開(kāi)時(shí),當(dāng)前觸點(diǎn)斷開(kāi),到下一個(gè)觸點(diǎn)吸合。單片機(jī)掃描觸點(diǎn)變化信號(hào)就可判斷當(dāng)前洗衣桶內(nèi)的水位。水位傳感器結(jié)構(gòu)示意圖如圖2.17所示。 BACK
圖2.17 水位傳感器結(jié)構(gòu)示意圖
2.3.9 電磁繼電器本電路系統(tǒng)是低壓控制高壓類型的程控電子線路,由芯片輸出的邏輯電平+5V來(lái)控制交流220V的負(fù)載電機(jī)。當(dāng)繼電器線圈兩端有電流時(shí),線圈產(chǎn)生的磁通使銜鐵吸向鐵芯極面,從而推動(dòng)常閉觸點(diǎn)斷開(kāi),常開(kāi)觸點(diǎn)閉合;當(dāng)線圈兩端電流小于一定值時(shí),機(jī)械反力大于電磁吸力,銜鐵回到初始狀態(tài),常開(kāi)觸點(diǎn)斷開(kāi),常閉觸點(diǎn)接通。繼電器原理圖如圖2.18所示。 BACK
圖2.18 繼電器原理圖
3 系統(tǒng)軟件設(shè)計(jì)3.1 系統(tǒng)主程序根據(jù)硬件設(shè)計(jì)要求,控制主程序流程如圖3.1所示。洗衣機(jī)通電后,單片機(jī)上電進(jìn)行程序的初始化操作,默認(rèn)洗衣機(jī)工作模式為“厚物洗滌”,并顯示此工作模式下的預(yù)設(shè)時(shí)間,然后掃描鍵盤,等待用戶命令。當(dāng)按下“開(kāi)始”鍵后,系統(tǒng)就開(kāi)始倒計(jì)時(shí),并進(jìn)入相應(yīng)的工作模式程序開(kāi)始洗滌.
系統(tǒng)調(diào)試與分析在完成節(jié)能洗衣機(jī)控制系統(tǒng)的設(shè)計(jì)后,將程序在系統(tǒng)硬件上進(jìn)行功能驗(yàn)證。系統(tǒng)硬件組成部分如圖4.1所示。
圖4.1 節(jié)能洗衣機(jī)系統(tǒng)硬件部分
系統(tǒng)上電后,會(huì)進(jìn)入默認(rèn)的“厚物洗滌”模式并等待操作,如圖4.2所示。通過(guò)模式選擇按鍵可切換至“薄物洗滌”模式。這時(shí)只要按下“開(kāi)始”鍵,洗衣機(jī)就會(huì)按照程序設(shè)定開(kāi)始工作。
圖4.2 系統(tǒng)上電后的等待狀態(tài)
在選定洗滌模式之后按下開(kāi)始鍵,系統(tǒng)開(kāi)始倒計(jì)時(shí),并打開(kāi)進(jìn)水閥進(jìn)水,如圖4.3所示。在預(yù)定水位達(dá)到后,控制器關(guān)閉進(jìn)水閥,主電機(jī)在程序的控制下間歇正反轉(zhuǎn),帶動(dòng)波輪和洗衣桶轉(zhuǎn)動(dòng)進(jìn)行洗滌,如圖4.4所示。 BACK






圖4.3 進(jìn)水狀態(tài)





圖4.4 洗滌狀態(tài)
洗衣機(jī)完成漂洗后進(jìn)入歷時(shí)2分鐘的脫水模式工作。如圖4.5所示,脫水狀態(tài)指示燈點(diǎn)亮,排水閥打開(kāi),電機(jī)在高速檔運(yùn)作。若此時(shí)在時(shí)間剩余1分鐘內(nèi)水位降至最低,則洗衣機(jī)直接跳出脫水程序,完成洗滌,進(jìn)入停機(jī)等待狀態(tài)。





圖4.5 系統(tǒng)“脫水”工作狀態(tài)
在系統(tǒng)的正常工作中,若有異常情況出現(xiàn),系統(tǒng)會(huì)立刻中斷當(dāng)前工作任務(wù),進(jìn)入“報(bào)警”狀態(tài):使電機(jī)停車等待,蜂鳴器發(fā)出告警音響,如圖4.6所示。當(dāng)處理異常情況后,按下“開(kāi)始”鍵洗衣機(jī)就會(huì)恢復(fù)到原來(lái)的工作狀態(tài),繼續(xù)洗滌工作。
圖4.6 系統(tǒng)進(jìn)入“報(bào)警”狀態(tài)
經(jīng)過(guò)硬件驗(yàn)證,本系統(tǒng)除具備洗衣機(jī)基本功能外,也具有智能判斷濁度,自主決策漂洗時(shí)間,根據(jù)水位情況制定洗滌任務(wù)等功能,本課題設(shè)計(jì)最終實(shí)現(xiàn)節(jié)能洗衣機(jī)的預(yù)期功能。 BACK
5 總結(jié)本課題采用STC89C52單片機(jī)對(duì)家用洗衣機(jī)進(jìn)行智能控制,設(shè)計(jì)的節(jié)水控制洗衣機(jī)系統(tǒng)充分應(yīng)用了濁度檢測(cè)技術(shù),通過(guò)硬件設(shè)計(jì)與軟件編程,實(shí)現(xiàn)了洗衣機(jī)的節(jié)能控制,一個(gè)按鈕就能完成洗衣的全過(guò)程,且將洗衣機(jī)水耗降至最低。本設(shè)計(jì)系統(tǒng)的特點(diǎn)有: BACK
(1) 由TS濁度傳感器和水位傳感器檢測(cè)到衣物的污濁度與洗滌所用水量,既能保證洗凈衣物又使洗滌時(shí)間縮短,最大限度地提高洗滌效果,節(jié)約能源及用水量,達(dá)到了本設(shè)計(jì)設(shè)定的節(jié)水這一主要目的。
(2) 本設(shè)計(jì)還考慮到半自動(dòng)時(shí)的情況,用戶可以根據(jù)自己的需求自由選擇洗衣機(jī)的工作方式與洗滌時(shí)間。在洗衣機(jī)工作的任一過(guò)程中,用戶可根據(jù)需要隨時(shí)暫停洗衣機(jī),機(jī)蓋檢測(cè)和過(guò)載保護(hù)能有效保證用戶安全與洗衣機(jī)穩(wěn)定工作,延長(zhǎng)使用壽命。 BACK
在本課題的設(shè)計(jì)過(guò)程中,也出現(xiàn)了不少問(wèn)題。如濁度傳感器暫時(shí)找不到,找到的雖然精度高質(zhì)量好,但是價(jià)格不菲。經(jīng)過(guò)分析,發(fā)現(xiàn)濁度傳感器在工作中輸出的是0V~5V的模擬電壓信號(hào),而這個(gè)信號(hào)可用電位器輸出,給設(shè)計(jì)和實(shí)物檢驗(yàn)帶來(lái)極大方便。 BACK
本設(shè)計(jì)仍存在一些不足之處,如洗衣機(jī)水位調(diào)節(jié)只有二級(jí)水位變化,在實(shí)際應(yīng)用中可以增加水位調(diào)節(jié)級(jí)別,以便把洗衣機(jī)的節(jié)能功效發(fā)揮到最大;雖然系統(tǒng)消除了繼電器動(dòng)作單元對(duì)控制單元的影響,但在同塊萬(wàn)用板上焊接的幾個(gè)電磁繼電器之間又相互影響,看來(lái)只有使用更規(guī)范的PCB電路板和更合理的布線才能消去這種干擾。在軟件設(shè)計(jì)方面,本課題的軟件設(shè)計(jì)只考慮了各功能模塊都正常運(yùn)行的情況,而沒(méi)設(shè)計(jì)在某個(gè)關(guān)鍵器件故障時(shí)系統(tǒng)的自檢與保護(hù)性停機(jī)的程序,故在不同的系統(tǒng)中可視具體情況在程序中加入更加全面的故障處理與保護(hù)功能以使系統(tǒng)完善。由于時(shí)間所限,本設(shè)計(jì)的硬件模擬只能做出節(jié)能洗衣機(jī)的幾大基本功能,不能做出較完善和較全面的多功能控制系統(tǒng),也是本設(shè)計(jì)的遺憾之處。
附錄一 系統(tǒng)原理圖
單片機(jī)源程序如下:
- <font color="rgb(0, 0, 0)">/*=======================================
- 基于STC89C52單片機(jī)的
- 節(jié)能洗衣機(jī)控制程序設(shè)計(jì)
- =========================================*/
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit dula = P2^6; //段鎖存。P0是數(shù)碼管數(shù)據(jù)端
- sbit wela = P2^7;
- sbit beep = P2^3;
- sbit diola= P2^5; //LED指示燈鎖存
-
- sbit mod_hou = P1^0; //厚物指示
- sbit mod_bao = P1^1; //薄物指示
- sbit mod_rewash = P1^2; //漂洗指示
- sbit mod_dry = P1^3; //甩干指示
- sbit mod_pause =P1^4; //暫停指示
- sbit mod_stop = P1^5; //停止指示
- sbit mod_error= P1^6; //錯(cuò)誤指示
-
- sbit mola = P2^4; //伺服控制的鎖存器使能
- sbit molf = P1^0;
- sbit mort = P1^1;
- sbit mosp = P1^2;
- sbit wtin = P1^3;
- sbit wtot = P1^4;
- sbit adwr = P3^6; //ADC的控制針
- sbit adrd = P3^7;
-
- uint mh, ml, sh, sl;
- uchar we, du, count, fen, miao; //LED位鎖,段鎖,中斷計(jì)數(shù),分,秒
- uchar key_num, mod_flag, tmp_mod; //按鍵返回值,模式標(biāo)志,臨時(shí)模式標(biāo)志
- uchar adc_rewash, adc_display_mod; //AD判斷是否漂洗,AD結(jié)果是否顯示;
- uchar adc_samp; //ADC轉(zhuǎn)換結(jié)果變量
- uchar wt_h, wt_m, wt_l; //水位指示:高,中,低,水位標(biāo)志
- uchar action_mod, wt_io_action; //工作標(biāo)志緩存,進(jìn)排水動(dòng)作標(biāo)志
- uchar rewash_times; //記錄漂洗次數(shù)
- bit flag_1s; //1s標(biāo)志位
- uint flag_1s_counter; //1s計(jì)數(shù)
-
- uchar code table_of_duanma[] = { //共陰碼段
- 0x3f, 0x06, 0x5b, 0x4f, // 0, 1, 2, 3,
- 0x66, 0x6d, 0x7d, 0x07, // 4, 5, 6, 7,
- 0x7f, 0x6f, 0x40, 0x00 }; // 8, 9, -, ,
-
- //=== 延時(shí)子程序 ====================================
- void delay(uchar z)
- {
- uchar x, y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //=== 蜂鳴子程序 ====================================
- void beep_on(uchar beep_mod) //蜂鳴器發(fā)聲模式:
- { //1-短促(按鍵響應(yīng) 和 模式切換) 2-稍長(zhǎng)(結(jié)束提示) 3-很長(zhǎng)(報(bào)警)
- uchar bp_ct; //計(jì)算發(fā)聲次數(shù)的局部變量
- switch(beep_mod)
- {
- case 1: { //模式 1 -短促(用于按鍵)
- for( bp_ct=3;bp_ct>0;bp_ct-- )
- {
- beep = 0;
- delay(100);
- beep = ~beep;
- }
- beep = 1;
- }
- break;
- case 2: { //模式 2 -稍長(zhǎng)(結(jié)束提示)
- for( bp_ct=5;bp_ct>0;bp_ct-- )
- { beep = 0;
- delay(500);
- beep = ~beep;
- }
- beep = 1;
- }
- break;
- case 3: { //模式 3 -很長(zhǎng)(報(bào)警)
- for( bp_ct=7;bp_ct>0;bp_ct-- )
- {
- beep = 0;
- delay(500);
- beep = ~beep;
- }
- beep = 1;
- }
- break;
- default:{ //其他情況視為錯(cuò)誤,長(zhǎng)2聲
- for( bp_ct=11;bp_ct>0;bp_ct-- )
- {
- beep = 0;
- delay(500);
- }
- beep = 1;
- }
- break;
- }
- }
-
- //=== 系統(tǒng)初始化 ==============================
- void init()
- {
- fen = 15;
- miao = 0;
- count = 0;
- wt_h = 0;
- wt_m = 0;
- wt_l = 1;
-
- P0 = 0x00; //端口置位,防止干擾
- P1 = 0xff;
- P2 = 0x00;
- wela = 0;
- dula = 0;
- diola= 0;
- mola = 0; //關(guān)閉電機(jī)控制,等待指令操作
- beep_on(2); //開(kāi)機(jī)聲音響應(yīng)
- beep = 1; //關(guān)閉蜂鳴器
- rewash_times = 0; //漂洗次數(shù)初值:0次
-
- key_num=16; //按鍵返回值:無(wú)按鍵
- mod_flag=1; //模式標(biāo)志
- tmp_mod=0; //臨時(shí)模式寄存標(biāo)志
-
- TMOD = 0x01;
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- IE = 0x82; //中斷使能位置1: EA = 1,ET0 = 1。或直接設(shè)IE也得
- }
-
- //=== 倒計(jì)時(shí) =========================
- void count_time()
- {
- if(count==20)
- {
- count=0; //倒計(jì)時(shí):
- if(fen>0) //分鐘大于0時(shí)
- {
- if(miao>0 && miao<60) // 0 < miao < 60
- {
- miao--;
- } //秒減1
- else //if(miao<0 || miao>59) //若秒不在0~59內(nèi)
- {
- miao=59; //說(shuō)明進(jìn)位了,就拉回值域
- fen--; //然后分鐘減1
- }
- }
- else if(fen==0) //分鐘為0時(shí),即在最后一分鐘內(nèi)時(shí)
- {
- if(miao>0 && miao<=59) //秒還沒(méi)進(jìn)位的話
- miao--; //秒就減1
- else if(miao==0) //若秒走到0了,則計(jì)時(shí)時(shí)間到
- { TR0 = 0; //停定時(shí)器
- //時(shí)間到00:00,當(dāng)前模式工作完成,進(jìn)入下一模式繼續(xù):
- beep_on(1); //蜂鳴模式1:模式切換
- }
- }
- }
- }
-
- //=== 顯示時(shí)間 ===========================
- void display_time()
- {
- if(adc_display_mod != 1) //若ADC結(jié)果不顯示(≠1時(shí)),就進(jìn)入時(shí)間顯示
- { //否則跳出。以此來(lái)消去AD顯示時(shí)的時(shí)間部分干擾
- for(we=0xdf;we!=0xfe;we=_cror_(we,1))
- { //we==1101 1111 開(kāi)始右移
- wela = 0;
- P0 = we;
- wela = 1; //位選
- wela = 0;
- delay(1);//這個(gè)delay只能是1,大于3嚴(yán)重閃爍,大于5時(shí)間不走...
- dula = 0; //段選
- switch(we)
- {
- case 0xdf: P0=table_of_duanma[miao%10];
- break;
- case 0xef: P0=table_of_duanma[miao/10];
- break;
- case 0xf7: P0=0x40; // - 間位符
- break;
- case 0xfb: P0=table_of_duanma[fen%10];
- break;
- case 0xfd: P0=table_of_duanma[fen/10];
- break;
- case 0xfe: P0=0x00; //關(guān)閉最高位
- we=0xdf;
- break;
- }
- dula = 1;
- delay(1);
- P0 = 0x00; //關(guān)數(shù)碼管
- dula = 0;
- }
- }
- }
-
- //=== 工作模式指示燈 =========================
- void display_mod() //顯示:僅用于點(diǎn)亮LED工作模式指示燈
- {
- mola = 0; //關(guān)閉電機(jī)控制鎖存器使能
- P1 = 0xff; //改變 mod_flag
- diola = 1;
- delay(1);
- switch(mod_flag)
- {
- case 1: { mod_hou = 0; } //標(biāo)志 1:厚物洗滌
- break;
- case 2: { mod_bao = 0; } //標(biāo)志 2:薄物洗滌
- break;
- case 3: { mod_rewash = 0; } //標(biāo)志 3:漂洗
- break;
- case 4: { mod_dry = 0; } //標(biāo)志 4:甩干
- break;
- case 5: { mod_pause = 0; } //標(biāo)志 5:暫停
- break;
- case 6: { mod_stop = 0; } //標(biāo)志 6:停止
- break;
- case 7: { mod_error = 0; } //標(biāo)志 7:報(bào)警
- break;
- }
- diola = 0;
- }
-
- //=== ADC Display =========================
- void adc_display(uchar bai_c,uchar sh_c,uchar g_c) /
- {
- P0=table_of_duanma[bai_c]; //顯示百位
- dula=1;
- dula=0;
-
- P0=0xfe; //確定顯示用數(shù)碼管的位地址
- wela=1;
- wela=0;
- delay(10); //延時(shí)放在這是為了消除鬼影
-
- dula=0;
- P0=table_of_duanma[sh_c]; //顯示十位
- dula=1;
- dula=0;
-
- wela=0;
- P0=0xfd;
- wela=1;
- wela=0;
- delay(10);
-
- P0=table_of_duanma[g_c]; //顯示個(gè)位
- dula=1;
- dula=0;
-
- P0=0xfb;
- wela=1;
- wela=0;
- delay(10);
- }
- //=== AD轉(zhuǎn)換 =============================
- void adc_serve()
- {
- uchar a,A1,A2,A2t,A3;
- dula=0; //關(guān)閉7段數(shù)碼管的顯示
- wela=1; //打開(kāi)有ADC片選的鎖存器
- P0=0; //P0^7針為0時(shí),選通ADCS
- adwr=0; //AD寫入,低電平有效(主要是為了啟動(dòng)AD轉(zhuǎn)換)
- display_mod(); //顯示一下工作模式,(為了給AD轉(zhuǎn)換延時(shí))
- adwr=1; //關(guān)ADC寫入使能
- P0=0xff; //關(guān)閉ADCS
- if(adc_display_mod==1) //ADC顯示標(biāo)志為1(0就不顯示結(jié)果)。
- { wela=0;
- for(a=10;a>0;a--)
- {
- delay(10);
- adc_display(A1,A2,A3); //送去顯示各個(gè)數(shù)位。
- }
- }
- wela = 1; //重新打開(kāi)有AD片選信號(hào)鎖存器的鎖存端
- P1 = 0xff; //讀取P1口之前先給其寫全1
- P0 = 0; //選通ADCS
- adrd = 0; //AD讀使能
- adc_samp = P1; //AD數(shù)據(jù)讀取賦給P1口
- adrd = 1; //關(guān)閉AD讀使能
- P0 = 0xff; //關(guān)閉ADCS片選
- adwr =0 ; //打開(kāi)AD寫
- if(adc_display_mod==1) // 若允許AD顯示
- { A1=adc_samp/100; //分出百,十,和個(gè)位
- A2t=adc_samp%100;
- A2=A2t/10;
- A3=A2t%10; //AD原理:透過(guò)的光多,電流大,說(shuō)明水清,反之水濁
- } //仿真輸出是0~255數(shù)字。0(0v)為污濁,清凈為255(5v).
- if(adc_samp < 200)
- adc_rewash = 1;
- else
- {
- adc_rewash = 0;
- }
- }
- //=== 鍵盤掃描 =============================
- void key_serve() //按鍵服務(wù)
- { //讀取鍵值后進(jìn)行相應(yīng)的操作
- uchar tmp_mod_memory=0, tmp_fen=0, tmp_miao=0;
- diola=0;
- P1 = 0xff; //關(guān)閉LED燈,防按鍵干擾
- switch(key_num)
- {
- case 0: { //厚物洗滌
- if(TR0==0 && (fen==0 || fen==10))
- {
- fen = 15;
- miao = 0;
- mod_flag = 1; //工作模式1:厚物
- tmp_mod = 1;
- rewash_times = 0;
- adc_rewash = 1;
- beep_on(1);
- }
- }
- break;
- case 4: { //薄物洗滌
- if(TR0==0 && (fen==0 || fen==15))
- {
- fen = 10;
- miao = 0;
- mod_flag = 2; //工作模式2:薄物
- rewash_times = 0;
- adc_rewash = 1;
- tmp_mod = 2;
- beep_on(1);
- }
- }
- break;
- case 1: { // 開(kāi)始 鍵
- if(TR0==0) //定時(shí)器不工作時(shí),才響應(yīng)
- {
- mod_flag = tmp_mod; //從臨時(shí)變量讀取原工作模式
- TR0 = 1;
- beep_on(1);
- }
- }
- break;
- case 5: { // 暫停 鍵
- if(mod_flag != 5 && TR0==1)
- {
- tmp_mod = mod_flag; //當(dāng)前工作模式存入臨時(shí)變量中
- TR0 = 0;
- mod_flag = 5; //工作模式5:暫停
- beep_on(1);
- }
- }
- break;
- case 9: { //停止 鍵:
- if(TR0 == 1) //定時(shí)器在工作時(shí),才響應(yīng)
- {
- tmp_mod = mod_flag; //當(dāng)前工作模式存入臨時(shí)變量中
- P1 = 0xff;
- TR0 = 0; //關(guān)定時(shí)器
- fen = 00;
- miao= 00;
- rewash_times = 0; //重置漂洗次數(shù)
- adc_rewash = 1; //重置漂洗允許標(biāo)志位
- mod_flag = 6; //工作模式6:停止
- beep_on(2); //蜂鳴器模式2:停止
- }
- } //然后停止,等待
- break;
- case 2: { // 報(bào)警
- if( (mod_flag != 5) && (mod_flag != 6) && TR0==1 )
- {
- tmp_mod = mod_flag; //當(dāng)前工作模式存入臨時(shí)變量中
- P1 = 0xff; //LED防干擾,先關(guān)閉
- TR0 = 0;
- mod_flag = 7; //工作模式7:報(bào)警
- beep_on(2); //蜂鳴器模式2:停止
- }
- }
- break;
- case 6: { // 機(jī)蓋打開(kāi)(6鍵是 機(jī)蓋)
- if( (mod_flag != 5) && (mod_flag != 6) && TR0==1 )
- {
- tmp_mod = mod_flag; //當(dāng)前工作模式存入臨時(shí)變量中
- P1 = 0xff; //LED防干擾,先關(guān)閉
- TR0 = 0;
- mod_flag = 5; //工作模式7:報(bào)警
- beep_on(2); //蜂鳴器模式2:停止
- }
- }
- break;
- //演示專用:水位模擬鍵的動(dòng)作
- case 12: {
- P1 = 0x0ff;
- wt_h = 1; //高水位
- wt_m = 0;
- wt_l = 0;
- }
- break;
- case 13: {
- P1 = 0x0ff;
- wt_h = 0;
- wt_m = 1; //中水位
- wt_l = 0;
- }
- break;
- case 14: {
- P1 = 0x0ff;
- wt_h = 0;
- wt_m = 0;
- wt_l = 1; //低水位
- }
- break;
- //演示專用:分鐘速減鍵
- case 3: {
- P1 = 0xff;
- mola=0;
- diola=0; //以上防干擾用
- if(fen != 1)
- fen=1;
- }
- break;
- //演示專用:秒鐘速減鍵
- case 7: {
- P1 = 0xff;
- mola=0;
- diola=0; //以上防干擾用
- if(miao!=1)
- miao=1;
- }
- break;
- //演示專用:從 時(shí)間顯示 切換到 AD轉(zhuǎn)換結(jié)果顯示
- case 11: {
- if(adc_display_mod==0) //顯示模式不在AD顯示時(shí),響應(yīng)
- {
- tmp_fen = fen; //先保存當(dāng)前計(jì)時(shí)時(shí)間
- tmp_miao = miao;
- adc_display_mod = 1; //模式1為AD結(jié)果顯示;
- adc_serve(); //(0為不顯示,后臺(tái)運(yùn)行)
- EA = 0; //關(guān)中斷,優(yōu)化顯示效果(消鬼影)
- TR0 = 0;
- }
- }
- break;
- //演示專用:從 AD轉(zhuǎn)換結(jié)果 切換到 時(shí)間顯示
- case 15: { //切換到Time時(shí)間顯示
- if(adc_display_mod==1)
- {
- fen = tmp_fen; //讀取暫存的時(shí)間數(shù)據(jù)
- miao = tmp_miao;
- adc_display_mod = 0; //不顯示ADC結(jié)果
- EA = 1; //開(kāi)中斷,回到時(shí)間顯示
- TR0 = 1;
- }
- }
- break;
- }
- }
- //=== 鍵盤掃描 ===============================
- void key_scan() //鍵盤掃描:將獲取新的key_num值
- {
- uchar temp, tempp=30;//臨時(shí)鍵值
- uchar key_en=1; //鍵盤監(jiān)視:有按鍵動(dòng)作時(shí)才執(zhí)行Key_serve,否則僅僅作掃描。不然延時(shí)太嚴(yán)重,LED會(huì)閃爍
-
- P3 = 0x0f; //低4位置1,放入4行。
- temp = P3^0x0f; //異或,把相異的一行變成1,其它全為0
- switch(temp) //判斷是哪行有鍵按下了(0-3行)
- { //就給相應(yīng)鍵值的行提前量
- case 1: key_num = 0; break;
- case 2: key_num = 1; break;
- case 4: key_num = 2; break;
- case 8: key_num = 3; break;
- default: { //無(wú)按鍵
- key_num= 16;
- key_en=0;
- } break;
- }
-
- P3 = 0xf0; //高4位置1,放入4列。
- temp = (P3>>4)^0x0f; //將高位移到低位,用異或找出按下的列
- switch(temp) //判斷列按下,在先前的鍵值中加入列數(shù)得鍵值
- {
- case 1: key_num += 0; break;
- case 2: key_num += 4; break;
- case 4: key_num += 8; break;
- case 8: key_num += 12;
- }
- if(key_en==1 && temp!=tempp) //如果有鍵盤操作,才執(zhí)行按鍵服務(wù)
- {
- tempp = key_num;
- key_serve();
- }
- temp = key_num;
- display_mod(); //指示工作模式的LED燈變化
- }
-
- //=== 系統(tǒng)動(dòng)作控制 =====================
- void action_serve(uchar action_mod) //主電機(jī)動(dòng)作
- {
- P0 = 0xff;
- diola = 0;
- switch(action_mod)
- {
- case 1: { //模式1 - 1分鐘電機(jī)間歇正反轉(zhuǎn) ==》洗滌
-
- if( ((miao<55)&&(miao>45)) || ((miao<25)&&(miao>15)) )
- {
- mola = 1;
- P1 = 0xfe; //電機(jī)正轉(zhuǎn)
- mola = 0;
- }
- else if( ((miao<40)&&(miao>30))||((miao<10)&&(miao>0)) )
- {
- mola = 1;
- P1 = 0xfd; //電機(jī)反轉(zhuǎn)
- mola = 0;
- }
- else
- {
- mola = 1;
- P1 = 0xff; //電機(jī)停車
- mola = 0;
- }
- }
- break;
- case 2: { //模式2 -電機(jī)加速 ==》脫水
- mola = 1;
- P1 = 0xea; //speed
- mola = 0;
- if(fen==0 && miao==0) //計(jì)時(shí)時(shí)間到
- action_mod = 7;
- }
- break;
- case 3: { //模式3 -進(jìn)水
- mola = 1;
- P1 = 0xf7; //開(kāi)進(jìn)水閥
- mola = 0;
- }
- break;
- case 4: { //模式4:-排水
- mola = 1;
- P1 = 0xef; //開(kāi)排水閥
- mola = 0;
- }
- break;
- case 7: { //模式7:空(停機(jī),等待)
- mola = 1;
- P1 = 0xff; //關(guān)停全部伺服
- mola = 0;
- }
- break;
- default:{ //其他不可預(yù)知的狀態(tài)
- mola = 1;
- P1 = 0xff; //關(guān)停全部伺服
- mola = 0;
- }
- break;
- }
- }
- //=== 工作模式子程序 ====================================
- void working_mod() //工作模式:讀取模式標(biāo)志 mod_flag,判斷系統(tǒng)任務(wù)
- {
- uchar t; //報(bào)警次數(shù)設(shè)定
- uchar dirty_level; //水的污濁級(jí)別
- switch(mod_flag)
- {
- case 1: { //---‘厚物’洗滌--- (按鍵處設(shè)定時(shí)間了)
- tmp_mod = mod_flag; //當(dāng)前工作模式存入臨時(shí)變量中
- if(wt_h==0 && (fen+2)>=15 && TR0==1)
- action_serve(3); //進(jìn)水
- if(wt_h==1 && fen!=0) //水位控制
- action_serve(1); //進(jìn)行厚物洗滌
- if(fen==0 && miao!=0) //結(jié)束前1分鐘
- {
- action_serve(4); //排水
- adc_serve(); //在排水時(shí)檢測(cè)濁度
- delay(1); //ADC needs time
- }
- if((fen==0 && wt_l==1)) //如果時(shí)間到最后1min 或 水位低
- {
- beep_on(1);
- miao=0;
- adc_rewash=1; //漂洗標(biāo)志置1
- TR0 = 0;
- mod_flag = 3; //就進(jìn)入漂洗程序
- }
- }
- break;
- case 2: { //---‘薄物’洗滌--- (按鍵處設(shè)定時(shí)間了)
- tmp_mod = mod_flag; //當(dāng)前工作模式存入臨時(shí)變量中
- if(wt_m==0 && (fen+1)>=10 && TR0==1)
- action_serve(3); //進(jìn)水(1min)
- if(wt_m==1 && fen!=0) //從8min開(kāi)始
- action_serve(1); //進(jìn)行薄物洗滌
- if(fen==0 && miao!=0) //提前1分鐘排水
- action_serve(4); //排水
- if((fen==0 && wt_l==1)) //如果時(shí)間到 或 水位低
- {
- beep_on(1);
- miao=0;
- adc_rewash=1; //漂洗標(biāo)志置1
- TR0 = 0;
- mod_flag = 3; //就進(jìn)入漂洗程序
- }
- }
- break;
- case 3: { //---漂洗---
- tmp_mod = mod_flag; //當(dāng)前工作模式存入臨時(shí)變量中
- adc_serve(); //AD判斷水的污濁程度
- if((rewash_times <= 4) && (adc_rewash==1))
- {
- if(TR0==0) //若定時(shí)器還沒(méi)開(kāi)啟,就進(jìn)入 時(shí)間設(shè)定 { //4級(jí)洗衣水污濁程度判斷后設(shè)定rewash時(shí)間
- if( adc_samp < 100 ) //若AD檢測(cè)結(jié)果 小于100:很污濁
- { fen = 10;
- miao = 0;
- dirty_level = 3; //3級(jí)污濁
- }
- else if( (adc_samp >= 100) && (adc_samp < 150))
- //AD結(jié)果 在 100 到 150 之間:比較污濁
- { fen = 7;
- miao = 0;
- dirty_level = 2; //2級(jí)污濁
- }
- else if( (adc_samp >=150) && (adc_samp < 200) )
- //AD結(jié)果 在 150 到 200 之間:輕微污濁
- { fen = 5;
- miao = 0;
- dirty_level = 1; //1級(jí)污濁
- } //時(shí)間設(shè)定完成
- rewash_times++; //漂洗次數(shù)加1
- TR0 = 1;
- }
- else if(TR0==1 && fen!=0 && wt_l==1)
- {
- action_serve(3); //開(kāi)進(jìn)水閥
- } //定時(shí)器是開(kāi)著的,就執(zhí)行下面
- else if(fen!=0 && miao!=0 && wt_l!=1) action_serve(1); //開(kāi)電機(jī),漂洗
- else if( fen==0 && miao!=0 && wt_l!=1 ) {
- action_serve(4); //排水
- adc_serve(); //同時(shí)進(jìn)行濁度檢測(cè)
- }
- }
- else if( fen==0 && miao!=0 && wt_l==1)
- //在結(jié)束漂洗前1min內(nèi) and 低水位到
- {
- miao = 0;
- wt_l = 0;
- }
-
- else if((rewash_times > 4) || (adc_rewash==0))
- //若漂洗超過(guò)4次 或 由AD結(jié)果說(shuō)明不需要再漂洗了
- {
- adc_rewash = 0; //停止漂洗
- mod_flag = 4; //進(jìn)入甩干程序
- TR0 = 0; //進(jìn)入甩干模式前先停定時(shí)器
- }
- }
- break;
- case 4: { //---脫水---
- tmp_mod = mod_flag; //當(dāng)前工作模式存入臨時(shí)變量中
- if(adc_rewash==0 && TR0 == 0) //如果滿足甩干初始條件
- { fen=2; //設(shè)定甩干時(shí)間為2分鐘
- miao=0;
- TR0 = 1; //開(kāi)始計(jì)時(shí)
- }
- if(TR0==1)
- action_serve(2); //伺服動(dòng)作2:甩干
- if(wt_l==1) //若低水位到
- {
- if(fen==1 && miao>10)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
- </font>
復(fù)制代碼
所有資料51hei提供下載:
單片機(jī)洗衣機(jī)節(jié)水控制系統(tǒng)的設(shè)計(jì).doc
(1.81 MB, 下載次數(shù): 41)
2018-5-10 06:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |