main.c
#include <stc15.h>
#include "sys.h"
bit flag500ms=0;
int hour=0x23;
int minute=0x59;
int second=0x50;
int hour0=0x00; int minute0=0x00;int second0=0x00;
int time_flag[]={0,0,0,0,0,0};
bit flag_back=0;bit flag_led=0;
void main()
{
All_Init();
EA=1;
Timer0Init();
Timer1Init();
Write_Ds1302_Byte( 0x00,7);
Write_Ds1302_Byte( 0x80,second);
Write_Ds1302_Byte( 0x82,minute);
Write_Ds1302_Byte( 0x84,hour);
while(1)
{
if(flag_back!=flag500ms&&Time_Option==0)
{
second=Read_Ds1302_Byte(0x81);
minute=Read_Ds1302_Byte(0x83);
hour=Read_Ds1302_Byte(0x85);
time_flag[0]=hour/16*10+hour%16;
time_flag[1]=minute/16*10+minute%16;
time_flag[2]=second/16*10+second%16;
flag_back=flag500ms;
}
if((hour==hour0)&&(minute==minute0)&&(second==second0) )
{
flag_led=1;
}
}
}
sys.c
#include "sys.h"
void All_Init()
{
P2=(P2&0x1f)|0x80;
P0=0xff;
P2=(P2&0x1f)|0xa0;
P0=0x00;
P2=(P2&0x1f)|0xc0;
P0=0x00;
}
void Timer0Init(void) //1ms @11.0592MHz
{
AUXR &= 0x7F;
TMOD &= 0xF0;
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0=1;
}
void Timer0() interrupt 1
{
static u16 T0c0=0,T0c1=0;
if(T0c0==500&&Time_Option==0)
{
// second=Read_Ds1302_Byte(0x81);
// minute=Read_Ds1302_Byte(0x83);
// hour=Read_Ds1302_Byte(0x85);
// time_flag[0]=hour/16*10+hour%16;
// time_flag[1]=minute/16*10+minute%16;
// time_flag[2]=second/16*10+second%16;
//
T0c0=0;
}
if(T0c1>=500)
{
flag500ms=~flag500ms;
T0c1=0;
}
T0c0++;
T0c1++;
Smg_Show();
Smg_Scan();
Key_Scan();
Key_Press();
}
void Timer1Init(void) //10ms @11.0592MHz
{
AUXR &= 0xBF;
TMOD &= 0x0F;
TL1 = 0x00;
TH1 = 0xDC;
TF1 = 0;
TR1 = 1;
ET1=1;
}
void Timer1() interrupt 3
{
static u16 T1c0;
static i=0;
if(T1c0>50)
{
if(flag_led==1)
{
if(i%2==0)
Led_work(0xfe);
else
Led_work(0xff);
if(i==10)
{
Led_work(0xff);
flag_led=0;
i=0;
}
i++;
}
T1c0=0;
}
T1c0++;
}
key.c
#include "sys.h"
u8 Time_Option=0;
u8 Clock_Option=0;
bit flag_temp=0;
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
u8 KeySta[]={1,1,1,1};
//u8 keystu[]={0xff,0xff,0xff,0xff};
u8 keyback[]={1,1,1,1};
void Key_Scan()
{
u8 i;
static u8 keybuff[]={0xff,0xff,0xff,0xff};
keybuff[0]=(keybuff[0]<<1)|s7;
keybuff[1]=(keybuff[1]<<1)|s6;
keybuff[2]=(keybuff[2]<<1)|s5;
keybuff[3]=(keybuff[3]<<1)|s4;
for(i=0;i<4;i++)
{
if(keybuff[i]==0x00)
{
KeySta[i]=0; //anxia
}
else if(keybuff[i]==0xff)
{
KeySta[i]=1;
}
else;
}
}
void Key_Press()
{
u8 i;
for(i=0;i<4;i++)
{
if(KeySta[i]!=keyback[i])
{
if(keyback[i]!=1)
{
keydrive(i);
}
keyback[i]=KeySta[i];
}
}
if((Time_Option==0)&&(Clock_Option==0))
{
if(keyback[0]==0)
{
// if(//Get_18B20Temp())
// {
// flag_temp=1;
// }
}
else
flag_temp=0;
}
}
void keydrive(u8 key)
{
if(key==3&&Clock_Option==0)
{
Time_Option++;
if(Time_Option>3)
{
Time_Option=0;
Write_Ds1302_Byte( 0x80,second);
Write_Ds1302_Byte( 0x82,minute);
Write_Ds1302_Byte( 0x84,hour);
}
}
else if(key==2&&Time_Option==0)
{
Clock_Option++;
if(Clock_Option>3)
{
Clock_Option=0;
}
}
else if(key==1)
{
if(Time_Option==1)
time_flag[0]++;
else if(Time_Option==2)
time_flag[1]++;
else if(Time_Option==3)
time_flag[2]++;
else if(Clock_Option==1)
time_flag[3]++;
else if(Clock_Option==2)
time_flag[4]++;
else if(Clock_Option==3)
time_flag[5]++;
if(time_flag[0]>23)
time_flag[0]=0;
else if(time_flag[1]>59)
time_flag[1]=0;
else if(time_flag[2]>59)
time_flag[2]=0;
else if(time_flag[3]>23)
time_flag[3]=0;
else if(time_flag[4]>59)
time_flag[4]=0;
else if(time_flag[5]>59)
time_flag[5]=0;
}
else if(key==0)
{
if(Time_Option==1)
time_flag[0]--;
else if(Time_Option==2)
time_flag[1]--;
else if(Time_Option==3)
time_flag[2]--;
else if(Clock_Option==1)
time_flag[3]--;
else if(Clock_Option==2)
time_flag[4]--;
else if(Clock_Option==3)
time_flag[5]--;
if(time_flag[0]<0)
time_flag[0]=23;
else if(time_flag[1]<0)
time_flag[1]=59;
else if(time_flag[2]<0)
time_flag[2]=59;
else if(time_flag[3]<0)
time_flag[3]=59;
else if(time_flag[4]<0)
time_flag[4]=59;
else if(time_flag[5]<0)
time_flag[5]=59;
}
if(Time_Option!=0)
{
hour=time_flag[0]/10*16+time_flag[0]%10;
minute=time_flag[1]/10*16+time_flag[1]%10;
second=time_flag[2]/10*16+time_flag[2]%10;
}
else if(Clock_Option!=0)
{
hour0=time_flag[3]/10*16+time_flag[3]%10;
minute0=time_flag[4]/10*16+time_flag[4]%10;
second0=time_flag[5]/10*16+time_flag[5]%10;
}
}
smg.c
#include "sys.h"
u8 duanma[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,
0xff, 0xbf};
u8 show[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
u8 smg1;smg2,smg3,smg4,smg5,smg6,smg7,smg8;
void Smg_Scan()
{
static u8 i=0;
P2=(P2&0x1f)|0xc0;
P0=0x01<<i;
P2=(P2&0x1f)|0xe0;
P0=0xff;
P0=show[i];
P2=P2&0x1f; //
i++;
i&=0x07;
}
void Smg_Show()
{
if(Time_Option==0&&Clock_Option==0)
{
smg1=(Read_Ds1302_Byte(0x85))/16;
smg2=(Read_Ds1302_Byte(0x85))%16;
smg3=17;
smg4=(Read_Ds1302_Byte(0x83))/16;
smg5=(Read_Ds1302_Byte(0x83))%16;
smg6=17;
smg7=(Read_Ds1302_Byte(0x81))/16;
smg8=(Read_Ds1302_Byte(0x81))%16;
}
else if(Time_Option==1)
{
if(flag500ms==1)
{
smg1=hour/16;
smg2=hour%16;
smg3=17;
smg4=minute/16;
smg5=minute%16;
smg6=17;
smg7=second/16;
smg8=second%16;
}
else
{
smg1=16;
smg2=16;
smg3=17;
smg4=minute/16;
smg5=minute%16;
smg6=17;
smg7=second/16;
smg8=second%16;
}
}
else if(Time_Option==2)
{
if(flag500ms==1)
{
smg1=hour/16;
smg2=hour%16;
smg3=17;
smg4=minute/16;
smg5=minute%16;
smg6=17;
smg7=second/16;
smg8=second%16;
}
else
{
smg1=hour/16;
smg2=hour%16;
smg3=17;
smg4=16;
smg5=16;
smg6=17;
smg7=second/16;
smg8=second%16;
}
}
else if(Time_Option==3)
{
if(flag500ms==1)
{
smg1=hour/16;
smg2=hour%16;
smg3=17;
smg4=minute/16;
smg5=minute%16;
smg6=17;
smg7=second/16;
smg8=second%16;
}
else
{
smg1=hour/16;
smg2=hour%16;
smg3=17;
smg4=minute/16;
smg5=minute%16;
smg6=17;
smg7=16;
smg8=16;
}
}
else if(Clock_Option==1)
{
if(flag500ms==1)
{
smg1=hour0/16;
smg2=hour0%16;
smg3=17;
smg4=minute0/16;
smg5=minute0%16;
smg6=17;
smg7=second0/16;
smg8=second0%16;
}
else
{
smg1=16;
smg2=16;
smg3=17;
smg4=minute0/16;
smg5=minute0%16;
smg6=17;
smg7=second0/16;
smg8=second0%16;
}
}
else if(Clock_Option==2)
{
if(flag500ms==1)
{
smg1=hour0/16;
smg2=hour0%16;
smg3=17;
smg4=minute0/16;
smg5=minute0%16;
smg6=17;
smg7=second0/16;
smg8=second0%16;
}
else
{
smg1=hour0/16;
smg2=hour0%16;
smg3=17;
smg4=16;
smg5=16;
smg6=17;
smg7=second0/16;
smg8=second0%16;
}
}
else if(Clock_Option==3)
{
if(flag500ms==1)
{
smg1=hour0/16;
smg2=hour0%16;
smg3=17;
smg4=minute0/16;
smg5=minute0%16;
smg6=17;
smg7=second0/16;
smg8=second0%16;
}
else
{
smg1=hour0/16;
smg2=hour0%16;
smg3=17;
smg4=minute0/16;
smg5=minute0%16;
smg6=17;
smg7=16;
smg8=16;
}
}
if(flag_temp==1)
{
// smg3=temp/100;
// smg2=(temp%100)/10;
// smg1=temp/10;
}
show[0]=duanma[smg1];
show[1]=duanma[smg2];
show[2]=duanma[smg3];
show[3]=duanma[smg4];
show[4]=duanma[smg5];
show[5]=duanma[smg6];
show[6]=duanma[smg7];
show[7]=duanma[smg8];
}
void Led_work(u8 dat)
{
P2=(P2&0x1f)|0x80;
P0=dat;
P2=(P2&0x1f);
}
ds1302
/*
³ÌÐò˵Ã÷: DS1302Çý¶¯³ÌÐò
Èí¼þ»·¾³: Keil uVision 4.10
Ó²¼þ»·¾³: CT107µ¥Æ¬»ú×ÛºÏʵѵƽ̨ 8051£¬12MHz
ÈÕ ÆÚ: 2011-8-9
*/
#include <stc15.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302¸´Î»
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
SDA=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);
}
ds1302.h
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
#endif