基于51单片机电子显示时钟带闹钟整点报时日期星期Word下载.docx
《基于51单片机电子显示时钟带闹钟整点报时日期星期Word下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机电子显示时钟带闹钟整点报时日期星期Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
![基于51单片机电子显示时钟带闹钟整点报时日期星期Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/26/45eaaa29-e2bb-4cb1-afb9-1610303effbb/45eaaa29-e2bb-4cb1-afb9-1610303effbb1.gif)
//切换标志
uintcount=0;
//定时器计数,定时50ms,count满20,秒加1
/**********************延时子程序*****************************/
voiddelay(uintz)
{uintx,y;
for(x=0;
x<
z;
x++)
for(y=0;
y<
110;
y++);
}
/*******************蜂鸣器子程序****************************/
voidbeng()
{
bear=~bear;
delay(10);
bear=1;
}
/**********************显示时钟子函数***************************/
voiddisplay(ucharw[32])
{unsignedinti,j,c=0;
if(a==0)//正常时间显示
{for(i=0;
i<
8;
i++)//依次将数组w中八个数取出,并显示
{P2=weikong_code[i];
//位选
j=w[i];
//取出要显示的数码
P0=tab[j];
//取出段选编码
delay
(1);
//显示延时
P0=0xff;
}}
if(a==1)//闹钟调整显示
{for(i=8;
16;
i++)
{if(c==8)c=0;
P2=weikong_code[c];
c++;
}}
if(a==2)//日期调整显示
{for(i=16;
24;
i++)//取w内容显示
//控制位选1
//控制位选2
//控制位选3
//取w内容
//取w内容查表
if(a==3)//星期调整显示
{for(i=24;
32;
/***********************显示时钟数组子程序***********************/
voidxianshishuzu()
{StrTab[1]=second/10;
//秒十位
StrTab[0]=second%10;
//秒个位
StrTab[2]=10;
//间隔符-
StrTab[4]=minute/10;
//分十位
StrTab[3]=minute%10;
//分个位
StrTab[5]=10;
//间隔符-
StrTab[7]=hour/10;
//时十位
StrTab[6]=hour%10;
//时个位
}
/********************************定时闹钟****************/
voidalarm()
{chark;
if((hour==hour1)&
(minute==minute1)&
(k))
{if(P3!
=0XFF)
{k=0;
}
beng();
display(StrTab);
(minute!
=minute1))
{k=1;
StrTab[9]=10;
//闹钟秒个位
StrTab[8]=10;
StrTab[10]=10;
StrTab[12]=minute1/10;
StrTab[11]=minute1%10;
StrTab[13]=10;
StrTab[15]=hour1/10;
StrTab[14]=hour1%10;
//时十位
display(StrTab);
}
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;
StrTab[23]=year/1000;
StrTab[22]=(year/100)%10;
}
voidweek1()//星期显示
StrTab[25]=10;
StrTab[24]=10;
StrTab[26]=10;
StrTab[28]=week/10;
StrTab[27]=week%10;
StrTab[29]=10;
StrTab[31]=10;
StrTab[30]=10;
}
voidgodata()
if((hour==0)&
(minute==0)&
(second==0))
{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))//判断是闰年
{if(day==30);
//闰年29天
{day=1;
month++;
if(month==13)
{month=1;
year++;
if(year==10000)
year=0;
}}}
elseif(day==29)//平年28天
}}
elseif(day==31)//其他月30天
{day=1;
}
else
if(day==32)//其他其他月31天
{day=1;
if(month==13)
week++;
//星期走
if(week==8)
week=1;
data1();
week1();
while(second==0);
}
/**********************键盘扫描子程序*************************/
voidkeycan()
if(KEY1==0)//按一次,正常显示,按第二次,时调整,按第三次,分调这整,
{delay(10);
//按键1去抖以及动作
if(KEY1==0)//确认按键是否按下
{flag++;
}//切换标志
if(flag==10)
flag=0;
a=0;
if((flag==4)|(flag==5))
a=1;
if((flag==6)|(flag==7)|(flag==8))
a=2;
if(flag==9)
a=3;
while(!
KEY1);
}//释放按键
}
voidtiao()
{
while(flag==1)
{if(KEY2==0)
{delay(10);
if(KEY2==0)
{hour++;
if(hour==24)hour=0;
}//正常时间小时加1
while(!
KEY2)display(StrTab);
if(KEY3==0)
{delay(10);
{hour--;
if(hour==-1)hour=23;
}//正常时间小时减1
while(!
KEY3)display(StrTab);
}display(StrTab);
keycan();
while(flag==2)
{if(KEY2==0)//按键去抖以及动作
{minute++;
if(minute==60)minute=0;
}//分加1
while(!
if(KEY3==0)
{delay(10);
{minute--;
if(minute==-1)minute=59;
while(!
}display(StrTab);
}
while(flag==3)//秒表的加1
{if(KEY3==0)
{delay(10);
if(KEY3==0)
second=0;
}
if(KEY2==0)
if(KEY2==0)
while(!
}display(StrTab);
}
while(flag==4)//闹钟
{if(KEY2==0)
if(KEY2==0)
{hour1++;
if(hour1==25)hour1=0;
}//闹钟时间小时加1
KEY2)alarm();
if(KEY3==0)
{delay(10);
{hour1--;
if(hour1==-1)hour1=24;
}//闹钟时间小时减
KEY3)alarm();
}alarm();
keycan();
while(flag==5)
{if(KEY2==0)//按键去抖以及动作
if(KEY2==0)
{minute1++;
if(minute1==60)minute1=0;
}//闹钟分加1
while(!
if(KEY3==0)//按键去抖以及动作
if(KEY3==0)
{minute1--;
if(minute1==-1)minute1=59;
}//闹钟分减1
}alarm();
while(flag==6)//调整年
{year++;
if(year==10000)year=0;
}//闹钟分加1
KEY2)data1();
{year--;
if(year==-1)year=9999;
KEY3)data1();
}data1();
while(flag==7)//调整月只加
{month++;
if(month==13)month=1;
data1();
while(flag==8)//调整日只加
if(KEY2==0)//按键去抖以及动作
{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))//判断是闰年
{if(day==30)//闰年29天
day=1;
elseif(day==29)//平年28天
elseif(day==31)//其他月30天
day=1;
elseif(day==32)//其他其他月31天
day=1;
}
}//日期加加
while(flag==9)//调整星期只加
{week++;
if(week==8)week=1;
KEY2)week1();
week1();
}
/*****************整点报警子程序***************************/
voidzhengdian(void)
{chari;
if((minute==0)&
(second==0))//整点报时
{if((hour<
=23)&
(hour>
=7))
{for(i=0;
hour;
i++)
{beng();
delay(1000);
else
{beng();
godata();
delay(3000);
/**************************中断子程序*********************************/
voidtime_()interrupt1//中断程序
{count++;
TH0=(65536-50000)/256;
//0.5ms重新送初值
TL0=(65536-50000)%256;
if(count==20)//定时器计数,定时50ms,count满20,秒加1
{second++;
count=0;
if(second==60)//秒值等于60,秒清零,分加1
{second=0;
minute++;
if(minute==60)//分值等于60,分清零,时加1
{minute=0;
hour++;
if(hour==24)//时值等于24,时清零,返回,全部归零
{hour=0;
}}}}
xianshishuzu();
/***********************主函数***************************/
voidmain()
{P3=0XFF;
TMOD=0x01;
//time0为定时器,方式1
//预置计数初值,50ms
EA=1;
//总中断开
ET0=1;
//允许定时器0中断
TR0=1;
//开启定时器0
while
(1)//主循环
{
zhengdian();
alarm();
tiao();
if((second%8==1)&
(flag==0))
{w++;
if(w==36)
w=0;
while((second%8==1)&
{display(StrTab);
alarm();
tiao();
P1=pp[w];
if(flag==0)
{if(second==11)
a=2;
if(second==15)
a=3;
if(second==19)
a=0;
}}