文档库 最新最全的文档下载
当前位置:文档库 › 51单片机电子时钟C语言程序

51单片机电子时钟C语言程序

#include//头文件
#define uchar unsigned char//宏定义
#define uint unsigned int
sbit P32=P3^2;//位声明
sbit P36=P3^6;
sbit P37=P3^7;
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳段码表
uint hou1,hou2,min1,min2,sec1,sec2,numhou,nummin,numsec,yue1,yue2,ri1,ri2,numyue,numri;
uint num,m,n;
void delayms(uint xms)//延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void p32xd()//按键P32消抖
{ delayms(2);
while(P32!=1);
delayms(2);
}
void p36xd()//按键P36消抖
{ delayms(1);
while(P36!=1);
delayms(1);
}
void p37xd()//按键P37消抖
{ delayms(1);
while(P37!=1);
delayms(1);
}
void displaysj()//显示时间
{
P2=0x00;
P0=table[hou1];//显示时的第一位
P2=0X20;
delayms(1);

P2=0xff;
P0=table[hou2]&0x7f;//显示时的第二位与小数点
P2=0X10;
delayms(1);

P2=0xff;
P0=table[min1];//显示分的第一位
P2=0X08;
delayms(1);

P2=0xff;
P0=table[min2]&0x7f;//显示时的第二位与小数点
P2=0X04;
delayms(1);

P2=0xff;
P0=table[sec1];//显示秒的第一位
P2=0X02;
delayms(1);

P2=0xff;
P0=table[sec2];//显示秒的第二位
P2=0X01;
delayms(1);
}
void displayrq()//显示日期
{ P2=0x00;
P0=table[yue1];//显示月的第一位
P2=0X20;
delayms(1);

P2=0x00;
P0=table[yue2]&0x7f;//显示月的第二位
P2=0X10;
delayms(1);

P2=0x00;
P0=table[ri1];//显示日的第一位
P2=0X08;
delayms(1);

P2=0x00;
P0=table[ri2];//显示日的第二位
P2=0X04;
delayms(1);
}
void houqh()//时针切换函数
{
hou1=numhou/10;
hou2=numhou%10;
}
void minqh()//分针切换函数
{
min1=nummin/10;
min2=nummin%10;
}
void secqh()//秒针切换函数
{
sec1=numsec/10;
sec2=numsec%10;
}
void yueqh()//月切换函数
{
yue1=numyue/10;
yue2=numyue%10;
}
void riqh()//日切换函数
{
ri1=numri/10;
ri2=numri%10;
}
void start()//初始化函数
{
num=0;
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
IT0=0;//电平触发(低电平有效)
EX0=1;
ET0=1;
TR0=1;
yueqh(),riqh();//初始化日月切换
}
void ritiao()//日期的调节函数
{ if(P36==0)//日期加一调节键
{
p36xd();
if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12))
{
numri+=1;
if(numri>=32)//如果是大月,日期有31号,等于符号是防止日期大于31号而乱码
{numri=1;}
}
if((numyue==4)||(numyue==6)||(numyue==9)||(numyue==11))
{
numri+=1;
if(numri>=31)//如果是小月,日期有30号
{numri=1;}
}
if(numyue==2)
{
numri+=1;
if(numri>=29)//如果是小月,日期有28号
{numri=1;}
}
riqh();//日期调节后 切换一下
}
if(P37==0)//日期减一调节键
{
p37xd();
if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12))
{
numri-=1;

if(numri==0)
{numri=31;}
}
if((numyue==4)||(numyue==6)||(numyue==9)||(numyue==11))
{
numri-=1;
if(numri==0)
{numri=30;}
}
if(numyue==2)
{
numri-=1;
if(numri==0)
{numri=28;}
}
riqh();
}
}
void yuetiao()//月份的调节函数
{if(P36==0)
{
p36xd();
numyue+=1;
if(numyue==13)//月份为12时再加一马上为一月
{numyue=1;}
yueqh();
}
if(P37==0)
{
p37xd();
numyue-=1;
if(numyue==0)
{numyue=12;}
yueqh();
}

}
void int0() interrupt 0
{
p32xd();
while(P32!=0)//第一次按下p32时,进行秒调时
{
for(m=0;m<40;m++)//此for循环不显示秒,为的是使秒闪烁
{
P2=0x00;
P0=table[hou1];
P2=0X20;
delayms(1);

P2=0x00;
P0=table[hou2]&0x7f;
P2=0X10;
delayms(1);

P2=0x00;
P0=table[min1];
P2=0X08;
delayms(1);

P2=0x00;
P0=table[min2]&0x7f;
P2=0X04;
delayms(1);
if(P36==0)//如果按一下P36,则秒加一
{
p36xd();
numsec+=1;
if(numsec==60)
{
numsec=0;
}
secqh();
}
if(P37==0)//如果按一下P37,则秒减一
{
p37xd();
numsec-=1;
if(numsec==-1)
{
numsec=59;
}
secqh();
}
};
for(n=0;n<40;n++)//此循环时分秒全显示,也为的是使秒闪烁
{ displaysj();
if(P36==0)
{
p36xd();
numsec+=1;
if(numsec==60)
{
numsec=0;
}
secqh();
}
if(P37==0)
{
p37xd();
numsec-=1;
if(numsec==-1)
{
numsec=59;
}
secqh();
}

}
};
p32xd();
while(P32!=0)//第二次按下p32时,进行分调时
{
for(m=0;m<40;m++)
{
P2=0x00;
P0=table[hou1];
P2=0X20;
delayms(1);

P2=0x00;
P0=table[hou2]&0x7f;
P2=0X10;
delayms(1);

P2=0x00;
P0=table[sec1];
P2=0X02;
delayms(1);

P2=0x00;
P0=table[sec2];
P2=0X01;
delayms(1);

if(P36==0)
{
p36xd();
nummin+=1;
if(nummin==60)
{
nummin=0;
}
minqh();
}
if(P37==0)
{
p37xd();
nummin-=1;
if(nummin==-1)
{
nummin=59;
}
minqh();
}
}
for(n=0;n<40;n++)
{ displaysj();
if(P36==0)
{
p36xd();
nummin+=1;
if(nummin==60)
{
nummin=0;
}
minqh();
}
if(P37==0)
{
p37xd();
nummin-=1;
if(nummin==-1)
{
nummin=59;
}
minqh();
}
}

};
p32xd();
while(P32!=0)//第三次按下p32时,进行时调时
{
for(m=0;m<40;m++)
{
P2=0x00;
P0=table[min1];
P2=0X08;
delayms(1);

P2=0x00;
P0=table[min2]&0x7f;
P2=0X04;
delayms(1);

P2=0x00;
P0=table[sec1];
P2=0X02;
delayms(1);

P2=0x00;
P0=table[sec2];
P2=0X01;
delayms(1);

if(P36==0)
{
p36xd();
numhou+=1;
if(numhou==24)
{

numhou=0;
}
houqh();
}
if(P37==0)
{
p37xd();
numhou-=1;
if(numhou==-1)
{
numhou=23;
}
houqh();
}
}
for(n=0;n<40;n++)
{ displaysj();
if(P36==0)
{
p36xd();
numhou+=1;
if(numhou==24)
{
numhou=0;
}
houqh();
}
if(P37==0)
{
p37xd();
numhou-=1;
if(numhou==-1)
{
numhou=23;
}
houqh();
}
}
}
p32xd();
while(P32!=0)//第四次按下p32时,进行日期调节
{
for(m=0;m<50;m++)
{ P2=0x00;
P0=table[yue1];
P2=0x20;
delayms(1);

P2=0x00;
P0=table[yue2]&0x7f;
P2=0x10;
delayms(1);
ritiao();
}
for(n=0;n<50;n++)
{ displayrq();
ritiao();
}
}
p32xd();
while(P32!=0)//第五次按下p32时,进行月调节
{
for(m=0;m<50;m++)
{

P2=0xff;
P0=table[ri1];
P2=0xf7;
delayms(1);

P2=0xff;
P0=table[ri2];
P2=0xfb;
delayms(1);
yuetiao();
}
for(n=0;n<50;n++)
{ displayrq();
yuetiao();
}
}
p32xd();
}
void yuejia()
{ numri=1;
numyue+=1;
if(numyue==13)
{numyue=1;}
}
void timer0() interrupt 1
{
TH0=(65536-46100)/256;
TL0=(65536-46100)%256;
num++;
if(num==20)
{
num=0;
TH0=(65536-46100)/256;
TL0=(65536-46100)%256;
numsec=numsec+1;
if(numsec==60)
{
numsec=0;
nummin=nummin+1;
if(nummin==60)
{
nummin=0;
numhou=numhou+1;
if(numhou==24)
{
numhou=0;
numri+=1;
if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12))
{
numri+=1;
if(numri>=32)
{
numri=1;
numyue+=1;
if(numyue==13)
{numyue=1;}
}
}
if((numyue==4)||(numyue==6)||(numyue==9)||(numyue==11))
{
numri+=1;
if(numri>=31)
{
numri=1;
numyue+=1;
if(numyue==13)
{numyue=1;}
}
}
if(numyue==2)
{
numri+=1;
if(numri>=29)
{
numri=1;
numyue+=1;
if(numyue==13)
{numyue=1;}
}
}
}
}
}

}
}
void main()
{
numhou=12;//初始化时间设为12点,日期设为1月1日
nummin=0;
numsec=0;
numyue=1;
numri=1;
start();
while(1)
{
if(P36==1)//默认(没有按下p36时)显示时间
{houqh(),minqh(),secqh();
displaysj();}

if(P36==0)//当按下p36键时显示日期
{yueqh(),riqh();
displayrq();}
}
}

相关文档
相关文档 最新文档