洗衣機是現(xiàn)代家庭中必不可少的一部分,它的出現(xiàn)方便了我們的生活,為我們節(jié)省了不少時間。隨著經(jīng)濟的發(fā)展和人民生活水平的不斷提高,其發(fā)展也是日新月異,全自動化的程序是現(xiàn)在洗衣機的基本要求。我們現(xiàn)在只要按一個鍵,我們就可以完成洗衣服的所有操作。洗衣機逐漸向微電腦智能化發(fā)展。傳統(tǒng)的機械式、簡單的電子式控制都難以滿足現(xiàn)代洗衣機的發(fā)展要求。本系統(tǒng)的微控制器采用STC89C52單片機,系統(tǒng)主要由液晶顯示模塊,系統(tǒng)報警模塊,電機控制模塊,功能按鍵模塊,指示燈模塊。洗衣機開機默認標準模式,洗滌12分鐘,漂洗6分鐘,漂洗兩次脫水,漂洗和洗滌,電機都正轉(zhuǎn)四秒,停兩秒,反轉(zhuǎn)四秒,停兩秒。系統(tǒng)通過按鍵來啟停洗衣機,通過按鍵選擇洗衣機標準,快速,脫水三種模式,通過按鍵模擬脫水翻蓋功能等等。 本設(shè)計洗衣的過程控制主要包括,洗滌,漂洗,排水脫水三個過程。按照全自動洗衣機的控制系統(tǒng)的要求和特點,來進行確定單片機的輸入輸出分配關(guān)系,根據(jù)洗衣過程的需求,控制程序的設(shè)計主要包括主程序、內(nèi)部定時中斷服務(wù)程序、外部定時中斷程序、洗衣,排水和脫水的設(shè)計,設(shè)計完畢并進行系統(tǒng)調(diào)試。 1.緒 論 1.1 課題研究背景及意義 1.2本文主要的研究內(nèi)容 2系統(tǒng)方案總體設(shè)計 2.1 全自動洗衣機指標要求 2.2 系統(tǒng)方案選擇 2.2.1 控制器選擇 2.2.2 電機驅(qū)動器選擇 2.3 系統(tǒng)總體設(shè)計 3 系統(tǒng)硬件電路設(shè)計 3.1 電機驅(qū)動電路設(shè)計 3.1.1 L298介紹 3.1.2 電機驅(qū)動電路設(shè)計 3.2 單片機控制單元設(shè)計 3.2.1單片機介紹 3.2.2 中斷系統(tǒng) 3.2.3定時器 3.2.4控制系統(tǒng)電路設(shè)計 3.3. 顯示電路設(shè)計 3.4 報警電路設(shè)計 3.5指示燈電路設(shè)計 3.6鍵盤電路設(shè)計 3.7電源電路設(shè)計 4.系統(tǒng)軟件設(shè)計 4.1 軟件開發(fā)環(huán)境介紹 4.2 C語言介紹 4.3 軟件總體設(shè)計 4.3.1系統(tǒng)主程序設(shè)計 4.3.2系統(tǒng)中斷程序設(shè)計 4.3.3 鍵盤掃描程序 4.3.4 電機驅(qū)動程序設(shè)計 5.系統(tǒng)仿真及結(jié)果分析 5.1 硬件實物 5.2系統(tǒng)仿真環(huán)境介紹 5.3 系統(tǒng)仿真結(jié)果分析 5.4仿真遇到的問題 結(jié)束語 參考文獻 致 謝 附錄 系統(tǒng)電路圖 程序代碼清單
1.緒 論在本章中主要介紹了課題研究的背景和意義,以及洗衣機控制系統(tǒng)的使用現(xiàn)狀,結(jié)合一些實際中的問題,闡述了洗衣機控制系統(tǒng)設(shè)計的必要性,最后介紹了一下本設(shè)計的的要求和內(nèi)容,以及在文檔的結(jié)構(gòu)安排。 1.1 課題研究背景及意義洗衣服從古到今都是一個必不可少的家務(wù)勞動,從電視上的劇集上也可以看到,古代婦女都把衣服拿到河邊用棍子敲打,用手搓等等。但是隨著時間的推移,科技的發(fā)展,出現(xiàn)了用機械洗衣代替手工洗衣的操作。早在1858年,一個叫漢密爾頓·史密斯的美國人在匹茨堡制成了世界上第一臺洗衣機。這個洗衣機整體設(shè)計比較簡單,它的主件是一只圓桶,桶內(nèi)裝有一根帶有槳狀葉子的直軸。軸是通過搖動和它相連的曲柄轉(zhuǎn)動的。但這臺洗衣機使用起來比較費力,而且對衣物的損害也比較大,所以并沒被廣泛使用,但是給人們用機器代替手工洗衣服的想法起到一個至關(guān)重要的啟示。時至今天,洗衣機已經(jīng)發(fā)展到一個非常先進水平。 我們這一代人也可以深刻地體會到洗衣機的發(fā)展。在90年代初期,普通大眾還是用著半自動的洗衣機,就是那種洗和甩干分開兩個滾筒,那種要我們把洗滌好的衣服再人手拿到另外一個滾筒去甩干。在今天看來是比較落后的洗衣機,但是在當時也是十分先進的。再到了90年代后期出現(xiàn)了全自動洗衣機,全自動洗衣機是一個重大的跨越。它的操作十分方便,我們只要把衣服放進去,再按開始,過一段時間就能洗好并自動甩干,F(xiàn)在的洗衣機就更先進了,有了更多的功能,例如自動烘干、自動熨好等等更實用的功能。 本洗衣機控制系統(tǒng)正是在這一個背景下產(chǎn)生的,設(shè)計一套完善的洗衣機控制系統(tǒng)對于勞動力有著重要意義,一個好的控制系統(tǒng),不僅能在保證洗干凈衣服的前提下,還能夠更好的保護衣服,節(jié)約時間。
1.2本文主要的研究內(nèi)容本設(shè)計采用STC89S52單片機作為控制芯片,使用L298控制芯片作為電機驅(qū)動,使用蜂鳴器來作為報警系統(tǒng),使用LCD1602作為顯示,使用LED來作為標示洗衣狀態(tài)。系統(tǒng)在軟件里面通過多個定時器協(xié)同工作,完成洗衣的漂洗過程:正轉(zhuǎn)4秒,停止2秒,反轉(zhuǎn)4秒,停止2秒。并且在系統(tǒng)的運行過程中,通過啟動/停止按鍵來啟動和暫停洗衣機,通過模式切換開關(guān)來切換洗衣機在標準洗滌,快速洗滌,脫水三個模式切換;通過按鍵來模擬洗衣機在脫水過程中翻蓋報警急停功能。 對于整個系統(tǒng)而言,系統(tǒng)上電確認后,系統(tǒng)同默認進入到標準模式,當按照標準洗滌的12分鐘后,洗衣機進行排水脫水,然后進入到漂洗過6分鐘,在此過程中,標準洗滌指示燈,排水脫水指示燈分別不斷閃爍來表示正在進行的過程,完成以后的漂洗和脫水便可以完成整個標準洗衣過程。對于快速洗滌過程跟標準洗滌過程一樣;對于脫水模式,洗衣機進入到高速旋轉(zhuǎn)模式,當有翻蓋模擬按鍵按下時候,洗衣機急停并且報警。 主要的設(shè)計任務(wù)有:第一步是把可行的方案列舉出來,并選擇最為合適的方案,再選擇控制芯片和電機驅(qū)動的方案,確定大致的設(shè)計方向;第二步是設(shè)計單片機控制控制系統(tǒng)硬件,能夠?qū)崿F(xiàn)控制電機、顯示當前工作狀態(tài)、時間、報警等等的功能;第三步是軟件設(shè)計,設(shè)計人機交互界面,電機驅(qū)動程序,報警程序設(shè)計,模式選擇程序設(shè)計,中斷程序設(shè)計等等;最后的步驟是系統(tǒng)調(diào)試仿真,調(diào)試系統(tǒng)的硬件和軟件,并且進行仿真,看設(shè)計是否成功。
2系統(tǒng)方案總體設(shè)計
2.1 全自動洗衣機指標要求全自動洗衣機的指標要求如下: 首先,標準洗滌12分鐘再漂洗6分鐘,漂洗兩次就脫水3分鐘。 其次,快速洗滌7分鐘再漂洗3分鐘,漂洗兩次,脫水。 最后:還可以實現(xiàn)啟動和暫停按鈕控制,第一次啟動,標準洗滌;工作時按此按鈕暫停,再按則恢復(fù)工作。洗滌、漂洗4秒正轉(zhuǎn),停2秒,反轉(zhuǎn)4秒,停2秒,繼續(xù)運行。為了安全,在脫水時,如果打開蓋板(K3鍵模擬),脫水暫停。在洗滌時洗滌指示燈閃爍,漂洗時漂洗指示燈閃爍,脫水時脫水指示燈閃爍。 按鍵功能設(shè)想:K1鍵改變“標準、快速、排水”三種方式,執(zhí)行相應(yīng)程序,對應(yīng)LED閃爍。默認標準模式。k2鍵改變控制洗衣機的“啟動、暫!惫δ。按下暫停,再按下恢復(fù)運行。K3鍵模擬打開蓋板,在脫水時,如果打開蓋板,脫水暫停。 根據(jù)設(shè)計所需要求,要完成一個比較完善的洗衣機控制器,必須要注意每一個細節(jié),把系統(tǒng)調(diào)試到最為合適的工作狀態(tài)。并且要有一定的可靠性,所以可靠性是在設(shè)計過程中應(yīng)該優(yōu)先考慮的一個因素,一個控制系統(tǒng)必須要能穩(wěn)定、可靠地工作,才能投入到生產(chǎn)實踐中去。如果系統(tǒng)的可靠性不能達到要求,那么系統(tǒng)出現(xiàn)故障的可能就會增大,有可能會造成很大的損失。
2.2 系統(tǒng)方案選擇
2.2.1 控制器選擇本設(shè)計中擁有一個控制器,它主要控制驅(qū)動信號產(chǎn)生,以及信息的現(xiàn)實等功能,控制器擁有很多種,下面介紹一些控制器以及本設(shè)計采用的控制器。 方案一:選擇STC89C52作為控制器。首先,STC89C52是51內(nèi)核,是8位單片機,其指令是采用的被稱為“CISC”的復(fù)雜指令集,共有111條指令,內(nèi)部自然豐富,并且操作簡單。[1]還有,它的供電電壓是5V和其他的一些芯片具有相同的供電電壓,其抗干擾能力強,端口容易操作,構(gòu)建其最小控制系統(tǒng)簡單。[2] 該方案的實用性和可靠性比較高,可以滿足絕大多數(shù)控制,選擇51單片機作為控制器,對于初學(xué)者可以很方便的構(gòu)建一個最小控制系統(tǒng),并且其的編程很簡單,成本低,便于操作者實現(xiàn)控制目標。 方案二:選擇MSP430作為控制器。MSP430是TI公司生產(chǎn)的一款低功耗控制芯片,其功耗低,供電電壓3.3V,其可以工作在低功耗模式,可以減少系統(tǒng)的功耗,并且MSP430單片機是16位的單片機,采用了精簡指令集(RISC)結(jié)構(gòu),只有簡潔的27條指令,大量的指令則是模擬指令,眾多的寄存器以及片內(nèi)數(shù)據(jù)寄存器都可參加多種運算。[3] 該方案在低功耗和運算能力上具有很大的優(yōu)勢,然而其的可靠性不高,其抗干擾能力比較差,最重要的是其編寫程序比較復(fù)雜,芯片成本比較高,編寫程序復(fù)雜。 聯(lián)系本設(shè)計的任務(wù),對于控制器的要求不是很高,所以從設(shè)計成本以及可靠性和實施難度等方面考慮,本設(shè)計選擇控制方案一作為控制方案選擇。
2.2.2 電機驅(qū)動器選擇本設(shè)計要對洗衣機的電機進行控制,選擇恰當?shù)碾姍C驅(qū)動方案有利于電機控制,在本設(shè)計中要求電機可以調(diào)速,電機可以改變方向,具體方案如下: 方案一:采用數(shù)字電位器加大電流穩(wěn)壓器構(gòu)建調(diào)壓電路,采用繼電器構(gòu)建電壓方向改變電路。在本方案中,通過驅(qū)動數(shù)字電位器改變大電流穩(wěn)壓器的輸出電壓,從而實現(xiàn)電壓調(diào)速,通過繼電器切換電壓方向來改變輸出電壓方向,從而改變電機轉(zhuǎn)向,采用這一種辦法來實現(xiàn)電機調(diào)速雖然方便智能,但是由于使用了大量價格昂貴的數(shù)字電位器等芯片,成本很高,并且調(diào)速范圍不廣。 方案二:采用專用電機調(diào)速控制器L298來進行電機控制。L298通過四個控制引腳來控制兩個電機的運行速度以及運行電壓方向,不過使用L298來對電機調(diào)速的時候,要運用PWM波形進行控制,這種控制方案不僅集成度高,便于控制,而且整個系統(tǒng)的成本相對較低。 聯(lián)系本設(shè)計的任務(wù),由于本設(shè)計還要求仿真,并且設(shè)計都對成本又要求,所以,在本設(shè)計選用方案二來對電機控制。
2.3 系統(tǒng)總體設(shè)計
在本設(shè)計中,要求實現(xiàn)洗衣機的全自動控制,在整個控制系統(tǒng)中,要求對電機控制,報警控制,液晶顯示以及鍵盤輸入等功能,在本設(shè)計里面主要體現(xiàn)出對電機的智能控制,在軟件里面實現(xiàn),首先通過按鍵選擇洗衣機的工作模式,選擇完工作模式后,系統(tǒng)進入到相應(yīng)的模式下運行,在運行的過程中也可以通過按鍵來啟停電機,并且還可以用按鍵來模擬脫水翻蓋報警功能。本設(shè)計的總體設(shè)計框圖如下:   圖2-1 全自動洗衣機控制系統(tǒng)框圖 Fig.2-1 Block diagram of control system of automatic washing machine 由圖2-1可以知道,整個系統(tǒng)分為三大塊:人機交互,狀態(tài)顯示,執(zhí)行電路。在這個三個模塊中,人機交互模塊有液晶和鍵盤組成,在整個系統(tǒng)中,通過電機運行時間來判斷當前電機運行狀態(tài),當洗衣機的洗滌時間到了后,系統(tǒng)自動運行到排水脫水狀態(tài),并且相應(yīng)的指示燈閃爍,通過按鍵來設(shè)置洗衣機運行狀態(tài),并且在洗衣機運行過程中,通過啟動/暫停按鍵來啟動和暫停按洗衣機,當洗衣機洗衣結(jié)束的時候,電機停止,蜂鳴器報警。在脫水的時候,用按鍵來模擬翻蓋,當有按鍵按下時,洗衣機停止脫水,并且報警,當再次按下的時候,系統(tǒng)進入到正常脫水模式。
3 系統(tǒng)硬件電路設(shè)計
3.1 電機驅(qū)動電路設(shè)計
3.1.1 L298介紹平時我們在觀察洗衣機工作時可以發(fā)現(xiàn),在洗衣服的過程中,洗衣機的轉(zhuǎn)動會先順時針轉(zhuǎn)一會,停一會,再逆時針轉(zhuǎn)一會,通過這樣的動作,就能夠起到像手動揉衣服的作用。因為正轉(zhuǎn)反轉(zhuǎn)所以工作的電機轉(zhuǎn)速不可過快,不然對電機的傷害會比較大。在脫水時,洗衣機只會需朝某一個方向快速旋轉(zhuǎn),利用離心力的方法把衣物甩干。 本設(shè)計系統(tǒng)的電機驅(qū)動采用的是電機驅(qū)動芯片L298,它的驅(qū)動電流達3A,可以滿足系統(tǒng)工作的需求。而且L298的驅(qū)動方式比較簡單, L298有兩個電壓輸入,一個給電機的電壓,一個是給芯片工作與控制邏輯的參考電壓。L298相當于有四個驅(qū)動門,每個IN1,對應(yīng)該一個OUT1,當IN1為高電平是,OUT1輸出高電平,電壓為VSS,也就是給這個芯片電機的供電電壓,而且指的不是邏輯電壓。[5]又見圖2-1與L298的內(nèi)部原理圖3-1本設(shè)計每個兩個驅(qū)動門做成一路控制電機的信號,這樣可以使電機在四個象限運行,即正轉(zhuǎn),反轉(zhuǎn),停車,自由滑行。ENA與ENB的使能的控制,如果采用PWM對電機進行調(diào)速,可以在ENA與ENB中分別接入PWM信號,IN1與IN2,和IN3與IN4,分別可以控制電機的正反轉(zhuǎn)與不轉(zhuǎn)。為了方便一些接線的電機,本電路板設(shè)計輸出的接線端子,輸出端子分別為:OUT1,OUT2,OUT3,OUT4。同時為了方便接四線的步進電機,在接線端子上也設(shè)計了四位排針,輸出信號與接線端子相同的順序[7]。L298內(nèi)部原理圖如圖3-1所示。 
圖3-1 L298內(nèi)部原理圖 Fig.3-1 L298 internal schematic diagram 3.1.2 電機驅(qū)動電路設(shè)計
本設(shè)計系統(tǒng)的電機驅(qū)動采用的是L298電機驅(qū)動芯片,因為用L298電機芯片在編寫程序是只要兩個指令就能夠滿足電機的正轉(zhuǎn)、反轉(zhuǎn)、停止等等的功能。編寫比較簡單,操作也更為容易。而如圖3-2就是L298的管腳圖。 
圖3-2 L298管腳圖 Fig.3-2 L298 Pin diagram L298有兩路電源分別為邏輯電源和動力電源,它的電路原理圖如圖3-3所示。它圖中5V為邏輯電源,16V為動力電源。ENA與ENB直接接入5V邏輯電源也就是說兩個電機時刻都工作在使能狀態(tài),控制電機的運行狀態(tài)只有通過IN1與IN2,IN3與IN4兩個接口。由于我們使用的電機是線圈式的,在從運行狀態(tài)突然轉(zhuǎn)換到停止狀態(tài)和從順時針狀態(tài)突然轉(zhuǎn)換到逆時針狀態(tài)時會形成很大的反向電流,在電路中加入二極管的作用就是在產(chǎn)生反向電流的時候進行泄流,保護芯片的安全。各輸入端串如二極管同樣是起保護作用。[16] 圖3-3 L298驅(qū)動原理圖 Fig.3-3 Schematic of L298 driver
3.2 單片機控制單元設(shè)計3.2.1單片機介紹 在微型計算機中,單片機微型計算機具有很重要的地位,并且得到廣泛的應(yīng)用。也就是我們常說的單片機。單片機在電子行業(yè)起著十分重要的作用。單片機也是我們學(xué)習的重點,可想而知,單片機在今天的電子計算機行業(yè)是多么的重要。又因為單片機被廣泛應(yīng)用在控制系統(tǒng)中,所以也常常稱其為微控制器。單片機也被叫做微型電腦。一般情況,單片機就是集成電路芯片,不過其內(nèi)部包含有計算機的功能部分:加法器,存儲器以及與外設(shè)連接的I/O設(shè)備。因此,單片機加上基本工作電路以及對應(yīng)的外設(shè)電路便可以構(gòu)造我們想要的控制系統(tǒng)。 STC89C52是擁有51內(nèi)核單片機的典型產(chǎn)品,在單片機內(nèi)部包含了中央處理器、程序存儲器(ROM)、數(shù)據(jù)存儲器(RAM)、定時/計數(shù)器、并行接口、串行接口和中斷系統(tǒng)等幾大單元及數(shù)據(jù)總線、地址總線和控制總線等三大總線。如圖3-4所示就是STC89C52單片機。中央處理器(CPU)是整個單片機的核心部件,是擁有8微數(shù)據(jù)處理能的處理器,能夠處理8位組成的代碼和數(shù)據(jù),CPU起到一個大腦的作用,負責指揮和調(diào)度系統(tǒng)的各個單元協(xié)調(diào)工作。芯片內(nèi)部有兩個16位的可編程定時/計數(shù)器,以實現(xiàn)定時或計數(shù)產(chǎn)生中斷用于控制程序轉(zhuǎn)向。片上共有4組8位I/O口(P0、P1、P2或P3),用于對外部數(shù)據(jù)的傳輸。具備較完善的中斷功能,有兩個外中斷、兩個定時/計數(shù)器中斷和一個串行中斷,可滿足不同的控制要求,并具有2級的優(yōu)先級別選擇。 
圖3-4 STC89C52管腳分布 Fig.3-4 STC89c52Pin diagram
而STC89C52各個引腳的作用與介紹: - VCC是供電電壓;
- GND是接地;
- P0口是一個雙向I/O口,每個引腳均可以吸收8TLL電流,當P1口的引腳在第一次被置為高電平的時候表示為高阻輸入。P0能夠可以與外部存儲器相連接,并且充當高8位地址或者數(shù)據(jù)。使用FLASH編程的時候,它作為程序燒寫口,也就是通過P1口可以把程序?qū)戇M單片機中。
- P2口是一個雙向I/O口,并且內(nèi)部漏極上拉,P2口 可以作為緩沖器接受,可以輸出P0口一半的電流,當P2口被寫1的時候,該管教被上拉到高電平,表示當前為輸入狀態(tài)。當作為輸入時,其電平被外設(shè)拉低,將電流輸出。這是由于內(nèi)部被上拉的緣故。
- P3口是一個雙向I/O口,并且內(nèi)部漏極上拉,P2口 可以作為緩沖器接受,可以輸出P0口一半的電流,當P3口被寫1的時候,該管教被上拉到高電平,表示當前為輸入狀態(tài)。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 P3口也可作為下載端口等一些特殊口。
總體來說,STC89C52是一款功能強大的單片機,它為許多控制系統(tǒng)提供了靈活,成本更低的解決方案。本次設(shè)計之所以采用STC89C51單片機主要是想應(yīng)用STC89C52的外部中斷和定時器中斷等片上自帶的外部資源,從而使設(shè)計更容易。
3.2.2 中斷系統(tǒng)
中斷是處理器處理外部突發(fā)事件的一個重要技術(shù)。它能使處理器在運行過程中對外部事件發(fā)出的中斷請求及時地進行處理,處理完成后又立即返回斷點,繼續(xù)進行處理器原來的工作。觸發(fā)中斷的事件和原因可以被稱為中斷源。根據(jù)中斷的的不同來源,可以把中斷的種類分為軟硬件中斷,而硬件的中斷又可以分為由外部事件和內(nèi)部事件觸發(fā)的中斷兩類。 外部中斷一般是指由外部事件觸發(fā)的,如:鍵盤,定時器,ADC等。外部中斷是可以屏蔽的中斷,也就是說,利用中斷控制器可以屏蔽這些外部設(shè)備的中斷請求。中斷是各個設(shè)計系統(tǒng)中不可缺少的一個功能。 3.2.3定時器
在本設(shè)計中采用的是51定時器,通過在學(xué)校的學(xué)習和查閱相關(guān)的資料,可以知道51定時器操作較為簡單。其工作原理為:單片機包含兩個定時器,這兩個定時器也叫計數(shù)器,它們都可以進行編程控制,它們工作在四種工作方式,通過寫控制字和相關(guān)寄存器可以選擇器工作在不同的工作方式。 具體的要求是:定時器0的控制寄存器TL0(低8位)和 TH0(高8位)構(gòu)成,定時器1的控制寄存器TL1(低8位)和TH1(高8位)構(gòu)成。通過改變相關(guān)寄存器的值可以使他們工作在不同的方式,TCON則用于定時器的啟停,同時還兼顧溢出標志等功能。程序開始時需對這些寄存器進行初始化,然后才能控制這些寄存器。
3.2.4控制系統(tǒng)電路設(shè)計
如圖3-5所示為系統(tǒng)控制電路系統(tǒng)電路原理圖。是通過C45,S1,R22組成而成的復(fù)位電路,由相關(guān)的資料可以知道51單片機為高電平復(fù)位,單片機上電時,電容C45和R22組成的RC電路中電容緩慢充電,使RST端保持一個幾個微秒的高電平,使單片機上電復(fù)位,當電容C45充滿電后RST腳電平通過下拉電阻將電平拉低為零,單片機開始進入運行狀態(tài),復(fù)位完成。當單片機在運行的過中,通過按下按鍵S1也可以形成一個高電平狀態(tài),單片機手動復(fù)位。 
圖3-5復(fù)位電路 Fig.3-5 Reset circuit 電路中為了計時方便計算,本設(shè)計的晶振選用12MHz無源外部晶振。配合兩個起振電容C2,C3。形成晶體諧振電路為單片機提供一個12MHz的穩(wěn)定的時鐘源。為了方便起振,起振電容選用22pF。電路圖如圖3-6所示 
圖3-6 晶振電路 Fig.3-6 Crystal oscillator circuit 單片機的原理圖如圖3-6所示,在本設(shè)計中使用51單片機,采用圖3-4、圖3-5、圖3-6所示電路圖與圖3-7構(gòu)成最小系統(tǒng),。  圖3-7 STC89C52單片機最小系統(tǒng) Fig.3-7 STC89C52 Single chip microcomputer 3.3. 顯示電路設(shè)計
在本設(shè)計中使用LCD1602來作為顯示器,LCD1602能夠同時顯示16x02即32個字符,也就是2行16列。如圖3-8所示。LCD1602采用的是5V供電,在一些基礎(chǔ)的設(shè)計和實驗室操作中都有比較多的應(yīng)用。

圖3-8 LCD1602液晶 Fig.3-8 LCD1602 Liquid crystal
在PROPEUS軟件上的LCD1602電路圖設(shè)計如圖3-9所示: 
圖3-9 LCD1602電路設(shè)計 Fig.3-9 LCD1602 circuit design 3.4 報警電路設(shè)計
在本設(shè)計中,顯然沒有要求有報警電路,但是平時我們的洗衣機出于安全考慮都會加入報警電路,我們平時也應(yīng)該有留意到當洗衣機完成洗衣的時候,洗衣機會提示洗衣完成,當脫水時翻開蓋的時候,洗衣機也會報警警示用戶小心,所以為了更加完善本設(shè)計的系統(tǒng),使設(shè)計更有實用性。在設(shè)計中加入了蜂鳴報警器。具體的設(shè)計如圖3-10所示,此電路中的蜂鳴器是有源蜂鳴器,在本設(shè)計中由于仿真的時候沒有三極管可以達到蜂鳴器的驅(qū)動要求,所以在仿真處理的時候,直接使用單片機的引腳來驅(qū)動蜂鳴器,而在實際的電路中,并需通過一個三極管的電流放大作用才能驅(qū)動蜂鳴器,所以在實際電路中,為了減小單片機的負擔,所以,采用PNP的三極管來驅(qū)動蜂鳴器。 
圖3-10 報警電路 Fig.3-10 The alarm circuit 如圖3-10所示,蜂鳴器選用5V的,驅(qū)動蜂鳴器需要大約100mA的電流,也就是說驅(qū)動蜂鳴器的三極管的集電極電流為Ic=100mA。三極管選用直流放大系數(shù)為100的9014,根據(jù)Ic=βIb,可計算得三極管基極電流Ib=1mA,而Vbe=0.7V,又由于光耦中的光電三極管的集電極、發(fā)射極飽和壓降Vces=0.3V,所以基極的限流電阻上的壓降為(5-Vces-Vbe)=4V,4V/0.001A=4KΩ,由于沒有標稱值為4KΩ的電阻,所以選擇4.7KΩ的。電路中的發(fā)光二極管用來表示當前設(shè)備處于運行狀態(tài)。而電路中的電阻均用來限流,保護后級的三極管和發(fā)光二極管的正常工作。
3.5指示燈電路設(shè)計
本設(shè)計要求在不同的工作狀態(tài)的時候要有不同的指示燈,所以在設(shè)計指示燈電路中,通過用三個LED發(fā)光二極管來表示系統(tǒng)當前的運行狀態(tài):分別為:脫水,漂洗,洗滌三個狀態(tài),根據(jù)當前電機運行的時長,不停的切換當前的電機運行狀態(tài),LED也不斷的更替閃爍,其原理圖3-11所示。 
圖3-11 洗衣機運行狀態(tài)指示燈 Fig.3-11 Washing machine operation status indication lamp
3.6鍵盤電路設(shè)計
在這一個設(shè)計中使用的鍵盤電路是1 4鍵盤電路,鍵盤在電路中實現(xiàn)的功能是:模式選擇、啟動暫停、模擬洗衣機翻蓋、確定按鍵等。在本設(shè)計中采用上拉電路的方式構(gòu)建鍵盤電路,如圖3-11示,采用的是1K電阻上拉,使按鍵按下時輸出低電平,按鍵彈起時輸出高電平,從而實現(xiàn)按鍵對應(yīng)的功能。 
圖3-11鍵盤電路設(shè)計 Fig 3-11 keyboard circuit design 3.7電源電路設(shè)計本設(shè)計中系統(tǒng)供電電源為5V,由于單片機都屬對電源的紋波要求較高,并且LCD、蜂鳴器等等部件使用的都是5V供電,所以系統(tǒng)供電采用線性電源。系統(tǒng)電源電路如圖3-12所示。

圖3-12系統(tǒng)電源電路 Fig.3-12 The system power supply circuit 如圖3-12示,所接電源為220V交流電。通過工頻變壓器將電壓降壓到9V后,整流濾波為直流電,然后再經(jīng)過5V的三端穩(wěn)壓器將電壓穩(wěn)定為5V的直流電壓輸出為信號調(diào)理電路,單片機電路等整個系統(tǒng)供電。電路圖的原理如下,220V交流電經(jīng)過線性變壓器T1變壓后轉(zhuǎn)換成一個峰值比較小的交流信號,通過整流橋后,交流小信號變換成一個脈動的直流信號,經(jīng)過后級的電容C14和C11的濾波,信號變換成一個脈動很小的直流信號,通過5V的穩(wěn)壓器構(gòu)成的穩(wěn)壓電路后,輸出5V的直流電壓,后級接兩個電容用于穩(wěn)壓以及減少輸出電壓的的脈動。建立起這個一個系統(tǒng)供電電源后,便可以向運放、單片機、液晶、鍵盤等等供應(yīng)電源,使他們能夠正常的工作。 1
4.系統(tǒng)軟件設(shè)計4.1 軟件開發(fā)環(huán)境介紹在這一次的設(shè)計中,在軟件部分使用uVision4軟件進行程序的編寫,uVision4使用起來比較簡單,操作也相對較為方便,比起老式的c語言編程軟件更有效率。該軟件集成了業(yè)內(nèi)最領(lǐng)先的技術(shù)。Keil software的8051開發(fā)工具提供以下程序,可以用它們來編譯C程序代碼,匯編源程序,連接和重定位目標文件和庫文件,創(chuàng)建HEX文件以及調(diào)試目標程序。 4.2 C語言介紹
在這個系統(tǒng)設(shè)計中,利用的是c語言編寫程序。c語言在電子工程,計算機工程等等方面是至關(guān)重要的。C語言是人與計算機之間進行交互的、面向過程的一門高級設(shè)計語言。它的層次清晰,便于初學(xué)者組織程序,易于調(diào)試和維護,語言簡潔,使用方便靈活。c語言還可以直接訪問內(nèi)存地址,能進行位操作等等的特點。由于c語言可以對硬件進行編程操作,因此,它既有高級語言的功能,同時也有低級語言的優(yōu)勢。不僅可用于系統(tǒng)軟件的開發(fā),同時也適用于應(yīng)用軟件的開發(fā)。所以本次設(shè)計采用的是c語言編程。
4.3 軟件總體設(shè)計
本設(shè)計的軟件設(shè)計主要包括主程序,液晶顯示,鍵盤掃描,中斷程序,電機控制程序等五個模塊的程序。其中主程序主要完成的是開機界面的顯示,以及各個模塊的初始化,并且中斷程序的初始化。 在KEIL工程中編程時,為了讓程序的可讀性變強,我們一般講各個模塊化程序都建立一個C文件來寫相關(guān)的驅(qū)動子程序,然后給每一個子程序的C文件配備一個H文件,用來生命C文件里面所定義的驅(qū)動函數(shù),并且兩個文件的名字要一樣。當要將某一個C文件的函數(shù)調(diào)用到別的C文件中的時候,那么就要在要調(diào)用其他C文件里的C文件的里面加上調(diào)用對應(yīng)C文件的H文件,用來聲明,例如#include <*.h>。
4.3.1系統(tǒng)主程序設(shè)計系統(tǒng)的主程序主要的任務(wù)是要完成各個模塊的初始化,對于本設(shè)計的模塊包括有液晶顯示程序的初始化、延時程序的初始化、鍵盤掃描程序的初始化、電機啟動程序的初始化等等。并且定義各種變量。起到本設(shè)計的程序基礎(chǔ)的作用。可以實現(xiàn)標準模式、快速模式、脫水模式、并有啟動暫停功能、翻蓋模擬功能等等?梢哉{(diào)用各個子程序。主程序的具體實現(xiàn)的功能可以看到附錄中的程序代碼。要其程序流程圖如圖4-1所示。 
圖4-1 主程序流程圖 Fig.4-1 The main program flow chart
主程序中的具體程序?qū)崿F(xiàn)的幾個主要的功能: 這一段程序是定義顯示器的初始值,具體如下:如果模式選擇完畢,再按確定按鍵,程序就會跳到對應(yīng)的模式的程序運行。delay_10ms(10); 再定義LCD顯示,LCD_write_com(0X0C); LCD_clear(); key_flag=key_scan(); LCD_write_str(4,0,"00: : "); if(c==0)LCD_write_str(1,1,"Standard mode"); if(c==5)LCD_write_str(3,1,"fast mode"); if(c==10)LCD_write_str(1,1,"Dehydrate mode"); while(1) }。 如圖4-2所示,為LCD液晶顯示的初始化操作。 
圖4-2 LCD初始化流程框圖 Fig 4-2 LCD initialization flow chart 下面這一段分別表示的是啟動暫停功能,在運行時只要按下了暫停按鍵,電機就會暫停運行。 {key_flag=key_scan(); if(key_flag==UP){delay_ms(20); while(key_flag!=UP) key_flag = key_scan();temp1=~temp1;temp=!temp;buzzer_flag=temp;if(temp1==1){if(key_flag==DOWN) {delay_ms(20); while(key_flag!=DOWN) key_flag =key_scan(); buzzer_flag=!buzzer_flag; temp=0;} } 這個表示的是在脫水時,如果翻蓋電機就暫停運行的程序,如圖4-3翻蓋模擬流程圖所示,if(buzzer_flag==1){{motor_stop();buzzer=!buzzer;delay_10ms(10);}}if(temp1==1){if(temp2==0)motor_stop();}}

圖4-3 翻蓋模擬流程框圖 Fig 4-3 analogue flow diagram 下面的表示的是選擇了對應(yīng)模式的對應(yīng)的程序,分別有標準洗滌、快速洗滌、脫水等。當按鍵選擇了case 0標準洗滌就會執(zhí)行這一段程序,并且設(shè)計在洗滌,漂洗,脫水下對應(yīng)的led等會閃爍,還有設(shè)計了時間的間隔,就是每個過程用的時間等等。case5與case10同理就是當按鍵選擇了快速模式與脫水模式的運行。 如圖4-4所示,當c值為0、5、10的時候分別表示的是在標準模式下的工作,在快速模式下的工作,在脫水模式系的工作等。 
圖4-4 洗衣機模式框圖 Fig 4-4 washing machine model diagram 每一個模式下都有不同的工作時間與對應(yīng)的led等的顯示,用當c=0的標準模式下的程序為例子,標準洗滌12分鐘再漂洗6分鐘,漂洗兩次就脫水3分鐘。程序如下switch (c){case 0: { if(time_minite<12) {temp2=0;TR0=1;led3=0;led1=!led1; delay_10ms(10);} if((time_minite>=12)&&(time_minite<15)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led1=0;led3=!led3;delay_10ms(10);} if((time_minite==15)&&(time_second<8)) {temp1=0;temp2=0;} if((time_minite>=15)&&(time_minite<21)) {led3=0;led1=0;led2=!led2; delay_10ms(10);} if((time_minite>=21)&&(time_minite<24)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led2=0;led3=!led3;delay_10ms(10);} if((time_minite==24)&&(time_second<8)) {temp1=0;temp2=0;} if((time_minite>=24)&&(time_minite<30)) {led3=0;led1=0;led2=!led2; delay_10ms(10);} if((time_minite>=30)&&(time_minite<33)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led2=0;led3=!led3;delay_10ms(10);} if((time_minite>=33)) {TR0=0;motor_stop();buzzer=!buzzer;delay_10ms(10);} break; } 4.3.2系統(tǒng)中斷程序設(shè)計
系統(tǒng)要實時的產(chǎn)生占空比可調(diào)的PWM,并且做出判斷做出動作,為了滿足實時性和可靠性,增加程序的可讀性,在程序中使用定時器中斷來來產(chǎn)生PWM,并且使用另外一個定時器來進行計時,按鍵判斷等操作。 為了方便運算,本設(shè)計中定時器工作于方式1,采用16位定時的方式。計數(shù)最大值為65535。定時器初值計算方法為:由于選用的16位定時法。當系統(tǒng)開啟中斷的時候,計數(shù)器每次溢出的時候,系統(tǒng)進入到中斷,別且做出相應(yīng)的操作,系統(tǒng)每隔50ms進入一次中斷,進行倒計時,并且進行按鍵掃描,PWM產(chǎn)生,則計數(shù)器的設(shè)置如下: TH0 = (65536-100)/256 TL0 = (65536-100)%256 TH1 = (65536-50000)/256 TL1 = (65536-50000)%256 每當系統(tǒng)運行到要進行下一個運行時系統(tǒng)開啟中斷,系統(tǒng)進入到系統(tǒng)中斷中,并且對系統(tǒng)進行相應(yīng)的操作。中斷程序的流程圖如圖4-5,4-6所示。 
圖4-5中斷服務(wù)0子程序流程圖 Fig 4-5 0 Interrupt service subroutine flow chart 
圖4-6 中斷服務(wù)1子程序流程圖 Fig 4-6 1 Interrupt service subroutine flow chart 4.3.3 鍵盤掃描程序對于鍵盤來說,分為編碼鍵盤和非編碼鍵盤,單片機一般使用的事編碼鍵盤,對于系統(tǒng)來說鍵盤的掃描程序一般分為以下幾步:掃描,延時消抖,賦予功能,檢測松開四個步驟。他的驅(qū)動程序流程圖如圖4-7所示。 本系統(tǒng)采用的是4×1的鍵盤,具體的按鍵流程如下圖所示。 
圖4-7 鍵盤掃描程序流程圖 Fig 4-7 keyboard scanning program flow chart 由圖4-7可知在掃描按鍵程序是的流程,具體的程序如下:開始定義鍵盤掃描程序unsigned char key_scan(void),按鍵掃描函數(shù),返回掃描的鍵值。{ unsigned char key_value = 0; P2 = 0X1F; key_value = (P2&0X0f); key_value = key_value^0X0f; 如果有按鍵按下,求異或 if(key_value { delay_10ms(10); 延時去抖 key_value = (P2&0X0f); 延時之后再求異或 key_value = key_value^0X0f; if(key_value) { return key_value; 返回鍵值} }else return 0;} 通過這一段程序就能夠?qū)崿F(xiàn)對鍵盤的掃描。
4.3.4 電機驅(qū)動程序設(shè)計
電機驅(qū)動程序是用專用驅(qū)動芯片L298來驅(qū)動,當給出控制L298的驅(qū)動信號不一樣的時候,電機正轉(zhuǎn)或者反轉(zhuǎn),當給定控制L298的驅(qū)動信號同時為零的時候點擊停止。同時外加電機使能引腳,當使能引腳為0的時候,電機停止運行。控制策略如公式(1)所示?刂平M合方式如表4-1所示。 (1) 表4-1 電機運行狀態(tài)與控制信號關(guān)系表 Tab 4-1 motor running state and control signal relationship table
因為本個設(shè)計使用的是L298作為啟動芯片,使用電機只要用兩個信號就可以開始電機的正轉(zhuǎn)、反轉(zhuǎn)、停止、電機全速轉(zhuǎn)動等等各個不同的運行。對于電機的占空比pwm都是有不同的數(shù)據(jù)設(shè)計的,因為對應(yīng)于不同的電機運行模式,下面就對電機的程序代碼分別實現(xiàn)的功能描述一下,motor_forward (void) if(c==0) PWM_VALUE=70; else PWM_VALUE=90; motor1=0;表示的是電機在正轉(zhuǎn)的是時候的轉(zhuǎn)速;通過void motor_back (void) { if(c==0) PWM_VALUE=30; else PWM_VALUE=10; motor1=1; } 表示的是電機在反轉(zhuǎn)的時候的轉(zhuǎn)速;通過void motor_stop(void){ PWM_VALUE=0; motor0=0; motor1=0; }讓電機停止運行、通過void motor_full(void) { PWM_VALUE=100; motor1=0; }讓電機全速運行。這樣就能夠滿足在本次設(shè)計中對電機運行的各個要求。 如圖4-8所示,當電機在標準模式、快速模式時,通過對變量b的控制,就可以實現(xiàn)電機正轉(zhuǎn)4s,停2s,反轉(zhuǎn)4s的功能要求。 
圖4-8電機運行程序框圖 Figure 4-8 motor running program diagram 1
5.系統(tǒng)仿真及結(jié)果分析5.1 硬件實物
在經(jīng)過前面的軟件設(shè)計和硬件設(shè)計后,就可以用protel軟件繪制原理圖和PCB ,再根據(jù)畫好的pcb圖焊接電路板,如圖5-1所示實物圖就是本設(shè)計的實物圖。在實物圖中包含單片機最小系統(tǒng),人機交互電路,電機驅(qū)動電路,狀態(tài)顯示電路。 
圖5-1 實物圖 Fig 5-1 Material object
5.2系統(tǒng)仿真環(huán)境介紹
本設(shè)計的仿真軟件用的是PROTEUS,從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計,真正實現(xiàn)了從概念到產(chǎn)品的完整設(shè)計。是目前世界上唯一將電路仿真軟件、PCB設(shè)計軟件和虛擬模型仿真軟件三合一的設(shè)計平臺,其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等等,2010年又增加了Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。因為在校期間,同Proteus的學(xué)習比較全面,而且軟件操作起來也比較簡單,所以在設(shè)計時就采用了這一個軟件作為本系統(tǒng)的仿真軟件。
5.3 系統(tǒng)仿真結(jié)果分析
通過完整的硬件設(shè)計和軟件設(shè)計后,可以通過Proteus軟件來連接仿真全自動洗衣機控制系統(tǒng),具體的連接線路可見附錄中的全自動洗衣機控制系統(tǒng)原理圖。在整個系統(tǒng)中都能夠通過液晶顯示當前運行狀態(tài),和通過鍵盤來設(shè)置當前運行的狀態(tài),如圖5-2,5-3,5-4,5-5,5-6所示。 
圖5-2 開始界面 圖5-3 模式選擇界面 Fig 5-2 interface Fig 5-3 mode selection interface 
圖5-4 標準模式界面 圖5-5 快速模式界面 Fig 5-4 standard interface Fig 5-5 fast interface 
圖5-6 脫水模式界面 Fig 5-6 dehdydrate interface 通過仿真可以得出,當通過圖5-1到圖5-6所示的設(shè)定方法設(shè)置洗衣機工作在不同的運行狀態(tài),并且系統(tǒng)的工作狀態(tài)也受到時間的設(shè)定,當時間滿足要求后,洗衣機自動進入到下一個狀態(tài)來運行。就是說分別在標準模式、快速模式、脫水模式下都能夠按要求完成。
5.4仿真遇到的問題
在整個系統(tǒng)的仿真過程中遇到了各種問題,但是經(jīng)過自己的努力,利用各種方法也克服了這些困難。 首先,在仿真的時候,出現(xiàn)驅(qū)動LCD1602的問題,由于在PROTUSE里面是理想模型,而理想模型對于時間特別敏感,在實物上調(diào)試好的程序,在仿真里面,LCD1602總是閃爍,顯示不穩(wěn)定,最后通過協(xié)調(diào)實物上控制時間和仿真里面的控制時間,最后實物和仿真都可以比較好的顯示。 其次:在使用PROTUSE仿真軟件的時候,在構(gòu)建基于L298的電機驅(qū)動電路的時候,在給這一款專用電機驅(qū)動芯片配置地的時候是直接將地的符號拉倒對應(yīng)的引腳,沒有通過導(dǎo)線連接,從而在正確的功能下,電機不能夠運行。通過我一天的努力,從排查程序錯誤到懷疑L298使用方法錯誤等過程,終于在重新構(gòu)建仿真電路的時候發(fā)現(xiàn)了這一問題,從而順利解決了問題,自己也學(xué)習到了找問題,解決問題的方法。 最后:在整體仿真的時候,由于中斷時間時50mS一次,但是我放在中斷里面的程序運行時間遠遠大于中斷時間,所以程序運行的不正常,但有的時候也運行正常,通過自己查閱相關(guān)的資料,當我進入中斷的時候我屏蔽了中斷,從而保證整個中斷程序的執(zhí)行,并且將部分程序拿到中斷程序以外執(zhí)行,從而順利解決了這一問題。 總之,在整個仿真的過程中,我遇到了各種各樣的問題,但是通過自己的努力,我克服了各種問題和困難,順利完成了系統(tǒng)的仿真。
1
結(jié)束語
這一次設(shè)計使我收獲了很多,特別是之前沒有接觸到太多硬件方面的知識,然而在這一次設(shè)計中通過查詢一些資料和尋求老師,同學(xué)的幫助,使我初步的了解了這次設(shè)計的一些知識,也使我認識到了自己的不足。在大學(xué)期間都比較偏重理論的學(xué)習,而沒有太多注重實踐操作,所以在設(shè)計的過程中總是會遇到各種問題。但是最終在自己的努力下,還是順利的完成了這一次的設(shè)計。 通過這一次設(shè)計,我覺得我能夠把理論知識與實踐相結(jié)合。設(shè)計都是一個人一個項目,通過自己的獨立思考和分析,解決設(shè)計中的各種難題,很好的鍛煉了自己獨立解決問題和分析問題的能力。在做設(shè)計的時候,都是幾個人一組,遇到問題都是大家一起解決的,或者是自己僅僅只是做了自己會的那一部分,這樣使自己的知識體系很不完整,不能夠全面地解決問題。而這一次的設(shè)計,從方案的選擇,元器件的選擇到驅(qū)動程序的設(shè)計,原理圖的繪制都是自己獨立完成的,感覺對自己的設(shè)計的整個過程有很深的了解。 雖然這一次的設(shè)計是完成了,但是通過自己的分析,深刻的認識到,全自動洗衣機的設(shè)計還可以實現(xiàn)更多的功能,例如我在設(shè)計中加入了蜂鳴報警器,為這一個系統(tǒng)提供了提醒的功能。還可以有其他方面的改進,又例如在電機驅(qū)動上,可以改用其它的電機控制器件來控制電機,使其可以實現(xiàn)電機調(diào)速等等的功能。雖然本次設(shè)計中基本完成了任務(wù),但是如果用在實際應(yīng)用中,還是有一定的問題的,在下一步的設(shè)計中,可以針對這些問題進行修改,使系統(tǒng)更加智能化。使其可以更接近生活上要求的智能洗衣機的功能。 總而言之:設(shè)計在很大程度上提高了我的分析和解決問題的能力,為我以后的就業(yè)打下了十分堅實的基礎(chǔ)。
致 謝經(jīng)過近半年的學(xué)習和一直以來的努力,設(shè)計即將進入尾聲。在本次設(shè)計中我有因為失敗而感到沮喪過,有因為成功而喜悅過,但是我還是十分享受這一次設(shè)計。在這次設(shè)計中我得到了老師、同學(xué)、家人等等的支持與幫助。我首先要衷心感謝我的指導(dǎo)老師,老師在本次設(shè)計中作為我的指導(dǎo)老師,她淵博的學(xué)識、嚴謹細致的治學(xué)作風,實事求是的處世態(tài)度深深地影響著我,并將使我終生受益。在我整個設(shè)計過程中,老師為我提供了設(shè)計思路,傳授我設(shè)計相關(guān)的專業(yè)知識。正是老師的悉心指導(dǎo)和熱心教誨才使我能順利完成此次設(shè)計。這些都在本次設(shè)計中為我?guī)砹撕艽蟮膸椭?/p> 在本次設(shè)計的過程中,還得到同學(xué)們的幫助。他們一直都幫我答疑解難。為我提供豐富的學(xué)習資料,給我的設(shè)計提供了很多參考和寶貴的意見。正是有了他們的無私幫助我才能一步步的克服設(shè)計中遇到的種種技術(shù)難題。 另外感謝我的父母,你們一直都默默的在我身后支持我,對我關(guān)懷備至。正是你們的關(guān)心和支持讓我順利完成學(xué)業(yè)。感謝全體同學(xué)。在這即將畢業(yè)的日子,與你們相處的每一天都是那樣的珍惜。 最后感謝和評閱的各位老師。感謝你們對我的設(shè)計進行評審,感謝你們對我大學(xué)學(xué)習的檢測。讓我更好地完成大學(xué)的學(xué)習生活。
附錄系統(tǒng)電路圖
程序代碼清單- #include <REG52.H>
- #include "lm1602.h"
- #include "delay.h"
- #include <key_scan.h>
- #include <intrins.h>
- #include <math.h>
- #include "motor.h" //這一部分是調(diào)用各部分的程序,例如lm1602是液晶程序,delay是延時程序,key-scan是鍵盤程序等等。
-
- sbit buzzer=P2^4;
- sbit led1=P1^0;
- sbit led2=P1^1;
- sbit led3=P1^2; //這部分是定義外設(shè),對應(yīng)的就是三個led燈
- unsigned char buzzer_flag=0; (這里是蜂鳴器標志位)
- unsigned char PWM_count=0;
- extern unsigned char PWM_VALUE;( PWM是占空比,而且是從電機的子程序引用過來的)
- unsigned char value=0;
- unsigned char a=0,b=0,c=0;
- unsigned char time_count=0;
- unsigned char time_second=0;time_minite=0;
- unsigned char key_flag=0;
- unsigned char temp1=0,temp2=0; //這部分是定義變量
-
- 程序設(shè)計兩個定時器,下面的是定時器一的程序
- void InitialTime1 (void)
- {
- TMOD |= 0x11;//16計數(shù)器
- TH1=(65535-100)/256;
- TL1=(65535-100)%256;
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
-
- }
- void InitialIt (void)
- {
- ET1=1;
- TR1=1;
- ET0=1;
- // TR0=1;
- EA=1;
- } //定時器的初始化及其定義
-
-
- 下面的是主程序
- main()
- {
- InitialTime1();
- InitialIt();
- LCD_init(); //主程序初始化
- motor_stop();
- led1=0;
- led2=0;
- led3=0;
- LCD_write_str(4,0,"welcome");
- LCD_clear();
- LCD_write_str(0,0,"Ok->Set System");
- LCD_write_str(0,1,"Back->Run System");
- while(1)
- {
- key_flag=key_scan();
- if(key_flag==OK)
- {
- while(key_flag==OK)key_flag=key_scan();
- LCD_clear();
- LCD_write_str(4,0,"00: : ");
- LCD_write_str(0,1,"1sta 2fas 3def");
- delay_10ms(10);
- Cursor_GotoXY(0,1);
- delay_10ms(10);
- LCD_write_com(0X0F);
- key_flag=key_scan(); 這一部分是LCD顯示器的顯示,就是各種模式的選擇
-
- while(key_flag!=OK)
- {
- key_flag=key_scan();
- if(key_flag==BACK) {while(key_flag!=BACK) key_flag = key_scan();c=c+5;if(c>10)c=0;} //定義按鍵1,就是設(shè)計實物中最左邊的按鍵,通過這一個按鍵可以選擇不同的模式,分別有標準洗滌、快速洗滌、脫水模式等。
- delay_10ms(10);
- Cursor_GotoXY(c,1);
- } //如果模式選擇完畢,再按確定按鍵,程序就會跳到對應(yīng)的模式的程序運行
- delay_10ms(10);
- LCD_write_com(0X0C);
- LCD_clear();
- key_flag=key_scan();
- LCD_write_str(4,0,"00: : ");
- if(c==0)LCD_write_str(1,1,"Standard mode");
- if(c==5)LCD_write_str(3,1,"fast mode");
- if(c==10)LCD_write_str(1,1,"Dehydrate mode");
-
- while(1)
- {
- 下面這一段分別表示的是啟動暫停同翻蓋模擬的功能,在運行時只要按下了暫停按鍵,電機就會暫停運行。而在脫水模式下,模擬翻蓋脫水就會暫停等等。
- key_flag=key_scan();
- if(key_flag==UP){delay_ms(20);while(key_flag!=UP) key_flag = key_scan();temp1=~temp1;temp=!temp;buzzer_flag=temp;}
- if(temp1==1){ if(key_flag==DOWN) {delay_ms(20);while(key_flag!=DOWN) key_flag = key_scan();buzzer_flag=!buzzer_flag;temp=0;} }
- 下面的表示的是選擇了對應(yīng)模式的對應(yīng)的程序,分別有標準洗滌、快速洗滌、脫水等。
- switch (c)
- {
- case 0: {
- if(time_minite<12) {temp2=0;TR0=1;led3=0;led1=!led1; delay_10ms(10);}
- if((time_minite>=12)&&(time_minite<15)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led1=0;led3=!led3;delay_10ms(10);}
- if((time_minite==15)&&(time_second<8)) {temp1=0;temp2=0;}
- if((time_minite>=15)&&(time_minite<21)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}
- if((time_minite>=21)&&(time_minite<24)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led2=0;led3=!led3;delay_10ms(10);}
- if((time_minite==24)&&(time_second<8)) {temp1=0;temp2=0;}
- if((time_minite>=24)&&(time_minite<30)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}
- if((time_minite>=30)&&(time_minite<33)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led2=0;led3=!led3;delay_10ms(10);}
- if((time_minite>=33)) {TR0=0;motor_stop();buzzer=!buzzer;delay_10ms(10);}
- break;
- } //case 0 是當按鍵選擇了標準洗滌就會執(zhí)行這一段程序,并且設(shè)計在洗滌,漂洗,脫水下對應(yīng)的led等會閃爍,還有設(shè)計了時間的間隔,就是每個過程用的時間等等。
-
- case 5: {
- if(time_minite<7) {temp2=0;TR0=1;led3=0;led1=!led1; delay_10ms(10);}
- if((time_minite>=7)&&(time_minite<10)) {temp1=1;temp2=1;if((buzzer_flag==0)&&(temp==0))motor_full();led1=0;led3=!led3;delay_10ms(10);}
- if((time_minite==10)&&(time_second<8)) {temp1=0;temp2=0;}
- if((time_minite>=10)&&(time_minite<13)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}
- if((time_minite>=13)&&(time_minite<16)) {temp1=1;temp2=1;if((buzzer_flag==0)&&(temp==0))motor_full();led2=0;led3=!led3;delay_10ms(10);}
- if((time_minite==16)&&(time_second<8)) {temp1=0;temp2=0;}
- if((time_minite>=16)&&(time_minite<19)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}
- if((time_minite>=19)&&(time_minite<22)) {temp1=1;temp2=1;if((buzzer_flag==0)&&(temp==0))motor_full();led2=0;led3=!led3;delay_10ms(10);}
- if(time_minite>=22) {TR0=0;motor_stop();buzzer=!buzzer;delay_10ms(10);}
- break;
- break;
- } //當選擇了快速模式,程序就會執(zhí)行這一部分的程序
-
- case 10: {
- temp1=1;
- if(time_minite<3)
- {
- led3=!led3; //對應(yīng)的led燈閃爍
- delay_10ms(10);
- TR0=1; //這個是定時器
- temp1=1;
- temp2=1;
- if((buzzer_flag==0)&&(temp==0))
- motor_full();
- else motor_stop();
-
- }
- else {motor_stop();TR0=0;}
- break;
- } //這一段是脫水模式的程序
- }
- if(buzzer_flag==1) {{motor_stop();buzzer=!buzzer;delay_10ms(10);}}
- if(temp1==1){if(temp2==0)motor_stop();}
- }
- }
- }
-
- }
- void time0() interrupt 1 //定時器0
- {
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256; //這里表示的是50毫秒進行中斷
- a++;
- if(a==20)
- {
- a=0;
- if(temp1==0) //這里temp1為0是表示的是在標準模式下和快速模式下的功能
- {
- b++;
- if(b<4)motor_forward();
- if(b==4) motor_stop();
- if(b==6) motor_back();
- if(b==10) motor_stop();
- if(b==12) b=0; } //這一部分表示的是在標準模式和在快速模式下的洗滌、漂洗時,電機正轉(zhuǎn)4s,停2s,再反轉(zhuǎn)4s的一個程序
- else{if(temp2==0)motor_stop();} //如果temp1不滿足上面的要求就會執(zhí)行這段程序,程序就會判斷temp2是否為0,如果是的就表示按了stop按鍵,模擬的就是在脫水模式下洗衣機翻蓋的操作,電機就會停止。
- time_count++;
- if(time_count==60)
- {
- time_count=0;
- time_second=0;
- time_minite++;
- LCD_clear();
- LCD_write_str(4,0,"00: : ");
- if(c==0)LCD_write_str(1,1,"Standard mode");
- if(c==5)LCD_write_str(3,1,"fast mode");
- if(c==10)LCD_write_str(1,1,"Dehydrate mode");
- }
- else time_second=time_count;
- } //這一段是時間的計數(shù)和對應(yīng)的顯示
- key_flag=key_scan();
- if(key_flag==UP) temp1=!temp1;
- if(temp1==1){ if(key_flag==DOWN) {buzzer_flag=!buzzer_flag;} }
- DIS_UINT(7,0,time_minite);
- DIS_UINT(10,0,time_second);
-
- }
-
- void time1() interrupt 3 //定時器1
- {
- TH1=(65535-100)/256;
- TL1=(65535-100)%256; //這里指的是占空比,定時每100微秒就執(zhí)行中斷
- PWM_count++;
- if(PWM_count==100) PWM_count=0; //pwm的占空比為1k
- if(PWM_count>PWM_VALUE) motor0=0; //可以把pwm的占空比分為0到100的占空比
- else motor0=1;
-
- // key_flag=key_scan();
- // if(key_flag==UP) temp1=!temp1; //表示的是啟動停止的標志位。當按鍵按下,就會暫停運行,再按就會繼續(xù)運行。
- // if(temp1==1){ if(key_flag==DOWN) {buzzer_flag=1;} }
-
- }
-
-
- 電機的程序
- 因為使用的是l298啟動,所以電機只要用兩個信號就可以控制電機的正反轉(zhuǎn)
- #include "motor.h"
- #include "delay.h"
- extern unsigned char c;
- unsigned char PWM_VALUE=0;
-
- void motor_forward(void)
- {
- if(c==0)
- PWM_VALUE=70;
- else
- PWM_VALUE=90;
- motor1=0;
- } //這里表示的是正轉(zhuǎn)
-
- void motor_back(void)
- {
- if(c==0)
- PWM_VALUE=30;
- else
- PWM_VALUE=10;
- motor1=1;
- } //這里表示的是反轉(zhuǎn)
- 正轉(zhuǎn)反轉(zhuǎn)的占空比都有設(shè)定。
-
- void motor_stop(void)
- {
- PWM_VALUE=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
以上的Word格式文檔51黑下載地址:
word文檔.docx
(968.97 KB, 下載次數(shù): 239)
2022-4-23 17:14 上傳
點擊文件名下載附件
|