实现洗衣机常用功能,C源代码+Proteus仿真,可以在此设计基础上适当增减功能,实现洗衣机的控制!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- //按键引脚
- sbit key_1 = P1^4;
- sbit key_2 = P1^5;
- sbit key_3 = P1^6;
- sbit key_4 = P1^7;
- //电机引脚
- sbit b_1 = P1^0;
- sbit b_2 = P1^1;
- sbit b_3 = P1^2;
- sbit b_4 = P1^3;
- sbit BEEP = P2^0;
- sbit led_1 = P2^1;
- sbit led_2 = P2^2;
- sbit led_3 = P2^3;
- sbit led_4 = P2^4;
- sbit w_1 = P2^6;//位选引脚
- sbit w_2 = P2^7; //位选引脚
- sbit power_1 = P3^6; //加水
- sbit power_2 = P3^7; //脱水
- int count = 0;
- char flag=0; //当前层
- char number=0;
- char bit_1 = 0;//位选
- char bit_2 = 0;//位选
- int time = 0;
- int time_1 = 1*60; //12分钟 洗涤时间
- int time_2 = 1*60; //6分钟 漂洗时间
- int time_3 = 20; //3分钟 脱水时间
- char start = 0; //报警标量
- //int time_4 = 12*60; //12分钟 洗涤时间
- //数码管a--f
- unsigned char dis[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; //数码管引脚定义 0123456789 -
- void Delay10ms(unsigned char d) //误差 0us
- {
- unsigned char a, b,c;
- //正传按键按下
- if(key_1==0)
- {
- while(key_1==0); //等待正传按键抬起
- flag = 1; //状态标量
- }
- if(key_2==0)
- {
- while(key_2==0);
- flag = 2;
- }
- if(key_3==0)
- {
- while(key_3==0);
- flag = 0;
- }
- //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
- for (c=d;c>0;c--)
- {
- for (b=38;b>0;b--)
- {
- for (a=130;a>0;a--);
- }
- }
- }
- //电机正转 A-B-C-D循环
- void dianji_z(unsigned char time)
- {
- b_1 = 1;
- b_2 = 0;
- b_3 = 0;
- b_4 = 0;
- Delay10ms(time);
- b_1 = 0;
- b_2 = 1;
- b_3 = 0;
- b_4 = 0;
- Delay10ms(time);
- b_1 = 0;
- b_2 = 0;
- b_3 = 1;
- b_4 = 0;
- Delay10ms(time);
- b_1 = 0;
- b_2 = 0;
- b_3 = 0;
- b_4 = 1;
- Delay10ms(time);
- }
- //电机反转 A-B-C-D循环
- void dianji_f(unsigned char time)
- {
- b_1 = 0;
- b_2 = 0;
- b_3 = 0;
- b_4 = 1;
- Delay10ms(time);
- b_1 = 0;
- b_2 = 0;
- b_3 = 1;
- b_4 = 0;
- Delay10ms(time);
- b_1 = 0;
- b_2 = 1;
- b_3 = 0;
- b_4 = 0;
- Delay10ms(time);
- b_1 = 1;
- b_2 = 0;
- b_3 = 0;
- b_4 = 0;
- Delay10ms(time);
- }
- //洗涤模式 漂洗模式
- void xidi()
- {
- int i; //用于for循环变量
- for(i=0;i<10;i++) //正转10s
- dianji_z(25); //1S
- for(i=0;i<5;i++) //反转5s
- Delay10ms(100); //1S
- for(i=0;i<10;i++) //反转10s
- dianji_f(25); //1S
- for(i=0;i<5;i++) //反转5s
- Delay10ms(100); //1S
- }
- void main(void)
- {
- int i; //用于for循环变量
- TMOD = 0X01; //设置定时器T0 16位
- EA = 1; //打开中断
- ET0 = 1; //打开TO定时器
- TR0 = 1; //关闭中断
- TH0 = (65536-5000)/256;
- TL0 = (65536-5000)%256;
-
- BEEP = 0;//蜂鸣器 不响
- led_1 = led_2 = led_3 = led_4 = 0; //指示灯 全灭
- while(1)
- {
- //开始检测
- if(key_1==0)
- {
- while(key_1==0);
- power_2 = 1; //脱水关
- power_1 = 0; //加水
- start = 1;
- //检测到水位
- if(key_4==0)
- {
- while(key_4==0); //水位加满
- power_1 = 1; //停止加水
- }
- for(i=0;i<3;i++) //洗涤 漂洗 三次
- {
- //洗涤模式
- time = time_1;
- led_1 = 1;
- led_2 = led_3 = 0;
- for(;;)
- {
- xidi();
- if(time==0)
- break;
- }
- //漂洗模式
- time = time_2;
- led_2 = 1;
- led_1 = led_3 = 0;
- for(;;)
- {
- xidi();
- if(time==0)
- break;
- }
- }
- led_1 = led_2 = 0;
- led_3 = 1;
- power_2 = 0; //启动脱水
- power_1 = 1; //不加水
- time = time_3;
- for(;;)
- {
- if(time==0)
- break;
- Delay10ms(10); //延时100ms
- }
- led_3 = 0;
- start = 0;
- }
- Delay10ms(10); //延时100ms
- }
- }
- //中断函数
- void delay1s(void) interrupt 1
- {
- TH0 = (65536-5000)/256; //5ms产生一次中断 用于数码管动态扫描
- TL0 = (65536-5000)%256; //5ms产生一次中断 用于数码管动态扫描
- count++;
- if(count>=200) //1S时间变小
- {
- count = 0;
- if(time>0)
- time--;
- if(time>60) //显示分钟
- {
- bit_1 = (time/60)/10;
- bit_2 = (time/60)%10;
- }
- else if(time<60) //显示秒
- {
- bit_1 = (time%60)/10;
- bit_2 = (time%60)%10;
- }
- }
- w_1 = w_2 = 0;
- switch(count % 2)
- {
- case 0: //数码管1位
-
- w_1 = 1;
- w_2 = 0;
- P0 = dis[bit_1];
- break;
- case 1: //数码管1位
- w_1 = 0;
- w_2 = 1;
- P0 = dis[bit_2];
- break;
- }
- //检测盖子打开 报警
- if((key_3==0)&&(start==1))
- {
- led_4 = 1; //报警指示灯
- BEEP = 1; //报警
- }
- else
- {
- led_4 = 0; //报警指示灯 不亮
- BEEP = 0; //不报警
- }
- }
复制代码
所有资料51hei提供下载:
Exam1.rar
(189.32 KB, 下载次数: 125)
|