#include "includes.h"
uint temp;
uint count;
uint hour,minute,sec,oldsec=0;
uint hour1=0,minute1=0,sec1=0; //時,分,秒
sbit green = P1^0; //工作指示燈
sbit red = P1^1; //停止指示燈
sbit Cook = P1^2; //速煮米飯
sbit Soup = P1^3; //精煮米飯
sbit congee = P1^7; //煮粥
sbit Stewed = P2^0; //煲湯
sbit KeepHeat = P1^4; //保溫
sbit menu = P1^5; //時間預約
sbit add = P1^6; //加
sbit dec = P2^1; //減
sbit Beep = P2^4; //蜂鳴器
sbit AddTemp = P3^7; //加熱
uint ModeFlag;
unsigned char mode;
void KeepTemp(void);
/*******************************************
****** 延時程序 ***************
*******************************************/
void delay_ms(unsigned char ms) // 延時毫秒@12M,ms最大值255
{
unsigned char i;
while(ms--)
for(i = 0; i < 5; i++);
}
void delay00(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************************************
****** 設置工作模式 ***************
*******************************************/
void SetMode()
{
if(Cook == 0) //速煮米飯
{
delay_ms(5);
while(!Cook);
sec = 0;
minute = 0;
count = 0;
ModeFlag = 1;
}
else if(Soup == 0) //精煮米飯
{
delay_ms(5);
while(!Soup);
sec = 0;
minute = 0;
count = 0;
ModeFlag = 2;
}
else if(KeepHeat == 0) //保溫
{
delay_ms(5);
while(!KeepHeat);
sec = 0;
minute = 0;
count = 0;
ModeFlag = 5;
}
else if(congee == 0) //煮粥
{
delay_ms(5);
while(!congee);
sec = 0;
minute = 0;
count = 0;
ModeFlag = 3;
}
else if(Stewed == 0) //煲湯
{
delay_ms(5);
while(!Stewed);
sec = 0;
minute = 0;
count = 0;
ModeFlag = 4;
}
}
/*******************************************
****** 速煮米飯部分 ***************
*******************************************/
void CookRice(void) //速煮米飯
{
LCD_WriteString(0,0,"Cook Rice..");
AddTemp = 0;//開始加熱
green = 0;
red=1;
if(temp >= 500) //超過50度
{
TR0 = 1;
if(sec!=oldsec)
{
oldsec=sec;
LCD_SramChar(11,1,(3 - minute)%100/10+0x30); //4分鐘
LCD_SramChar(12,1,(3 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(59 - sec)%100/10+0x30);
LCD_SramChar(15,1,(59 - sec)%10+0x30);
}
}
else
TR0 = 0;
if((1 - minute) == 0 && (59 - sec) == 0)
{
TR0 = 0;
AddTemp = 1;
green = 1;
red=0;
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
ModeFlag=5; //保溫
}
}
/*******************************************
****** 精煮米飯部分 ***************
*******************************************/
void CookCong(void)
{
LCD_WriteString(0,0,"Cook Cong..");
AddTemp = ~AddTemp;//開始加熱
green = 0;
red=1;
if(temp >= 500)//超過50度
{
TR0 = 1;
if(sec!=oldsec)
{
oldsec=sec;
LCD_SramChar(11,1,(6 - minute)%100/10+0x30); //7分鐘
LCD_SramChar(12,1,(6 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(59 - sec)%100/10+0x30);
LCD_SramChar(15,1,(59 - sec)%10+0x30);
}
}
else
TR0 = 0;
if((1 - minute) == 0 && (59 - sec) == 0)
{
TR0 = 0;
AddTemp = 1;
green = 1;
red=0;
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
ModeFlag=5;
}
}
/*******************************************
****** 煮粥部分 ***************
*******************************************/
void CookSoup(void) //煮粥
{
LCD_WriteString(0,0,"Cook Soup..");
delay00(200);
AddTemp = ~AddTemp;//開始加熱
green = 0;
red=1;
if(temp >= 450)//超過45度
{
TR0 = 1;
if(sec!=oldsec)
{
oldsec=sec;
LCD_SramChar(11,1,(3 - minute)%100/10+0x30); //4 分鐘
LCD_SramChar(12,1,(3 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(59 - sec)%100/10+0x30);
LCD_SramChar(15,1,(59 - sec)%10+0x30);
}
}
else
TR0 = 0;
if((1 - minute) == 0 && (59 - sec) == 0)
{
TR0 = 0;
AddTemp = 1;
green = 1;
red=0;
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
//KeepTemp();
ModeFlag=5;
}
/*******************************************
****** 煲湯部分 ***************
*******************************************/
void Stewedsoup(void) //煲湯
{
LCD_WriteString(0,0,"Stew soup..");
AddTemp = ~AddTemp;//開始加熱
delay00(800);
green = 0;
red=1;
if(temp >= 400)//超過40度
{
TR0 = 1;
if(sec!=oldsec)
{
oldsec=sec;
LCD_SramChar(11,1,(5 - minute)%100/10+0x30); //6分鐘
LCD_SramChar(12,1,(5 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(59 - sec)%100/10+0x30);
LCD_SramChar(15,1,(59 - sec)%10+0x30);
}
}
else
TR0 = 0;
if((1 - minute) == 0 && (59 - sec) == 0)
{
TR0 = 0;
AddTemp = 1;
green = 1;
red=0;
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
Beep = 0;delay00(200);Beep = 1;delay00(200);
ModeFlag=5;
}
}
/*******************************************
****** 保溫部分 ***************
*******************************************/
void KeepTemp(void)
{
LCD_WriteString(0,0,"Keep Temp.. ");
AddTemp = 0;//開始加熱
green = 0;
red=0;
if(temp >= 300)//超過60度 30
{
AddTemp = 1;//停止加熱
}
else if(temp <= 300) //開始加熱 30度
{
AddTemp = 0;
green = 0;
red=0;
}
}
/*******************************************
****** 按鍵部分 ***************
*******************************************/
void key_scan()
{
unsigned char s1num=0;
if(menu==0)
{
delay00(50);
if(menu==0)
{
while(!menu);
s1num++;
command(0x01);
TR0 = 0; hour=0;minute=0;sec=0;
while(1)
{
if(menu==0)
{
delay00(50);
if(menu==0)
{
while(!menu);
s1num++;
}
}
if(s1num==1)
{
LCD_WriteString(0,0,"Set Mode:");
LCD_SramChar(9,0,mode/10+0x30);
LCD_SramChar(10,0,mode%10+0x30);
if(add==0)
{
delay00(30);
if(add==0)
{ while(!add);
mode ++;
if(mode >= 5)
mode = 0;
LCD_SramChar(9,0,mode/10+0x30);
LCD_SramChar(10,0,mode%10+0x30);
}
}
if(dec==0)
{
delay00(30);
if(dec==0)
{ while(!dec);
if(mode == 0)
mode = 5;
mode --;
LCD_SramChar(9,0,mode/10+0x30);
LCD_SramChar(10,0,mode%10+0x30);
}
}
}
if(s1num==2)
{
LCD_WriteString(0,0,"Set hour:");
LCD_SramChar(9,0,hour1/10+0x30);
LCD_SramChar(10,0,hour1%10+0x30);
if(add==0)
{
delay00(30);
if(add==0)
{ while(!add);
hour1 ++;
if(hour1 == 12)
hour1 = 0;
LCD_SramChar(9,0,hour1/10+0x30);
LCD_SramChar(10,0,hour1%10+0x30);
}
}
if(dec==0)
{
delay00(30);
if(dec==0)
{ while(!dec);
if(hour1 == 0)
hour1 = 12;
hour1 --;
LCD_SramChar(9,0,hour1/10+0x30);
LCD_SramChar(10,0,hour1%10+0x30);
}
}
}
if(s1num==3)
{
LCD_WriteString(0,0,"Set minute:");
LCD_SramChar(11,0,minute1/10+0x30);
LCD_SramChar(12,0,minute1%10+0x30);
if(add==0)
{
delay00(30);
if(add==0)
{ while(!add);
minute1 ++;
if(minute1 == 60)
minute1 = 0;
LCD_SramChar(11,0,minute1/10+0x30);
LCD_SramChar(12,0,minute1%10+0x30);
}
}
if(dec==0)
{
delay00(30);
if(dec==0)
{ while(!dec);
if(minute1 == 0)
minute1 = 60;
minute1 --;
LCD_SramChar(11,0,minute1/10+0x30);
LCD_SramChar(12,0,minute1%10+0x30);
}
}
}
if(s1num == 4)
{
s1num=0;//s1num清零//
command(0x01); //清屏
ModeFlag = 6;
AddTemp = 1;
TR0 = 1;
break;
}
}
}
}
}
/*******************************************
****** 顯示預約剩余時間部分 ***************
*******************************************/
void SetTime(void)
{
LCD_SramChar(0,1,(hour1 - hour)%100/10+0x30); //hour1 是設定的時間,hour是正常走的時間
LCD_SramChar(1,1,(hour1 - hour)%10+0x30);
LCD_SramChar(2,1,':');
if((minute1-minute)>0)
{
LCD_SramChar(3,1,(minute1 - 1 - minute)%100/10+0x30);
LCD_SramChar(4,1,(minute1 - 1 - minute)%10+0x30);
}
else
{
LCD_SramChar(3,1,'0');
LCD_SramChar(4,1,'0');
}
LCD_SramChar(5,1,':');
if(((hour1 - hour)>0)||((minute1-minute)>0))
{
LCD_SramChar(6,1,(59 - sec)%100/10+0x30);
LCD_SramChar(7,1,(59 - sec)%10+0x30);
}
else
{
LCD_SramChar(6,1,'0');
LCD_SramChar(7,1,'0');
}
LCD_WriteString(8,1," ");
if((minute1 - 1 - minute) == 0 && (59 - sec) == 0 &&(hour1 - hour) == 0)
{
TR0 = 0;Beep = 0;delay00(200);Beep = 1;
ModeFlag = mode;
hour=0;minute=0;sec=0;
}
}
/*******************************************
****** 主函數 ***************
*******************************************/
void main()
{
EA = 1;
TMOD = 0X01;
ET0 = 1;
TH0 = 0X3C;
TL0 = 0XB0;
Beep = 1;
AddTemp = 1;
LCD_Initial();
Init_DS18B20();
temp = ReadTemperature();
delay_ms(100);
while(1)
{
temp = ReadTemperature();
LCD_WriteString(0,2,"NowTemp=");
LCD_SramChar(8,2,temp%10000/1000+0x30);
LCD_SramChar(9,2,temp%1000/100+0x30);
LCD_SramChar(10,2,temp%100/10+0x30);
LCD_SramChar(11,2,'.');
LCD_SramChar(12,2,temp%10+0x30);
LCD_SramChar(13,2,'C');
SetMode();
key_scan();
switch(ModeFlag) //模式選擇
{
case 1: CookRice();break;
case 2: CookCong();break;
case 3: CookSoup();break;
case 4: Stewedsoup();break;
case 5: KeepTemp();break;
case 6: SetTime();break;
}
}
}
/*******************************************
****** 定時器定時部分 ***************
*******************************************/
void t0() interrupt 1
{
TH0 = 0X3C;
TL0 = 0XB0;
count ++;
if(count >= 20)
{
count = 0;
sec ++;
if(sec == 60)
{
sec = 0;
minute ++;
if(minute == 60)
hour ++;
}
}
}
|