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