![](http://a.hiphotos.baidu.com/album/pic/item/3801213fb80e7bec229031812d2eb9389b506b03.jpg?v=tbs)
#include<reg52.h>
#include"ds1302.h"
sbit alarm=P3^4;
sbit wei=P3^5; //调整位
sbit add=P3^6; //增加键
sbit stop=P3^7; //暂停键
sbit dula=P2^6; //数码管段显
sbit wela=P2^7; //数码管位显
sbit beep=P2^3; //喇叭
unsigned char a=0;
unsigned char code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管
void delay(unsigned char i) ; // 延迟
void ShowClock(unsigned char h,unsigned char m,unsigned char s); //显示闹钟
void ShowDate(unsigned char year,unsigned char mon,unsigned char day);
void ShowSecond(unsigned char sec);
void ShowMinute(unsigned char min);
void ShowHour(unsigned char hour);
void ShowDay(unsigned char day);
void ShowMonth(unsigned char mon);
void ShowYear(unsigned char year);
void main()
{
unsigned char alarm_hour=12,alarm_minute=0,alarm_second=10,fen1=0,miao1=0,haomiao=10;
char flag_time=0;//flag_time=0,显示clockflag_time=1,显示日期
bit flag_add=0;//按下加按钮标志
bit flag_stop=0;//按下秒表暂停键标志
bit flag_alarm=0;//按下闹钟键标志
bit flag_reset=0;//按下秒表复位标志
bit flag_start=0;//按下秒表开始标志
char change=0;//change=0显示时分秒 change=1显示年月日change=2显示秒表 change=3只显示秒change=4只显示分
//change=5只显示时 change=6只显示日change=7只显示月 change=8只显示年
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
Ds1302_Write_Time();
while(1)
{
Ds1302_Read_Time();
if(time_buf1[5]==0&&time_buf1[6]==0)//整点报时
{
beep=0;
delay(100);
beep=1;
}
if(time_buf1[4]==alarm_hour&&time_buf1[5]==alarm_minute&&time_buf1[6]==alarm_second) //闹钟判断
{
beep=0;
delay(100);
beep=1;
}
switch(change)
{
case 0:
if(!flag_alarm) ShowClock(time_buf1[4],time_buf1[5],time_buf1[6]);//显示时分秒
else ShowClock(alarm_hour,alarm_minute,alarm_second);//显示闹钟时分秒
break;
case 1:
ShowDate(time_buf1[1],time_buf1[2],time_buf1[3]);//显示年月日
break;
case 2:
if(a==2)
{
a=0;
if(haomiao==100)
{
haomiao=0;miao1++;
if(miao1==60)
{
miao1=0;fen1++;
if(fen1==60) fen1=0;
}
}
haomiao++;
}
if(flag_start)
{
TR0=1;
flag_start=0;
}
if(flag_stop)
{
TR0=0;
flag_stop=0;
}
if(flag_reset)
{
fen1=miao1=haomiao=0;
TR0=0;
flag_reset=0;
}
ShowClock(fen1,miao1,haomiao);
break;
case 3: //只显示秒
if(flag_alarm==0&&flag_add==1) //判断是时钟add还是闹钟add
{
time_buf1[6]+=1;
time_buf1[6]%=60;
Ds1302_Write_Time();
}
if(flag_alarm==1&&flag_add==1)
{
alarm_second+=1;
alarm_second%=60;
}
if(flag_alarm) //选择显示时钟还是闹钟
{
ShowSecond(alarm_second);
}
else
{
ShowSecond(time_buf1[6]);
Ds1302_Write_Time();
}
flag_add=0;
break;
case 4: //只显示分
if(flag_alarm==0&&flag_add==1)
{
time_buf1[5]+=1;
time_buf1[5]%=60;
Ds1302_Write_Time();
}
if(flag_alarm==1&&flag_add==1)
{
alarm_minute+=1;
alarm_minute%=60;
}
if(flag_alarm)
{
ShowMinute(alarm_minute);
}
else
{
ShowMinute(time_buf1[5]);
}
flag_add=0;
break;
case 5: //只显示时
if(flag_alarm==0&&flag_add==1)
{
time_buf1[4]+=1;
time_buf1[4]%=60;
Ds1302_Write_Time();
}
if(flag_alarm==1&&flag_add==1)
{
alarm_hour+=1;
alarm_hour%=60;
}
if(flag_alarm)
{
ShowHour(alarm_hour);
}
else
{
ShowHour(time_buf1[4]);
}
flag_add=0;
break;
case 6:
if(flag_add)
{
time_buf1[3]+=1;
time_buf1[3]%=32;
Ds1302_Write_Time();
flag_add=0;
}
ShowDay(time_buf1[3]); //只显示日
break;
case 7:
if(flag_add)
{
time_buf1[2]+=1;
time_buf1[2]%=12;
Ds1302_Write_Time();
flag_add=0;
}
ShowMonth(time_buf1[2]);//只显示月
break;
case 8:
if(flag_add)
{
time_buf1[1]+=1;
time_buf1[1]%=100;
Ds1302_Write_Time();
flag_add=0;
}
ShowYear(time_buf1[1]); //只显示年
break;
default:;
}
if(alarm==0)//按下闹钟键
{
delay(10);
while(alarm==0); //不松手操作
{
flag_alarm=~flag_alarm;
flag_reset=1;
}
}
if(wei==0) //根据位数进行每位的显示
{
delay(10);
if(wei==0)
{
while(wei==0)
{
Ds1302_Read_Time();
}
change++;
if(change>8)change=0;
}
}
if(add==0)
{
delay(10);
while(add==0)
{
Ds1302_Read_Time();
}
flag_add=1;
flag_start=1;
}
if(stop==0)
{
delay(5);
while(stop==0)
{
flag_stop=1;
}
}
if(time_buf1[5]==0&&time_buf1[6]==0)//整点报时
{
beep=0;
delay(100);
beep=1;
}
}
}
void ShowClock(unsigned char h,unsigned char m,unsigned char s)//显示时分秒
{
P0=0x00;
dula=1;
P0=smg[h/10];
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[h%10];
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[m/10];
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[m%10];
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[s/10];
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[s%10];
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(2);
}
void ShowDate(unsigned char year,unsigned char mon,unsigned char day) //显示年月日
{
P0=0x00;
dula=1;
P0=smg[year/10];
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[year%10];
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[mon/10];
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[mon%10];
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[day/10];
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[day%10];
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(2);
}
void ShowSecond(unsigned char s) //单独显示秒
{
P0=0x00;
dula=1;
P0=smg[s/10];
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[s%10];
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(2);
}
void ShowMinute(unsigned char m) //单独显示分
{
P0=0x00;
dula=1;
P0=smg[m/10];
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[m%10];
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(2);
}
void ShowHour(unsigned char h) //单独显示时
{
P0=0x00;
dula=1;
P0=smg[h/10];
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[h%10];
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(2);
}
void ShowDay(unsigned char day) //单独显示日
{
ShowSecond(day);
}
void ShowMonth(unsigned char mon) //单独显示月
{
ShowMinute(mon);
}
void ShowYear(unsigned char year) //单独显示年
{
ShowHour(year);
}
void delay(unsigned char i) //延迟函数
{
unsigned char j;
while(i--)for(j=0;j<115;j++);
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
#include"ds1302.h"
sbit alarm=P3^4;
sbit wei=P3^5; //调整位
sbit add=P3^6; //增加键
sbit stop=P3^7; //暂停键
sbit dula=P2^6; //数码管段显
sbit wela=P2^7; //数码管位显
sbit beep=P2^3; //喇叭
unsigned char a=0;
unsigned char code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管
void delay(unsigned char i) ; // 延迟
void ShowClock(unsigned char h,unsigned char m,unsigned char s); //显示闹钟
void ShowDate(unsigned char year,unsigned char mon,unsigned char day);
void ShowSecond(unsigned char sec);
void ShowMinute(unsigned char min);
void ShowHour(unsigned char hour);
void ShowDay(unsigned char day);
void ShowMonth(unsigned char mon);
void ShowYear(unsigned char year);
void main()
{
unsigned char alarm_hour=12,alarm_minute=0,alarm_second=10,fen1=0,miao1=0,haomiao=10;
char flag_time=0;//flag_time=0,显示clockflag_time=1,显示日期
bit flag_add=0;//按下加按钮标志
bit flag_stop=0;//按下秒表暂停键标志
bit flag_alarm=0;//按下闹钟键标志
bit flag_reset=0;//按下秒表复位标志
bit flag_start=0;//按下秒表开始标志
char change=0;//change=0显示时分秒 change=1显示年月日change=2显示秒表 change=3只显示秒change=4只显示分
//change=5只显示时 change=6只显示日change=7只显示月 change=8只显示年
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
Ds1302_Write_Time();
while(1)
{
Ds1302_Read_Time();
if(time_buf1[5]==0&&time_buf1[6]==0)//整点报时
{
beep=0;
delay(100);
beep=1;
}
if(time_buf1[4]==alarm_hour&&time_buf1[5]==alarm_minute&&time_buf1[6]==alarm_second) //闹钟判断
{
beep=0;
delay(100);
beep=1;
}
switch(change)
{
case 0:
if(!flag_alarm) ShowClock(time_buf1[4],time_buf1[5],time_buf1[6]);//显示时分秒
else ShowClock(alarm_hour,alarm_minute,alarm_second);//显示闹钟时分秒
break;
case 1:
ShowDate(time_buf1[1],time_buf1[2],time_buf1[3]);//显示年月日
break;
case 2:
if(a==2)
{
a=0;
if(haomiao==100)
{
haomiao=0;miao1++;
if(miao1==60)
{
miao1=0;fen1++;
if(fen1==60) fen1=0;
}
}
haomiao++;
}
if(flag_start)
{
TR0=1;
flag_start=0;
}
if(flag_stop)
{
TR0=0;
flag_stop=0;
}
if(flag_reset)
{
fen1=miao1=haomiao=0;
TR0=0;
flag_reset=0;
}
ShowClock(fen1,miao1,haomiao);
break;
case 3: //只显示秒
if(flag_alarm==0&&flag_add==1) //判断是时钟add还是闹钟add
{
time_buf1[6]+=1;
time_buf1[6]%=60;
Ds1302_Write_Time();
}
if(flag_alarm==1&&flag_add==1)
{
alarm_second+=1;
alarm_second%=60;
}
if(flag_alarm) //选择显示时钟还是闹钟
{
ShowSecond(alarm_second);
}
else
{
ShowSecond(time_buf1[6]);
Ds1302_Write_Time();
}
flag_add=0;
break;
case 4: //只显示分
if(flag_alarm==0&&flag_add==1)
{
time_buf1[5]+=1;
time_buf1[5]%=60;
Ds1302_Write_Time();
}
if(flag_alarm==1&&flag_add==1)
{
alarm_minute+=1;
alarm_minute%=60;
}
if(flag_alarm)
{
ShowMinute(alarm_minute);
}
else
{
ShowMinute(time_buf1[5]);
}
flag_add=0;
break;
case 5: //只显示时
if(flag_alarm==0&&flag_add==1)
{
time_buf1[4]+=1;
time_buf1[4]%=60;
Ds1302_Write_Time();
}
if(flag_alarm==1&&flag_add==1)
{
alarm_hour+=1;
alarm_hour%=60;
}
if(flag_alarm)
{
ShowHour(alarm_hour);
}
else
{
ShowHour(time_buf1[4]);
}
flag_add=0;
break;
case 6:
if(flag_add)
{
time_buf1[3]+=1;
time_buf1[3]%=32;
Ds1302_Write_Time();
flag_add=0;
}
ShowDay(time_buf1[3]); //只显示日
break;
case 7:
if(flag_add)
{
time_buf1[2]+=1;
time_buf1[2]%=12;
Ds1302_Write_Time();
flag_add=0;
}
ShowMonth(time_buf1[2]);//只显示月
break;
case 8:
if(flag_add)
{
time_buf1[1]+=1;
time_buf1[1]%=100;
Ds1302_Write_Time();
flag_add=0;
}
ShowYear(time_buf1[1]); //只显示年
break;
default:;
}
if(alarm==0)//按下闹钟键
{
delay(10);
while(alarm==0); //不松手操作
{
flag_alarm=~flag_alarm;
flag_reset=1;
}
}
if(wei==0) //根据位数进行每位的显示
{
delay(10);
if(wei==0)
{
while(wei==0)
{
Ds1302_Read_Time();
}
change++;
if(change>8)change=0;
}
}
if(add==0)
{
delay(10);
while(add==0)
{
Ds1302_Read_Time();
}
flag_add=1;
flag_start=1;
}
if(stop==0)
{
delay(5);
while(stop==0)
{
flag_stop=1;
}
}
if(time_buf1[5]==0&&time_buf1[6]==0)//整点报时
{
beep=0;
delay(100);
beep=1;
}
}
}
void ShowClock(unsigned char h,unsigned char m,unsigned char s)//显示时分秒
{
P0=0x00;
dula=1;
P0=smg[h/10];
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[h%10];
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[m/10];
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[m%10];
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[s/10];
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[s%10];
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(2);
}
void ShowDate(unsigned char year,unsigned char mon,unsigned char day) //显示年月日
{
P0=0x00;
dula=1;
P0=smg[year/10];
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[year%10];
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[mon/10];
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[mon%10];
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[day/10];
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[day%10];
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(2);
}
void ShowSecond(unsigned char s) //单独显示秒
{
P0=0x00;
dula=1;
P0=smg[s/10];
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[s%10];
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(2);
}
void ShowMinute(unsigned char m) //单独显示分
{
P0=0x00;
dula=1;
P0=smg[m/10];
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[m%10];
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(2);
}
void ShowHour(unsigned char h) //单独显示时
{
P0=0x00;
dula=1;
P0=smg[h/10];
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(2);
P0=0x00;
dula=1;
P0=smg[h%10];
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(2);
}
void ShowDay(unsigned char day) //单独显示日
{
ShowSecond(day);
}
void ShowMonth(unsigned char mon) //单独显示月
{
ShowMinute(mon);
}
void ShowYear(unsigned char year) //单独显示年
{
ShowHour(year);
}
void delay(unsigned char i) //延迟函数
{
unsigned char j;
while(i--)for(j=0;j<115;j++);
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
![](http://a.hiphotos.baidu.com/album/pic/item/3801213fb80e7bec229031812d2eb9389b506b03.jpg?v=tbs)