基于51单片机的智能淋浴系统(Proteus仿真)

        基于51单片机的智能淋浴系统以AT89C51作为系统主控,LCD1602作为显示器件,同时,电源、加热装置、出水装置都采取继电器进行仿真,同时系统具有时间功能,利用DS1302进行提供,同时有谷电时间段自动加热的功能。

一、硬件设计

1、ADC0804

        ADC0804是一款经典的ADC芯片,该芯片主要用于模数转换,使用简单,代码量偏小,缺点就是芯片需要占用较多IO口,但是对于本次设计无需过多关注IO口。

2、DS1302

        DS1302是一款时钟芯片,该芯片通常使用32.768khz的晶振提供震荡源,可为系统提供更为精确的时钟。

3、继电器

        本次设计使用了三个继电器,因为在实际使用中,继电器其实是比较方便进行加热(加热片)、出水(水泵)、开关的控制,其主要特点就是小功率控制大功率。

4、DS18B20

           DS18B20是一种常见的数字型温度传感器,具备独特的单总线接口方式。其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点。

二、软件设计

1、ADC0804驱动

//ADC0804读取ADC的值
unsigned char ADC0804_Read(void)
{
	unsigned char dat;
	ADC0804_Port = 0xff;
	ADC0804_CS = 1;
	ADC0804_WR = 1;
	ADC0804_CS = 0;
	ADC0804_WR = 0;
	//Delay_xus(100);
	ADC0804_CS = 1;
	ADC0804_WR = 1;
	//Delay_xus(500);
	ADC0804_CS = 0;
	ADC0804_RD = 0;
	//Delay_xus(50);
	dat = ADC0804_Port;
	ADC0804_RD = 1;
	ADC0804_CS = 1;
	return dat;
}

2、DS18B20

OneWire.c

#include <REGX52.H>

sbit OneWire_DQ=P3^7;

unsigned char OneWire_Init()
{
	unsigned char i;
	unsigned char AckBit;
	OneWire_DQ=1;
	OneWire_DQ=0;
	i = 247;while (--i);	//delay 500us
	OneWire_DQ=1;
	i = 32;while (--i);		//delay 70us
	AckBit=OneWire_DQ;
	i = 247;while (--i);	//delay 500us
	return AckBit;
}

void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	OneWire_DQ=0;
	i=4;while(--i);		//delay 10us
	OneWire_DQ=Bit;
	i=24;while(--i);	//delay 50us
	OneWire_DQ=1;
}	

unsigned char OneWire_ReceiveBit()
{
	unsigned char i;
	unsigned char Bit;
	OneWire_DQ=0;
	i=2;while(--i);		//delay 5us
	OneWire_DQ=1;
	i=2;while(--i);		//dealy 5us
	Bit=OneWire_DQ;
	i=24;while(--i);	//delay 50us
	return Bit;
}	

void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));
	}
}	

unsigned char OneWire_ReceiveByte()
{
	unsigned char i;
	unsigned char Byte=0x00;
	for(i=0;i<8;i++)
	{
		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
	}
	return Byte;
}	
	




DS18B20.c

#include <REGX52.H>
#include "OneWire.h"

#define DS18B20_SKIP_ROM        	0xcc
#define DS18B20_CONVERT_T      		0x44
#define DS18B20_READ_SCERATCHPAD 	0xbe

void DS18B20_ConvertT()
{
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_CONVERT_T);
}	

float DS18B20_ReadT()
{
	unsigned char TLSB,TMSB;
	int Temp;
	float T;
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_READ_SCERATCHPAD);
	TLSB=OneWire_ReceiveByte();
	TMSB=OneWire_ReceiveByte();
	Temp=(TMSB<<8)|TLSB;
	T=Temp/16.0;
	return T;
}	

3、主函数逻辑

#include <REGX52.H>
#include "LCD1602.H"
#include "delay.h" 
#include "DS18B20.h" 
#include "DS1302.h" 
#include "ADC.h"
#include "KEY.h"
 
sbit Mswitch = P2^0;
sbit Hot = P2^1;
sbit Water = P2^2;
 
float tem=0;
float pos=0;
 
unsigned char posFlag=0;
unsigned char temFlag=0;
unsigned char gdFlag=0;
unsigned char tem_set=50;
unsigned char keyNum=0;
 
void main()
{
	Mswitch = 1;
	Hot = 0;
	Water = 0;
	DS18B20_ConvertT();
	DS1302_Init();
	ADC0804_Read();
    LCD_Init();
	LCD_ShowString(2,1,"  :  :");
	LCD_ShowString(1,1,"Tem:");
	LCD_ShowString(1,9,"Pos:");
	while(1)
    {                  
		DS18B20_ConvertT();			//转换温度
		tem = DS18B20_ReadT();		//读取温度
		pos = (float)ADC0804_Convert()/255*100;	//读取水位
		DS1302_ReadTime();			//获取实时时间
		
		keyNum = KEY();
		if(keyNum==1){
			tem_set--;
		}
		else if(keyNum==2){
			tem_set++;
		}
		
		//当水位低于10的时候,开始补水,置补水标志位
		if(pos < 10){
			posFlag=1;
		}
		//补水标志位为1时,进行补水
		if(posFlag==1){
			//关闭总电源
			Mswitch=0;
			//开启补水
			Water=1;
			//水量大于50,关闭补水,开启总电源
			if(pos >= 50){
				posFlag=0;
				Mswitch=1;
				Water=0;
			}
		}
		
		
		
		if(Mswitch == 1){
			//温度低于20的时候,进行加热
			if(tem < 30){
				temFlag=1;
			}
			//加热标志位为1时,进行加热
			if(temFlag==1){
				//开启加热
				Hot=1;
				//温度大于50,关闭加热
				if(tem >= tem_set){
					temFlag=0;
					Hot=0;
				}
			}
			
			
			//谷电加热
			if(DS1302_Time[3] >= 22 || DS1302_Time[3]<8){
				if(tem < tem_set){
					Hot=1;
				}
				else{
					Hot=0;
				}
			}
			if(DS1302_Time[3] == 8){
				gdFlag = 1;
			}
			if(gdFlag == 1){
				Hot=0;
				gdFlag=0;
			}			
		}
		else{
			Hot=0;
		}
		
		LCD_ShowNum(1,5,tem,2);		//显示温度
		LCD_ShowNum(1,13,pos,3);	//显示水位
		
		//显示实时时间
		LCD_ShowNum(2,1,DS1302_Time[3],2);
		LCD_ShowNum(2,4,DS1302_Time[4],2);
		LCD_ShowNum(2,7,DS1302_Time[5],2);
		
		LCD_ShowNum(2,13,tem_set,2);	
    }
}               

三、项目演示

1、程序初始状态

        程序初始状态,显示温度、水位、时间、温度阈值,同时电源通电。

2、进水状态

        进水状态时为了保证安全,会先将电源关闭,然后再打开出水装置,如下:

3、加热状态

        温度下降到30以下,自动开启加热,直到温度上升到50度及以上加热装置关闭

4、谷电时间自动加热

        本次不做过多演示,参考代码如下:

//谷电加热
if(DS1302_Time[3] >= 22 || DS1302_Time[3]<8){
    if(tem < tem_set){
        Hot=1;
    }
    else{
        Hot=0;
    }
}

四、项目总结

        本次项目,利用Proteus仿真,结合LCD1602、继电器、DS1302等实现了一整个系统的设计,完成了固定时间开关水、自动补水、自动加热、按键调节温度阈值等。

详情可参考本人bilibili:

基于51单片机的智能淋浴系统_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值