#include "reg52.h"
#include "ds1302.h"
#include "onewire.h"
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
sbit S4=P3^3;
sbit S5=P3^2;
sbit S6=P3^1;
sbit S7=P3^0;
unsigned char code Seg_Table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char Write_DS1302_Addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char Read_DS1302_Addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char TimeNow[7]={0x57,0x59,0x23};
unsigned char TimeTemp[7];
unsigned char TimeAlarm[7];
unsigned char i=0;
unsigned char Timeopen=0;
unsigned char Timemode=1;
unsigned char Timemode1;
unsigned char TimeTempset[7];
unsigned char shineflag=0;
unsigned char tmode=0;
unsigned char Alarmopen=0;
unsigned char Alarmmode=1;
unsigned char Alarmmode1;
unsigned char getup=0;
unsigned int t=0;
unsigned int L1=0;
unsigned char temperatureopen=0;
unsigned int temperature;
void Get_Tempc();
void SelectHC138(unsigned char n)
{
switch(n)
{
case 4:
HC138_C=1;
HC138_B=0;
HC138_A=0;
break;
case 5:
HC138_C=1;
HC138_B=0;
HC138_A=1;
break;
case 6:
HC138_C=1;
HC138_B=1;
HC138_A=0;
break;
case 7:
HC138_C=1;
HC138_B=1;
HC138_A=1;
break;
}
}
void SystemInit()
{
SelectHC138(4);
P0=0xff;
SelectHC138(5);
P0=0x00;
}
void DS1302_Config()
{
unsigned char i;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_Ds1302_Byte(Write_DS1302_Addr[i],TimeNow[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void Get_Time()
{
unsigned char i;
for(i=0;i<7;i++)
{
TimeNow[i]=Read_Ds1302_Byte(Read_DS1302_Addr[i]);
}
}
void Delay(unsigned int t)
{
while(t--);
}
void SMG_Display(unsigned char pos,unsigned char dat)
{
SelectHC138(6);
P0=0x01<<pos;
SelectHC138(7);
P0=dat;
}
void SMG_Dynamic()
{
while(S4==0)
{
if(Timeopen==0&&Alarmopen==0)
{
SMG_Display(0,0xff);
Delay(100);
SMG_Display(1,0xff);
Delay(100);
SMG_Display(2,0xff);
Delay(100);
SMG_Display(3,0xff);
Delay(100);
SMG_Display(4,0xff);
Delay(100);
SMG_Display(5,Seg_Table[(temperature/10)]);
Delay(100);
SMG_Display(6,Seg_Table[(temperature%10)]);
Delay(100);
SMG_Display(7,0xc6);
Delay(100);
SelectHC138(6);
P0=0xff;
SelectHC138(7);
P0=0xff;
}
}
if(Alarmopen==1)
{
SMG_Display(0,Seg_Table[TimeTemp[2]/16]);
Delay(100);
SMG_Display(1,Seg_Table[TimeTemp[2]%16]);
Delay(100);
SMG_Display(2,0xbf);
Delay(100);
SMG_Display(3,Seg_Table[TimeTemp[1]/16]);
Delay(100);
SMG_Display(4,Seg_Table[TimeTemp[1]%16]);
Delay(100);
SMG_Display(5,0xbf);
Delay(100);
SMG_Display(6,Seg_Table[TimeTemp[0]/16]);
Delay(100);
SMG_Display(7,Seg_Table[TimeTemp[0]%16]);
Delay(100);
SelectHC138(6);
P0=0xff;
SelectHC138(7);
P0=0xff;
}
else if(Timeopen==1)
{
switch(Timemode)
{
case 2:
if(shineflag==1)
{
SMG_Display(0,0xff);
Delay(100);
SMG_Display(1,0xff);
Delay(100);
}
if(shineflag==0)
{
SMG_Display(0,Seg_Table[TimeTempset[2]/16]);
Delay(100);
SMG_Display(1,Seg_Table[TimeTempset[2]%16]);
Delay(100);
}
SMG_Display(2,0xbf);
Delay(100);
SMG_Display(3,Seg_Table[TimeTempset[1]/16]);
Delay(100);
SMG_Display(4,Seg_Table[TimeTempset[1]%16]);
Delay(100);
SMG_Display(5,0xbf);
Delay(100);
SMG_Display(6,Seg_Table[TimeTempset[0]/16]);
Delay(100);
SMG_Display(7,Seg_Table[TimeTempset[0]%16]);
Delay(100);
SelectHC138(6);
P0=0xff;
SelectHC138(7);
P0=0xff;
break;
case 3:
if(shineflag==1)
{
SMG_Display(3,0xff);
Delay(100);
SMG_Display(4,0xff);
Delay(100);
}
if(shineflag==0)
{
SMG_Display(3,Seg_Table[TimeTempset[1]/16]);
Delay(100);
SMG_Display(4,Seg_Table[TimeTempset[1]%16]);
Delay(100);
}
SMG_Display(0,Seg_Table[TimeTempset[2]/16]);
Delay(100);
SMG_Display(1,Seg_Table[TimeTempset[2]%16]);
Delay(100);
SMG_Display(2,0xbf);
Delay(100);
SMG_Display(5,0xbf);
Delay(100);
SMG_Display(6,Seg_Table[TimeTempset[0]/16]);
Delay(100);
SMG_Display(7,Seg_Table[TimeTempset[0]%16]);
Delay(100);
SelectHC138(6);
P0=0xff;
SelectHC138(7);
P0=0xff;
break;
case 0:
if(shineflag==1)
{
SMG_Display(6,0xff);
Delay(100);
SMG_Display(7,0xff);
Delay(100);
}
if(shineflag==0)
{
SMG_Display(6,Seg_Table[TimeTempset[0]/16]);
Delay(100);
SMG_Display(7,Seg_Table[TimeTempset[0]%16]);
Delay(100);
}
SMG_Display(0,Seg_Table[TimeTempset[2]/16]);
Delay(100);
SMG_Display(1,Seg_Table[TimeTempset[2]%16]);
Delay(100);
SMG_Display(2,0xbf);
Delay(100);
SMG_Display(3,Seg_Table[TimeTempset[1]/16]);
Delay(100);
SMG_Display(4,Seg_Table[TimeTempset[1]%16]);
Delay(100);
SMG_Display(5,0xbf);
Delay(100);
SelectHC138(6);
P0=0xff;
SelectHC138(7);
P0=0xff;
break;
}
}
else if(Timeopen==0&&Alarmopen==0&&S4==1)
{
SMG_Display(0,Seg_Table[TimeNow[2]/16]);
Delay(100);
SMG_Display(1,Seg_Table[TimeNow[2]%16]);
Delay(100);
SMG_Display(2,0xbf);
Delay(100);
SMG_Display(3,Seg_Table[TimeNow[1]/16]);
Delay(100);
SMG_Display(4,Seg_Table[TimeNow[1]%16]);
Delay(100);
SMG_Display(5,0xbf);
Delay(100);
SMG_Display(6,Seg_Table[TimeNow[0]/16]);
Delay(100);
SMG_Display(7,Seg_Table[TimeNow[0]%16]);
Delay(100);
SelectHC138(6);
P0=0xff;
SelectHC138(7);
P0=0xff;
}
}
void Timer0Init()
{
TMOD=0x01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
ET0=1;
EA=1;
}
void ServiceTimer0() interrupt 1
{
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
t++;
if((t/20)%2==0)
{
SelectHC138(4);
P0=0xfe;
}
if((t/20)%2==1)
{
SelectHC138(4);
P0=0xff;
}
SelectHC138(5);
P0=0x00;
if(t>500)
{
t=0;
getup=0;
TR0=0;
}
}
void Timer1Init()
{
TMOD=0x01;
TH1=(65535-10000)/256;
TL1=(65535-10000)%256;
ET1=1;
EA=1;
}
void ServiceTimer1() interrupt 3
{
TH1=(65535-10000)/256;
TL1=(65535-10000)%256;
tmode++;
if(tmode>100)
{
shineflag=~shineflag;
tmode=0;
}
}
void Get_Tempc()
{
unsigned int LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(100);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
temperature=MSB;
temperature=temperature<<8;
temperature=temperature|LSB;
temperature=temperature>>4;
}
void ScanKeys()
{
if(S7==0)
{
Delay(200);
if(S7==0)
{
if(getup==1)
{
TR0=0;
getup=0;
SystemInit();
}
switch(Timemode)
{
case 1:
for(i=0;i<3;i++)
{
TimeTempset[i]=TimeNow[i];
}
TR1=1;
Timemode=2;
Timeopen=1;
Timemode1=1;
break;
case 2:
TR1=1;
Timemode=3;
Timemode1=2;
break;
case 3:
TR1=1;
Timemode=0;
Timemode1=3;
break;
case 0:
TR1=0;
Timemode=1;
shineflag=0;
Timeopen=0;
break;
}
}
}while(S7==0);
if(S6==0)
{
Delay(200);
if(S6==0)
{
if(getup==1)
{
TR0=0;
getup=0;
SystemInit();
}
switch(Alarmmode)
{
case 1:
Alarmmode=2;
Alarmopen=1;
Alarmmode1=1;
break;
case 2:
Alarmmode=3;
Alarmmode1=2;
break;
case 3:
Alarmmode=0;
Alarmmode1=3;
break;
case 0:
Alarmmode=1;
Alarmopen=0;
break;
}
}
}while(S6==0);
if(S5==0)
{
Delay(200);
if(S5==0)
{
if(getup==1)
{
TR0=0;
getup=0;
SystemInit();
}
if(Alarmopen==1)
{
switch(Alarmmode1)
{
case 1:
if(TimeTemp[2]!=0x23)
{
if(TimeTemp[2]%16==9)
TimeTemp[2]=TimeTemp[2]+7;
else
TimeTemp[2]++;
}
break;
case 2:
if(TimeTemp[1]!=0x59)
{
if(TimeTemp[1]%16==9)
TimeTemp[1]=TimeTemp[1]+7;
else
TimeTemp[1]++;
}
break;
case 3:
if(TimeTemp[0]!=0x59)
{
if(TimeTemp[0]%16==9)
TimeTemp[0]=TimeTemp[0]+7;
else
TimeTemp[0]++;
}
break;
}
for(i=0;i<3;i++)
{
TimeAlarm[i]=TimeTemp[i];
}
}
else if(Timeopen==1)
{
switch(Timemode1)
{
case 1:
if(TimeTempset[2]!=0x23)
{
if(TimeTempset[2]%16==9)
TimeTempset[2]=TimeTempset[2]+7;
else
TimeTempset[2]++;
}
break;
case 2:
if(TimeTempset[1]!=0x59)
{
if(TimeTempset[1]%16==9)
TimeTempset[1]=TimeTempset[1]+7;
else
TimeTempset[1]++;
}
break;
case 3:
if(TimeTempset[0]!=0x59)
{
if(TimeTempset[0]%16==9)
TimeTempset[0]=TimeTempset[0]+7;
else
TimeTempset[0]++;
}
break;
}
for(i=0;i<3;i++)
{
TimeNow[i]=TimeTempset[i];
}
DS1302_Config();
}
}
}while(S5==0);
if(S4==0)
{
Delay(200);
if(S4==0)
{
if(getup==1)
{
TR0=0;
getup=0;
SystemInit();
}
if(Alarmopen==1)
{
switch(Alarmmode1)
{
case 1:
if(TimeTemp[2]!=0x00)
{
if(TimeTemp[2]%16==0)
TimeTemp[2]=TimeTemp[2]-7;
else
TimeTemp[2]--;
}
break;
case 2:
if(TimeTemp[1]!=0x00)
{
if(TimeTemp[1]%16==0)
TimeTemp[1]=TimeTemp[1]-7;
else
TimeTemp[1]--;
}
break;
case 3:
if(TimeTemp[0]!=0x00)
{
if(TimeTemp[0]%16==0)
TimeTemp[0]=TimeTemp[0]-7;
else
TimeTemp[0]--;
}
break;
}
for(i=0;i<3;i++)
{
TimeAlarm[i]=TimeTemp[i];
}
}
else if(Timeopen==1)
{
switch(Timemode1)
{
case 1:
if(TimeTempset[2]!=0x00)
{
if(TimeTempset[2]%16==0)
TimeTempset[2]=TimeTempset[2]-7;
else
TimeTempset[2]--;
}
break;
case 2:
if(TimeTempset[1]!=0x00)
{
if(TimeTempset[1]%16==0)
TimeTempset[1]=TimeTempset[1]-7;
TimeTempset[1]--;
}
break;
case 3:
if(TimeTempset[0]!=0x00)
{
if(TimeTempset[0]%16==0)
TimeTempset[0]=TimeTempset[0]-7;
else
TimeTempset[0]--;
}
break;
}
for(i=0;i<3;i++)
{
TimeNow[i]=TimeTempset[i];
}
DS1302_Config();
}
}
}while(S4==0);
}
void IStime()
{
if((TimeNow[2]==TimeTemp[2])&&(TimeNow[1]==TimeTemp[1])&&(TimeNow[0]==TimeTemp[0]))
{
getup=1;
TR0=1;
}
}
void LED_Lighting()
{
if(getup==1)
{
SelectHC138(4);
P0=0xfe;
}
else
{
SelectHC138(4);
P0=0xff;
}
SelectHC138(5);
P0=0x00;
}
void main()
{
SystemInit();
DS1302_Config();
Timer0Init();
Timer1Init();
while(1)
{
Get_Tempc();
Get_Time();
SMG_Dynamic();
ScanKeys();
IStime();
LED_Lighting();
}
}
DS1302
#include "reg52.h"
#include "intrins.h"
#include "ds1302.h"
//
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
//
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
//
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
ONEWIRE DS18B20
#include "reg52.h"
#include "onewire.h"
#include "intrins.h"
sbit DQ=P1^4;
//
void Delay_OneWire(unsigned int t)
{
unsigned char i;
while(t--){
for(i=0;i<12;i++);
}
}
//
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}