基于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: