本帖最后由 席成 于 2018-6-12 08:58 編輯
洗衣機(jī)內(nèi)容: 設(shè)自動(dòng)洗衣機(jī)的控制要求是:?jiǎn)?dòng)后先開(kāi)啟進(jìn)水閥進(jìn)水,水位到達(dá)設(shè)定值后關(guān)閉,然后波輪按正轉(zhuǎn)5秒、反轉(zhuǎn)5秒,正、反轉(zhuǎn)之間停3秒的規(guī)律不斷循環(huán)轉(zhuǎn)動(dòng),直至達(dá)到設(shè)定時(shí)間停止,之后打開(kāi)排水閥放水,水放完后洗衣桶旋轉(zhuǎn)脫水,1分鐘后停止并關(guān)閉排水閥,洗衣過(guò)程結(jié)束。要求水位設(shè)置不少于高、中、低三檔,洗衣時(shí)間在3——12分鐘范圍內(nèi)可調(diào),以1分鐘為單位,排水時(shí)間定為1分鐘。運(yùn)動(dòng)執(zhí)行器用指示燈模擬,水位用開(kāi)關(guān)模擬,試設(shè)計(jì)該洗衣機(jī)的控制電路。 洗衣機(jī)要求: 1. 畫(huà)出控制系統(tǒng)的框圖,說(shuō)明系統(tǒng)方案設(shè)計(jì)的思路、理由或依據(jù); 2. 選擇、確定組成控制系統(tǒng)的各個(gè)單元,并闡述選擇確定的原則或依據(jù); 3. 畫(huà)出完整的電氣原理圖,介紹整體電路的工作原理、性能或特點(diǎn); 4. 如采用單片機(jī)控制,給出單片機(jī)程序的流程圖和清單,說(shuō)明程序的工作原理。 5. 制作實(shí)物電路,驗(yàn)證設(shè)計(jì)、制作是否正確。 完整程序: #include <reg51.h> #define uint unsigned int #define uchar unsigned char uchar gewei,shiwei; uchar xiyitime,num3; uchar shuiweizhi,shuiwei; uint num1,num2; sbit wei1=P1^0; sbit wei2=P1^1; sbit wei3=P1^2; sbit wei4=P1^3; sbit shuiwei0=P1^4; // sbit shuiwei1=P1^5; //低水位 sbit shuiwei2=P1^6; //中水位 sbit shuiwei3=P1^7; // 高水位 sbit shezhi_key=P2^0; sbit qidong_key=P2^1; //sbit xiyi_key=P2^0; sbit up_key=P2^2; sbit down_key=P2^3; sbit shuifa=P2^4; sbit paishuifa=P2^5; sbit zhengzhuang=P2^6; sbit fanzhuang=P2^7; sbit tuoshui=P3^6; sbit zhishiled=P3^7; //此表為 LED 的字模, 共陰數(shù)碼管 0-9 - unsigned char code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //段碼控制 unsigned char code segtab1[]={0x40,0x4F,0x24,0x30,0x19,0x12, 0x02,0x78,0x00,0x10}; //共陰0-9帶小數(shù)點(diǎn)編碼 //延時(shí)X毫秒函數(shù)11.0592Mhz時(shí) void delay_xms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } //延時(shí)X秒函數(shù) void delay_s(uint xs) { uint x; for(x=xs;x>0;x--) delay_xms(1000); } //延時(shí)X分鐘函數(shù) void delay_min(uint xmin) { uint m,n; for(m=xmin;m>0;m--) for(n=60;n>0;n--) delay_s(1); } //取操作數(shù)的個(gè)十位 void chuli(uint num) { gewei=num%10; shiwei=(num/10)%10; } //按鍵掃描函數(shù) void keysaomiao() { uchar jianzhi; if(shezhi_key==0) { delay_xms(10); if(!shezhi_key) { jianzhi++; if(jianzhi>2) jianzhi=1; while(!shezhi_key); } } if(jianzhi==1) //水位設(shè)置 { if(up_key==0) { delay_xms(10); if(up_key==0) { shuiwei++; if(shuiwei>3) { shuiwei=0; } while(!up_key); } } if(down_key==0) { delay_xms(10); if(down_key==0) { if(shuiwei<=0) { shuiwei=3; } shuiwei--; while(!down_key); } } chuli(shuiwei); P0=segtab[gewei]; wei1=0; delay_xms(5); wei1=1; P0=segtab[shiwei]; wei2=0; delay_xms(5); wei2=1; P0=0xFE; wei3=0; delay_xms(5); wei3=1; P0=0x9C; wei4=0; delay_xms(5); wei4=1; } if(jianzhi==2) { if(up_key==0) { delay_xms(10); if(up_key==0) { xiyitime++; if(xiyitime>12) { xiyitime=3; } while(!up_key); } } if(down_key==0) { delay_xms(10); if(down_key==0) { xiyitime--; if(xiyitime<3) { xiyitime=12; } while(!down_key); } } chuli(xiyitime); P0=segtab[gewei]; wei1=0; delay_xms(5); wei1=1; P0=segtab[shiwei]; wei2=0; delay_xms(5); wei2=1; P0=0xF7; wei3=0; delay_xms(5); wei3=1; P0=0xA3; wei4=0; delay_xms(5); wei4=1; } } //水位檢測(cè)子函數(shù) void shuiweijiance() { if(shuiwei0==0) { delay_xms(10); if(shuiwei0==0) { shuiweizhi=0; while(!shuiwei0); } } if(shuiwei1==0) { delay_xms(10); if(shuiwei1==0) { shuiweizhi=1; while(!shuiwei1); } } if(shuiwei2==0) { delay_xms(10); if(shuiwei2==0) { shuiweizhi=2; while(!shuiwei2); } } if(shuiwei3==0) { delay_xms(10); if(shuiwei3==0) { shuiweizhi=3; while(!shuiwei3); } } } //初始化函數(shù) void init() { num2=60; num3=4; shuiweizhi=0; xiyitime=3; TMOD=0x01; //TH0=(65536-45872)/256;//11.0592M晶振 //TL0=(65536-45872)%256; TH0 = 0xB1;//12M晶振 TL0 = 0xE0; EA=1; ET0=1; } /************主函數(shù)**********************/ void main() { uint i,j; init(); P0=0xbf; wei1=0; wei2=0; wei3=0; wei4=0; while(qidong_key) { keysaomiao();//水位和洗衣時(shí)間設(shè)置 } num3=xiyitime-1; if(qidong_key==0) { delay_xms(10); if(qidong_key==0)//啟動(dòng)鍵按下 { shuifa=0; //開(kāi)進(jìn)水閥進(jìn)水 while(shuiwei!=shuiweizhi)//檢測(cè)是否到達(dá)設(shè)定水位 { shuiweijiance(); chuli(shuiweizhi); P0=segtab[gewei]; wei1=0; delay_xms(5); wei1=1; P0=segtab[shiwei]; wei2=0; delay_xms(5); wei2=1; delay_xms(5); chuli(shuiwei); P0=segtab[gewei]; wei3=0; delay_xms(5); wei3=1; P0=segtab[shiwei]; wei4=0; delay_xms(5); wei4=1; } while(i<100) { i++; shuiweijiance(); chuli(shuiweizhi); P0=segtab[gewei]; wei1=0; delay_xms(5); wei1=1; P0=segtab[shiwei]; wei2=0; delay_xms(5); wei2=1; delay_xms(5); chuli(shuiwei); P0=segtab[gewei]; wei3=0; delay_xms(5); wei3=1; P0=segtab[shiwei]; wei4=0; delay_xms(5); wei4=1; } delay_s(1); while(j<300) { j++; chuli(shuiwei); P0=segtab[gewei]; wei1=0; delay_xms(5); wei1=1; P0=segtab[shiwei]; wei2=0; delay_xms(5); wei2=1; chuli(xiyitime); P0=segtab[gewei]; wei3=0; delay_xms(5); wei3=1; P0=segtab[shiwei]; wei4=0; delay_xms(5); wei4=1; } shuifa=1; zhishiled=0; TR0=1; while(!num3==0) { if(num2>=59) zhengzhuang=0; if(num2==55) zhengzhuang=1; if(num2==52) fanzhuang=0; if(num2==46) fanzhuang=1; if(num2==42) zhengzhuang=0; if(num2==35) zhengzhuang=1; if(num2==30) fanzhuang=0; if(num2==23) fanzhuang=1; if(num2==19) zhengzhuang=0; if(num2==13) zhengzhuang=1; if(num2==9) fanzhuang=0; if(num2==3) fanzhuang=1; } TR0=0; zhengzhuang=1; fanzhuang=1; paishuifa=0; while(1) { if(shuiwei0==0) delay_xms(10); if(shuiwei0==0) { P0=0xbf; wei1=0; wei2=0; wei3=0; wei4=0; tuoshui=0; delay_min(1); tuoshui=1; paishuifa=1; P0=0; delay_s(2); zhishiled=1; break; } } } } } void zhongduangT0() interrupt 1 { //TH0=(65536-45872)/256;//11.0592M晶振 //TL0=(65536-45872)%256; TH0 = 0xB1;//12M晶振 TL0 = 0xE0; num1++; if(num1>=50) { num2--; num1=0; if(num2<=0) { num2=59; num3--; if(num3==0) { TR0=0; } } } chuli(num2); wei1=0; P0=segtab[gewei]; delay_xms(4); wei1=1; wei2=0; P0=segtab[shiwei]; delay_xms(4); wei2=1; chuli(num3); wei3=0; P0=segtab1[gewei]; delay_xms(4); wei3=1; wei4=0; P0=segtab[shiwei]; delay_xms(4); wei4=1; }
|