标题: 小白求助!关于单片机洗衣机控制系统的设计 [打印本页]
作者: iamkenny 时间: 2016-12-17 19:00
标题: 小白求助!关于单片机洗衣机控制系统的设计
小白刚学单片机不久 碰到了老师布置这个题目 感觉毫无头绪。。 再此求教各位大神!
洗衣机控制系统设计设计内容:
1、 用直流电机的转速表征三种不同洗衣方式,弱洗、强洗、漂洗;(20分)
2、 实现最长10分钟定时;(20分)
3、 用三个独立按键设置待洗衣物的不同洗涤方式: (40分)
丝质衣服: 漂洗 定时3分钟
棉质衣服:弱洗 2分钟;强洗 5分钟;漂洗 3分钟;
化纤衣服: 强洗 4分钟;漂洗 2分钟;
4、 定时时间到,蜂鸣器报警提示。(20分)
作者: angmall 时间: 2016-12-18 22:22
- // 基于单片机的洗衣机的控制系统设计
- /*
- 1洗衣机的功能及设计
- 1.1洗衣机功能要求 洗衣机的主要工作程序是:洗涤——脱水——漂洗——脱水——漂洗——脱水。上述工作程序中,包含三个过程,洗涤过程、漂洗过程、脱水过程。
- (1)洗涤过程:放好待洗物,启动开关,进水阀通电,向洗衣机供水,当供水达到预定水位时,水位开关接通,进水阀断电关闭,停止供水。洗涤电动机接通电源,带动波轮(或桶)旋转,产生各种形式的水流搅动衣物进行洗涤。通过电动不停的正转、停、反转、反复循环,形成洗涤水对洗涤物产生强烈的翻滚作用。同时,衣物之间、衣物与四周桶壁之间产生互相摩擦和撞击力,以次达到洗涤衣物的目的。 (2)漂洗过程:漂洗的目的在于清除衣物上的洗涤液,因此,漂洗过程与洗涤过程的电器动作是完全相同的。
- (3)脱水过程:洗涤或漂洗后,需要对衣物进行脱水以便晾干,节省水资源,所以脱水是洗衣过程中必不可少的环节。洗涤或漂洗过程结束后,电动机停止转动,排水阀通电,打开排水阀门排水。当水位低到一定程度时,满足安全条件,脱水电动机接通,电机带动脱水桶高速旋转,利用离心力把衣服上的水从桶壁的小眼里甩出。全部洗衣工作完成后,由蜂鸣器发出音响,表示衣物已洗干净。
- 1.2洗衣机硬件电路设计
- 1.2.1 洗衣机总体设计框图
- 椭圆型表示指示灯:从上到下依次为强洗、弱洗、洗涤次数、洗衣定时、脱水定时、洗衣剩余时间、脱水剩余时间。 电动机正转为强洗,正反交替转动设定为弱洗,初始设定的状态为强洗,若要选择弱洗模式需按下增加按键,再次按下选择按键,则表示洗涤次数的指示灯被点亮,选择增加或减少按键对时间进行加减。然后对脱水时间设定,最后按下启动键,洗衣机开始工作。
- 1.2.3硬件电路的主要模块
- 根据洗衣机的基本功能,硬件电路设计需要考虑:水流强度的问题、洗涤、漂洗、脱水时间设定长短的问题、工作时间或剩余时间的显示、工作过程中的暂停、启动、复位、洗完后的报警等问题。 采用5l系列单片机作为控制核心,主要包括功能设置及控制电路、洗衣机状态显示及输出控制电路。主要组成部件有:单片机、74LSl38译码器、ULN2003、指示灯、数码管、电动机、蜂鸣器以及按键等。
- (1)功能设置及控制电路
- ①暂停键K0,接P3.3,用外部中断1实现工作过程的暂停,根据人的需要可以进行手工洗涤; ②水位开关K1,接P1.O,水位到位时,K1闭合。在进水期间,系统不断检测K1,当检测到K1闭合就停止进水; ③按键K2,接P1.6,作为工作过程中的启动键;
- ④按键K3是洗衣强度选择键,接P3.4,每按一次代表一种强度。分别是标准、弱洗、强洗和自编,由4个指示灯进行显示; ⑤按键K4,接P3.5,对洗衣时间进行设置,并用数码管LEDl和LED2显示:
- ⑥按键K5,接P3.6,对漂洗、脱水次数进行设置,并用数码管LEDI显示;
- ⑦压电蜂鸣器接P1.7,作为洗衣时间到以及故障发生的报警器。
- (2)洗衣机状态显示 74LSl38译码器为3—8译码器,选用它可以解决I/0口线数量不足问题。从控制要求可知,洗衣机的工作模式以及工作程序必须有7中不同的显示加以区别。74LSl38译码器的输入端C、B、A分别接P1.3、P1.4、P1.5,输出端分别与7个发光二极管DO--D6的阴极相连,发光二极管阳极接电源。输出端YO控制D0“弱洗”指示灯:Y1控制D1“标准洗”指示灯,Y2控制D2“强洗”指示灯,Y3控制D3“自编”指示灯,Y4控制D4“洗衣”指示灯,Y5控制D5“漂洗”指 示灯,Y6控制D6“脱水”指示灯
- (3)输出控制电路 输出控制电路由触发器电路和相应的双向晶闸管组成。控制电机正反转以及进水阀和排水阀的开启和关闭。通过触发器电路和相应的双向晶闸管,电动机的正转和反转用单片机P1.1和P1.2进行控制;进水电磁阀和排水电磁阀用单片机的P3.0和P3.1进行控制
- 1.3洗衣机软件系统设计
- 1.3.1主程序设计
- 根据硬件设计要求,控制主程序流程图如图所示。洗衣机通电之后,单片机上电,首先进行程序的初始化,包括定时器O、外部中断O、外部中断l的初始化,以及各参数初值的设定。默认洗衣强度为“标准洗”,漂洗次数3次。然后扫描K2、K3、K4、K5键的状态,确定洗衣强度R2、洗衣时间R3和漂洗次数R4。洗衣机处于待命状态,控制指示灯显示洗衣强度,液晶显示预设洗衣时间。当发现启动键K2按下,洗衣机从待命状态进入工作状态。完成进水——洗涤——脱水——漂洗的循环过程。当洗衣结束时,控制蜂鸣器发声。
- */
- #include <reg51.h> //各个引脚功能定义
- sbit key_move_stop = P2^0; //启动、暂停按键
- sbit key_wash_dehydration = P2^1; //洗涤、脱水按键
- sbit key_water_detection = P3^2; //水位检测按键 外部中断0
- sbit key_cap_open = P3^3; //机盖装置按键 外部中断1
- sbit LED1 = P0^0; //启动指示灯 sbit LED2 = P0^1; //暂停指示灯
- sbit LED3 = P0^2; //洗涤指示灯 sbit LED4 = P0^3; //脱水指示灯
- sbit LED5 = P0^4; //进水阀指示灯 sbit LED6 = P0^5; //排水阀指示灯
- sbit LED7 = P0^6; //水位满指示灯 sbit LED8 = P0^7; //机盖松指示灯
- sbit LED9 = P2^7; //报警指示灯
- sbit LS138A = P2^2; //数码管片选
- sbit LS138B = P2^3; sbit LS138C = P2^4;
- sbit BEEP = P2^6; //蜂鸣器报警
- sbit PWM = P2^5; //直流电动机
- //共阴数码管 0-9 -
- unsigned int code Disp_Tab[] =
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- unsigned int i=0,LedNumVal=0; //数码管计时 0-9 选择
- unsigned int lednum = 0; //定时器0 数码管计时速率调控变量
- unsigned int LedOut[3]; //数码管计时存储区
- unsigned char key_s,key_v; //按键扫描变量
- static unsigned int m = 0; //启动、暂停键计数变量
- static unsigned int movenum = 0; //暂停功能变量
- /***********************************************************/
- unsigned char scan_key() //启动/暂停键;洗涤/脱水键扫描
- {
- 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) //数码扫描延时子程序
- {
- unsigned char b;
- for(; a > 0; a--)
- for(b = 200; b > 0; b--);
- }
- /**********************************************************/
- void delayms( unsigned char ms) //按键消抖延时子程序
- {
- 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() //数码管清零并直流电动机停止 蜂鸣器响三下
- {
- 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; //百位带小数点
- LedOut[1]=Disp_Tab[LedNumVal%100/10]; //十位
- LedOut[2]=Disp_Tab[LedNumVal%10]; //个位
-
- 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() //数码管清零并直流电动机停止 蜂鸣器响三下
- {
- beep();
- PWM = 1;
- while(1)
- {
- unsigned int i = 0;
- unsigned int Led = 0;
- LED1 = 1; //启动指示灯
- LED2 = 1; //暂停指示灯
- LED3 = 1; //洗涤指示灯
- LED4 = 1; //脱水指示灯
- LED5 = 1; //进水阀指示灯
- LED6 = 1; //排水阀指示灯
- LED7 = 1; //水位满指示灯
- LED8 = 1; //机盖松指示灯
- LED9 = 1; //出水阀指示灯
- if(key_move_stop ==0) //脱水后按下键跳出
- {
- LED1 = 0; //启动指示灯
- LED2 = 1; //暂停指示灯
- LED3 = 1; //洗涤指示灯
- LED4 = 1; //脱水指示灯
- LED5 = 0; //进水阀指示灯
- LED6 = 1; //排水阀指示灯
- LED7 = 1; //水位满指示灯
- LED8 = 1; //机盖松指示灯
- LED9 = 1; //报警指示灯
- break;
- }
- LedOut[0]=Disp_Tab[Led%1000/100]|0x80; //百位带小数点
- LedOut[1]=Disp_Tab[Led%100/10]; //十位
- LedOut[2]=Disp_Tab[Led%10]; //个位
- 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() //数码管清零并直流电动机停止 蜂鸣器响三下
- {
- beep(); //需要复位跳出
- PWM = 1;
- while(1)
- {
- unsigned int i = 0;
- unsigned int LedNum = 0;
- LedOut[0]=Disp_Tab[LedNum%1000/100]|0x80; //百位带小数点
- LedOut[1]=Disp_Tab[LedNum%100/10]; //十位
- LedOut[2]=Disp_Tab[LedNum%10]; //个位
- 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() //数码管计时并直流电动机运转
- {
- while(1)
- {
- PWM = 0;
- if(LedNumVal == 101) //计时到100时自动清零并蜂鸣器响三下
- {
- LedNumVal = 0;
- TR0 = 0;
- break;
- }
- if(key_move_stop ==0)
- {
- movenum++;
- if(movenum%2==1)
- {
- LED1 = 1; //启动指示灯
- LED2 = 0; //暂停指示灯
- TR0 = 0; //关闭定时器0
- }
- else
- {
- LED1 = 0;
- LED2 = 1;
- TR0 = 1; //开启定时器0
- }
- }
- while(key_move_stop ==0); //等待按键释放
- LedOut[0]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点
- LedOut[1]=Disp_Tab[LedNumVal%100/10]; //十位
- LedOut[2]=Disp_Tab[LedNumVal%10]; //个位
- 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; //启动指示灯
- LED2 = 1; //暂停指示灯
- LED3 = 1; //洗涤指示灯
- LED4 = 1; //脱水指示灯
- LED5 = 0; //进水阀指示灯
- LED6 = 1; //排水阀指示灯
- LED7 = 1; //水位满指示灯
- LED8 = 1; //机盖松指示灯
- LED9 = 1; //报警指示灯
- }
- else if((m>1)&&(m%2==1))
- {
- LED1 = 0; //启动指示灯
- LED2 = 1; //暂停指示灯
- } else
- {
- LED1 = 1; //启动指示灯
- LED2 = 0; //暂停指示灯
- TR0 = 0; //停止定时器工作
- }
- }
- /**********************************************************/
- void wash_dehydration_led()
- {
- static unsigned int j = 0;
- j++;
- if(j%2 == 1) //启动并洗涤
- {
- LED1 = 0; //启动指示灯
- LED2 = 1; //暂停指示灯
- LED3 = 0; //洗涤指示灯
- LED4 = 1; //脱水指示灯
- LED5 = 1; //进水阀指示灯
- LED6 = 1; //排水阀指示灯
- LED7 = 1; //水位满指示灯
- LED8 = 1; //机盖松指示灯
- LED9 = 1; //报警指示灯
- led_display_move();
- led_display_zero();
- }
- else //启动并脱水
- {
- LED1 = 0; //启动指示灯
- LED2 = 1; //暂停指示灯
- LED3 = 1; //洗涤指示灯
- LED4 = 0; //脱水指示灯
- LED5 = 1; //进水阀指示灯
- LED6 = 0; //排水阀指示灯
- LED7 = 1; //水位满指示灯
- LED8 = 1; //机盖松指示灯
- LED9 = 1; //报警指示灯
- 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; //定时器0开始工作
- wash_dehydration_led();
- }
- }
- }
- /*********************************************************/
- main() {
- IT0 = 1; //外部中断0 水位检测 跳沿触发方式
- EX0=0; //不允许外部中断0中断
- IT1 = 1; //外部中断1 机盖打开 跳沿触发方式
- EX1 = 1; //允许外部中断1中断
- TMOD = 0x01; //定时器0 定时模式 方式1
- ET0 = 1; //允许定时器0中断
- TR0 = 0; //停止定时器工作
- 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(); //启动/暂停键 洗涤/脱水键扫描
- 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; //进水阀指示灯
- 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; //启动指示灯
- LED2 = 1; //暂停指示灯
- LED3 = 1; //洗涤指示灯
- LED4 = 1; //脱水指示灯
- LED5 = 1; //进水阀指示灯
- LED6 = 1; //排水阀指示灯
- LED7 = 1; //水位满指示灯
- LED8 = 1; //机盖松指示灯
- cap_open();
- }
复制代码
作者: 谢金汛 时间: 2019-6-13 09:20
楼主设计出来了吗?
作者: ygs2527 时间: 2019-7-3 15:07
666楼主设计出来了吗?
作者: 不鸣001 时间: 2020-11-20 00:27
你好,你有proteus的图吗
作者: 器车人 时间: 2020-11-20 09:25
找个电机驱动ic,然后学会调速PWM控制,然后学习单片机,定时器,按键输入
作者: changhz 时间: 2020-11-20 09:42
不错,占个位,抽空测试看看
作者: zzyiSir 时间: 2020-12-9 12:38
楼主设计出来了吗?求proteus图
作者: spxbaba 时间: 2020-12-11 13:13
二楼难道不是答案么?
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |