標(biāo)題: 小白求助!關(guān)于單片機(jī)洗衣機(jī)控制系統(tǒng)的設(shè)計(jì) [打印本頁]
作者: iamkenny 時(shí)間: 2016-12-17 19:00
標(biāo)題: 小白求助!關(guān)于單片機(jī)洗衣機(jī)控制系統(tǒng)的設(shè)計(jì)
小白剛學(xué)單片機(jī)不久 碰到了老師布置這個(gè)題目 感覺毫無頭緒。。 再此求教各位大神!
洗衣機(jī)控制系統(tǒng)設(shè)計(jì)設(shè)計(jì)內(nèi)容:
1、 用直流電機(jī)的轉(zhuǎn)速表征三種不同洗衣方式,弱洗、強(qiáng)洗、漂洗;(20分)
2、 實(shí)現(xiàn)最長10分鐘定時(shí);(20分)
3、 用三個(gè)獨(dú)立按鍵設(shè)置待洗衣物的不同洗滌方式: (40分)
絲質(zhì)衣服: 漂洗 定時(shí)3分鐘
棉質(zhì)衣服:弱洗 2分鐘;強(qiáng)洗 5分鐘;漂洗 3分鐘;
化纖衣服: 強(qiáng)洗 4分鐘;漂洗 2分鐘;
4、 定時(shí)時(shí)間到,蜂鳴器報(bào)警提示。(20分)
作者: angmall 時(shí)間: 2016-12-18 22:22
- // 基于單片機(jī)的洗衣機(jī)的控制系統(tǒng)設(shè)計(jì)
- /*
- 1洗衣機(jī)的功能及設(shè)計(jì)
- 1.1洗衣機(jī)功能要求 洗衣機(jī)的主要工作程序是:洗滌——脫水——漂洗——脫水——漂洗——脫水。上述工作程序中,包含三個(gè)過程,洗滌過程、漂洗過程、脫水過程。
- (1)洗滌過程:放好待洗物,啟動(dòng)開關(guān),進(jìn)水閥通電,向洗衣機(jī)供水,當(dāng)供水達(dá)到預(yù)定水位時(shí),水位開關(guān)接通,進(jìn)水閥斷電關(guān)閉,停止供水。洗滌電動(dòng)機(jī)接通電源,帶動(dòng)波輪(或桶)旋轉(zhuǎn),產(chǎn)生各種形式的水流攪動(dòng)衣物進(jìn)行洗滌。通過電動(dòng)不停的正轉(zhuǎn)、停、反轉(zhuǎn)、反復(fù)循環(huán),形成洗滌水對洗滌物產(chǎn)生強(qiáng)烈的翻滾作用。同時(shí),衣物之間、衣物與四周桶壁之間產(chǎn)生互相摩擦和撞擊力,以次達(dá)到洗滌衣物的目的。 (2)漂洗過程:漂洗的目的在于清除衣物上的洗滌液,因此,漂洗過程與洗滌過程的電器動(dòng)作是完全相同的。
- (3)脫水過程:洗滌或漂洗后,需要對衣物進(jìn)行脫水以便晾干,節(jié)省水資源,所以脫水是洗衣過程中必不可少的環(huán)節(jié)。洗滌或漂洗過程結(jié)束后,電動(dòng)機(jī)停止轉(zhuǎn)動(dòng),排水閥通電,打開排水閥門排水。當(dāng)水位低到一定程度時(shí),滿足安全條件,脫水電動(dòng)機(jī)接通,電機(jī)帶動(dòng)脫水桶高速旋轉(zhuǎn),利用離心力把衣服上的水從桶壁的小眼里甩出。全部洗衣工作完成后,由蜂鳴器發(fā)出音響,表示衣物已洗干凈。
- 1.2洗衣機(jī)硬件電路設(shè)計(jì)
- 1.2.1 洗衣機(jī)總體設(shè)計(jì)框圖
- 橢圓型表示指示燈:從上到下依次為強(qiáng)洗、弱洗、洗滌次數(shù)、洗衣定時(shí)、脫水定時(shí)、洗衣剩余時(shí)間、脫水剩余時(shí)間。 電動(dòng)機(jī)正轉(zhuǎn)為強(qiáng)洗,正反交替轉(zhuǎn)動(dòng)設(shè)定為弱洗,初始設(shè)定的狀態(tài)為強(qiáng)洗,若要選擇弱洗模式需按下增加按鍵,再次按下選擇按鍵,則表示洗滌次數(shù)的指示燈被點(diǎn)亮,選擇增加或減少按鍵對時(shí)間進(jìn)行加減。然后對脫水時(shí)間設(shè)定,最后按下啟動(dòng)鍵,洗衣機(jī)開始工作。
- 1.2.3硬件電路的主要模塊
- 根據(jù)洗衣機(jī)的基本功能,硬件電路設(shè)計(jì)需要考慮:水流強(qiáng)度的問題、洗滌、漂洗、脫水時(shí)間設(shè)定長短的問題、工作時(shí)間或剩余時(shí)間的顯示、工作過程中的暫停、啟動(dòng)、復(fù)位、洗完后的報(bào)警等問題。 采用5l系列單片機(jī)作為控制核心,主要包括功能設(shè)置及控制電路、洗衣機(jī)狀態(tài)顯示及輸出控制電路。主要組成部件有:單片機(jī)、74LSl38譯碼器、ULN2003、指示燈、數(shù)碼管、電動(dòng)機(jī)、蜂鳴器以及按鍵等。
- (1)功能設(shè)置及控制電路
- ①暫停鍵K0,接P3.3,用外部中斷1實(shí)現(xiàn)工作過程的暫停,根據(jù)人的需要可以進(jìn)行手工洗滌; ②水位開關(guān)K1,接P1.O,水位到位時(shí),K1閉合。在進(jìn)水期間,系統(tǒng)不斷檢測K1,當(dāng)檢測到K1閉合就停止進(jìn)水; ③按鍵K2,接P1.6,作為工作過程中的啟動(dòng)鍵;
- ④按鍵K3是洗衣強(qiáng)度選擇鍵,接P3.4,每按一次代表一種強(qiáng)度。分別是標(biāo)準(zhǔn)、弱洗、強(qiáng)洗和自編,由4個(gè)指示燈進(jìn)行顯示; ⑤按鍵K4,接P3.5,對洗衣時(shí)間進(jìn)行設(shè)置,并用數(shù)碼管LEDl和LED2顯示:
- ⑥按鍵K5,接P3.6,對漂洗、脫水次數(shù)進(jìn)行設(shè)置,并用數(shù)碼管LEDI顯示;
- ⑦壓電蜂鳴器接P1.7,作為洗衣時(shí)間到以及故障發(fā)生的報(bào)警器。
- (2)洗衣機(jī)狀態(tài)顯示 74LSl38譯碼器為3—8譯碼器,選用它可以解決I/0口線數(shù)量不足問題。從控制要求可知,洗衣機(jī)的工作模式以及工作程序必須有7中不同的顯示加以區(qū)別。74LSl38譯碼器的輸入端C、B、A分別接P1.3、P1.4、P1.5,輸出端分別與7個(gè)發(fā)光二極管DO--D6的陰極相連,發(fā)光二極管陽極接電源。輸出端YO控制D0“弱洗”指示燈:Y1控制D1“標(biāo)準(zhǔn)洗”指示燈,Y2控制D2“強(qiáng)洗”指示燈,Y3控制D3“自編”指示燈,Y4控制D4“洗衣”指示燈,Y5控制D5“漂洗”指 示燈,Y6控制D6“脫水”指示燈
- (3)輸出控制電路 輸出控制電路由觸發(fā)器電路和相應(yīng)的雙向晶閘管組成�?刂齐姍C(jī)正反轉(zhuǎn)以及進(jìn)水閥和排水閥的開啟和關(guān)閉。通過觸發(fā)器電路和相應(yīng)的雙向晶閘管,電動(dòng)機(jī)的正轉(zhuǎn)和反轉(zhuǎn)用單片機(jī)P1.1和P1.2進(jìn)行控制;進(jìn)水電磁閥和排水電磁閥用單片機(jī)的P3.0和P3.1進(jìn)行控制
- 1.3洗衣機(jī)軟件系統(tǒng)設(shè)計(jì)
- 1.3.1主程序設(shè)計(jì)
- 根據(jù)硬件設(shè)計(jì)要求,控制主程序流程圖如圖所示。洗衣機(jī)通電之后,單片機(jī)上電,首先進(jìn)行程序的初始化,包括定時(shí)器O、外部中斷O、外部中斷l(xiāng)的初始化,以及各參數(shù)初值的設(shè)定。默認(rèn)洗衣強(qiáng)度為“標(biāo)準(zhǔn)洗”,漂洗次數(shù)3次。然后掃描K2、K3、K4、K5鍵的狀態(tài),確定洗衣強(qiáng)度R2、洗衣時(shí)間R3和漂洗次數(shù)R4。洗衣機(jī)處于待命狀態(tài),控制指示燈顯示洗衣強(qiáng)度,液晶顯示預(yù)設(shè)洗衣時(shí)間。當(dāng)發(fā)現(xiàn)啟動(dòng)鍵K2按下,洗衣機(jī)從待命狀態(tài)進(jìn)入工作狀態(tài)。完成進(jìn)水——洗滌——脫水——漂洗的循環(huán)過程。當(dāng)洗衣結(jié)束時(shí),控制蜂鳴器發(fā)聲。
- */
- #include <reg51.h> //各個(gè)引腳功能定義
- sbit key_move_stop = P2^0; //啟動(dòng)、暫停按鍵
- sbit key_wash_dehydration = P2^1; //洗滌、脫水按鍵
- sbit key_water_detection = P3^2; //水位檢測按鍵 外部中斷0
- sbit key_cap_open = P3^3; //機(jī)蓋裝置按鍵 外部中斷1
- sbit LED1 = P0^0; //啟動(dòng)指示燈 sbit LED2 = P0^1; //暫停指示燈
- sbit LED3 = P0^2; //洗滌指示燈 sbit LED4 = P0^3; //脫水指示燈
- sbit LED5 = P0^4; //進(jìn)水閥指示燈 sbit LED6 = P0^5; //排水閥指示燈
- sbit LED7 = P0^6; //水位滿指示燈 sbit LED8 = P0^7; //機(jī)蓋松指示燈
- sbit LED9 = P2^7; //報(bào)警指示燈
- sbit LS138A = P2^2; //數(shù)碼管片選
- sbit LS138B = P2^3; sbit LS138C = P2^4;
- sbit BEEP = P2^6; //蜂鳴器報(bào)警
- sbit PWM = P2^5; //直流電動(dòng)機(jī)
- //共陰數(shù)碼管 0-9 -
- unsigned int code Disp_Tab[] =
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- unsigned int i=0,LedNumVal=0; //數(shù)碼管計(jì)時(shí) 0-9 選擇
- unsigned int lednum = 0; //定時(shí)器0 數(shù)碼管計(jì)時(shí)速率調(diào)控變量
- unsigned int LedOut[3]; //數(shù)碼管計(jì)時(shí)存儲(chǔ)區(qū)
- unsigned char key_s,key_v; //按鍵掃描變量
- static unsigned int m = 0; //啟動(dòng)、暫停鍵計(jì)數(shù)變量
- static unsigned int movenum = 0; //暫停功能變量
- /***********************************************************/
- unsigned char scan_key() //啟動(dòng)/暫停鍵;洗滌/脫水鍵掃描
- {
- unsigned char Key_s; Key_s = 0x00;
- Key_s |= key_wash_dehydration; Key_s <<= 1;
- Key_s |= key_move_stop;
- return Key_s;
- }
- /************************************************************/
- void delay( unsigned int a) //數(shù)碼掃描延時(shí)子程序
- {
- unsigned char b;
- for(; a > 0; a--)
- for(b = 200; b > 0; b--);
- }
- /**********************************************************/
- void delayms( unsigned char ms) //按鍵消抖延時(shí)子程序
- {
- unsigned char k;
- while(ms--)
- {
- for(k = 0; k < 120; k++);
- }
- }
- /***********************************************************/
- void beep() {
- unsigned int n = 0;
- BEEP = 1;LED9 = 1;
- for(; n<6;n++)
- {
- BEEP = 0;LED9 = 0;
- delayms(3000);
- BEEP = 1;LED9 = 1;
- delayms(1000);
- }
- }
- /*************************************************************/
- void led_display_zero() //數(shù)碼管清零并直流電動(dòng)機(jī)停止 蜂鳴器響三下
- {
- beep();
- PWM = 1;
- while(1)
- {
- unsigned int i = 0;
- unsigned int LedNumVal = 0;
- PWM = 1;
- if(key_wash_dehydration ==0) //洗滌后脫水按下鍵跳出
- {
- LED3 =1;
- LED4 =0;
- LED6 =0; break;
- }
-
- LedOut[0]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位帶小數(shù)點(diǎn)
- LedOut[1]=Disp_Tab[LedNumVal%100/10]; //十位
- LedOut[2]=Disp_Tab[LedNumVal%10]; //個(gè)位
-
- for( i=0; i<3; i++)
- {
- P1= LedOut[i];
- switch(i)
- {
- case 0:LS138A=1; LS138B=0; LS138C=0; break;
- case 1:LS138A=0; LS138B=1; LS138C=0; break;
- case 2:LS138A=0; LS138B=0; LS138C=1; break;
- default:break;
- }
- delay(10);
- P1 = 0x00;
- }
- }
- }
- /*************************************************************/
- void led_display_over() //數(shù)碼管清零并直流電動(dòng)機(jī)停止 蜂鳴器響三下
- {
- beep();
- PWM = 1;
- while(1)
- {
- unsigned int i = 0;
- unsigned int Led = 0;
- LED1 = 1; //啟動(dòng)指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 1; //進(jìn)水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機(jī)蓋松指示燈
- LED9 = 1; //出水閥指示燈
- if(key_move_stop ==0) //脫水后按下鍵跳出
- {
- LED1 = 0; //啟動(dòng)指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 0; //進(jìn)水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機(jī)蓋松指示燈
- LED9 = 1; //報(bào)警指示燈
- break;
- }
- LedOut[0]=Disp_Tab[Led%1000/100]|0x80; //百位帶小數(shù)點(diǎn)
- LedOut[1]=Disp_Tab[Led%100/10]; //十位
- LedOut[2]=Disp_Tab[Led%10]; //個(gè)位
- for( i=0; i<3; i++)
- {
- P1= LedOut[i];
- switch(i)
- {
- case 0:LS138A=1; LS138B=0; LS138C=0; break;
- case 1:LS138A=0; LS138B=1; LS138C=0; break;
- case 2:LS138A=0; LS138B=0; LS138C=1; break;
- default:break;
- }
- delay(10);
- P1 = 0x00;
- }
- }
- }
- /*************************************************************/
- void cap_open() //數(shù)碼管清零并直流電動(dòng)機(jī)停止 蜂鳴器響三下
- {
- beep(); //需要復(fù)位跳出
- PWM = 1;
- while(1)
- {
- unsigned int i = 0;
- unsigned int LedNum = 0;
- LedOut[0]=Disp_Tab[LedNum%1000/100]|0x80; //百位帶小數(shù)點(diǎn)
- LedOut[1]=Disp_Tab[LedNum%100/10]; //十位
- LedOut[2]=Disp_Tab[LedNum%10]; //個(gè)位
- for( i=0; i<3; i++)
- {
- P1= LedOut[i];
- switch(i)
- {
- case 0:LS138A=1; LS138B=0; LS138C=0; break;
- case 1:LS138A=0; LS138B=1; LS138C=0; break;
- case 2:LS138A=0; LS138B=0; LS138C=1; break;
- default:break;
- }
- delay(10);
- P1 = 0x00;
- }
- }
- }
- /************************************************************/
- void led_display_move() //數(shù)碼管計(jì)時(shí)并直流電動(dòng)機(jī)運(yùn)轉(zhuǎn)
- {
- while(1)
- {
- PWM = 0;
- if(LedNumVal == 101) //計(jì)時(shí)到100時(shí)自動(dòng)清零并蜂鳴器響三下
- {
- LedNumVal = 0;
- TR0 = 0;
- break;
- }
- if(key_move_stop ==0)
- {
- movenum++;
- if(movenum%2==1)
- {
- LED1 = 1; //啟動(dòng)指示燈
- LED2 = 0; //暫停指示燈
- TR0 = 0; //關(guān)閉定時(shí)器0
- }
- else
- {
- LED1 = 0;
- LED2 = 1;
- TR0 = 1; //開啟定時(shí)器0
- }
- }
- while(key_move_stop ==0); //等待按鍵釋放
- LedOut[0]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位帶小數(shù)點(diǎn)
- LedOut[1]=Disp_Tab[LedNumVal%100/10]; //十位
- LedOut[2]=Disp_Tab[LedNumVal%10]; //個(gè)位
- for( i=0; i<3; i++)
- {
- P1 = LedOut[i];
- switch(i)
- {
- case 0:LS138A=1; LS138B=0; LS138C=0; break;
- case 1:LS138A=0; LS138B=1; LS138C=0; break;
- case 2:LS138A=0; LS138B=0; LS138C=1; break;
- default:break;
- }
- delay(10);
- P1 = 0x00;
- }
- }
- }
- /***********************************************************/
- void move_stop_led()
- {
- m++;
- if(m == 1)
- {
- EX0=1; //外部中斷0允許中斷 水位檢測
- LED1 = 0; //啟動(dòng)指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 0; //進(jìn)水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機(jī)蓋松指示燈
- LED9 = 1; //報(bào)警指示燈
- }
- else if((m>1)&&(m%2==1))
- {
- LED1 = 0; //啟動(dòng)指示燈
- LED2 = 1; //暫停指示燈
- } else
- {
- LED1 = 1; //啟動(dòng)指示燈
- LED2 = 0; //暫停指示燈
- TR0 = 0; //停止定時(shí)器工作
- }
- }
- /**********************************************************/
- void wash_dehydration_led()
- {
- static unsigned int j = 0;
- j++;
- if(j%2 == 1) //啟動(dòng)并洗滌
- {
- LED1 = 0; //啟動(dòng)指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 0; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 1; //進(jìn)水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機(jī)蓋松指示燈
- LED9 = 1; //報(bào)警指示燈
- led_display_move();
- led_display_zero();
- }
- else //啟動(dòng)并脫水
- {
- LED1 = 0; //啟動(dòng)指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 0; //脫水指示燈
- LED5 = 1; //進(jìn)水閥指示燈
- LED6 = 0; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機(jī)蓋松指示燈
- LED9 = 1; //報(bào)警指示燈
- led_display_move();
- led_display_over();
- }
- }
- /*********************************************************/
- void proc_key(unsigned char key_v)
- {
- if((key_v & 0x01) == 0)
- { move_stop_led();
- }
- else if((key_v & 0x02) == 0)
- { if(m%2==1)
- { TR0 = 1; //定時(shí)器0開始工作
- wash_dehydration_led();
- }
- }
- }
- /*********************************************************/
- main() {
- IT0 = 1; //外部中斷0 水位檢測 跳沿觸發(fā)方式
- EX0=0; //不允許外部中斷0中斷
- IT1 = 1; //外部中斷1 機(jī)蓋打開 跳沿觸發(fā)方式
- EX1 = 1; //允許外部中斷1中斷
- TMOD = 0x01; //定時(shí)器0 定時(shí)模式 方式1
- ET0 = 1; //允許定時(shí)器0中斷
- TR0 = 0; //停止定時(shí)器工作
- TH0 = 0xDB;
- TL0 = 0xF0; //10ms EA=1;
- P0 = 0xff;
- key_v = 0x03;
- LS138A=0;
- LS138B=0;
- LS138C=0;
- while(1)
- {
- key_s = scan_key();
- if(key_s != key_v)
- {
- delayms(10);
- key_s = scan_key(); //啟動(dòng)/暫停鍵 洗滌/脫水鍵掃描
- if(key_s != key_v)
- {
- key_v = key_s;
- proc_key(key_v);
- delayms(30);
- }
- }
- }
- }
- void counter0(void) interrupt 0
- {
- EX0=0;
- LED7 = 0; //水位滿
- LED5 = 1; //進(jìn)水閥指示燈
- EX0=1;
- }
- void time0(void) interrupt 1
- {
- lednum++;
- TR0 = 0;
- TH0 = 0xDB; //10ms
- TL0 = 0xF0;
- if(lednum == 50)
- {
- lednum = 0;
- LedNumVal++;
- }
- TR0 = 1;
- }
- void counter1(void) interrupt 2
- {
- EX1 = 0;
- LED1 = 1; //啟動(dòng)指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 1; //進(jìn)水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機(jī)蓋松指示燈
- cap_open();
- }
復(fù)制代碼
作者: 謝金汛 時(shí)間: 2019-6-13 09:20
樓主設(shè)計(jì)出來了嗎?
作者: ygs2527 時(shí)間: 2019-7-3 15:07
666樓主設(shè)計(jì)出來了嗎?
作者: 不鳴001 時(shí)間: 2020-11-20 00:27
你好,你有proteus的圖嗎
作者: 器車人 時(shí)間: 2020-11-20 09:25
找個(gè)電機(jī)驅(qū)動(dòng)ic,然后學(xué)會(huì)調(diào)速PWM控制,然后學(xué)習(xí)單片機(jī),定時(shí)器,按鍵輸入
作者: changhz 時(shí)間: 2020-11-20 09:42
不錯(cuò),占個(gè)位,抽空測試看看
作者: zzyiSir 時(shí)間: 2020-12-9 12:38
樓主設(shè)計(jì)出來了嗎?求proteus圖
作者: spxbaba 時(shí)間: 2020-12-11 13:13
二樓難道不是答案么?
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |