#include "includes.h"
uint temp;
uint count;
uint hour=0,minute=0,sec=0,sec2=0,oldsec=0;
uint hour1=0,minute1=0,sec1=0; //時,分,秒
sbit green = P1^0; //工作指示燈
sbit red = P1^1; //停止指示燈
sbit Set = P3^6; //速煮米飯
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);
unsigned char mode = 0;
/*******************************************
****** 延時程序 ***************
*******************************************/
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(Set == 0) //速煮米飯
{
delay_ms(5);
while(!Set);
ModeFlag = 7;
}
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 Set_KEY(void) //速煮米飯
{
sec = 0;
minute = 0;
count = 0;
Beep = 1;
AddTemp = 1;
green = 1;
red=1;
LCD_WriteString(0,0," ");
}
/*******************************************
****** 速煮米飯部分 ***************
*******************************************/
void CookRice(void) //速煮米飯
{
LCD_WriteString(0,0,"Cook Rice1.");
LCD_SramChar(11,1,(0 - minute)%100/10+0x30); //4分鐘
LCD_SramChar(12,1,(0 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(10 - sec)%100/10+0x30);
LCD_SramChar(15,1,(10 - sec)%10+0x30);
if(temp >= 800) //超過80度
{
AddTemp = 1;
}
else
{
AddTemp = 0;
}
if((0 - minute) == 0 && (10 - sec) > 0)
{
TR0=1;
green = 0;
red=1;
}
else
{
TR0 = 1;
if(temp >= 800) //超過80度
{
TR0 = 1;
AddTemp = 1;
mode=1;
sec2=0;
}
else
{
TR0 = 0;
AddTemp = 0;
}
}
}
void CookRice2(void) //速煮米飯
{
LCD_WriteString(0,0,"Cook Rice2.");
LCD_SramChar(11,1,(0 - minute)%100/10+0x30);
LCD_SramChar(12,1,(0 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(15 - sec2)%100/10+0x30);
LCD_SramChar(15,1,(15 - sec2)%10+0x30);
if(temp >= 1000) //超過100度
{
AddTemp = 1;
}
else
{
AddTemp = 0;
}
if((0 - minute) == 0 && (15 - sec2) > 0)
{
green = 0;
red=1;
}
else
{
if(temp >= 1000) //超過100度
{
TR0 = 0;
AddTemp = 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);
delay00(200);
Beep = 0;
delay00(200);
Beep = 1;
delay00(200);
Beep = 0;
delay00(200);
Beep = 1;
delay00(200);
ModeFlag=5; //保溫
}
else
{
TR0 = 0;
AddTemp = 1;
}
}
}
/*******************************************
****** 精煮米飯部分 ***************
*******************************************/
void CookCong(void)
{
LCD_WriteString(0,0,"Cook Cong1.");
LCD_SramChar(11,1,(0 - minute)%100/10+0x30); //4分鐘
LCD_SramChar(12,1,(0 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(15 - sec)%100/10+0x30);
LCD_SramChar(15,1,(15 - sec)%10+0x30);
if(temp >= 800) //超過80度
{
AddTemp = 1;
}
else
{
AddTemp = 0;
}
if((0 - minute) == 0 && (15 - sec) > 0)
{
TR0=1;
green = 0;
red=1;
}
else
{
TR0 = 1;
if(temp >= 800) //超過80度
{
TR0 = 1;
AddTemp = 1;
mode=1;
sec2=0;
}
else
{
TR0 = 0;
AddTemp = 0;
}
}
}
void CookCong2(void) //速煮米飯
{
LCD_WriteString(0,0,"Cook Cong2.");
LCD_SramChar(11,1,(0 - minute)%100/10+0x30);
LCD_SramChar(12,1,(0 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(30 - sec2)%100/10+0x30);
LCD_SramChar(15,1,(30 - sec2)%10+0x30);
if(temp >= 1000) //超過100度
{
AddTemp = 1;
}
else
{
AddTemp = 0;
}
if((0 - minute) == 0 && (30 - sec2) > 0)
{
green = 0;
red=1;
}
else
{
if(temp >= 1000) //超過100度
{
TR0 = 0;
AddTemp = 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);
ModeFlag=5; //保溫
}
else
{
TR0 = 0;
AddTemp = 1;
}
}
}
/*******************************************
****** 煮粥部分 ***************
*******************************************/
void CookSoup(void) //煮粥
{
LCD_WriteString(0,0,"Cook Soup1.");
LCD_SramChar(11,1,(0 - minute)%100/10+0x30); //4分鐘
LCD_SramChar(12,1,(0 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(10 - sec)%100/10+0x30);
LCD_SramChar(15,1,(10 - sec)%10+0x30);
if(temp >= 700) //超過70度
{
AddTemp = 1;
}
else
{
AddTemp = 0;
}
if((0 - minute) == 0 && (10 - sec) > 0)
{
TR0=1;
green = 0;
red=1;
}
else
{
TR0 = 1;
if(temp >= 700) //超過70度
{
TR0 = 1;
AddTemp = 1;
mode=1;
sec2=0;
}
else
{
TR0 = 0;
AddTemp = 0;
}
}
}
void CookSoup2(void) //速煮米飯
{
LCD_WriteString(0,0,"Cook Soup2.");
LCD_SramChar(11,1,(0 - minute)%100/10+0x30);
LCD_SramChar(12,1,(0 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(25 - sec2)%100/10+0x30);
LCD_SramChar(15,1,(25 - sec2)%10+0x30);
if(temp >=1000) //超過100度
{
AddTemp = 1;
}
else
{
AddTemp = 0;
}
if((0 - minute) == 0 && (25 - sec2) > 0)
{
green = 0;
red=1;
}
else
{
if(temp >= 1000) //超過100度
{
TR0 = 0;
AddTemp = 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);
ModeFlag=5; //保溫
}
else
{
TR0 = 0;
AddTemp = 1;
}
}
}
/*******************************************
****** 煲湯部分 ***************
*******************************************/
void Stewedsoup(void) //煲湯
{
LCD_WriteString(0,0,"Stew soup1.");
LCD_SramChar(11,1,(0 - minute)%100/10+0x30); //4分鐘
LCD_SramChar(12,1,(0 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(10 - sec)%100/10+0x30);
LCD_SramChar(15,1,(10 - sec)%10+0x30);
if(temp >= 700) //超過70度
{
AddTemp = 1;
}
else
{
AddTemp = 0;
}
if((0 - minute) == 0 && (10 - sec) > 0)
{
TR0=1;
green = 0;
red=1;
}
else
{
TR0 = 1;
if(temp >= 700) //超過70度
{
TR0 = 1;
AddTemp = 1;
mode=1;
sec2=0;
}
else
{
TR0 = 0;
AddTemp = 0;
}
}
}
void Stewedsoup2(void) //速煮米飯
{
LCD_WriteString(0,0,"Cook soup2.");
LCD_SramChar(11,1,(0 - minute)%100/10+0x30);
LCD_SramChar(12,1,(0 - minute)%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,(30 - sec2)%100/10+0x30);
LCD_SramChar(15,1,(30 - sec2)%10+0x30);
if(temp >= 1000) //超過100度
{
AddTemp = 1;
}
else
{
AddTemp = 0;
}
if((0 - minute) == 0 && (30 - sec2) > 0)
{
green = 0;
red=1;
}
else
{
if(temp >= 1000) //超過100度
{
TR0 = 0;
AddTemp = 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; //保溫
}
else
{
TR0 = 0;
AddTemp = 1;
}
}
}
/*******************************************
****** 保溫部分 ***************
*******************************************/
void KeepTemp(void)
{
mode=0;
LCD_WriteString(0,0,"Keep Temp.. ");
AddTemp = 0;//開始加熱
green = 0;
red=0;
if(temp >= 600)//超過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(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);
TR0=1;
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:
if(mode==0)
{
CookRice();
else if(mode==1)
{
CookRice2();
}
break;
case 2:
if(mode==0)
{
CookCong();
}
else if(mode==1)
{
CookCong2();
}
break;
case 3:
if(mode==0)
{
CookSoup();
}
else if(mode==1)
{
CookSoup2();
}
break;
case 4:
if(mode==0)
{
Stewedsoup();
}
else if(mode==1)
{
Stewedsoup2();
}
break;
case 5:
KeepTemp();
break;
case 6:
SetTime();
break;
case 7:
Set_KEY();
break;
}
}
}
/*******************************************
****** 定時器定時部分 ***************
*******************************************/
void t0() interrupt 1
{
TH0 = 0X3C;
TL0 = 0XB0;
count ++;
if(count >= 20)
{
count = 0;
sec ++;
sec2 ++;
if(sec == 60)
{
sec = 0;
minute ++;
if(minute == 60)
hour ++;
}
}
}
|