首页 > 其他分享 >23 基于51单片机的自动清洗系统(自动洗衣机)

23 基于51单片机的自动清洗系统(自动洗衣机)

时间:2024-09-25 08:53:03浏览次数:9  
标签:23 51 else while 自动 mode sbit miao1 0x30

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于AT89C52单片机,采用DS18B20温度传感器检测温度,通过LCD1602显示屏显示,并且按键
可以加减温度的上限;
点击清洗按键后,倒计时1分钟,电机正转20s,反转20s,直到倒计时结束停止,蜂鸣器报警。
点击脱水按键后,倒计时1分钟,电机正转20s,反转20s,直到倒计时结束停止,蜂鸣器报警。
然后加三个按键,分别代表进水,出水,排水,三个LED状态灯表示。
采用滑动变阻器连接ADC0832数模转换器检测水位。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

#include "reg51.h"#include<intrins.h>#include<stdio.h>#include "lcd1602.h"#include "Delay.h"#define uchar unsigned char#define uint unsigned intsbit k1=P1^2;
sbit k2=P1^3;
sbit k3=P1^4;
sbit k4=P1^5;
sbit k5=P1^6;
sbit k6=P1^7;
sbit k7=P3^0;
sbit beep=P2^7;//蜂鸣器sbit led1=P3^7;//ledsbit led2=P3^6;
sbit led3=P3^5;
sbit out1=P3^3;//电机sbit out2=P3^4;
sbit out3=P1^0;
sbit out4=P1^1;
sbit CS=  P2^4; //ADC0832sbit CLK= P2^5;
sbit DIO= P2^6;
sbit DS=P3^2;                 //DS18B20温度传感器uchar time=0,mode=0,sec=0;//系统变量uchar fen=0,miao=0,set=1;//时间uchar miao1=0;//倒计时uchar disp1\[\]="00:00";
uchar disp2\[\]="00s";
uchar wd\[\]="00";
uchar wdyz\[\]="00";
uchar shuiwei\[\]="000";static uint u,U,R;//水位变量static int wdmax=50;unsigned char count;typedef unsigned char u8;typedef unsigned int  u16;static uint temp;static float ftemp = 0.0f;//温度转变static int wdnumber;
uint temp;static int mode1=0;void tmpchange();uint tmp();void beep_warning();void dsreset(void)            //发出命令{
  uint i;
  DS=0;		              
  i=103;				   //将总线拉低480us~960us

  while(i>0)i--;
  DS=1;					   //然后拉高总线,若DS18B20做出反应会将在15us~60us后将总线拉低
  i=4;					   //15us~60us等待
  while(i>0)i--;  //while(DS);}bit tmpreadbit(void)          //读取数据{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;   return (dat);
}uchar tmpread(void)           //读取数据{
  uchar i,j,dat;
  dat=0;  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }  return(dat);
}void tmpwritebyte(uchar dat)  //传输数据给DS18B20{
  uint i;
  uchar j;
  bit testb;  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }
  }
}void tmpchange(void)          //DS18B20开始工作{  dsreset();  Delay(1);  tmpwritebyte(0xcc);  
  tmpwritebyte(0x44);  
}					  
uint tmp()                    //获得温度{  float tt;
  uchar a,b;  dsreset();  Delay(1);  tmpwritebyte(0xcc);  tmpwritebyte(0xbe);
  a=tmpread();//低八位
  b=tmpread();//高八位
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625; //算出来的是测到的温度,数值可到小数点后两位
  temp=tt*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不能取小数点后的数
  return temp;
}uchar get\_AD\_Res()          //ADC0832启动读取函数{
	uchar i, data1=0, data2=0;
	CS=0;
	
	CLK=0;DIO=1;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	CLK=1;\_nop\_();
	
	CLK=0;DIO=0;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO<<i;
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
	}
	CS=1;	
	return(data1 == data2)?data1:0;
}void swpd() //水位判断{	if(R>100)
	{
		out3 = 1;
		out4 = 0;
	}	else
	{
		out3 = 1;
		out4 = 1;
	}
}void main()//主函数{	init_1602();//初始化LCD
	write\_string(2,0,"ms:");	write\_string(2,11,"sw");
	TMOD|=0X01;
	TH0=0X3C;
	TL0=0XB0;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器
	beep = 1;	while(1)
	{
	   u=get\_AD\_Res();
		 U=(250*u)/128;    //水位
		 R=200*U/250;	   //水位转变
     swpd();//水位判断

		if(mode==0) // 停止模式
		{			if(!k1)
			{
				wdmax++;				while(!k1);
			}			
			if(!k2)
			{
				wdmax--;				while(!k2);
			}			
			if(!k3)
			{				init_1602();
				mode1=0;				write_string(2,1,"qx");			if(mode==0)
			{
				mode=1;
				fen=set;
				miao=0;
				miao1=20;
			}				while(!k3);
			}			
			if(!k4)
			{				init_1602();
				mode1=0;				write_string(2,1,"ts");			if(mode==0)
			{
				mode=1;
				fen=set;
				miao=0;
				miao1=20;
			}				while(!k4);
			}			
			if(!k5)
			{
				mode1=1;				while(!k5);
			}			
			if(!k6)
			{
				mode1=2;				while(!k6);
			}			if(!k7)
			{
			  mode1=3;				while(!k7);
			}
		}		 switch(mode)//模式控制
		 {		 	 case 0:
			 	out1=1;out2=1;
				led1=1;led2=1;led3=1;				break;			 case 1:
			 	out1=1;out2=0;				break;			 case 2:
			 	out1=1;out2=1;				break;			 case 3:
			 	out1=0;out2=1;				break;			 case 4:
			 	out1=1;out2=1;
		 }		 
		 switch(mode1)
		 {			 case 0:
				 out3 = 0;
				out4 = 0;
				led1 = 1;
				led2 = 1;
				led3 = 1;			 break;			 case 1:
				out3 = 1;
				out4 = 0;
				led1 = 0;
				led2 = 1;
				led3 = 1;			  break;			  case 2:
				out3 = 1;
				out4 = 0;
				led1 = 1;
				led2 = 0;
				led3 = 1;			  break;				case 3:
				out3 = 1;
				out4 = 0;
				led1 = 1;
				led2 = 1;
				led3 = 0;			  break;
		 }
	}
}//定时器中断void Timer0() interrupt 1{	if(time<10)//0.5s
		time++;	else
	{		 tmpchange();        //让18b20开始转换温度
	    temp = tmp();       //读取温度
	    ftemp = temp/10.0f; //转换温度
		  wdnumber = ftemp;
		  
		
		time=0;		//显示
		if(mode==0)
		{			write\_string(1,0,"wd:");			write\_string(1,7,"yz:");
			wd\[0\]=wdnumber/10+0x30;
			wd\[1\]=wdnumber%10+0x30;
			
			wdyz\[0\]=wdmax/10+0x30;
			wdyz\[1\]=wdmax%10+0x30;			
			if(wdnumber > wdmax)
			{
				beep = 0;
			}			else
			{
				beep = 1;
			}			
			
			write\_string(1,3,wd);			write\_string(1,10,wdyz);
			
			disp1\[0\]=set/10+0x30;
			disp1\[1\]=set%10+0x30;
			disp1\[3\]='0';
			disp1\[4\]='0';			write_string(2,5,disp1);

     	shuiwei\[0\]=R/100+0x30;
		  shuiwei\[1\]=(R%100)/10+0x30;
	   	shuiwei\[2\]=R%10+0x30;		  write_string(2,13,shuiwei);
		}		else//运行倒计时
		{			write_string(1,0,"run:");
			disp1\[0\]=fen/10+0x30;
			disp1\[1\]=fen%10+0x30;
			disp1\[3\]=miao/10+0x30;
			disp1\[4\]=miao%10+0x30;			write_string(2,5,disp1);
			disp2\[0\]=miao1/10+0x30;
			disp2\[1\]=miao1%10+0x30;			write_string(1,6,disp2);

     	shuiwei\[0\]=R/100+0x30;
		shuiwei\[1\]=(R%100)/10+0x30;
	   	shuiwei\[2\]=R%10+0x30;		 write_string(2,13,shuiwei);
		}
	}	if(mode>0)
	{	if(sec<19)//1s
		sec++;	else
	{
		sec=0;		if(miao>0)//秒计时
			miao--;		else
		{			if(fen>0)
			{
				miao=59;//分计时
				fen--;
			}			else
			{
				beep=0;	//结束
				mode=0;
				beep=1;
			}
		}		if(mode==1)//正转
		{			if(miao1>0)
			 	miao1--;			else
			{
				miao1=20;
				mode=3;
			}
		}		else if(mode==2)//暂停
		{			if(miao1>0)
			 	miao1--;			else
			{
				miao1=25;
				mode=3;
			}
		}		else if(mode==3)//反转
		{			if(miao1>0)
			 	miao1--;			else
			{
				miao1=20;
				mode=1;
			}
		}		else if(mode==4)//暂停
		{			if(miao1>0)
			 	miao1--;			else
			{
				miao1=20;
				mode=1;
			}
		}	
		else
		{
			miao1=0;				init_1602();
			beep = 0;			Delay(500);
			beep = 1;
		}			
	}
	}
	TH0=0X3C;
	TL0=0XB0;
}

四、实现现象

具体动态效果看B站演示视频:

2b003bd569cf596a5562e2dc3275bd94.jpeg

基于51单片机的自动清洗系统(自动洗衣机)


全部资料(源程序、仿真文件、安装包、演示视频):
链接:https://pan.baidu.com/s/1ddJ3RP7JqBRiUF7uI6a2tw?pwd=ahdy 
提取码:ahdy

标签:23,51,else,while,自动,mode,sbit,miao1,0x30
From: https://blog.csdn.net/szq0419/article/details/142513844

相关文章

  • Let‘s Encrypt基于阿里云Linux服务器搭建自动更新免费的SSL证书
    前言:‌SSL免费证书的有效期从2024年4月底开始从12个月缩短至3个月。对于使用免费SSL证书的中小企业或者个人开发者而言,每三个月去手动部署一次证书文件很容易遗忘,从而导致服务器接口或者网站访问异常,今天把基于阿里云一套自动更新的流程详细写出来。本系统环境基于阿里云......
  • 2024.9.[23, 24]训练记录
    23上午whk。辅助角公式。诱导公式。23下午莫队:原序列分块。询问排序:第一关键字为左端点所在块的编号,第二关键字为右端点编号。回滚莫队:适用于增加或删除操作其中一个复杂度较大,但另一个较小的情况。可以做到只使用一种操作。排序后按照左端点的块编号一块一块做。排完......
  • 9.23 ~ 9.29
    9.23集训第一天。早晨因为太多人没拿早读资料被老登D了。不是哥们你不早说现在我上哪给你找资料去......
  • 2023CSP-J 普及组第二轮试题及解析( 第三题一元二次方程)
    参考程序代码:#include<bits/stdc++.h>usingnamespacestd;intt,m,a,b,c;intaa,bb,gd1,gd2;intgcd(inta,intb){ if(a%b==0)returnb; returngcd(b,a%b);}intmain(){ scanf("%d%d",&t,&m); while(t--) { scanf("%d%d%d"......
  • DOTS计算Voronoi图形生成,根据点自动划分区域生成多边形
      如图,生成Voronoi图形,代码如下。 usingUnityEngine;usingUnity.Mathematics;usingUnity.Jobs;usingUnity.Collections;usingUnity.Profiling;[ExecuteInEditMode]publicclassVoronoiTextureBurstJobComponent:MonoBehaviour{[SerializeField][Min(......
  • [COCI2022-2023#4] Zrinka
    [COCI2022-2023#4]Zrinka题意给定两个由\(0,1\)组成的序列。\(0\)只能填入偶数,\(1\)只能填入奇数。要求两个序列单调递增并且每个数最多使用一次。求所用数最大值的最小值。思路动态规划。定义\(dp_{i,j}\)表示序列\(1\)填到\(i\),序列\(2\)填到\(j\)的最小......
  • CCPC 2023 Final
    \(A.\)考虑合法的b序列长什么样,我们倒着做,把+变成-,在所有\(b_{i}>b_{i+1}\)的\(i\)操作\(b_{i}-b_{i+1}\)次前缀,后缀同理,最终要求b全部相等非负即满足条件。考虑前缀(后缀)操作本质是从某个地方开始后下降次数,那么我们设\(b_{0}=b_{n+1}=inf\),最终只需要判断\(\sum|b_{i}-b_{i+1}......
  • node实现自动部署
    node实现自动部署环境准备#安装依赖版本号最好一致"chalk":"^4.1.2","child_process":"^1.0.2",目录src/configinit.js[用于初始化执行,获取当前操作的分支]publish.js[发布所需核心命令]代码/*init.js*//*开发分支直接发布脚本npmrundaily*/const{......
  • 【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合
    写在前面:......
  • 数控纵切自动车床
    数控纵切自动车床,作为现代机械加工领域的重要设备,集成了高精度、高效率与自动化等诸多优势。下面,我将从多个方面为您详细介绍这一先进设备。‌一、设备概述‌数控纵切自动车床,顾名思义,是一种结合了数控技术与纵切加工原理的自动化机床。它通过预设的程序控制,实现工件的自动上......