欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(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 鎖存器的真值表

輸出使能(/OE)

鎖存使能(LE)

輸入端(D)

輸出端(Q)

L

H

H

H

L

H

L

L

L

L

X

Q0

H

X

X

Z


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)系

序號(hào)

污濁程度A(十進(jìn)制A/D值)

洗滌時(shí)間(min)

1

A ≤ 55

6

2

55 < A ≤ 94

8

3

94 < A ≤ 126

10

4

126 < A ≤ 152

12

5

152 < A ≤ 173

14

6

173 < A ≤ 191

16

7

191 < A ≤ 208

18

8

A > 208

20

  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ī)源程序如下:

  1. <font color="rgb(0, 0, 0)">/*=======================================
  2.                             基于STC89C52單片機(jī)的
  3.                                           節(jié)能洗衣機(jī)控制程序設(shè)計(jì)
  4. =========================================*/
  5. #include<reg52.h>
  6. #include<intrins.h>
  7. #define uchar unsigned char
  8. #define uint unsigned int

  9. sbit dula = P2^6;                                          //段鎖存。P0是數(shù)碼管數(shù)據(jù)端
  10. sbit wela = P2^7;
  11. sbit beep = P2^3;
  12. sbit diola= P2^5;                                          //LED指示燈鎖存

  13. sbit mod_hou =              P1^0;              //厚物指示
  14. sbit mod_bao =              P1^1;              //薄物指示
  15. sbit mod_rewash = P1^2;              //漂洗指示
  16. sbit mod_dry =              P1^3;              //甩干指示
  17. sbit mod_pause =P1^4;              //暫停指示
  18. sbit mod_stop = P1^5;              //停止指示
  19. sbit mod_error= P1^6;              //錯(cuò)誤指示

  20. sbit mola = P2^4;                            //伺服控制的鎖存器使能
  21. sbit molf = P1^0;
  22. sbit mort = P1^1;
  23. sbit mosp = P1^2;
  24. sbit wtin = P1^3;
  25. sbit wtot = P1^4;
  26. sbit adwr = P3^6;                            //ADC的控制針
  27. sbit adrd = P3^7;

  28. uint mh, ml, sh, sl;
  29. uchar we, du, count, fen, miao;                            //LED位鎖,段鎖,中斷計(jì)數(shù),分,秒
  30. uchar key_num, mod_flag, tmp_mod;              //按鍵返回值,模式標(biāo)志,臨時(shí)模式標(biāo)志
  31. uchar adc_rewash, adc_display_mod;              //AD判斷是否漂洗,AD結(jié)果是否顯示;
  32. uchar adc_samp;                                                                                    //ADC轉(zhuǎn)換結(jié)果變量
  33. uchar wt_h, wt_m, wt_l;                                                        //水位指示:高,中,低,水位標(biāo)志
  34. uchar action_mod, wt_io_action;                            //工作標(biāo)志緩存,進(jìn)排水動(dòng)作標(biāo)志
  35. uchar rewash_times;                                                                      //記錄漂洗次數(shù)
  36. bit flag_1s;                                          //1s標(biāo)志位
  37. uint flag_1s_counter;              //1s計(jì)數(shù)

  38. uchar code table_of_duanma[] = {                            //共陰碼段
  39.                             0x3f, 0x06, 0x5b, 0x4f,      // 0, 1, 2, 3,
  40.                             0x66, 0x6d, 0x7d, 0x07,     // 4, 5, 6, 7,
  41.                             0x7f, 0x6f, 0x40, 0x00 };    // 8, 9, -,              ,                           

  42. //=== 延時(shí)子程序 ====================================
  43. void delay(uchar z)
  44. {
  45.               uchar x, y;
  46.               for(x=z;x>0;x--)
  47.                             for(y=110;y>0;y--);
  48. }
  49. //=== 蜂鳴子程序 ====================================
  50. void beep_on(uchar beep_mod)              //蜂鳴器發(fā)聲模式:
  51. {              //1-短促(按鍵響應(yīng) 和 模式切換) 2-稍長(zhǎng)(結(jié)束提示) 3-很長(zhǎng)(報(bào)警)
  52.               uchar bp_ct;                                                                      //計(jì)算發(fā)聲次數(shù)的局部變量
  53.               switch(beep_mod)
  54.               {
  55.                             case 1: {                            //模式 1 -短促(用于按鍵)
  56.                                           for( bp_ct=3;bp_ct>0;bp_ct-- )
  57.                                           {            
  58.                                                         beep = 0;
  59.                                                         delay(100);
  60.                                                         beep = ~beep;
  61.                                           }
  62.                                           beep = 1;
  63.                                                         }
  64.                                           break;
  65.                             case 2: {                            //模式 2 -稍長(zhǎng)(結(jié)束提示)
  66.                                           for( bp_ct=5;bp_ct>0;bp_ct-- )
  67.                                           {              beep = 0;
  68.                                                         delay(500);
  69.                                                         beep = ~beep;
  70.                                           }
  71.                                           beep = 1;
  72.                                                         }
  73.                                           break;
  74.                             case 3: {                            //模式 3 -很長(zhǎng)(報(bào)警)
  75.                                           for( bp_ct=7;bp_ct>0;bp_ct-- )
  76.                                           {            
  77.                                                         beep = 0;
  78.                                                         delay(500);
  79.                                                         beep = ~beep;
  80.                                           }
  81.                                           beep = 1;
  82.                                                         }
  83.                                           break;
  84.                             default:{               //其他情況視為錯(cuò)誤,長(zhǎng)2聲
  85.                                           for( bp_ct=11;bp_ct>0;bp_ct-- )
  86.                                           {            
  87.                                                         beep = 0;
  88.                                                         delay(500);
  89.                                           }
  90.                                           beep = 1;
  91.                                                         }
  92.                                           break;
  93.               }
  94. }

  95. //=== 系統(tǒng)初始化 ==============================
  96. void init()
  97. {
  98.               fen = 15;
  99.               miao = 0;
  100.               count = 0;
  101.               wt_h = 0;
  102.               wt_m = 0;
  103.               wt_l = 1;

  104.               P0 = 0x00;                            //端口置位,防止干擾
  105.               P1 = 0xff;
  106.               P2 = 0x00;
  107.               wela = 0;
  108.               dula = 0;
  109.               diola= 0;
  110.               mola = 0;                            //關(guān)閉電機(jī)控制,等待指令操作
  111.               beep_on(2);                            //開(kāi)機(jī)聲音響應(yīng)
  112.               beep = 1;                            //關(guān)閉蜂鳴器
  113.               rewash_times = 0;              //漂洗次數(shù)初值:0次

  114.               key_num=16;              //按鍵返回值:無(wú)按鍵
  115.               mod_flag=1;                            //模式標(biāo)志
  116.               tmp_mod=0;                            //臨時(shí)模式寄存標(biāo)志

  117.               TMOD = 0x01;
  118.               TH0 = (65536-50000)/256;
  119.               TL0 = (65536-50000)%256;
  120.               IE = 0x82;                            //中斷使能位置1: EA = 1,ET0 = 1。或直接設(shè)IE也得
  121. }

  122. //=== 倒計(jì)時(shí) =========================
  123. void count_time()
  124. {
  125.               if(count==20)
  126.               {
  127.                             count=0;                            //倒計(jì)時(shí):
  128.                             if(fen>0)                            //分鐘大于0時(shí)
  129.                             {
  130.                                           if(miao>0 && miao<60)                            // 0 < miao < 60
  131.                                           {
  132.                                                         miao--;
  133.                                           }                                                        //秒減1
  134.                                           else                                          //if(miao<0 || miao>59)  //若秒不在0~59內(nèi)
  135.                                           {
  136.                                                         miao=59;              //說(shuō)明進(jìn)位了,就拉回值域
  137.                                                         fen--;                            //然后分鐘減1
  138.                                           }                                         
  139.                             }
  140.                             else if(fen==0)                            //分鐘為0時(shí),即在最后一分鐘內(nèi)時(shí)
  141.                             {
  142.                                           if(miao>0 && miao<=59)              //秒還沒(méi)進(jìn)位的話
  143.                                                         miao--;                                                        //秒就減1
  144.                                           else if(miao==0)                                                        //若秒走到0了,則計(jì)時(shí)時(shí)間到
  145.                                           {              TR0 = 0;                                                        //停定時(shí)器
  146.                                           //時(shí)間到00:00,當(dāng)前模式工作完成,進(jìn)入下一模式繼續(xù):
  147.                                                         beep_on(1);                                          //蜂鳴模式1:模式切換
  148.                                           }
  149.                             }
  150.               }
  151. }

  152. //=== 顯示時(shí)間 ===========================
  153. void display_time()
  154. {
  155.               if(adc_display_mod != 1)              //若ADC結(jié)果不顯示(≠1時(shí)),就進(jìn)入時(shí)間顯示
  156.               {                                                                                    //否則跳出。以此來(lái)消去AD顯示時(shí)的時(shí)間部分干擾
  157.                             for(we=0xdf;we!=0xfe;we=_cror_(we,1))
  158.                             {                                                                       //we==1101 1111 開(kāi)始右移            
  159.                                           wela = 0;
  160.                                           P0 = we;
  161.                                           wela = 1;                              //位選
  162.                                           wela = 0;
  163.                                           delay(1);//這個(gè)delay只能是1,大于3嚴(yán)重閃爍,大于5時(shí)間不走...
  164.                                           dula = 0;                            //段選
  165.                                                         switch(we)
  166.                                                         {
  167.                                                                       case 0xdf: P0=table_of_duanma[miao%10];
  168.                                                                                     break;
  169.                                                                       case 0xef: P0=table_of_duanma[miao/10];
  170.                                                                                     break;                                                      
  171.                                                                       case 0xf7: P0=0x40;                 // -              間位符
  172.                                                                                     break;
  173.                                                                       case 0xfb: P0=table_of_duanma[fen%10];
  174.                                                                                     break;
  175.                                                                       case 0xfd: P0=table_of_duanma[fen/10];
  176.                                                                                     break;
  177.                                                                       case 0xfe: P0=0x00;                //關(guān)閉最高位
  178.                                                                                     we=0xdf;                                         
  179.                                                                                     break;
  180.                                                         }                                                      
  181.                                           dula = 1;
  182.                                           delay(1);
  183.                                           P0 = 0x00;              //關(guān)數(shù)碼管
  184.                                           dula = 0;
  185.                             }
  186.               }
  187. }

  188. //=== 工作模式指示燈 =========================
  189. void display_mod()                            //顯示:僅用于點(diǎn)亮LED工作模式指示燈
  190. {
  191.               mola = 0;                                          //關(guān)閉電機(jī)控制鎖存器使能
  192.               P1 = 0xff;                                          //改變 mod_flag
  193.               diola = 1;
  194.               delay(1);
  195.               switch(mod_flag)
  196.               {
  197.                             case 1:              {              mod_hou = 0;               }              //標(biāo)志 1:厚物洗滌
  198.                                           break;
  199.                             case 2: {              mod_bao = 0;               }                            //標(biāo)志 2:薄物洗滌
  200.                                           break;
  201.                             case 3: {              mod_rewash = 0; }                            //標(biāo)志 3:漂洗
  202.                                           break;
  203.                             case 4: {              mod_dry = 0;              }                            //標(biāo)志 4:甩干
  204.                                           break;
  205.                             case 5:              {              mod_pause = 0;              }              //標(biāo)志 5:暫停
  206.                                           break;
  207.                             case 6: {              mod_stop = 0;              }                            //標(biāo)志 6:停止
  208.                                           break;
  209.                             case 7: {              mod_error = 0;              }                            //標(biāo)志 7:報(bào)警
  210.                                           break;
  211.               }
  212.               diola = 0;
  213. }

  214. //=== ADC Display =========================
  215. void adc_display(uchar bai_c,uchar sh_c,uchar g_c)              /
  216. {
  217.    P0=table_of_duanma[bai_c];                            //顯示百位
  218.    dula=1;
  219.    dula=0;

  220.    P0=0xfe;                            //確定顯示用數(shù)碼管的位地址
  221.    wela=1;
  222.    wela=0;
  223.    delay(10);              //延時(shí)放在這是為了消除鬼影 

  224.    dula=0;
  225.    P0=table_of_duanma[sh_c];                            //顯示十位
  226.    dula=1;
  227.    dula=0;

  228.    wela=0;
  229.    P0=0xfd;
  230.    wela=1;
  231.    wela=0;
  232.    delay(10);

  233.    P0=table_of_duanma[g_c];                            //顯示個(gè)位
  234.    dula=1;
  235.    dula=0;

  236.    P0=0xfb;
  237.    wela=1;
  238.    wela=0;
  239.    delay(10);
  240. }
  241. //=== AD轉(zhuǎn)換 =============================
  242. void adc_serve()            
  243. {
  244.               uchar a,A1,A2,A2t,A3;
  245.               dula=0;                                          //關(guān)閉7段數(shù)碼管的顯示
  246.               wela=1;                                          //打開(kāi)有ADC片選的鎖存器
  247.     P0=0;                                          //P0^7針為0時(shí),選通ADCS
  248.     adwr=0;                            //AD寫入,低電平有效(主要是為了啟動(dòng)AD轉(zhuǎn)換)
  249.               display_mod();              //顯示一下工作模式,(為了給AD轉(zhuǎn)換延時(shí))
  250.     adwr=1;                            //關(guān)ADC寫入使能
  251.     P0=0xff;                            //關(guān)閉ADCS
  252.               if(adc_display_mod==1)                            //ADC顯示標(biāo)志為1(0就不顯示結(jié)果)。
  253.               {    wela=0;
  254.                   for(a=10;a>0;a--)
  255.                   {
  256.                               delay(10);                                                                                                                                                                                          
  257.                    adc_display(A1,A2,A3);              //送去顯示各個(gè)數(shù)位。
  258.                   }
  259.               }
  260.               wela = 1;                                          //重新打開(kāi)有AD片選信號(hào)鎖存器的鎖存端            
  261.      P1 = 0xff;                                          //讀取P1口之前先給其寫全1
  262.      P0 = 0;                                          //選通ADCS
  263.                    adrd = 0;                            //AD讀使能                  
  264.               adc_samp = P1;                            //AD數(shù)據(jù)讀取賦給P1口
  265.                    adrd = 1;                            //關(guān)閉AD讀使能
  266.      P0 = 0xff;                                          //關(guān)閉ADCS片選
  267.      adwr =0 ;                                          //打開(kāi)AD寫
  268.               if(adc_display_mod==1)                            // 若允許AD顯示
  269.               {              A1=adc_samp/100;                            //分出百,十,和個(gè)位
  270.                             A2t=adc_samp%100;
  271.                             A2=A2t/10;
  272.                             A3=A2t%10;              //AD原理:透過(guò)的光多,電流大,說(shuō)明水清,反之水濁
  273.               }                                                        //仿真輸出是0~255數(shù)字。0(0v)為污濁,清凈為255(5v).
  274.               if(adc_samp < 200)
  275.                             adc_rewash = 1;
  276.               else
  277.                             {
  278.                                           adc_rewash = 0;
  279.                             }
  280. }
  281. //=== 鍵盤掃描 =============================
  282. void key_serve()                                          //按鍵服務(wù)
  283. {                                                                                    //讀取鍵值后進(jìn)行相應(yīng)的操作
  284.               uchar tmp_mod_memory=0, tmp_fen=0, tmp_miao=0;
  285.               diola=0;
  286.               P1 = 0xff;                                          //關(guān)閉LED燈,防按鍵干擾
  287.               switch(key_num)
  288.               {
  289.                             case 0: {                                          //厚物洗滌
  290.                                                         if(TR0==0 && (fen==0 || fen==10))            
  291.                                                         {
  292.                                                                       fen = 15;
  293.                                                                       miao = 0;
  294.                                                                       mod_flag = 1;              //工作模式1:厚物
  295.                                                                       tmp_mod = 1;
  296.                                                                       rewash_times = 0;
  297.                                                                       adc_rewash = 1;
  298.                                                                       beep_on(1);
  299.                                                                       }
  300.                                                         }
  301.                                           break;
  302.                             case 4: {                            //薄物洗滌
  303.                                                         if(TR0==0 && (fen==0 || fen==15))            
  304.                                                                       {
  305.                                                                       fen = 10;
  306.                                                                       miao = 0;
  307.                                                                       mod_flag = 2;                                                                      //工作模式2:薄物
  308.                                                                       rewash_times = 0;
  309.                                                                       adc_rewash = 1;
  310.                                                                       tmp_mod = 2;
  311.                                                                       beep_on(1);
  312.                                                                       }
  313.                                                         }
  314.                                           break;
  315.                             case 1: {                            // 開(kāi)始              鍵
  316.                                                         if(TR0==0)                                                                                    //定時(shí)器不工作時(shí),才響應(yīng)
  317.                                                                       {
  318.                                                                       mod_flag = tmp_mod;                            //從臨時(shí)變量讀取原工作模式
  319.                                                                       TR0 = 1;
  320.                                                                       beep_on(1);
  321.                                                                       }
  322.                                                         }
  323.                                           break;
  324.                             case 5: {                            // 暫停 鍵
  325.                                                         if(mod_flag != 5 && TR0==1)
  326.                                                                       {
  327.                                                                       tmp_mod = mod_flag;              //當(dāng)前工作模式存入臨時(shí)變量中
  328.                                                                       TR0 = 0;
  329.                                                                       mod_flag = 5;                            //工作模式5:暫停
  330.                                                                       beep_on(1);            
  331.                                                                       }
  332.                                                         }                                                      
  333.                                           break;
  334.                             case 9:              {                            //停止 鍵:
  335.                                                         if(TR0 == 1)                                                        //定時(shí)器在工作時(shí),才響應(yīng)
  336.                                                                       {
  337.                                                                       tmp_mod = mod_flag;                            //當(dāng)前工作模式存入臨時(shí)變量中
  338.                                                                       P1 = 0xff;
  339.                                                                       TR0 = 0;                                                        //關(guān)定時(shí)器
  340.                                                                       fen = 00;
  341.                                                                       miao= 00;
  342.                                                                       rewash_times = 0;                            //重置漂洗次數(shù)
  343.                                                                       adc_rewash = 1;                                          //重置漂洗允許標(biāo)志位                                         
  344.                                                                       mod_flag = 6;                                          //工作模式6:停止
  345.                                                                       beep_on(2);                                                        //蜂鳴器模式2:停止
  346.                                                                       }
  347.                                                         }                                                                                                  //然后停止,等待
  348.                                           break;
  349.                             case 2: {                 // 報(bào)警
  350.                                                         if( (mod_flag != 5) && (mod_flag != 6) && TR0==1 )            
  351.                                                                       {
  352.                                                                       tmp_mod = mod_flag;              //當(dāng)前工作模式存入臨時(shí)變量中
  353.                                                                       P1 = 0xff;                                          //LED防干擾,先關(guān)閉            
  354.                                                                       TR0 = 0;
  355.                                                                       mod_flag = 7;                            //工作模式7:報(bào)警
  356.                                                                       beep_on(2);                                          //蜂鳴器模式2:停止
  357.                                                                       }
  358.                                                         }
  359.                                           break;
  360.                             case 6: {                 // 機(jī)蓋打開(kāi)(6鍵是 機(jī)蓋)
  361.                                                         if( (mod_flag != 5) && (mod_flag != 6) && TR0==1 )            
  362.                                                                       {
  363.                                                                       tmp_mod = mod_flag;              //當(dāng)前工作模式存入臨時(shí)變量中
  364.                                                                       P1 = 0xff;                                                        //LED防干擾,先關(guān)閉
  365.                                                                       TR0 = 0;
  366.                                                                       mod_flag = 5;                                          //工作模式7:報(bào)警
  367.                                                                       beep_on(2);                                                        //蜂鳴器模式2:停止
  368.                                                                       }
  369.                                                         }
  370.                                           break;
  371.               //演示專用:水位模擬鍵的動(dòng)作
  372.                             case 12: {
  373.                                                         P1 = 0x0ff;
  374.                                                         wt_h = 1;              //高水位
  375.                                                         wt_m = 0;
  376.                                                         wt_l = 0;
  377.                                                         }
  378.                                           break;
  379.                             case 13: {
  380.                                                         P1 = 0x0ff;
  381.                                                         wt_h = 0;
  382.                                                         wt_m = 1;              //中水位
  383.                                                         wt_l = 0;
  384.                                                         }
  385.                                           break;
  386.                             case 14: {
  387.                                                         P1 = 0x0ff;
  388.                                                         wt_h = 0;
  389.                                                         wt_m = 0;
  390.                                                         wt_l = 1;              //低水位
  391.                                                         }
  392.                                           break;
  393.               //演示專用:分鐘速減鍵
  394.                             case 3: {
  395.                                                         P1 = 0xff;
  396.                                                         mola=0;
  397.                                                         diola=0;                              //以上防干擾用
  398.                                                         if(fen != 1)
  399.                                                                       fen=1;
  400.                                                         }
  401.                                           break;
  402.               //演示專用:秒鐘速減鍵
  403.                             case 7: {
  404.                                                         P1 = 0xff;
  405.                                                         mola=0;
  406.                                                         diola=0;                              //以上防干擾用
  407.                                                         if(miao!=1)
  408.                                                                       miao=1;
  409.                                                         }
  410.                                           break;
  411.               //演示專用:從 時(shí)間顯示 切換到 AD轉(zhuǎn)換結(jié)果顯示
  412.                             case 11: {
  413.                                                         if(adc_display_mod==0)                            //顯示模式不在AD顯示時(shí),響應(yīng)
  414.                                                         {            
  415.                                                                       tmp_fen = fen;                                          //先保存當(dāng)前計(jì)時(shí)時(shí)間
  416.                                                                       tmp_miao = miao;
  417.                                                                       adc_display_mod = 1;              //模式1為AD結(jié)果顯示;
  418.                                                                       adc_serve();                                                        //(0為不顯示,后臺(tái)運(yùn)行)
  419.                                                                       EA = 0;                                                                      //關(guān)中斷,優(yōu)化顯示效果(消鬼影)
  420.                                                                       TR0 = 0;            
  421.                                                         }
  422.                                           }
  423.                                           break;
  424.               //演示專用:從 AD轉(zhuǎn)換結(jié)果 切換到 時(shí)間顯示
  425.                             case 15: {              //切換到Time時(shí)間顯示
  426.                                                         if(adc_display_mod==1)
  427.                                                         {            
  428.                                                                       fen = tmp_fen;                                          //讀取暫存的時(shí)間數(shù)據(jù)
  429.                                                                       miao = tmp_miao;
  430.                                                                       adc_display_mod = 0;              //不顯示ADC結(jié)果
  431.                                                                       EA = 1;                                                                      //開(kāi)中斷,回到時(shí)間顯示            
  432.                                                                       TR0 = 1;            
  433.                                                         }
  434.                                           }
  435.                                           break;
  436.               }
  437. }
  438. //=== 鍵盤掃描 ===============================
  439. void key_scan()                            //鍵盤掃描:將獲取新的key_num值
  440. {
  441.               uchar temp, tempp=30;//臨時(shí)鍵值            
  442.               uchar key_en=1;              //鍵盤監(jiān)視:有按鍵動(dòng)作時(shí)才執(zhí)行Key_serve,否則僅僅作掃描。不然延時(shí)太嚴(yán)重,LED會(huì)閃爍

  443.               P3 = 0x0f;                            //低4位置1,放入4行。
  444.               temp = P3^0x0f;              //異或,把相異的一行變成1,其它全為0
  445.                                           switch(temp)              //判斷是哪行有鍵按下了(0-3行)
  446.                                           {                                                        //就給相應(yīng)鍵值的行提前量
  447.                                                         case 1: key_num = 0; break;
  448.                                                         case 2: key_num = 1; break;
  449.                                                         case 4: key_num = 2; break;
  450.                                                         case 8: key_num = 3; break;
  451.                                                         default: {              //無(wú)按鍵
  452.                                                                                     key_num= 16;
  453.                                                                                     key_en=0;
  454.                                                                                     }              break;
  455.                                           }
  456.                            
  457.                                           P3 = 0xf0;                            //高4位置1,放入4列。
  458.                                           temp = (P3>>4)^0x0f;              //將高位移到低位,用異或找出按下的列
  459.                                           switch(temp)              //判斷列按下,在先前的鍵值中加入列數(shù)得鍵值
  460.                                           {
  461.                                                         case 1: key_num += 0; break;
  462.                                                         case 2: key_num += 4; break;
  463.                                                         case 4: key_num += 8; break;
  464.                                                         case 8: key_num += 12;
  465.                                           }
  466.                                           if(key_en==1 && temp!=tempp)              //如果有鍵盤操作,才執(zhí)行按鍵服務(wù)
  467.                                           {
  468.                                                         tempp = key_num;
  469.                                                         key_serve();
  470.                                           }
  471.                                           temp = key_num;
  472.                                           display_mod();              //指示工作模式的LED燈變化
  473. }

  474. //=== 系統(tǒng)動(dòng)作控制 =====================
  475. void action_serve(uchar action_mod)                            //主電機(jī)動(dòng)作
  476. {
  477.               P0 = 0xff;
  478.               diola = 0;
  479.               switch(action_mod)
  480.               {
  481.                             case 1: {              //模式1 - 1分鐘電機(jī)間歇正反轉(zhuǎn) ==》洗滌

  482.                                           if( ((miao<55)&&(miao>45)) || ((miao<25)&&(miao>15)) )
  483.                                           {            
  484.                                                         mola = 1;
  485.                                                         P1 = 0xfe;              //電機(jī)正轉(zhuǎn)
  486.                                                         mola = 0;
  487.                                           }
  488.                                           else if( ((miao<40)&&(miao>30))||((miao<10)&&(miao>0)) )
  489.                                           {
  490.                                                         mola = 1;
  491.                                                         P1 = 0xfd;              //電機(jī)反轉(zhuǎn)
  492.                                                         mola = 0;
  493.                                           }
  494.                                           else
  495.                                           {
  496.                                                         mola = 1;            
  497.                                                         P1 = 0xff;              //電機(jī)停車
  498.                                                         mola = 0;            
  499.                                           }
  500.                             }
  501.                                           break;
  502.                             case 2: {              //模式2 -電機(jī)加速 ==》脫水
  503.                                           mola = 1;
  504.                                           P1 = 0xea;                            //speed
  505.                                           mola = 0;
  506.                                           if(fen==0 && miao==0)                            //計(jì)時(shí)時(shí)間到
  507.                                           action_mod = 7;
  508.                             }
  509.                                           break;
  510.                             case 3: {              //模式3 -進(jìn)水
  511.                                           mola = 1;
  512.                                           P1 = 0xf7;              //開(kāi)進(jìn)水閥
  513.                                           mola = 0;
  514.                             }
  515.                                           break;
  516.                             case 4: {              //模式4:-排水
  517.                                           mola = 1;
  518.                                           P1 = 0xef;              //開(kāi)排水閥
  519.                                           mola = 0;
  520.                             }
  521.                                           break;
  522.                             case 7: {              //模式7:空(停機(jī),等待)
  523.                                           mola = 1;
  524.                                           P1 = 0xff;              //關(guān)停全部伺服
  525.                                           mola = 0;
  526.                             }
  527.                                           break;
  528.                             default:{              //其他不可預(yù)知的狀態(tài)
  529.                                           mola = 1;
  530.                                           P1 = 0xff;              //關(guān)停全部伺服
  531.                                           mola = 0;
  532.                                                         }
  533.                                           break;
  534.               }
  535. }
  536. //=== 工作模式子程序 ====================================
  537. void working_mod()              //工作模式:讀取模式標(biāo)志 mod_flag,判斷系統(tǒng)任務(wù)
  538. {
  539.               uchar t;                                          //報(bào)警次數(shù)設(shè)定
  540.               uchar dirty_level;              //水的污濁級(jí)別
  541.               switch(mod_flag)
  542.               {
  543.                             case 1: {                             //---‘厚物’洗滌---              (按鍵處設(shè)定時(shí)間了)
  544.                                                         tmp_mod = mod_flag;              //當(dāng)前工作模式存入臨時(shí)變量中
  545.                                                         if(wt_h==0 && (fen+2)>=15 && TR0==1)
  546.                                                                       action_serve(3);                                                        //進(jìn)水
  547.                                                         if(wt_h==1 && fen!=0)                                          //水位控制
  548.                                                                       action_serve(1);                                                        //進(jìn)行厚物洗滌                                         
  549.                                                         if(fen==0 && miao!=0)                                                        //結(jié)束前1分鐘
  550.                                                                       {
  551.                                                                                     action_serve(4);                                                        //排水
  552.                                                                                     adc_serve();              //在排水時(shí)檢測(cè)濁度
  553.                                                                                     delay(1);              //ADC needs time
  554.                                                                       }
  555.                                                         if((fen==0 && wt_l==1))                            //如果時(shí)間到最后1min 或 水位低
  556.                                                                       {
  557.                                                                                     beep_on(1);
  558.                                                                                     miao=0;
  559.                                                                                     adc_rewash=1;                            //漂洗標(biāo)志置1
  560.                                                                                     TR0 = 0;
  561.                                                                                     mod_flag = 3;                            //就進(jìn)入漂洗程序
  562.                                                                       }
  563.                                                         }
  564.                                           break;
  565.                             case 2: {                            //---‘薄物’洗滌---              (按鍵處設(shè)定時(shí)間了)
  566.                                                         tmp_mod = mod_flag;              //當(dāng)前工作模式存入臨時(shí)變量中
  567.                                                         if(wt_m==0 && (fen+1)>=10 && TR0==1)
  568.                                                                       action_serve(3);                                                        //進(jìn)水(1min)
  569.                                                         if(wt_m==1 && fen!=0)                                          //從8min開(kāi)始
  570.                                                                       action_serve(1);                                                        //進(jìn)行薄物洗滌
  571.                                                         if(fen==0 && miao!=0)                                          //提前1分鐘排水
  572.                                                                       action_serve(4);                                                        //排水
  573.                                                         if((fen==0 && wt_l==1))                                          //如果時(shí)間到 或 水位低
  574.                                                                       {
  575.                                                                                     beep_on(1);
  576.                                                                                     miao=0;
  577.                                                                                     adc_rewash=1;                                          //漂洗標(biāo)志置1
  578.                                                                                     TR0 = 0;
  579.                                                                                     mod_flag = 3;                                          //就進(jìn)入漂洗程序
  580.                                                                       }
  581.                                                         }
  582.                                           break;
  583.                             case 3: {                            //---漂洗---
  584.                                                         tmp_mod = mod_flag;                            //當(dāng)前工作模式存入臨時(shí)變量中
  585.                                                         adc_serve();                                                                      //AD判斷水的污濁程度
  586.                                                         if((rewash_times <= 4) && (adc_rewash==1))            
  587.                                                         {
  588.                                                                       if(TR0==0)                            //若定時(shí)器還沒(méi)開(kāi)啟,就進(jìn)入 時(shí)間設(shè)定                                                                                      {                            //4級(jí)洗衣水污濁程度判斷后設(shè)定rewash時(shí)間
  589.                                                                                     if( adc_samp < 100 )              //若AD檢測(cè)結(jié)果 小于100:很污濁
  590.                                                                                     {              fen = 10;
  591.                                                                                                   miao = 0;
  592.                                                                                                   dirty_level = 3;              //3級(jí)污濁
  593.                                                                                     }
  594.                                                                                     else if( (adc_samp >= 100) && (adc_samp < 150))
  595.               //AD結(jié)果 在 100 到 150 之間:比較污濁
  596.                                                                                     {              fen = 7;
  597.                                                                                                   miao = 0;
  598.                                                                                                   dirty_level = 2;              //2級(jí)污濁
  599.                                                                                     }
  600.                                                                                     else if( (adc_samp >=150) && (adc_samp < 200) )
  601.               //AD結(jié)果 在 150 到 200 之間:輕微污濁
  602.                                                                                     {              fen = 5;
  603.                                                                                                   miao = 0;
  604.                                                                                                   dirty_level = 1;              //1級(jí)污濁
  605.                                                                                     }                                                                                    //時(shí)間設(shè)定完成
  606.                                                                                     rewash_times++;                                          //漂洗次數(shù)加1
  607.                                                                                     TR0 = 1;
  608.                                                                       }
  609.                                                                       else if(TR0==1 && fen!=0 && wt_l==1)
  610.                                                                       {
  611.                                                                                     action_serve(3);                            //開(kāi)進(jìn)水閥
  612.                                                                       }                                                                                                  //定時(shí)器是開(kāi)著的,就執(zhí)行下面
  613.                                                                       else if(fen!=0 && miao!=0 && wt_l!=1)                                                                                                                                                          action_serve(1);                            //開(kāi)電機(jī),漂洗
  614.                                                                       else if( fen==0 && miao!=0 && wt_l!=1 )                                                                                                                                            {            
  615.                                                                                                   action_serve(4);              //排水
  616.                                                                                                   adc_serve();                            //同時(shí)進(jìn)行濁度檢測(cè)
  617.                                                                       }
  618.                                                         }
  619.                                                         else if( fen==0 && miao!=0 && wt_l==1)            
  620.               //在結(jié)束漂洗前1min內(nèi) and 低水位到
  621.                                                                       {
  622.                                                                                     miao = 0;
  623.                                                                                     wt_l = 0;
  624.                                                                       }

  625.                                                         else if((rewash_times > 4) || (adc_rewash==0))            
  626. //若漂洗超過(guò)4次 或 由AD結(jié)果說(shuō)明不需要再漂洗了
  627.                                                                       {
  628.                                                                                     adc_rewash = 0;                                          //停止漂洗
  629.                                                                                     mod_flag = 4;                                          //進(jìn)入甩干程序
  630.                                                                                     TR0 = 0;                                                        //進(jìn)入甩干模式前先停定時(shí)器
  631.                                                                       }
  632.                                           }
  633.                                           break;
  634.                             case 4: {                            //---脫水---
  635.                                                         tmp_mod = mod_flag;                                                        //當(dāng)前工作模式存入臨時(shí)變量中
  636.                                                         if(adc_rewash==0 && TR0 == 0)              //如果滿足甩干初始條件
  637.                                                                       {              fen=2;                                                                      //設(shè)定甩干時(shí)間為2分鐘
  638.                                                                                     miao=0;
  639.                                                                                     TR0 = 1;                                                        //開(kāi)始計(jì)時(shí)
  640.                                                                       }
  641.                                                         if(TR0==1)
  642.                                                                       action_serve(2);                                          //伺服動(dòng)作2:甩干
  643.                                                         if(wt_l==1)              //若低水位到
  644.                                                                       {            
  645.                                                                       if(fen==1 && miao>10)
  646. ……………………

  647. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
  648. </font>
復(fù)制代碼

所有資料51hei提供下載:

單片機(jī)洗衣機(jī)節(jié)水控制系統(tǒng)的設(shè)計(jì).doc (1.81 MB, 下載次數(shù): 41)










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