AT89C51控制的电子时钟和日期设计.docx
- 文档编号:9632662
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:19
- 大小:50.15KB
AT89C51控制的电子时钟和日期设计.docx
《AT89C51控制的电子时钟和日期设计.docx》由会员分享,可在线阅读,更多相关《AT89C51控制的电子时钟和日期设计.docx(19页珍藏版)》请在冰豆网上搜索。
AT89C51控制的电子时钟和日期设计
AT89C51控制的电子时钟和日期设计
“电子日历+电子时钟系统”,日历与时间轮流显示,间隔1秒,系统要求实现以下功能:
1、日历显示格式为“××××.××.××”,分别对应“年.月.日”;
2、时钟显示格式为“××-××-××”,分别对应“时-分-秒”;
3、实现日期和时间可通过键盘调整
在按键模块中,按键实现年月日、时分秒的调节功能。
k==1,修改时加1的功能;k==2,修改分加1的功能;k==3,修改秒加1的功能
k==5,修改时减1的功能;k==6,修改分减1的功能;k==7,修改秒减1的功能
k==9,修改年加1的功能;k==10,修改月加1的功能;k==11,修改日加1的功能
k==13,修改年减1的功能;k==14,修改月减1的功能;k==15,修改日减1的功能
当显示时分秒时按下k==0键,此时只显示时分秒,此时可以修改时分秒,当再次按下k==8时返回交替显示
当显示年月日时按下k==4键,此时只显示年月日,此时可以修改年月日,当再次按下k==8时返回交替显示
在交替显示时,同样可以修改年月日、时分秒
#include
unsignedchark,a;
unsignedintnian=2012,yue=05,ri=25,shi=10,fen=30,miao=20;//电子日历和电子时钟系统显示的初始化
unsignedcharflag;
voidshuma_xianshi();//年月日显示函数声明
voidshuma_xianshi1();//时分秒显示函数声明
voidtiaoshi();//调节年月日、时分秒函数声明
voiddelay();//延时函数声明
unsignedchargetkey1();//扫描键盘值函数声明
voidnianyuetiaozheng();//年月的调整函数声明
voidmain()//主函数程序
{
TMOD=0X01;//定时器T0模式1
TH0=0X4C;//设置定时器初值
TL0=0X00;
EA=1;//开总中断
ET0=1;
TR0=1;
while
(1)
{
tiaoshi();//"调节年月日、时分秒函数"的调用
nianyuetiaozheng();//"年月的调整函数"的调用
if(miao%2)//判断年月日、时分秒的交替轮流显示;当秒为奇数时显示时分秒,当秒为偶数时显示年月日
{
if(k==0)
{EA=0;//在显示时分秒时,若按键0按下时停止计数,此时只显示时分秒
while
(1)
{
shuma_xianshi1();//时分秒显示函数
tiaoshi();//"调节年月日、时分秒函数"的调用
if(k==9)nian=(--nian);;//在显示时分秒时,假如说有按键9按下,年++不起作用
if(k==10)yue=(--yue);//在显示时分秒时,假如说有按键10按下,月++不起作用
if(k==11)ri=(--ri);//在显示时分秒时,假如说有按键11按下,日++不起作用
if(k==13)nian=(++nian);//在显示时分秒时,假如说有按键13按下,年--不起作用
if(k==14)yue=(++yue);//在显示时分秒时,假如说有按键14按下,月--不起作用
if(k==15)ri=(++ri);//在显示时分秒时,假如说有按键15按下,日--不起作用
if(k==8)break;//在显示时分秒时,假如说有按键8按下,此时返回到年月日、时分秒的交替显示
nianyuetiaozheng();//"年月的调整函数"的调用
}EA=1;//开启总中断
}
shuma_xianshi1();//显示时分秒
}
else
{
if(k==4)
{EA=0;//在显示年月日时,若按键4按下时停止计数,此时只显示年月日
while
(1)
{
shuma_xianshi();//年月日显示函数
tiaoshi();
if(k==1)shi=(--shi);//在显示年月日时,假如说有按键1按下,时++不起作用
if(k==2)fen=(--fen);//在显示年月日时,假如说有按键2按下,分++不起作用
if(k==3)miao=(--miao);//在显示年月日时,假如说有按键3按下,秒++不起作用
if(k==5)shi=(++shi);//在显示年月日时,假如说有按键5按下,时--不起作用
if(k==6)fen=(++fen);//在显示年月日时,假如说有按键6按下,分--不起作用
if(k==7)miao=(++miao);//在显示年月日时,假如说有按键7按下,秒--不起作用
if(k==8)break;//在显示年月日时,假如说有按键8按下,此时返回到年月日、时分秒的交替显示
nianyuetiaozheng();//"年月的调整函数"的调用
}EA=1;//开启总中断
}
shuma_xianshi();//显示年月日
}
}
}
voidshuma_xianshi()//年月日显示函数
{
P0=0X80|(nian/1000);//年的千位数字
delay();
P0=0X90|(nian%1000/100);//年的百位数字
delay();
P0=0Xa0|(nian%100/10);//年的十位数字
delay();
P0=0Xb0|(nian%10);//年的个位数字
delay();
P0=0Xc0|(yue/10);
delay();
P0=0Xd0|(yue%10);
delay();
P0=0Xe0|(ri/10);
delay();
P0=0Xf0|(ri%10);
delay();
}
voidshuma_xianshi1()//时分秒显示函数
{
P0=0X80|(shi/10);
delay();
P0=0X90|(shi%10);
delay();
P0=0Xb0|(fen/10);
delay();
P0=0Xc0|(fen%10);
delay();
P0=0Xe0|(miao/10);
delay();
P0=0Xf0|(miao%10);
delay();
}
voidtiaoshi()//调节年月日、时分秒函数
{
k=getkey1();//当有键按下时,取键盘的值
if(k==1)//按键1按下时,实现小时的++
{
TR0=0;
shi++;
if(shi==24)
shi=0;
TR0=1;
}
if(k==2)//按键2按下时,实现分钟的++
{
TR0=0;
fen++;
if(fen==60)
fen=0;
TR0=1;
}
if(k==3)//按键3按下时,实现秒的++
{
TR0=0;
miao++;
if(miao==60)
miao=0;
TR0=1;
}
if(k==5)//按键5按下时,实现小时的--
{
TR0=0;
shi--;
if(shi==-1)
shi=23;
TR0=1;
}
if(k==6)//按键6按下时,实现分钟的--
{
TR0=0;
fen--;
if(fen==-1)
fen=59;
TR0=1;
}
if(k==7)//按键7按下时,实现秒的--
{
TR0=0;
miao--;
if(miao==-1)
miao=29;
TR0=1;
}
if(k==9)//按键9按下时,实现年的++
{
TR0=0;
nian++;
if(nian==2051)
nian=2012;
TR0=1;
}
if(k==10)//按键10按下时,实现月的++
{
TR0=0;
yue++;
if(yue==13)
yue=1;
TR0=1;
}
if(k==11)//按键11按下时,实现日的++
{
TR0=0;
ri++;
if(ri==a)
ri=1;
TR0=1;
}
if(k==13)//按键13按下时,实现年的--
{
TR0=0;
nian--;
if(nian==2011)
nian=2050;
TR0=1;
}
if(k==14)//按键14按下时,实现月的--
{
TR0=0;
yue--;
if(yue==0)
yue=12;
TR0=1;
}
if(k==15)//按键15按下时,实现日的--
{
TR0=0;
ri--;
if(ri==0)
ri=(a-1);
TR0=1;
}
}
voiddelay()//延时函数
{
unsignedcharm,n;
for(m=0;m<20;m++)
for(n=0;n<100;n++);
}
voidtime0()interrupt1//定时器中断函数
{
flag++;
TH0=0X4C;//重新置入初值
TL0=0X00;
if(flag==20)//当flag==20时,此时定时时间1秒到
{
flag=0;
miao++;
if(miao==60)//当miao==60时,实现fen++
{
miao=0;
fen++;
if(fen==60)//当fen==60时,实现shi++
{
fen=0;
shi++;
if(shi==24)//当shi==24时,实现ri++
{
shi=0;
ri++;
if(ri==31)//当ri==31时,实现yue++
{
ri=1;
yue++;
if(yue==13)//当yue==13时,实现nian++
{
yue=1;
nian++;
}
}
}
}
}
}
}
unsignedchargetkey1(void)//扫描键盘值函数
{
unsignedchartemp,k;
P2=0xfe;//判断按键0、1、2、3
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay();
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0xee:
k=0;
break;
case0xde:
k=1;
break;
case0xbe:
k=2;
break;
case0x7e:
k=3;
break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
returnk;
}
P2=0xfd;//判断按键4、5、6、7
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay();
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0xed:
k=4;
break;
case0xdd:
k=5;
break;
case0xbd:
k=6;
break;
case0x7d:
k=7;
break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
returnk;
}
P2=0xfb;//判断按键8、9、10、11
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay();
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0xeb:
k=8;
break;
case0xdb:
k=9;
break;
case0xbb:
k=10;
break;
case0x7b:
k=11;
break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
returnk;
}
P2=0xf7;//判断按键12、13、14、15
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay();
temp=P2;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P2;
switch(temp)
{
case0xe7:
k=12;
break;
case0xd7:
k=13;
break;
case0xb7:
k=14;
break;
case0x77:
k=15;
break;
}
while(temp!
=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
returnk;
}
}
voidnianyuetiaozheng()//年月的调整函数
{
if(yue==2)//当月份显示为2月份时
{
if(nian%4==0&&nian%100!
=0)//判断是否为闰年
{
a=30;//当是闰年时,a=30
}
else
{
a=29;//当不是闰年时,a=29
}
}
else
if(yue==1|yue==3|yue==5|yue==7|yue==8|yue==10|yue==12)
{
a=32;//当月份显示为1、3、5、7、8、10、12时,a=32
}
else
if(yue==4|yue==6|yue==9|yue==11)
{
a=31;//当月份显示为4、6、9、11时,a=31
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AT89C51 控制 电子 时钟 日期 设计