标题:
基于单片机的洗衣机的proteus仿真和源码
[打印本页]
作者:
已飞的鹰
时间:
2018-5-29 09:52
标题:
基于单片机的洗衣机的proteus仿真和源码
实现洗衣机常用功能,C源代码+Proteus仿真,可以在此设计基础上适当增减功能,实现洗衣机的控制!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(27.52 KB, 下载次数: 62)
下载附件
2018-5-29 17:52 上传
单片机源程序如下:
#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; //不报警
}
}
复制代码
0.png
(41.75 KB, 下载次数: 53)
下载附件
2018-5-29 17:53 上传
所有资料51hei提供下载:
Exam1.rar
(189.32 KB, 下载次数: 125)
2018-5-29 09:52 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1