摘要 在本文中我們?cè)敿?xì)介紹如何使用單片機(jī)開(kāi)發(fā)板模擬全自動(dòng)洗衣機(jī)的工作流程,首先簡(jiǎn)單的了解一下全自動(dòng)洗衣機(jī)的發(fā)展及工作原理,然后開(kāi)始洗衣機(jī)的模擬設(shè)計(jì)。從單片機(jī)的工作原理入手,先分析全自動(dòng)洗衣機(jī)的功能需求,然后一步步將其實(shí)現(xiàn),例如多種洗衣模式、水位模式、報(bào)警功能等等。其中我們還詳細(xì)了洗衣機(jī)必有的水位傳感器以及電動(dòng)機(jī)的驅(qū)動(dòng)芯片它們的工作原理,在文章的最后總結(jié)了此次設(shè)計(jì)所遇到的一些問(wèn)題。
目錄
1緒論 2
11 全自動(dòng)洗衣機(jī)的發(fā)展現(xiàn)狀 2
12 全自動(dòng)洗衣機(jī)設(shè)計(jì)功能介紹 3
2系統(tǒng)硬件設(shè)計(jì) 4
21 單片機(jī)控制電路及工作原理 4
22 洗衣機(jī)電機(jī)驅(qū)動(dòng)電路及工作原理 4
23 水位檢測(cè)電路及工作原理 7
24 顯示電路及工作原理 9
25 鍵盤(pán)電路及工作原理 10
26 報(bào)警控制電路及工作原理11
3系統(tǒng)軟件的設(shè)計(jì) 12
31 主程序設(shè)計(jì)說(shuō)明與流程圖………………12
32 洗衣程序功能設(shè)計(jì)與流程圖12
33 鍵盤(pán)程序設(shè)計(jì)說(shuō)明與流程圖14
34 顯示器程序設(shè)計(jì)說(shuō)明與流程圖15
35 報(bào)警功能設(shè)計(jì)與流程圖………15
4系統(tǒng)調(diào)試 16
41硬件調(diào)試說(shuō)明 16
42軟件調(diào)試說(shuō)明 16
5總結(jié)與體會(huì) 17
6、程序代碼18
1、緒論 1.1全自動(dòng)洗衣機(jī)的發(fā)展現(xiàn)狀 洗衣機(jī),這個(gè)被譽(yù)為歷史上100個(gè)最偉大的發(fā)明之一,如今已經(jīng)度過(guò)了它的第158個(gè)年頭。隨著科技的迅猛發(fā)展和智能時(shí)代的來(lái)臨,傳統(tǒng)洗衣機(jī)大多已經(jīng)徘徊在被淘汰的邊緣,利用高科技和人工智能系統(tǒng)制造而成的洗衣機(jī)受到了越來(lái)越多人的追捧。 隨著電動(dòng)洗衣機(jī)的問(wèn)世,人們對(duì)于洗衣機(jī)的要求越來(lái)越高,促成了洗衣機(jī)的新一輪變革。于是,攪拌式洗衣機(jī)應(yīng)運(yùn)而生。這種洗衣機(jī)主要在筒中心裝上一個(gè)立軸,立軸下端裝有攪拌翼,通過(guò)電動(dòng)機(jī)帶動(dòng)立軸進(jìn)行周期性的正反擺動(dòng)使衣物和水流不斷翻滾、相互摩擦來(lái)達(dá)到清潔衣物的目的。10年后,美國(guó)本德克斯航空公司成功研制了第一臺(tái)前裝式滾筒洗衣機(jī),使得洗滌、漂洗、脫水在同一個(gè)滾筒內(nèi)完成,標(biāo)志著電動(dòng)洗衣機(jī)朝著自動(dòng)化方向邁出了一大步。1937年,第一臺(tái)自動(dòng)洗衣機(jī)問(wèn)世。這種洗衣機(jī)靠一根水平的軸帶動(dòng)起整個(gè)缸,衣服在注滿(mǎn)水的缸內(nèi)不停地上下翻滾以達(dá)到凈衣的目的。 隨著工業(yè)化的加速,世界各國(guó)加快了研制洗衣機(jī)的步伐。英國(guó)制造出了一種噴流式洗衣機(jī),依靠筒內(nèi)一側(cè)的運(yùn)轉(zhuǎn)波輪產(chǎn)生的強(qiáng)烈渦流使衣物和洗滌液在筒內(nèi)不斷翻滾來(lái)清洗衣物。在引進(jìn)英國(guó)噴流式洗衣機(jī)的前提上,日本制造出了獨(dú)具風(fēng)格,一直流行至今的波輪式洗衣機(jī)。隨后幾十年里,雙桶洗衣機(jī)、波輪式套桶全自動(dòng)洗衣機(jī)等紛紛面世。 隨著科技的日新月異和智能時(shí)代的到來(lái),人們對(duì)于洗衣機(jī)的要求越來(lái)越高,洗衣機(jī)不僅僅是單純解放人類(lèi)雙手的家用電器了。 未來(lái)的洗衣機(jī)將會(huì)朝著更人性化和智能化的方向發(fā)展,洗衣機(jī)及家電行業(yè)的消費(fèi)升級(jí)將會(huì)不斷迭代。 如今人們?cè)絹?lái)越注重低碳環(huán)保的健康生活,消費(fèi)者在選購(gòu)洗衣機(jī)時(shí)越來(lái)越注重其除菌、凈化、耗電等方面的性能。 為了滿(mǎn)足市場(chǎng)的變革需要和人們的需求,未來(lái)的洗衣機(jī)可能會(huì)在凈化率、噪音度、耗電量等多方面進(jìn)行變革,并且將會(huì)朝著越來(lái)越輕巧簡(jiǎn)便、智能多元的渠道發(fā)展。
1.2全自動(dòng)洗衣機(jī)設(shè)計(jì)功能介紹 全自動(dòng)洗衣機(jī)就是將洗衣的全過(guò)程(泡浸-洗滌-漂洗-脫水)預(yù)先設(shè)定好N個(gè)程序,洗衣時(shí)選擇其中一個(gè)程序,打開(kāi)水龍頭和啟動(dòng)洗衣機(jī)開(kāi)關(guān)后洗衣的全過(guò)程就會(huì)自動(dòng)完成,洗衣完成時(shí)由蜂鳴器發(fā)出響聲。 全自動(dòng)洗衣機(jī)的主要功能為:讓人可以根據(jù)自身的需求通過(guò)幾個(gè)簡(jiǎn)單的按鍵設(shè)定洗衣機(jī)洗衣服的水位、強(qiáng)度、以及洗衣模式,在設(shè)置完后按下啟動(dòng)按鈕便開(kāi)始自動(dòng)洗衣服,為了解決不小心按錯(cuò)導(dǎo)致設(shè)置錯(cuò)誤的情況應(yīng)當(dāng)還要有暫停以及重新設(shè)置各個(gè)參數(shù)的功能,開(kāi)始后還應(yīng)該有倒計(jì)時(shí)以顯示距離洗衣完成的剩余時(shí)間,當(dāng)然與所有的家用電器一樣全自動(dòng)洗衣機(jī)應(yīng)當(dāng)有一些安全警報(bào)。綜合所需的要求本次設(shè)計(jì)全自動(dòng)洗衣機(jī)的功能為: 按鍵一:設(shè)置洗衣模式----根據(jù)不同的洗衣要求設(shè)定三種不同洗衣模式。(標(biāo)準(zhǔn)-洗滌-脫水) 按鍵二:設(shè)置洗衣水位----根據(jù)不同的衣服數(shù)量設(shè)定不同水位。(高-中-低) 按鍵三:設(shè)置洗衣強(qiáng)度----根據(jù)不同的衣服污穢程度設(shè)定不同的強(qiáng)度。(強(qiáng)-中-弱) 按鍵四:開(kāi)始\暫停----開(kāi)始洗衣\必要時(shí)暫停洗衣,并可重新設(shè)置。 附加功能:洗衣倒計(jì)時(shí)、進(jìn)水超時(shí)警報(bào)、排數(shù)超時(shí)警報(bào)、脫水開(kāi)蓋警報(bào)、脫水碰撞警報(bào)。
2、系統(tǒng)硬件設(shè)計(jì) 2.1單片機(jī)控制電路及工作原理 file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 單片機(jī)又稱(chēng)單片微控制器,它不是完成某一個(gè)邏輯功能的芯片,而是把一個(gè)計(jì)算機(jī)系統(tǒng)集成到一個(gè)芯片上。單片機(jī)由運(yùn)算器,控制器,存儲(chǔ)器,輸入輸出設(shè)備構(gòu)成,相當(dāng)于一個(gè)微型的計(jì)算機(jī)(最小系統(tǒng)),和計(jì)算機(jī)相比,單片機(jī)只缺少了I/O設(shè)備。單片機(jī)是靠程序工作的,并且可以修改。通過(guò)不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨(dú)特的一些功能。
2.2 洗衣機(jī)電機(jī)驅(qū)動(dòng)電路及工作原理 file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg ULN2003是高耐壓、大電流復(fù)合晶體管陣列,由七個(gè)硅NPN 復(fù)合晶體管組成,每一對(duì)達(dá)林頓都串聯(lián)一個(gè)2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來(lái)處理的數(shù)據(jù)。 file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png 這里步進(jìn)電機(jī)的A端流入+5V ,如果輸入的是高電平的話(huà)。兩個(gè)三極管導(dǎo)通,于是步進(jìn)電機(jī)的那一相就導(dǎo)通了。低電平,就斷開(kāi)了。這里如果電機(jī)突然停止產(chǎn)生很大的電流;這時(shí)由于COM端接了二極管則限制在+5.7V左右
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image007.jpg
ULN2003內(nèi)部還集成了一個(gè)消線(xiàn)圈反電動(dòng)勢(shì)的二極管,可用來(lái)驅(qū)動(dòng)繼電器。它是雙列16腳封裝,NPN晶體管矩陣,最大驅(qū)動(dòng)電壓=50V,電流=500mA,輸入電壓=5V,適用于TTL COMS,由達(dá)林頓管組成驅(qū)動(dòng)電路。 ULN是集成達(dá)林頓管IC,內(nèi)部還集成了一個(gè)消線(xiàn)圈反電動(dòng)勢(shì)的二極管,它的輸出端允許通過(guò)電流為200mA,飽和壓降VCE 約1V左右,耐壓BVCEO 約為36V。用戶(hù)輸出口的外接負(fù)載可根據(jù)以上參數(shù)估算。采用集電極開(kāi)路輸出,輸出電流大,故可直接驅(qū)動(dòng)繼電器或固體繼電器,也可直接驅(qū)動(dòng)低壓燈泡。通常單片機(jī)驅(qū)動(dòng)ULN2003時(shí),上拉2K的電阻較為合適,同時(shí),COM引腳應(yīng)該懸空或接電源。 ULN2003是一個(gè)非門(mén)電路,包含7個(gè)單元,單獨(dú)每個(gè)單元驅(qū)動(dòng)電流最大可達(dá)500mA,9腳可以懸空。 比如1腳輸入,16腳輸出,你的負(fù)載接在VCC與16腳之間,不用9腳。 file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg 引腳1:CPU脈沖輸入端,端口對(duì)應(yīng)一個(gè)信號(hào)輸出端。 引腳2:CPU脈沖輸入端。 引腳3:CPU脈沖輸入端。 引腳4:CPU脈沖輸入端。 引腳5:CPU脈沖輸入端。 引腳6:CPU脈沖輸入端。 引腳7:CPU脈沖輸入端。 引腳8:接地。 引腳9:該腳是內(nèi)部7個(gè)續(xù)流二極管負(fù)極的公共端,各二極管的正極分別接各達(dá)林頓管的集電極。用于感性負(fù)載時(shí),該腳接負(fù)載電源正極,實(shí)現(xiàn)續(xù)流作用。如果該腳接地,實(shí)際上就是達(dá)林頓管的集電極對(duì)地接通。 引腳10:脈沖信號(hào)輸出端,對(duì)應(yīng)7腳信號(hào)輸入端。參考電路接法 引腳11:脈沖信號(hào)輸出端,對(duì)應(yīng)6腳信號(hào)輸入端。 引腳12:脈沖信號(hào)輸出端,對(duì)應(yīng)5腳信號(hào)輸入端。 引腳13:脈沖信號(hào)輸出端,對(duì)應(yīng)4腳信號(hào)輸入端。 引腳14:脈沖信號(hào)輸出端,對(duì)應(yīng)3腳信號(hào)輸入端。 引腳15:脈沖信號(hào)輸出端,對(duì)應(yīng)2腳信號(hào)輸入端。 引腳16:脈沖信號(hào)輸出端,對(duì)應(yīng)1腳信號(hào)輸入端。 在本實(shí)驗(yàn)中我使用單片機(jī)P3^4引腳輸出脈沖給lun2003芯片,在洗衣時(shí)與脫水時(shí)我們需要電動(dòng)機(jī)以不同的轉(zhuǎn)速旋轉(zhuǎn),為我們使用PWM調(diào)波原理控制電動(dòng)機(jī)的轉(zhuǎn)速,且為了電動(dòng)機(jī)工作時(shí)不與其他程序沖突我們需要使用定時(shí)器用來(lái)延時(shí),固定電動(dòng)機(jī)驅(qū)動(dòng)電壓的周期然后改變0/1的占空比便可以改變電動(dòng)機(jī)的轉(zhuǎn)速,在周期內(nèi)為1 的時(shí)間越大電動(dòng)機(jī)的轉(zhuǎn)速則越高,反之越低。
2.3 水位檢測(cè)電路及工作原理 file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png 水位開(kāi)關(guān)又叫做水位壓力開(kāi)關(guān)、水位傳感器、水位控制器,它是利用洗衣桶內(nèi)水位高低潮產(chǎn)生的壓力來(lái)控制觸點(diǎn)開(kāi)關(guān)的通斷,結(jié)構(gòu)如圖下所示。水位開(kāi)關(guān)用塑料軟管與盛水桶下側(cè)的儲(chǔ)氣室口相連接。當(dāng)向盛水桶內(nèi)注水時(shí),隨著水位的升高,儲(chǔ)氣室的空氣被壓縮,并由塑料軟管將壓力傳至水位開(kāi)關(guān)。隨著氣壓逐漸升高,水位壓力開(kāi)關(guān)內(nèi)的膜片變形并推動(dòng)動(dòng)觸點(diǎn)與常閉觸點(diǎn)分離,常閉觸點(diǎn)與公共觸點(diǎn)迅速斷開(kāi),常開(kāi)觸點(diǎn)與公共觸點(diǎn)閉合,從而將水位已達(dá)到設(shè)定值的信號(hào)送至程控器或?qū)⑦B接進(jìn)水閥電磁線(xiàn)圈的電路斷開(kāi),停止進(jìn)水。當(dāng)洗衣機(jī)排水時(shí),隨著盛水桶水位的下降,儲(chǔ)氣室及塑料軟管內(nèi)的壓力逐漸減小,當(dāng)氣體壓力小于彈簧的彈性恢復(fù)力時(shí),常開(kāi)觸點(diǎn)與公共觸點(diǎn)迅速斷開(kāi),常閉觸點(diǎn)與公共觸點(diǎn)閉合,恢復(fù)到待檢測(cè)狀態(tài)。 全自動(dòng)洗衣機(jī)的水位高低檢測(cè)是根據(jù)與洗衣桶內(nèi)側(cè)相連的水壓氣管里的空氣壓力大小來(lái)判斷。水位越高,水壓就越大,從而導(dǎo)致傳感器里的電感線(xiàn)圈的電感量就越大,再根據(jù)電感與電容的并聯(lián)諧振頻率公式:f=1/2π√LC得出諧振頻率就越小,反之則反。然后將產(chǎn)生的諧振頻率經(jīng)過(guò)單片機(jī)的處理來(lái)判定水位的高低(頻率越大,則水位越低;反之則反)。 file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image010.png 基本市面上大部分的水位傳感器內(nèi)部都是由1個(gè)密封氣室、1根彈簧、1個(gè)電感量可調(diào)的電感線(xiàn)圈(阻值22Ω)、2個(gè)22nF滌綸電容和1個(gè)后蓋組成,具體構(gòu)件見(jiàn)下圖所示: file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg 2.4 顯示電路及工作原理 file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpgfile:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg 數(shù)碼管是一種半導(dǎo)體發(fā)光器件,其基本單元是發(fā)光二極管。數(shù)碼管按段數(shù)可分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管比七段數(shù)碼管多一個(gè)發(fā)光二極管單元,也就是多一個(gè)小數(shù)點(diǎn)(DP)這個(gè)小數(shù)點(diǎn)可以更精確的表示數(shù)碼管想要顯示的內(nèi)容;按能顯示多少個(gè)(8)可分為1位、2位、3位、4位、5位、6位、7位等數(shù)碼管。 按發(fā)光二極管單元連接方式可分為共陽(yáng)極數(shù)碼管和共陰極數(shù)碼管。共陽(yáng)數(shù)碼管是指將所有發(fā)光二極管的陽(yáng)極接到一起形成公共陽(yáng)極(COM)的數(shù)碼管,共陽(yáng)數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到+5V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時(shí),相應(yīng)字段就點(diǎn)亮,當(dāng)某一字段的陰極為高電平時(shí),相應(yīng)字段就不亮。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管,共陰數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到地線(xiàn)GND上,當(dāng)某一字段發(fā)光二極管的陽(yáng)極為高電平時(shí),相應(yīng)字段就點(diǎn)亮,當(dāng)某一字段的陽(yáng)極為低電平時(shí),相應(yīng)字段就不亮。 顯示部分主要由led數(shù)碼管顯示和led燈顯示組成,led燈用于當(dāng)做指示燈不同的燈亮則表示不同的水位或是不同的強(qiáng)度、模式等等。此外還需要兩個(gè)led燈用于表示洗衣機(jī)進(jìn)水口與排水口的情況,而數(shù)碼管則用于顯示洗衣的是剩余時(shí)間。
2.5 鍵盤(pán)電路及工作原理 file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image017.png
在本設(shè)計(jì)中使用到了四個(gè)按鍵,如上圖所示每個(gè)按鍵的一端接地另一端則分別接單片機(jī)的P3_0----P3_3引腳。 某一按鍵未被按下的時(shí)候其所對(duì)應(yīng)的單片機(jī)引腳是高電平的,當(dāng)按鍵按下時(shí)會(huì)使其所對(duì)應(yīng)的引腳置為低電平。 在程序中便可通過(guò)按鍵對(duì)應(yīng)的引腳的電平情況判斷按鍵是否被按下。
2.6報(bào)警控制電路及工作原理
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image018.png 有源蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車(chē)電子設(shè)備、電話(huà)機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類(lèi)型。蜂鳴器在電路中用字母"H"或"HA"(舊標(biāo)準(zhǔn)用"FM"、"LB"、"JD"等)表示。 壓電式蜂鳴器 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發(fā)光二極管。 多諧振蕩器由晶體管或集成電路構(gòu)成。當(dāng)接通電源后(1.5~15V直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHZ的音頻信號(hào),阻抗匹配器推動(dòng)壓電蜂鳴片發(fā)聲。 壓電蜂鳴片由鋯鈦酸鉛或鈮鎂酸鉛壓電陶瓷材料制成。在陶瓷片的兩面鍍上銀電極,經(jīng)極化和老化處理后,再與黃銅片或不銹鋼片粘在一起。 .電磁式蜂鳴器 電磁式蜂鳴器由振蕩器、電磁線(xiàn)圈、磁鐵、振動(dòng)膜片及外殼等組成。 接通電源后,振蕩器產(chǎn)生的音頻信號(hào)電流通過(guò)電磁線(xiàn)圈,使電磁線(xiàn)圈產(chǎn)生磁場(chǎng)。振動(dòng)膜片在電磁線(xiàn)圈和磁鐵的相互纏繞
報(bào)警電路如上圖所示單片機(jī)的P2_3引腳接有一個(gè)蜂鳴器,當(dāng)給單片機(jī)的P2_3引腳輸出低電平是蜂鳴器便會(huì)響。 如此只要在程序中判斷是否符合報(bào)警的條件,若是符合便讓蜂鳴器響起。 3、系統(tǒng)軟件的設(shè)計(jì) 3.1 主程序設(shè)計(jì)說(shuō)明與流程圖file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg 本次設(shè)計(jì)的全自動(dòng)洗衣機(jī)其主程序如上圖所示,首先將要使用的單片機(jī)定時(shí)器0配置好,然后開(kāi)始水位、洗衣模式的選擇,按下s2則改變洗衣模式此處通過(guò)不同的led燈亮以 區(qū)分不同的模式,同理按下s3則改變水位,不同的led燈亮表示不同水位,按下s5則開(kāi)始執(zhí)行對(duì)應(yīng)的洗衣程序。 3.2 洗衣程序功能設(shè)計(jì)與流程圖file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg 當(dāng)按下開(kāi)始鍵后便開(kāi)始執(zhí)行洗衣程序,在其中會(huì)先判斷洗衣的模式,標(biāo)準(zhǔn)洗模式、洗滌模式、脫水模式分別對(duì)應(yīng)不同的洗衣過(guò)程。 標(biāo)準(zhǔn)洗模式: 首先開(kāi)始倒計(jì)時(shí)80秒,然后開(kāi)始進(jìn)水10秒讓led7亮代表進(jìn)水閥開(kāi)啟,在此過(guò)程中會(huì)判斷是否達(dá)到對(duì)應(yīng)的水位,此處會(huì)使用水位鍵k4代替水位傳感器的測(cè)量結(jié)果,若水位鍵被按下則表示已經(jīng)加入足夠的水量并關(guān)閉進(jìn)水閥即使led7滅,若在此過(guò)程水位鍵未被按下則觸發(fā)進(jìn)水超時(shí)警報(bào),當(dāng)解決進(jìn)水超時(shí)警報(bào)或者進(jìn)水未超時(shí)則繼續(xù)執(zhí)行下一程序,開(kāi)始洗衣服10秒,此過(guò)程電動(dòng)機(jī)會(huì)停2秒然后低速轉(zhuǎn)兩秒循環(huán)至10秒過(guò)去,然后執(zhí)行排水程序,即以led8燈表示排水閥開(kāi)啟,此過(guò)程同理需要水位鍵代替水位傳感器的測(cè)量結(jié)果以判斷是否發(fā)生排水超時(shí),若水位鍵被按下則報(bào)警,處理完成后開(kāi)始脫水,此過(guò)程為排水閥開(kāi)啟且電動(dòng)機(jī)高速旋轉(zhuǎn)10秒,若此過(guò)程中洗衣蓋子被打開(kāi)或是發(fā)生激烈碰撞則報(bào)警,以P3^6以及P3^7接地分別模擬脫水開(kāi)蓋以及脫水碰撞。警報(bào)處理好后或是未發(fā)生警報(bào)的話(huà)則循環(huán)一次上面的程序然后時(shí)間到了,倒計(jì)時(shí)顯示為0,蜂鳴器響3秒以提示洗衣完成。 洗滌模式: 首先開(kāi)始倒計(jì)時(shí)40秒,然后開(kāi)始進(jìn)水10秒讓led7亮代表進(jìn)水閥開(kāi)啟,在此過(guò)程中會(huì)判斷是否達(dá)到對(duì)應(yīng)的水位,此處會(huì)使用水位鍵k4代替水位傳感器的測(cè)量結(jié)果,若水位鍵被按下則表示已經(jīng)加入足夠的水量并關(guān)閉進(jìn)水閥即使led7滅,若在此過(guò)程水位鍵未被按下則觸發(fā)進(jìn)水超時(shí)警報(bào),當(dāng)解決進(jìn)水超時(shí)警報(bào)或者進(jìn)水未超時(shí)則繼續(xù)執(zhí)行下一程序,開(kāi)始洗衣服10秒,此過(guò)程電動(dòng)機(jī)會(huì)停2秒然后低速轉(zhuǎn)兩秒循環(huán)至10秒過(guò)去,然后執(zhí)行排水程序,即以led8燈表示排水閥開(kāi)啟,此過(guò)程同理需要水位鍵代替水位傳感器的測(cè)量結(jié)果以判斷是否發(fā)生排水超時(shí),若水位鍵被按下則報(bào)警,處理完成后開(kāi)始脫水,此過(guò)程為排水閥開(kāi)啟且電動(dòng)機(jī)高速旋轉(zhuǎn)10秒,若此過(guò)程中洗衣蓋子被打開(kāi)或是發(fā)生激烈碰撞則報(bào)警,以P3^6以及P3^7接地分別模擬脫水開(kāi)蓋以及脫水碰撞。處理好警報(bào)后繼續(xù)執(zhí)行程序直至10秒過(guò)去,即完成了洗滌模式的洗衣,此時(shí)倒計(jì)時(shí)顯示會(huì)為0,蜂鳴器響3秒以提示洗衣完成。 脫水模式: 此模式下倒計(jì)時(shí)會(huì)顯示20的倒計(jì)時(shí),首先進(jìn)行10秒的排水,同上述過(guò)程一樣有排水超時(shí)警報(bào),排水10秒后開(kāi)始脫水,10秒內(nèi)排水閥開(kāi)且電動(dòng)機(jī)高速旋轉(zhuǎn),其中會(huì)檢測(cè)是否發(fā)生脫水開(kāi)蓋以及脫水碰撞。脫水完成后蜂鳴器響3秒以提示洗衣完成。 3.3 鍵盤(pán)程序設(shè)計(jì)說(shuō)明與流程圖file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg 本全自動(dòng)洗衣機(jī)設(shè)計(jì)用到三個(gè)按鍵分別是s2洗衣模式選擇鍵、s3水位選擇鍵、s5開(kāi)始與暫停鍵。 S2被按下則洗衣模式在標(biāo)準(zhǔn)洗—洗滌—脫水三種模式間循環(huán)切換,led1,led2,led3分別代表標(biāo)準(zhǔn)洗—洗滌—脫水三種模式。 S3被按下則水位在高—中—低三種模式間循環(huán)切換,led4,led5,led6分別代表在高—中—低三種模式。 S5則開(kāi)始執(zhí)行洗衣程序,期間s2、s3無(wú)法使用,當(dāng)s5再次被按下是退出洗衣程序,啟用s2、s3按鍵。
3.4 顯示器程序設(shè)計(jì)說(shuō)明與流程圖file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg 顯示程序主要根據(jù)選擇好是水位、洗衣模式亮不同的led燈,以及倒計(jì)不同的時(shí)間。 標(biāo)準(zhǔn)洗模式則led1亮且顯示80秒倒計(jì)時(shí)。 洗滌模式則led2亮且顯示40秒倒計(jì)時(shí)。 脫水模式則led3亮且顯示20秒倒計(jì)時(shí)。 高水位則led4亮,中水位則led5亮,低水位則led6亮。進(jìn)水時(shí)led7亮,排水時(shí)led8亮。 3.5 報(bào)警功能設(shè)計(jì)與流程圖file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg 在執(zhí)行洗衣程序是會(huì)有四種報(bào)警情況,當(dāng)符合其中的請(qǐng)開(kāi)始便會(huì)報(bào)警。,進(jìn)水超時(shí)時(shí)退出洗衣程序在數(shù)碼管上顯示g1,排水超時(shí)時(shí)退出洗衣程序在數(shù)碼管上顯示g2,脫水開(kāi)蓋時(shí)退出洗衣程序在數(shù)碼管上顯示g3,脫水碰撞時(shí)退出洗衣程序在數(shù)碼管上顯示g4,排除警報(bào)后繼續(xù)執(zhí)行洗衣程序。 4、系統(tǒng)調(diào)試 4.1硬件調(diào)試說(shuō)明 在硬件方面我們使用單片機(jī)開(kāi)發(fā)板模擬洗衣機(jī)的工作狀態(tài)。 剛上電時(shí)是默認(rèn)選擇為標(biāo)準(zhǔn)洗模式、水位為高顯示為led1及l(fā)ed4亮,此時(shí)按下k2鍵則切換洗衣模式改變led1、led2、led3的亮滅情況。Led1亮則為標(biāo)準(zhǔn)洗模式、led2亮則為洗滌模式、led3亮則為脫水模式。按下k3鍵則切換水位選擇改變led4、led5、led6、的亮滅情況。led4亮則選擇為高水位、led5亮則選擇為中水位、led6亮則選擇為低水位。 按下k5鍵后開(kāi)始洗衣,此時(shí)k2、k3鍵不可用。 執(zhí)行標(biāo)準(zhǔn)洗模式時(shí)在數(shù)碼管上會(huì)顯示一分二十秒的倒計(jì)時(shí)總共80秒,并且開(kāi)始下表的洗衣步驟: 洗滌模式時(shí)在數(shù)碼管上會(huì)顯示倒計(jì)時(shí)總共40秒,并且開(kāi)始下表的洗衣步驟: 脫水模式時(shí)在數(shù)碼管上顯示倒計(jì)時(shí)20秒,并且開(kāi)始下表的洗衣步驟: 進(jìn)水時(shí)led7亮,反之滅。排水時(shí)led8亮,反之滅。且進(jìn)水需要按下k4水位鍵停止進(jìn)水以表示水位到了,否則報(bào)警蜂鳴器響,數(shù)碼管顯示g1且退出洗衣程序。 在退水期間將P3^6、P3^7接地則分別觸發(fā)脫水開(kāi)蓋、脫水碰撞報(bào)警,蜂鳴器響,數(shù)碼管分別顯示g3、g4且退出洗衣程序直至報(bào)警處理好。 4.2軟件調(diào)試說(shuō)明 本實(shí)驗(yàn)代碼由C語(yǔ)言所編寫(xiě)其中除主函數(shù)外還包含有定時(shí)器初始化函數(shù)、定時(shí)器中斷函數(shù)、驅(qū)動(dòng)函數(shù)、顯示函數(shù)、報(bào)警函數(shù)、按鍵處理等多個(gè)函數(shù)。 不同的函數(shù)完成不同的工作。
5、總結(jié)與體會(huì)
在本次全自動(dòng)洗衣機(jī)系統(tǒng)設(shè)計(jì)和制作過(guò)程中主要是倒計(jì)時(shí)的顯示比較難處理以,在顯示倒計(jì)時(shí)時(shí)還要執(zhí)行洗衣程序要避免其相互沖突是一難點(diǎn),此外為了解決報(bào)警情況的相互沖突也花飛不少的時(shí)間。 通過(guò)本次實(shí)驗(yàn)我認(rèn)識(shí)了新的傳感器—水位傳感器,使用水位傳感器便可準(zhǔn)確測(cè)量出當(dāng)前的水量是一個(gè)很方便的傳感器,其結(jié)構(gòu)也不復(fù)雜。在編寫(xiě)程序過(guò)程中我開(kāi)始反省改善自己一些壞習(xí)慣逐漸養(yǎng)成良好編寫(xiě)習(xí)慣。 在設(shè)計(jì)過(guò)程中我的語(yǔ)言表達(dá)能力以及動(dòng)手能力得到了一定的鍛煉,相信在本實(shí)驗(yàn)完成的同時(shí)我的語(yǔ)言表達(dá)能力以及動(dòng)手能力也得到了提升!
單片機(jī)源程序如下:
- /*********************************************************************************
- 【編寫(xiě)時(shí)間】: 2016年11月18日
- 【功能】: 模擬洗衣機(jī)功能;
- **********************************************************************************/
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit sda=P2^0;
- sbit scl=P2^1;
- sbit s2=P3^0;
- sbit s3=P3^1;
- sbit s4=P3^2;
- sbit s5=P3^3;
- sbit moto=P3^4;
- sbit warn3=P3^6;
- sbit warn4=P3^7;
- sbit led1=P1^0;
- sbit led2=P1^1;
- sbit led3=P1^2;
- sbit led4=P1^3;
- sbit led5=P1^4;
- sbit led6=P1^5;
- sbit led7=P1^6;
- sbit led8=P1^7;
- sbit beep = P2^3; //蜂鳴器
- sbit dula=P2^6; //段選信號(hào)的鎖存器控制
- sbit wela=P2^7; //位選信號(hào)的鎖存器控制
- uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- //數(shù)碼管各位的碼表
- uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- //0-f的碼表
- uchar mode=1,waterl=1,water_warn=0,starts=0,drivec=0;
- uint count1=0,count2=0,count3=0,count4=0,count5=0,count6=0;
- uint time4=0,time5=0,time6=0,time7=0;
- uint warn=0;
- int gives=1;
- /*
- void delay() //5us
- {;;}
- */
- void delay1(uint z)//1ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- //
- void timer_init(){
- TMOD=0x01; //模式設(shè)置,00000001,可見(jiàn)采用的是定時(shí)器0,工作與模式1(M1=0,M0=1)。
- TR0=1; //打開(kāi)定時(shí)器
- TH0=(65536-46080)/256;// 由于晶振為11.0592,故所記次數(shù)應(yīng)為46080,計(jì)時(shí)器每隔50000微秒發(fā)起一次中斷。
- TL0=(65536-46080)%256;//46080的來(lái)歷,為50000*11.0592/12
- ET0=1; //開(kāi)定時(shí)器0中斷
- EA=1; //開(kāi)總中斷
- }
- void keys(){
- if(!s2){delay1(500); mode++; gives=1; if(mode==4) mode=1;}
- if(!s3){delay1(500); waterl++; gives=1; if(waterl==4) waterl=1;}
- }
- void key4(){
- if(s4==0){
- while(!s4);
- warn=0;
- starts++;
- water_warn=1;
- // delay1(500); water_warn++; gives=1; if(water_warn==4) water_warn=1;
- }
- }
- void key5(){
- if(s5==0){while(!s5); starts++; if(starts==2) starts=0;}
- }
- void show_warn(){
- beep=0;
- key4();
- if(warn==1){ //進(jìn)水超時(shí)警報(bào)
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x6f;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
-
- P0=wei[1];
- wela=1;
- wela=0;
- P0=0x06;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
- }
- if(warn==2){ //排水超時(shí)警報(bào)
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x6f;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
-
- P0=wei[1];
- wela=1;
- wela=0;
- P0=0x5b;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
- }
- if(warn==3){ //脫水開(kāi)蓋警報(bào)
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x6f;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
-
- P0=wei[1];
- wela=1;
- wela=0;
- P0=0x4f;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
- }
- if(warn==4){ //脫水碰撞警報(bào)
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x6f;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
-
- P0=wei[1];
- wela=1;
- wela=0;
- P0=0x66;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
- }
- }
- void show(){
- if(mode==1) {led3=1; led2=1; led1=0;}
- else if(mode==2) {led3=1; led1=1; led2=0;}
- else {led1=1; led2=1; led3=0;}
- if(waterl==1) {led6=1; led5=1; led4=0;}
- else if(waterl==2) {led6=1; led4=1; led5=0;}
- else {led4=1; led5=1; led6=0;}
- /*
- if(strength==1){
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x01;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
- }
- else if(strength==2){
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x40;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
- }
- else {
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x08;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。}
- }
- */
- }
- void dianji()
- {
- if(count5<=1) moto=1;
- if(count5>1) moto=0;
- }
- void dry()
- {
- if(count6==2) moto=1;
- if(count6==9) moto=0;
- }
- void drive(){
- int a;
-
- for(a=4;a<8;a++){
- /* if(strength==1){
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x01;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
- }
- else if(strength==2){
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x40;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。
- }
- else {
- P0=wei[0];
- wela=1;
- wela=0;
- P0=0x08;
- dula=1;
- dula=0;
- delay1(2); //時(shí)間間隔短,這是關(guān)鍵(所謂的同時(shí)顯示,只是間隔較短而已,利用人眼的余輝效應(yīng),覺(jué)得每個(gè)數(shù)碼管都一直在亮)。}
- } */
-
- P0=wei[a];
- wela=1;
- wela=0;
- if(a==4){
- P0=duan[time4];
- dula=1;
- dula=0;
- delay1(5); }
- if(a==5){
- P0=duan[time5]|0x80;
- dula=1;
- dula=0;
- delay1(5); }
- if(a==6){
- P0=duan[time6];
- dula=1;
- dula=0;
- delay1(5); }
- if(a==7){
- P0=duan[time7];
- dula=1;
- dula=0;
- delay1(5); }
- }
- if(time4==0&&time5==0&&time6==0&&time7==0){P1=0xff; moto=0; beep=0; delay1(2000); beep=1;while(1);}
- if(time5==0&&time6==0&&time7==0){
- time5=10;
- time4--;
- }
- if(time6==0&&time7==0) {
- time6=6;
- time5--;
- }
-
-
- //脫水
- if(mode==3){
- led8=0;
- key4();
- if(count2>10&&count2<=20){
- if(water_warn==1){warn=2; starts=0;} //排水超時(shí)警報(bào)
- led7=1;
- led8=0;
- dry();
- if(warn3==0) {warn=3; starts=0;} ///脫水開(kāi)蓋警報(bào)
- if(warn4==0) {warn=4; starts=0;} //脫水碰撞警報(bào)
- }
- if(count2>=20){ P1=0xff; moto=0; beep=0; delay1(3000);beep=1; while(1); }
- }
- //洗
- if(mode==2){
- if(count2<=10){
- if(water_warn==0){led7=0;}
- if(water_warn==1){led7=1;}
- key4(); }
- if(count2>10&&count2<=20){
- if(water_warn==0){warn=1; starts=0;} //進(jìn)水超時(shí)警報(bào)
- led7=1;
- if(count4<=2) {
- dianji();
- }
- else moto=0;
- }
- if(count2>20&&count2<=30){ water_warn=0; led7=1; led8=0; moto=0; }
- if(count2>30&&count2<=40) {
- //if(water_warn==1){warn=2; starts=0; } //排水超時(shí)警報(bào)
- led7=1; led8=0;
- dry();
- if(warn3==0) {warn=3; starts=0;} //脫水開(kāi)蓋警報(bào)
- if(warn4==0) {warn=4; starts=0;} //脫水碰撞警報(bào)
- }
- if(count2>40){P1=0xff; moto=0; beep=0; delay1(3000);beep=1; while(1);}
- }
- //標(biāo)準(zhǔn)
-
- if(mode==1){
- key5();
- if(count2<=10) {led8=1;
- if(water_warn==0){led7=0; }
- if(water_warn==1){led7=1;}
- key4(); }
- if(count2>10&&count2<=20){
- if(water_warn==0){warn=1; starts=0; } //進(jìn)水超時(shí)警報(bào)
- led7=1;
- if(count4<=2) {
- dianji();
- }
- else moto=0;
- }
- if(count2>20&&count2<=30){water_warn=0; led8=0; moto=0; }
- if(count2>30&&count2<=40) {
- // if(water_warn==1){warn=2; starts=0;} //排水超時(shí)警報(bào)
- led7=1;
- led8=0;
- dry();
- if(warn3==0) {warn=3; starts=0;} //脫水開(kāi)蓋警報(bào)
- if(warn4==0) {warn=4; starts=0;} //脫水碰撞警報(bào)
- }
- if(count2>40&&count2<=50) {led8=1;
- if(water_warn==0){led7=0;}
- if(water_warn==1){led7=1;}
- moto=0;
- key4();
- }
- if(count2>50&&count2<=60){
- if(water_warn==0) {warn=1; starts=0;} //進(jìn)水超時(shí)警報(bào)
- led7=1;
- if(count4<=2) {
- dianji();
- }
- else moto=0;
- }
- if(count3>=1&&count2<=10) {led7=1; delay1(1); led8=0; moto=0; }
- if(count3>=1&&count2>10&&count2<=20){
- // if(water_warn==1){warn=2; starts=0;} //排水超時(shí)警報(bào)
- led7=1; led8=0;
- dry();
- if(warn3==0) {warn=3; starts=0;} //脫水開(kāi)蓋警報(bào)
- if(warn4==0) {warn=4; starts=0;} //脫水碰撞警報(bào)
- }
- if(count3>=1&&count2>20) {P1=0xff; moto=0; beep=0; delay1(3000);beep=1; while(1);}
-
- }
- key5();
-
- if(count1==20){
- count1=0;
- count2++;
- count4++;
- if(count4>=5) count4=1;
- if(time7==0) time7=10;
- if(count2==60){count2=0; count3++;}
- time7--;
- if(time7==9) time6--;
- }
- }
- void give(){
- if(gives!=0){
- if(mode==1) {time4=0; time5=1; time6=2; time7=0; drivec=1;}
- if(mode==2) {time4=0; time5=0; time6=4; time7=0; drivec=1;}
- if(mode==3) {time4=0; time5=0; time6=2; time7=0; drivec=1;} }
- }
- void main()
- {
- uchar i=0;
- warn3=1;
- warn4=1;
- timer_init();
- while(1)
- {
- keys();
- show();
- key5();
- give();
- while(warn!=0){
-
- if(mode==3&&count2>10&&count2<=20){
- if(warn3==1&&warn4==1){beep=1; warn=0; starts++;}
- }
- if(mode==2&&count2>30&&count2<=40) {
- if(warn3==1&&warn4==1){beep=1; warn=0; starts++;}
- }
- if(mode==1&&count2>30&&count2<=40){
- if(warn3==1&&warn4==1){beep=1; warn=0; starts++;}
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼 所有資料51hei提供下載:
洗衣機(jī).zip
(39.44 KB, 下載次數(shù): 142)
2018-7-12 17:07 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|