基于51单片机的冰箱控制系统(冷冻冷藏,3模式)
1、显示冷藏温度、冷冻温度,两个温度可调
2、具有自动模式、手动模式、速冻模式
手动模式下可以修改温度;
自动模式下冷冻-18度,冷藏5度。
速冻模式下冷冻-25度,冷藏0度。
3、冰箱开门一分钟超时报警
#include "reg51.h"
#include"Ds18b20.h"
#define uchar unsigned char
#define uint unsigned int
sbit smg1=P2^0;//数码管
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit smg5=P2^4;
sbit smg6=P2^5;
sbit smg7=P2^6;
sbit smg8=P2^7;
sbit k1=P3^0;//按钮
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit k5=P3^4;
sbit k6=P3^5;
sbit k7=P3^6;
sbit k8=P3^7;
sbit beep=P1^4;//蜂鸣器
sbit led1=P1^5;
sbit led2=P1^6;
sbit led3=P1^7;
sbit out1=P1^0;
sbit out2=P1^2;
//数码管编码
uchar code smgduan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar time=0;
float wendu1=-18,wendu2=5;//冷冻,冷藏
uchar mode=0;
uchar miao=0,sec=0;
//延时
void delay(uint i)
{
while(i--);
}
//主函数
void main()
{
uint i;
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
//显示冷冻室
if(wendu1>0)
{
i=wendu1;
smg1=0;
P0=smgduan[i%1000/100]; smg2=1;delay(50);smg2=0;
P0=smgduan[i%100/10]; smg3=1;delay(50);smg3=0;
P0=smgduan[i%10]; smg4=1;delay(50);smg4=0;
}
else
{
i=-wendu1;
P0=0xbf; smg1=1;delay(50);smg1=0;
P0=smgduan[i%1000/100]; smg2=1;delay(50);smg2=0;
P0=smgduan[i%100/10]; smg3=1;delay(50);smg3=0;
P0=smgduan[i%10]; smg4=1;delay(50);smg4=0;
}
//显示冷藏室
if(wendu2>0)
{
i=wendu2;
smg5=0;
P0=smgduan[i%1000/100]; smg6=1;delay(50);smg6=0;
P0=smgduan[i%100/10]; smg7=1;delay(50);smg7=0;
P0=smgduan[i%10]; smg8=1;delay(50);smg8=0;
}
else
{
i=-wendu2;
P0=0xbf; smg5=1;delay(50);smg5=0;
P0=smgduan[i%1000/100]; smg6=1;delay(50);smg6=0;
P0=smgduan[i%100/10]; smg7=1;delay(50);smg7=0;
P0=smgduan[i%10]; smg8=1;delay(50);smg8=0;
}
//点亮led
if(mode==0)
{
led1=0;led2=1;led3=1;
if(!k4)
{
if(wendu1<99)
wendu1=wendu1+1;
while(!k4);
}
if(!k5)
{
if(wendu1>-30)
wendu1=wendu1-1;
while(!k5);
}
if(!k6)
{
if(wendu2<99)
wendu2=wendu2+1;
while(!k6);
}
if(!k7)
{
if(wendu2>-30)
wendu2=wendu2-1;
while(!k7);
}
}
if(mode==1)
{
led1=1;led2=0;led3=1;
wendu1=-18;wendu2=5;
}
if(mode==2)
{
led1=1;led2=1;led3=0;
wendu1=-25;wendu2=0;
}
//按键检测
if(!k1)
mode=0;
if(!k2)
mode=1;
if(!k3)
mode=2;
}
}
//定时器中断
void Timer0() interrupt 1
{
if(time<10)//0.5s
time++;
else
{
time=0;
Ds18b20ReadTemp();//测温
Ds18b20ReadTemp2();
//输出控制
if(wendu1<ds18b20_temp1)
out1=0;
else
out1=1;
if(wendu2<ds18b20_temp2)
out2=0;
else
out2=1;
}
//开门计时
if(k8)
{
if(sec<19)
sec++;
else
{
sec=0;
if(miao<59)
miao++;
else
{
miao=0;
beep=0;
}
}
}
else
{
beep=1;
miao=0;
sec=0;
}
TH0=0X3C;
TL0=0XB0;
}