89c51单片机数码管时钟例程Word文档格式.docx

上传人:b****3 文档编号:16747076 上传时间:2022-11-25 格式:DOCX 页数:14 大小:17.93KB
下载 相关 举报
89c51单片机数码管时钟例程Word文档格式.docx_第1页
第1页 / 共14页
89c51单片机数码管时钟例程Word文档格式.docx_第2页
第2页 / 共14页
89c51单片机数码管时钟例程Word文档格式.docx_第3页
第3页 / 共14页
89c51单片机数码管时钟例程Word文档格式.docx_第4页
第4页 / 共14页
89c51单片机数码管时钟例程Word文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

89c51单片机数码管时钟例程Word文档格式.docx

《89c51单片机数码管时钟例程Word文档格式.docx》由会员分享,可在线阅读,更多相关《89c51单片机数码管时钟例程Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

89c51单片机数码管时钟例程Word文档格式.docx

voidweek_show(void);

//星期显示6返回5;

voidcalendar_show(void);

//日历显示4显示年,3显示月日,2返回;

voidcalendar(void);

//日历设定2显示年,3显示月日,4返回;

charkey(void);

//键盘;

voidinitial(void);

//初始化;

定时中断

charhour1=1,hour0=2,min1=0,min0=0,sec1=0,sec0=0,n=0,w=1,v=1,//主显示全局变量;

n循环次数w星期显示v闹铃判断位;

fhour1=0,fhour0=0,fmin1=0,fmin0=0,fsec1=0,fsec0=0,//定时、调时共用全局变量;

t6=0,t5=6,t4=0,t3=0,t2=0,t1=0,//定时显示全局变量;

year3=2,year2=0,year1=1,year0=0,mouts1=0,mouts0=7,day1=0,day0=7;

//年月日全局变量;

inta1[12]={31,28,31,30,31,30,31,31,30,31,30,31};

//平年;

inta0[12]={31,29,31,30,31,30,31,31,30,31,30,31};

//闰年;

int*p;

//为a1.a0设置指针;

//********************************************************************定义和声明;

voidmain(void)

{

initial();

//初始化

while

(1)

{

P1=0x0f;

if(P1!

=0x0f)//判位进入调控程序;

control();

P1=0xff;

display(5,hour1);

///主显示程序;

delayms(150);

display(4,hour0);

display(3,min1);

display(2,min0);

display(1,sec1);

display(0,sec0);

}

}

//*************************************************判位操作显示;

voidcontrol(void)

{

P1=0xbf;

if(P1==0xbe)//1显示数码管和蜂鸣器,自动返回;

{P2=0x00;

P0=0xff;

delayms(2000);

}

elseif(P1==0xb7)//4显示某年,3显示某月日,2返回;

calendar_show();

elseif(P1==0xbb)//3定时年,2定时月日,1返回;

calendar();

P1=0xef;

if(P1==0xeb)//11定时,自动返回;

fixed_times();

elseif(P1==0xe7)//12调时,自动返回;

swap_times();

elseif(P1==0xed)//10显示定时9返回;

fixed_show();

P1=0xdf;

if(P1==0xd7)//8星期设置7返回;

week();

elseif(P1==0xdd)//6星期显示5返回;

week_show();

elseif(P1==0xde)//关闭闹铃;

v=1;

//******************************************************中断入口;

voidtime0(void)interrupt1//定时中断0;

{unsignedintq;

if(v==0)//盘闹铃是否工作;

P2_7=0;

else

P2_7=1;

q=year3*1000+year2*100+year1*10+year0;

//平、闰年判别;

if((q%4==0&

&

q%100!

=0)||(q%400==0))

p=a0;

//闰年指针指向;

elsep=a1;

//平年指针指向;

TH0=0xb8;

//20ms定时;

TL0=0x00;

n==50?

n=0:

++n;

//循环次数;

if(n==0)//时分秒的进位;

{++sec0;

if(sec0==10)

{sec0=0;

++sec1;

if(sec1==6)

{sec1=0;

++min0;

if(hour1==t6&

hour0==t5&

min1==t4&

min0==t3)//判蜂鸣器响,

v=0;

//闹铃标志位;

else//判蜂鸣器,虽然雍杂,但蜂鸣时数码管不闪烁;

v=1;

if(min0==10)

{min0=0;

++min1;

if(min1==6)

{min1=0;

++hour0;

P2_7=0;

delayms(8000);

if(hour0==10)

{hour0=0;

++hour1;

}

}

}

}

}

if((hour1==2)&

(hour0==4))//判是否大于24点

{hour1=0;

hour0=0;

++w;

if(w>

7||w<

1)//星期控制1-7天;

w=1;

if(++day0==10)//日的判断进位;

{day0=0;

++day1;

if(day1*10+day0>

*(p+(mouts1*10+mouts0-1)))

{day0=1;

day1=0;

++mouts0;

if(mouts0==10)//月的判断进位;

{mouts0=0;

++mouts1;

if(mouts1*10+mouts0>

12)

{mouts0=1;

mouts1=0;

++year0;

if(year0==10)//年的判断进位;

{year0=0;

++year1;

if(year1==10)

{year1=0;

++year2;

if(year2==10)

{year2=0;

++year3;

if(year3==10)

{year3=0;

}

}

}

}

}

////*****************************************************************显示程序;

voiddisplay(charm,charn)

unsignedchary[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsignedcharz[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

P2=z[m];

P0=y[n];

///*********************************************************************延时程序;

voiddelayms(unsignedintx)

unsignedinty;

for(y=0;

y<

x;

++y);

////****************************************************************键盘程序;

charkey(void)

{

P1=0x0f;

loop:

if(P1==0x0f)

gotoloop;

delayms(3350);

while

(1)

{P1=0xbf;

if(P1_0==0){while(P1!

=0xbf);

return0;

if(P1_1==0){while(P1!

return1;

}

if(P1_2==0){while(P1!

return2;

if(P1_3==0){while(P1!

return3;

=0xdf);

return4;

return5;

return6;

return7;

P1=0xef;

=0xef);

return8;

return9;

//*************************************************************定时时间程序;

voidfixed_times(void)

P2=0xfe;

P0=0x71;

common();

t6=fhour1;

t5=fhour0;

t4=fmin1;

t3=fmin0;

t2=fsec1;

t1=fsec0;

///************************************************************调时程序;

voidswap_times(void)

P0=0x6d;

hour1=fhour1;

hour0=fhour0;

min1=fmin1;

min0=fmin0;

sec1=fsec1;

sec0=fsec0;

//************************************************************初始化程序;

voidinitial(void)

IE=0x82;

TMOD=0x01;

TR0=1;

//*******************************************调时、定时共用设定和显示程序;

voidcommon(void)

charf=0,j=0,k;

for(k=0;

k<

6;

++k)

switch(++f)

case1:

{for(fsec0=key();

fsec0>

2;

fsec0=0)

{P2_7=0;

delayms(3000);

P2_7=1;

break;

case2:

{fsec1=fsec0;

for(fsec0=key();

fsec1>

=2&

=4;

case3:

{fmin0=fsec1;

fsec1=fsec0;

5;

case4:

{fmin1=fmin0;

fmin0=fsec1;

fsec0=key();

case5:

{fhour0=fmin1;

fmin1=fmin0;

case6:

{fhour1=fhour0;

fhour0=fmin1;

}

for(P1=0x0f;

(P1==0x0f)&

(f<

=6);

j=0)

if(++j<

=f)

{display(0,fsec0);

delayms(200);

if(++j<

{display(1,fsec1);

delayms(200);

if(++j<

{display(2,fmin0);

delayms(200);

if(++j<

{display(3,fmin1);

delayms(200);

if(++j<

{display(4,fhour0);

if(++j<

{display(5,fhour1);

delayms(200);

}

}

}

///********************************************************定时显示程序;

voidfixed_show(void)

do{

display(5,t6);

display(4,t5);

display(3,t4);

display(2,t3);

display(1,t2);

display(0,t1);

while(P1!

=0xee);

//*****************************************星期设定程序;

voidweek(void)

delayms(5000);

for(w=key();

w>

1;

w=1);

do

display(5,w);

while(P1!

=0xdb);

//******************************************星期显示程序;

voidweek_show(void)

P1=0xdf;

=0xde);

///*****************************************万年历显示程序;

voidcalendar_show(void)

do

display(4,year3);

//年显示;

delayms(150);

display(3,year2);

display(1,year1);

display(0,year0);

while(P1!

=0xbb);

display(4,mouts1);

//月日显示;

display(3,mouts0);

display(1,day1);

display(0,day0);

=0xbd);

//*******************************************万年历设定程序;

voidcalendar(void)

P0=0x6e;

do{}

while(P1==0xbb);

display(4,year3=key());

//年设定;

display(3,year2=key());

display(1,year1=key());

display(0,year0=key());

do{P1=0xbf;

P0=0x63;

while(P1==0xbd);

//月日设定;

display(4,mouts1=key());

display(3,mouts0=key());

if(mouts1*10+mouts0>

12||mouts1*10+mouts0<

1)

{mouts1=0;

mouts0=1;

P2_7=0;

delayms(1200);

display(1,day1=key());

display(0,day0=key());

if(day1*10+day0>

*p||day1*10+day0<

{day1=0;

day0=1;

=0xbe);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1