基于51单片机的豆浆果汁榨汁机仿真

仿真图:

在这里插入图片描述

功能简介:

单片机采用AT89C52,最小系统由晶振和复位电路组成
液晶显示采用LCD1602用于显示该项目的参数信息
具有多个功能按键,分别是启动、加、减和溢出等功能按键
采用DS18B20作为温度传感器
具有LED和蜂鸣器组成的声光报警电路,一旦工作完成或者溢出即可报警
采用多个LED作为电源指示灯以及电机工作状态灯和加热设备控制灯

芯片/模块的特点:

DS18B20特点:

  1. 单总线接口:DS18B20使用单总线接口进行通信,只需要一个引脚就可以连接多个传感器,简化了电路设计和连接。
  2. 数字输出:DS18B20以数字形式输出温度值,不需要额外的模数转换器。它使用12位的分辨率来表示温度值,可以实现高精度的温度测量。
  3. 高精度:DS18B20可以提供从-55°C到+125°C的温度测量范围,并具有±0.5°C的温度精度。因此,在许多应用中,它可以提供可靠和准确的温度测量结果。
  4. 多功能性:除了测量温度,DS18B20还可以执行其他功能,如温度报警功能。它可以设置上下限温度阈值,并在温度超过或低于这些阈值时触发报警。
  5. 低功耗:DS18B20采用低功耗设计,工作电流极低,只需要很少的能量来进行温度测量和通信。
  6. 耐用性: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++;
	  }
    }
  }
}

设计文件:

链接:https://pan.baidu.com/s/1hsvj3g61zO7bAjp5jGmquA?pwd=cv0m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值