基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ day++;//日期格式走
if((month==2)|(month==4)|(month==6)|(month==9)|(month==11)) //2,4,6,9,11数月30天)//其他偶数月
{ if(month==2) //对二月的特殊判断
{if((year%4==0)&(year/100!=0)|(year/400==0)) //判断是闰年
0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,
0x3e,0x3d,0x3b,0x37,0x2f,0x1f,
0x1e,0x1d,0x1b,0x17,0x0f,
0x0e,0x0d,0x0b,0x07,
0x06,0x05,0x03,
0x02,0x01,
0x00
};
char w=0;
while(!KEY3)alarm();
} alarm(); keycan(); }
while(flag==5)
{ for(i=24;i<32;i++)
{ if(c==8) c=0;
P2=weikong_code[c];
c++;
j=w[i];
P0=tab[j];
delay(1);
P0=0xff;
} }
}
/***********************显示时钟数组子程序***********************/
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}
week++;//星期走
if(week==8)
week=1;
data1();
week1();
while(second==err);
}
}
/**********************键盘扫描子程序*************************/
uint year=2014;
char month=12,day=10; //日期年,月,日定义
char week=3,v=1; //星期
char err=3;//误差用很重要、、、、!!
//P0口流水灯
char pp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
a=1;
if((flag==6)|(flag==7)|(flag==8))
a=2;
if(flag==9)
a=3;
while(!KEY1);} //释放按键
}
void tiao()
{
while(flag==1)
{ if(KEY2==0)
{ delay(10);
if(KEY2==0)
{ hour++;if(hour==24)hour=0; } //正常时间小时加1
delay(1); //显示延时
P0=0xff;
} }
if(a==1)//闹钟调整显示
{ for(i=8;i<16;i++)
{ if(c==8) c=0;
P2=weikong_code[c];
c++;
j=w[i];
P0=tab[j];
delay(1);
P0=0xff;
} }
if(a==2) //日期调整显示
void keycan()
{
if(KEY1==0) //按一次,正常显示,按第二次,时调整,按第三次,分调这整,
{ delay(10); //按键1去抖以及动作
if(KEY1==0) //确认按键是否按下
{flag++;}//切换标志
if(flag==10)
flag=0;
a=0;
if((flag==4)|(flag==5))
void xianshishuzu()
{ StrTab[1]=second/10; //秒十位
StrTab[0]=second%10; //秒个位
StrTab[2]=10; //间隔符-
StrTab[4]=minute/10; //分十位
StrTab[3]=minute%10; //分个位
StrTab[5]=10; //间隔符-
if(year==10000)
year=0;}}
}
else if(day==31)//其他月30天
{day=1; month++;
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}
}
else
if(day==32) //其他其他月31天
{day=1; month++;
StrTab[7]=hour/10; //时十位
StrTab[6]=hour%10; //时个位
}
/********************************定时闹钟****************/
void alarm()
{ char k;
if((hour==hour1)&(minute==minute1)&(k))
StrTab[23]=year/1000; //时个位
StrTab[22]=(year/100)%10; //时十位
display(StrTab);
}
/***********************显示星期数组子程序***********************/
void week1() //星期显示
second=0;
while(!KEY3)display(StrTab);}
if(KEY2==0)
{ delay(10);
if(KEY2==0)
second=0;
while(!KEY2)display(StrTab);
}display(StrTab);keycan();
}
while(flag==4) //闹钟
{if(day==30); //闰年29天
{day=1; month++;
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}}
else if(day==29)//平年28天
{day=1; month++;
if(month==13)
{month=1; year++;
while(!KEY2)display(StrTab); }
if(KEY3==0)
{delay(10);
if(KEY3==0)
{ hour--;if(hour==-1)hour=23;} //正常时间小时减1
while(!KEY3)display(StrTab);
} display(StrTab);keycan(); }
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1=P3^0; //切换键
sbit KEY3=P3^1; //minute ,hour调整加1定义
sbit KEY2=P3^7; //minute ,hour调整减1定义
while(flag==2)
{if(KEY2==0) //按键去抖以及动作
{ delay(10);
if(KEY2==0)
{ minute++;if(minute==60)minute=0;} //分加1
while(!KEY2)display(StrTab); }
if(KEY3==0)
{ delay(10);
uchar flag=0; //切换标志
uint count=0; //定时器计数,定时50ms,count满20,秒加1
/**********************延时子程序*****************************/
void delay(uint z)
{ uint x,y;
for(x=0;x<z;x++)
StrTab[30]=10; //时十位
display(StrTab);
}
/***********************日期走程序***********************/
void godata()
{
if((hour==0)&(minute==0)&(second==err))/*****根据晶振误差调整误差((慢了70秒)/24=2.8935)如果改了整点日期判断!!*******************/
voiddata1()//年日期显示
{
StrTab[17]=day/10; //闹钟秒个位
StrTab[16]=day%10; //秒十位9
StrTab[18]=month%10; //间隔符-
StrTab[20]=year%10; //分个位
StrTab[19]=month/10; //分十位
StrTab[21]=(year/10)%10; //间隔符-
{ for(i=16;i<24;i++) //取w内容显示
{ if(c==8) c=0;//控制位选1
P2=weikong_code[c]; //控制位选2
c++;//控制位选3
j=w[i];//取w内容
P0=tab[j]; //取w内容查表
delay(1);
P0=0xff;
} }
if(a==3) //星期调整显示
char code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar StrTab[32];
char minute=01,hour=13,second=00; //正常时钟秒,分,时定义
char minute1=12,hour1=24; //闹钟时钟秒,分,时定义
{if(P3!=0XFF)
{k=0;}
beng();
display(StrTab);
}
if((hour==hour1)&(minute!=minute1))
{k=1;}
StrTab[9]=10; //闹钟秒个位
StrTab[8]=10; //秒十位
StrTab[10]=10; //间隔符-
StrTab[12]=minute1/10; //分个位
for(y=0;y<110;y++);
}
/*******************蜂鸣器子程序****************************/
void beng()
{
bear=~bear;
delay(10);
bear=1;
}
/**********************显示函数***************************/
{
StrTab[25]=10; //闹钟秒个位
StrTab[24]=10; //秒十位9
StrTab[26]=10; //间隔符-
StrTab[28]=week/10; //分个位
StrTab[27]=week%10; //分十位
StrTab[29]=10; //间隔符-
StrTab[31]=10; //时个位
void display(uchar w[32])
{ unsigned int i,j,c=0;
if(a==0)//正常时间显示
{ for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示
{ P2=weikong_code[i]; //位选
j=w[i]; //取出要显示的数码
P0=tቤተ መጻሕፍቲ ባይዱb[j]; //取出段选编码
StrTab[11]=minute1%10; //分十位
StrTab[13]=10; //间隔符-
StrTab[15]=hour1/10; //时个位
StrTab[14]=hour1%10; //时十位
display(StrTab);
}
/***********************显示日期数组子程序***********************/
sbit bear=P3^4; //闹铃
uchar a=0; //时间显示和闹钟时间显示切换
code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21}; //段码控制
{ if(KEY2==0)
{ delay(10);
if(KEY2==0)
{ hour1++;if(hour1==25)hour1=0; } //闹钟时间小时加1
while(!KEY2)alarm(); }
if(KEY3==0)
{ delay(10);
if(KEY3==0)
{ hour1--;if(hour1==-1)hour1=24; } //闹钟时间小时减
if(KEY3==0)
{minute--;if(minute==-1)minute=59;}
while(!KEY3)display(StrTab);
} display(StrTab);keycan();
}
while(flag==3) //秒表的加1
{ if(KEY3==0)
{ delay(10);
if(KEY3==0)
if((month==2)|(month==4)|(month==6)|(month==9)|(month==11)) //2,4,6,9,11数月30天)//其他偶数月
{ if(month==2) //对二月的特殊判断
{if((year%4==0)&(year/100!=0)|(year/400==0)) //判断是闰年
0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,
0x3e,0x3d,0x3b,0x37,0x2f,0x1f,
0x1e,0x1d,0x1b,0x17,0x0f,
0x0e,0x0d,0x0b,0x07,
0x06,0x05,0x03,
0x02,0x01,
0x00
};
char w=0;
while(!KEY3)alarm();
} alarm(); keycan(); }
while(flag==5)
{ for(i=24;i<32;i++)
{ if(c==8) c=0;
P2=weikong_code[c];
c++;
j=w[i];
P0=tab[j];
delay(1);
P0=0xff;
} }
}
/***********************显示时钟数组子程序***********************/
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}
week++;//星期走
if(week==8)
week=1;
data1();
week1();
while(second==err);
}
}
/**********************键盘扫描子程序*************************/
uint year=2014;
char month=12,day=10; //日期年,月,日定义
char week=3,v=1; //星期
char err=3;//误差用很重要、、、、!!
//P0口流水灯
char pp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
a=1;
if((flag==6)|(flag==7)|(flag==8))
a=2;
if(flag==9)
a=3;
while(!KEY1);} //释放按键
}
void tiao()
{
while(flag==1)
{ if(KEY2==0)
{ delay(10);
if(KEY2==0)
{ hour++;if(hour==24)hour=0; } //正常时间小时加1
delay(1); //显示延时
P0=0xff;
} }
if(a==1)//闹钟调整显示
{ for(i=8;i<16;i++)
{ if(c==8) c=0;
P2=weikong_code[c];
c++;
j=w[i];
P0=tab[j];
delay(1);
P0=0xff;
} }
if(a==2) //日期调整显示
void keycan()
{
if(KEY1==0) //按一次,正常显示,按第二次,时调整,按第三次,分调这整,
{ delay(10); //按键1去抖以及动作
if(KEY1==0) //确认按键是否按下
{flag++;}//切换标志
if(flag==10)
flag=0;
a=0;
if((flag==4)|(flag==5))
void xianshishuzu()
{ StrTab[1]=second/10; //秒十位
StrTab[0]=second%10; //秒个位
StrTab[2]=10; //间隔符-
StrTab[4]=minute/10; //分十位
StrTab[3]=minute%10; //分个位
StrTab[5]=10; //间隔符-
if(year==10000)
year=0;}}
}
else if(day==31)//其他月30天
{day=1; month++;
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}
}
else
if(day==32) //其他其他月31天
{day=1; month++;
StrTab[7]=hour/10; //时十位
StrTab[6]=hour%10; //时个位
}
/********************************定时闹钟****************/
void alarm()
{ char k;
if((hour==hour1)&(minute==minute1)&(k))
StrTab[23]=year/1000; //时个位
StrTab[22]=(year/100)%10; //时十位
display(StrTab);
}
/***********************显示星期数组子程序***********************/
void week1() //星期显示
second=0;
while(!KEY3)display(StrTab);}
if(KEY2==0)
{ delay(10);
if(KEY2==0)
second=0;
while(!KEY2)display(StrTab);
}display(StrTab);keycan();
}
while(flag==4) //闹钟
{if(day==30); //闰年29天
{day=1; month++;
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}}
else if(day==29)//平年28天
{day=1; month++;
if(month==13)
{month=1; year++;
while(!KEY2)display(StrTab); }
if(KEY3==0)
{delay(10);
if(KEY3==0)
{ hour--;if(hour==-1)hour=23;} //正常时间小时减1
while(!KEY3)display(StrTab);
} display(StrTab);keycan(); }
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1=P3^0; //切换键
sbit KEY3=P3^1; //minute ,hour调整加1定义
sbit KEY2=P3^7; //minute ,hour调整减1定义
while(flag==2)
{if(KEY2==0) //按键去抖以及动作
{ delay(10);
if(KEY2==0)
{ minute++;if(minute==60)minute=0;} //分加1
while(!KEY2)display(StrTab); }
if(KEY3==0)
{ delay(10);
uchar flag=0; //切换标志
uint count=0; //定时器计数,定时50ms,count满20,秒加1
/**********************延时子程序*****************************/
void delay(uint z)
{ uint x,y;
for(x=0;x<z;x++)
StrTab[30]=10; //时十位
display(StrTab);
}
/***********************日期走程序***********************/
void godata()
{
if((hour==0)&(minute==0)&(second==err))/*****根据晶振误差调整误差((慢了70秒)/24=2.8935)如果改了整点日期判断!!*******************/
voiddata1()//年日期显示
{
StrTab[17]=day/10; //闹钟秒个位
StrTab[16]=day%10; //秒十位9
StrTab[18]=month%10; //间隔符-
StrTab[20]=year%10; //分个位
StrTab[19]=month/10; //分十位
StrTab[21]=(year/10)%10; //间隔符-
{ for(i=16;i<24;i++) //取w内容显示
{ if(c==8) c=0;//控制位选1
P2=weikong_code[c]; //控制位选2
c++;//控制位选3
j=w[i];//取w内容
P0=tab[j]; //取w内容查表
delay(1);
P0=0xff;
} }
if(a==3) //星期调整显示
char code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar StrTab[32];
char minute=01,hour=13,second=00; //正常时钟秒,分,时定义
char minute1=12,hour1=24; //闹钟时钟秒,分,时定义
{if(P3!=0XFF)
{k=0;}
beng();
display(StrTab);
}
if((hour==hour1)&(minute!=minute1))
{k=1;}
StrTab[9]=10; //闹钟秒个位
StrTab[8]=10; //秒十位
StrTab[10]=10; //间隔符-
StrTab[12]=minute1/10; //分个位
for(y=0;y<110;y++);
}
/*******************蜂鸣器子程序****************************/
void beng()
{
bear=~bear;
delay(10);
bear=1;
}
/**********************显示函数***************************/
{
StrTab[25]=10; //闹钟秒个位
StrTab[24]=10; //秒十位9
StrTab[26]=10; //间隔符-
StrTab[28]=week/10; //分个位
StrTab[27]=week%10; //分十位
StrTab[29]=10; //间隔符-
StrTab[31]=10; //时个位
void display(uchar w[32])
{ unsigned int i,j,c=0;
if(a==0)//正常时间显示
{ for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示
{ P2=weikong_code[i]; //位选
j=w[i]; //取出要显示的数码
P0=tቤተ መጻሕፍቲ ባይዱb[j]; //取出段选编码
StrTab[11]=minute1%10; //分十位
StrTab[13]=10; //间隔符-
StrTab[15]=hour1/10; //时个位
StrTab[14]=hour1%10; //时十位
display(StrTab);
}
/***********************显示日期数组子程序***********************/
sbit bear=P3^4; //闹铃
uchar a=0; //时间显示和闹钟时间显示切换
code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21}; //段码控制
{ if(KEY2==0)
{ delay(10);
if(KEY2==0)
{ hour1++;if(hour1==25)hour1=0; } //闹钟时间小时加1
while(!KEY2)alarm(); }
if(KEY3==0)
{ delay(10);
if(KEY3==0)
{ hour1--;if(hour1==-1)hour1=24; } //闹钟时间小时减
if(KEY3==0)
{minute--;if(minute==-1)minute=59;}
while(!KEY3)display(StrTab);
} display(StrTab);keycan();
}
while(flag==3) //秒表的加1
{ if(KEY3==0)
{ delay(10);
if(KEY3==0)