本帖最后由 席成 于 2018-6-12 08:58 编辑
洗衣机内容: 设自动洗衣机的控制要求是:启动后先开启进水阀进水,水位到达设定值后关闭,然后波轮按正转5秒、反转5秒,正、反转之间停3秒的规律不断循环转动,直至达到设定时间停止,之后打开排水阀放水,水放完后洗衣桶旋转脱水,1分钟后停止并关闭排水阀,洗衣过程结束。要求水位设置不少于高、中、低三档,洗衣时间在3——12分钟范围内可调,以1分钟为单位,排水时间定为1分钟。运动执行器用指示灯模拟,水位用开关模拟,试设计该洗衣机的控制电路。 洗衣机要求: 1. 画出控制系统的框图,说明系统方案设计的思路、理由或依据; 2. 选择、确定组成控制系统的各个单元,并阐述选择确定的原则或依据; 3. 画出完整的电气原理图,介绍整体电路的工作原理、性能或特点; 4. 如采用单片机控制,给出单片机程序的流程图和清单,说明程序的工作原理。 5. 制作实物电路,验证设计、制作是否正确。 完整程序: #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 的字模, 共阴数码管 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带小数点编码 //延时X毫秒函数11.0592Mhz时 void delay_xms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } //延时X秒函数 void delay_s(uint xs) { uint x; for(x=xs;x>0;x--) delay_xms(1000); } //延时X分钟函数 void delay_min(uint xmin) { uint m,n; for(m=xmin;m>0;m--) for(n=60;n>0;n--) delay_s(1); } //取操作数的个十位 void chuli(uint num) { gewei=num%10; shiwei=(num/10)%10; } //按键扫描函数 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) //水位设置 { 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; } } //水位检测子函数 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); } } } //初始化函数 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; } /************主函数**********************/ void main() { uint i,j; init(); P0=0xbf; wei1=0; wei2=0; wei3=0; wei4=0; while(qidong_key) { keysaomiao();//水位和洗衣时间设置 } num3=xiyitime-1; if(qidong_key==0) { delay_xms(10); if(qidong_key==0)//启动键按下 { shuifa=0; //开进水阀进水 while(shuiwei!=shuiweizhi)//检测是否到达设定水位 { 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; }
|