仿真图:
功能简介:
单片机采用AT89C52,最小系统由晶振和复位电路组成
液晶显示采用LCD1602用于显示该项目的参数信息
具有多个功能按键,分别是启动、加、减和溢出等功能按键
采用DS18B20作为温度传感器
具有LED和蜂鸣器组成的声光报警电路,一旦工作完成或者溢出即可报警
采用多个LED作为电源指示灯以及电机工作状态灯和加热设备控制灯
芯片/模块的特点:
DS18B20特点:
- 单总线接口:DS18B20使用单总线接口进行通信,只需要一个引脚就可以连接多个传感器,简化了电路设计和连接。
- 数字输出:DS18B20以数字形式输出温度值,不需要额外的模数转换器。它使用12位的分辨率来表示温度值,可以实现高精度的温度测量。
- 高精度:DS18B20可以提供从-55°C到+125°C的温度测量范围,并具有±0.5°C的温度精度。因此,在许多应用中,它可以提供可靠和准确的温度测量结果。
- 多功能性:除了测量温度,DS18B20还可以执行其他功能,如温度报警功能。它可以设置上下限温度阈值,并在温度超过或低于这些阈值时触发报警。
- 低功耗:DS18B20采用低功耗设计,工作电流极低,只需要很少的能量来进行温度测量和通信。
- 耐用性:DS18B20具有良好的耐用性和可靠性,其封装材料和结构设计使其适用于各种环境条件下的应用。
主程序:
#include <STC12C5A.H>
#include <LCD1602.h>
#include <DS18B20.h>//用AT89C51时就用这个头文件
#define speed 20
u16 temp=0;//DS18B20温度
u8 Temp_Dis[3]={'0','0','0'};
u8 WD[3]={0xdf,0x43,0}; //自定义字符摄氏
u8 dis[4]={'0','0','0',0};
u8 Star_Flag=0;
u8 stop_flag=0;
int Water_Level=0;
u16 haomiao=0,miao=0,fen=0;
u16 Time=0;
u16 Time_Set=0;
u8 yichu_flag=0;
u16 yichu_haomiao=0,yichu_miao=0,yichu_fen=0;
u16 Timeyichu=0;
u16 Timeyichu_Set=0;
sbit jiashui=P3^3;
sbit daoshui=P3^4;
sbit qidong =P3^5;
sbit yichu =P3^6;
sbit beep =P1^3;
sbit LED =P1^4;
sbit M_LED =P1^5;
sbit Heat_LED =P1^6;
sbit Motor =P2^0;
void KEY(void);
void Display_Water(void);
/******定时器初始化******/
void TIME_INIT_0()
{
TMOD=0X01;
EA=1;
TR0=1;
ET0=1;
TH0=0X3C;
TL0=0XAF;
}
void main()
{
u8 jiyi=0;
beep=1;
Motor=0;//关电机
M_LED=1;//关电机指示灯
LED=0;
LCD_Initial();
LCD_Print(1,0, "Fully Automatic");
LCD_Print(4,1, "Machine");
delayms(300);
LCD_Write(0x00, 0x01);//清屏
LCD_Print(0,0, "Please Add Water");
LCD_Print(0,1, "Volume: 000%");
TIME_INIT_0();//开定时器
while(1)
{
KEY();
/***********************************************浆液溢出***********************************************/
if(yichu_flag==1)
{
LCD_Write(0x00, 0x01);//清屏
LCD_Print(0,0,"overflow");
LCD_Print(0,1,"Time: S");
Motor=0;//关电机
M_LED=1;//关电机指示灯
Heat_LED=1;//关加热
jiyi=Star_Flag;//记录系统运行状态
Star_Flag=0;
Timeyichu_Set=10;//设置10秒消泡沫
yichu_flag=2;
}
if(yichu_flag==2)
{
Timeyichu=yichu_fen*60+yichu_miao;//计算时间
dis[1]=Timeyichu/10+'0';
dis[2]=Timeyichu%10+'0';
LCD_Print(5,1,&dis[1]);
LCD_Print(6,1,&dis[2]);
if(Timeyichu>=Timeyichu_Set)//达到预设
{
Timeyichu_Set=0;
yichu_haomiao=0;
yichu_miao=0;
yichu_fen=0;
yichu_flag=0;
if(jiyi%2==0)
Star_Flag=jiyi-1;//恢复系统运行状态
else
Star_Flag=jiyi;//恢复系统运行状态
}
}
/***************************************1600W加热到80℃*******************************************/
if(Star_Flag==1)//正常启动
{
LCD_Print(0,0,"Power:1600W");
LCD_Print(0,1,"Tempe: ");
LCD_Print(10,1,WD);
Star_Flag=2;//将进入1600W加热到80度
}
if(Star_Flag==2)//1600W加热到80度
{
while(1)
{
if(temp>0&&temp<=1600)
{
chuli(temp,Temp_Dis); //数据处理
LCD_PutChar(6,1,&Temp_Dis[0]);
LCD_PutChar(7,1,&Temp_Dis[1]);
LCD_Print(8,1,".");
LCD_PutChar(9,1,&Temp_Dis[2]);
Heat_LED=0;
if(temp>1280)
// Heat_LED=1;
break;
}
}
haomiao=0;
miao=0;
fen=0;
Star_Flag=3;//将进入启动电机打浆,加热功率1600W
}
/****************************************打浆120S不加热*****************************************/
if(Star_Flag==3)//启动电机打浆120s
{
Motor=1;//启动电机打浆
M_LED=0;//开电机指示灯
Heat_LED=1;
LCD_Write(0x00, 0x01);//清屏
LCD_Print(0,0,"Power:0W");
LCD_Print(0,1,"Motor Star: S");
Time_Set=10;//设定电机打浆120秒
Star_Flag=4;//将进入等待打浆时间到
}
if(Star_Flag==4)//等待打浆时间到
{
Time=fen*60+miao;//计算时间
dis[0]=Time/100+'0';
dis[1]=Time%100/10+'0';
dis[2]=Time%100%10+'0';
LCD_Print(11,1,&dis[0]);
LCD_Print(12,1,&dis[1]);
LCD_Print(13,1,&dis[2]);
if(Time>=Time_Set)
{
Time_Set=0;
haomiao=0;
miao=0;
fen=0;
Star_Flag=5;//将进入800W加热,打浆同时进行,60s
}
}
/*****************************************800W煮浆同时打浆*****************************************/
if(Star_Flag==5)//800W加热,打浆同时进行,60s
{
Motor=1;//启动电机打浆
M_LED=0;//开电机指示灯
Heat_LED=0;
LCD_Write(0x00, 0x01);//清屏
LCD_Print(0,0,"Power:800W");
LCD_Print(0,1,"Motor Star: S");
Time_Set=10;//设定800W加热同时电机打浆60秒
Star_Flag=6;//将进入等待煮浆打浆时间到
}
if(Star_Flag==6)//等待煮浆打浆时间到
{
Time=fen*60+miao;//计算时间
dis[1]=Time/10+'0';
dis[2]=Time%10+'0';
LCD_Print(12,1,&dis[1]);
LCD_Print(13,1,&dis[2]);
if(Time>=Time_Set)
{
Time_Set=0;
haomiao=0;
miao=0;
fen=0;
Motor=0;//关闭电机打浆
M_LED=1;//关电机指示灯
Star_Flag=7;//将进入煮浆
}
}
/*******************************************300W煮浆*****************************************/
if(Star_Flag==7)//煮浆
{
LCD_Write(0x00, 0x01);//清屏
LCD_Print(0,0,"Power:300W");
LCD_Print(0,1,"Time: S");
Time_Set=10;//设定 10s煮浆
Star_Flag=8;//将进入等待煮浆打浆时间到
}
if(Star_Flag==8)//煮浆
{
Time=fen*60+miao;//计算时间
dis[1]=(Time)/10+'0';
dis[2]=(Time)%10+'0';
LCD_Print(6,1,&dis[1]);
LCD_Print(7,1,&dis[2]);
if(Time>=Time_Set)
{
Time_Set=0;
haomiao=0;
miao=0;
fen=0;
Star_Flag=9;//将进结束
}
}
/********************************************结束10s**************************************/
if(Star_Flag==9)//结束
{
LCD_Write(0x00, 0x01);//清屏
LCD_Print(0,0,"End of Run");
LCD_Print(0,1,"Time: S");
Time_Set=10;//设定10s
Star_Flag=10;
Heat_LED=1;
}
if(Star_Flag==10)//结束
{
Time=fen*60+miao;//计算时间
dis[1]=Time/10+'0';
dis[2]=Time%10+'0';
LCD_Print(6,1,&dis[1]);
LCD_Print(7,1,&dis[2]);
if(Time>=Time_Set)
{
Time_Set=0;
haomiao=0;
miao=0;
fen=0;
Star_Flag=11;//将进入蜂鸣器
}
}
/********************************************10后报警*******************************************/
if(Star_Flag==11)//蜂鸣器
{
Time_Set=2;//设定10s
Star_Flag=12;
}
if(Star_Flag==12)//蜂鸣器
{
Time=fen*60+miao;//计算时间
if(Time>0&&Time<=1)
{
beep=0;
}
if(Time>1&&Time<=2)
{
beep=1;
}
if(Time>=Time_Set)
{
haomiao=0;
miao=0;
fen=0;
}
}
}
}
/******定时器中断******/
void KEY()
{
jiashui=1;
daoshui=1;
qidong=1;
yichu=1;
if(jiashui==0&&Star_Flag==0&&yichu_flag==0)//加水
{
delayms(30);
if(jiashui==0)
{
Water_Level+=5;
if(Water_Level>=100)
Water_Level=100;
Display_Water();//显示水位
}
}
if(daoshui==0&&Star_Flag==0&&yichu_flag==0)//倒水
{
delayms(30);
if(daoshui==0)
{
Water_Level-=5;
if(Water_Level<=0)
Water_Level=0;
Display_Water();//显示水位
}
}
if(qidong==0)//启动
{
delayms(30);
if(qidong==0)
{
if(Star_Flag==0)
{
if(Water_Level<=70)//水不够
{
LCD_Write(0x00, 0x01);//清屏
LCD_Print(0,0, "Too Little Water");
LCD_Print(1,1, "Unable To Star");
beep=0;//开蜂鸣器
}
else if(Water_Level>=90)//水太多
{
LCD_Write(0x00, 0x01);//清屏
LCD_Print(1,0, "Too Much Water");
LCD_Print(1,1, "Unable To Star");
beep=0;//开蜂鸣器
}
else//水位正常
{
beep=1;//关蜂鸣器
LCD_Write(0x00, 0x01);//清屏
LCD_Print(2,0, "Machine Star");
delayms(400);
LCD_Write(0x00, 0x01);//清屏
Star_Flag=1;
}
}
if(Star_Flag==12)
{
LCD_Write(0x00, 0x01);//清屏
LCD_Print(0,0, "Please Add Water");
LCD_Print(0,1, "Volume: %");
Water_Level=0;
beep=1;
Motor=0;//关电机
M_LED=1;//关电机指示灯
LED=0;
Time_Set=0;
haomiao=0;
miao=0;
fen=0;
Star_Flag=0;
}
}
}
if(yichu==0&&yichu_flag==0&&Star_Flag>=3&&Star_Flag<=8)//浆液溢出
{
delayms(30);
if(yichu==0)
{
yichu_flag=1;
}
}
}
/*****************显示水位***************/
void Display_Water()
{
LCD_Print(0,0, "Please Add Water");
LCD_Print(0,1, "Volume: %");
dis[0]=Water_Level/100+'0';//计算水位
dis[1]=Water_Level%100/10+'0';
dis[2]=Water_Level%100%10+'0';
LCD_Print(11,1,&dis[0]);
LCD_Print(12,1,&dis[1]);
LCD_Print(13,1,&dis[2]);
}
/******定时器中断******/
void TIME_0() interrupt 1
{
TH0=0X3C;
TL0=0XAF;
if(Star_Flag<=2)
temp=get_temp();//获取温度值
if(Time_Set>0&&yichu_flag==0)
{
haomiao++;
if(haomiao==speed)
{
haomiao=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
}
}
}
if(Timeyichu_Set>0)
{
yichu_haomiao++;
if(yichu_haomiao==speed)
{
yichu_haomiao=0;
yichu_miao++;
if(yichu_miao==60)
{
yichu_miao=0;
yichu_fen++;
}
}
}
}
设计文件: