#include<STC15F104E.H>
#define ulong unsigned long 
#define uchar unsigned char		
#define uint unsigned int
sbit led1=P3^7;
sbit led2=P3^6;
sbit led3=P3^3;
sbit led4=P3^2;
sbit led5=P3^1;
sbit led6=P3^0;
sbit p54=P5^4;
sbit temp=P5^5;		  //18B20
sbit key_c=P1^1;		//共用数码管的按键IO口
sbit key_t=P1^3;
sbit key_c1=P1^0;		//共用数码管的按键IO口
sbit key_t1=P1^2;
sbit key=P1^5;
bit flag,flag1,flag_one,flag_two,flag_one1,flag_two1;
long s=0,m=0,h=0,n=0,t0;
uint time=0;
uchar display1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xc6,0xa3,0xf7}; 
//uchar  display1[]={0xfe,0x28,0x5d,0x7d,0x2b,0x37,0x77,0x2c,0xff,0x3f,};
uchar  display2[]={0,0,1,1,1,1,1,0,1,1}; 
void delay(unsigned int time) 
{
	unsigned int n;
	n=0;
	while(n<time)   
	{n++;}
	return;
}
/*********************/
void Delay_DS18B20(ulong num)
{	
  while(num--);
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
   unsigned char x=0;
   temp = 1;          //temp复位
   Delay_DS18B20(2);   //稍做延时
   temp = 0;          //单片机将temp拉低
   Delay_DS18B20(80); //精确延时,大于480us
   temp = 1;          //拉高总线
   Delay_DS18B20(14);
   x = temp;            //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
   Delay_DS18B20(20);
}
/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
   unsigned char i=0;
   unsigned char dat = 0;
   for (i=8;i>0;i--)
   {
   temp = 0;     // 给脉冲信号
   dat>>=1;
   temp = 1;     // 给脉冲信号
   if(temp)
   dat|=0x80;
   Delay_DS18B20(8);
   }
   return(dat);
}
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
   unsigned char i=0;
   for (i=8; i>0; i--)
   {
   temp = 0;
   temp = dat&0x01;
   Delay_DS18B20(10);
   temp = 1;
   dat>>=1;
   }
}
/*****读取温度*****/
unsigned int ReadTemperature(void)
{

   unsigned char a=0;
   unsigned char b=0;
   unsigned int t=0;
   float tt=0; 
   Init_DS18B20();
   WriteOneChar(0xCC); //跳过读序号列号的操作
   WriteOneChar(0x44); //启动温度转换
   Delay_DS18B20(20);
   Init_DS18B20();
   WriteOneChar(0xCC); //跳过读序号列号的操作
   WriteOneChar(0xBE); //读取温度寄存器
   a=ReadOneChar();      //读低8位
   b=ReadOneChar();    //读高8位
   t=b;
   t<<=8;
   t=t|a;
   tt=t*0.0625;
   t= tt*10+0.5;      //放大10倍输出并四舍五入
   return(t);
}
/*************加热相关函数*****************/
void init()
{
	P3M1=0x00;
	P3M0=0x04;
	P1M1=0x00;
	P1M0=0xff;
	P5M1=0x00;
	P5M0=0x10;
	TMOD=0X01;
	TH0=(65536-49997)/256;
	TL0=(65536-49997)%256;
	EA=1;ET0=1;TR0=1;
	t0=ReadTemperature();
	time=0;
}
void dis()//显示温度
{
	t0=ReadTemperature();
	P1=0x00;P54=0;
	P1 = 0x39;
	p54 = display2[0];
	led1=0;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	delay(300);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 =0x63;
	p54 = display2[2];
	led1=1;led2=0;
	led3=1;led4=1;
	led5=1;led6=1;
	delay(300);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 = display1[t0];
	p54 = display2[t0];
	led1=1;led2=1;
	led3=0;led4=1;
	led5=1;led6=1;
	delay(300);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 = 0x08;
	p54 = display2[0];
	led1=1;led2=1;
	led3=1;led4=0;
	led5=1;led6=1;
	delay(300);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 = display1[t0/10];
	p54 = display2[t0/10];
	led1=1;led2=1;
	led3=1;led4=1;
	led5=0;led6=1;
	delay(300);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 = display1[t0/100];
	p54 = display2[t0/100];
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=0;
	delay(300);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
}
void distemp()	//显示时间
{
	P1=0x00;P54=0;
	P1 = display1[s];
	p54 = display2[s];
	led1=0;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	delay(100);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 = display1[s/10];
	p54 = display2[s/10];
	led1=1;led2=0;
	led3=1;led4=1;
	led5=1;led6=1;
	delay(100);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 = display1[m];
	p54 = display2[m];
	led1=1;led2=1;
	led3=0;led4=1;
	led5=1;led6=1;
	delay(100);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 = display1[m/10];
	p54 = display2[m/10];
	led1=1;led2=1;
	led3=1;led4=0;
	led5=1;led6=1;
	delay(100);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 = display1[h];
	p54 = display2[h];
	led1=1;led2=1;
	led3=1;led4=1;
	led5=0;led6=1;
	delay(100);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
	P1=0x00;P54=0;
	P1 = display1[h/10];
	p54 = display2[h/10];
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=0;
	delay(100);//600
	led1=1;led2=1;
	led3=1;led4=1;
	led5=1;led6=1;
}
void key1()
{
	P1=0x02|P1;
	if(key_c==0)
	flag_one=1;
		if((key_c==1)&&(flag_one==1))
		{
			m++;
			flag_one=0;
		}
}

void key2()
{
	P1=0x08|P1;
	if(key_t==0)
	flag_two=1;
	if((key_t==1)&&(flag_two==1))
	{
		m--;
		flag_two=0;
	}
}

void key3()
{
	P1=0x01|P1;
	if(key_c1==0)
	flag_one1=1;
		if((key_c1==1)&&(flag_one1==1))
		{
			h--;
			flag_one1=0;
		}
}

void key4()
{
	P1=0x04|P1;
	if(key_t1==0)
	flag_two1=1;
	if((key_t1==1)&&(flag_two1==1))
	{
		h++;
		flag_two1=0;
	}
}
void config()
{
	if(m<0)
	{
		h--;
		m=0;
	}
	if(h<0)
	{
		h=23;
		m=59;
		s=59;
	}
	if(h>=24)
	{
		h=0;
		m=0;
		s=0;
	}
}
void key_ex()
{
	P1=0x20|P1;
	if(key==0)
	flag=1;
	if((key==1)&&(flag==1))
	{
		flag1=~flag1;
		flag=0;
	}
}
void main()
{	
	init();
	while(1)
	{	
		key_ex();
		if(flag1==0)
		{
			key1();
			key2();
			key3();
			key4();
			config();
			distemp();
		}
		else 
		{
			dis();
		}
			
	}
}
void timer0(void) interrupt 1 
{
	TH0=(65536-49997)/256;
	TL0=(65536-49997)%256;
	n++;
	if(n>=20)
	{	
		s++;
		n=0;
		if(s>=60)
		{
			s=0;m++;
			if(m>=60)
			{
				m=0;s=0;h++;
				if(h>=24)
				{
					s=0;
					m=0;
					h=0;
				}
			}
		}
	}
}