工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

单片机电子钟c程序

作者:dolphin时间:2011-05-11

//**单片机SST89E58RD 8位共阳数码管 12M晶振**//
//*******P0段选,P2位选*******//
#include at89x52.h
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar n;
uchar hh,mm,ss;
uchar nhh,nmm,nss;
uint year;
uchar day,mon,week;
uchar hhs,hhg,mms,mmg,sss,ssg;
uchar days,dayg,mons,mong;
uchar nhhs,nhhg,nmms,nmmg,nsss,nssg;
uchar set1=1,set2=1;
sbit fm=P3^2;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年
void jishi();
void baoshi();
void alarm();
void set_time();
void set_alarm();
void set_mdw();
void key_change();
void key_set();

void delay(int m) //延时程序,延时m*0.5ms
{
uint i;
uint j;
for (i=0;im;i++)
{
for(j=0;j500;j++){}
}
}

void timer0() interrupt 1
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb1;

n++;
jishi();
}

main()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb1;

TR0=1;
EA=1;
ET0=1;
hh=12;mm=00;ss=00;
nhh=7;nmm=30;nss=0;
year=2008;mon=12;day=1;week=1;
while(1)
{
hhs=hh/10%10;//时分秒
hhg=hh%10;
mms=mm/10%10;
mmg=mm%10;
sss=ss/10%10;
ssg=ss%10;
nhhs=nhh/10%10;//闹钟
nhhg=nhh%10;
nmms=nmm/10%10;
nmmg=nmm%10;
nsss=nss/10%10;
nssg=nss%10;
days=day/10%10;//月日
dayg=day%10;
mons=mon/10%10;
mong=mon%10;

key_change(); //k1按键扫描
key_set(); //k2按键扫描
set_time(); //设置时间
set_mdw(); //设置月日星期
set_alarm(); //设置闹钟

if(set1==1) //正常走时显示
{
P0=tab[hhs];P2_7=0;delay(1);P2_7=1;//时十位
P0=tab[hhg];P2_5=0;delay(1);P2_5=1;//时个位
P0=tab[10];P2_3=0;delay(1);P2_3=1;//-
P0=tab[mms];P2_1=0;delay(1);P2_1=1;//分十位
P0=tab[mmg];P2_6=0;delay(1);P2_6=1;//分个位
P0=tab[10];P2_4=0;delay(1);P2_4=1;//-
P0=tab[sss];P2_2=0;delay(1);P2_2=1;//秒十位
P0=tab[ssg];P2_0=0;delay(1);P2_0=1;//秒个位
}
if(set1==2) //设置时间
{
P0=tab[hhs];P2_7=0;delay(1);P2_7=1;//时十位
P0=tab[hhg];P2_5=0;delay(1);P2_5=1;//时个位
P0=tab[10];P2_3=0;delay(1);P2_3=1;//-
P0=tab[mms];P2_1=0;delay(1);P2_1=1;//分十位
P0=tab[mmg];P2_6=0;delay(1);P2_6=1;//分个位
P0=tab[10];P2_4=0;delay(1);P2_4=1;//-
P0=tab[sss];P2_2=0;delay(1);P2_2=1;//秒十位
P0=tab[ssg];P2_0=0;delay(1);P2_0=1;//秒个位
}
if(set1==3) //正常显示月日-星期
{
P0=tab[mons];P2_7=0;delay(1);P2_7=1;//时十位
P0=tab[mong];P2_5=0;delay(1);P2_5=1;//时个位
P0=tab[10];P2_3=0;delay(1);P2_3=1;//-
P0=tab[days];P2_1=0;delay(1);P2_1=1;//分十位
P0=tab[dayg];P2_6=0;delay(1);P2_6=1;//分个位
P0=tab[11];P2_4=0;delay(1);P2_4=1;//-
P0=tab[11];P2_2=0;delay(1);P2_2=1;//秒十位
P0=tab[week];P2_0=0;delay(1);P2_0=1;//秒个位
}
if(set1==4) //设置月日-星期
{
P0=tab[mons];P2_7=0;delay(1);P2_7=1;//时十位
P0=tab[mong];P2_5=0;delay(1);P2_5=1;//时个位
P0=tab[10];P2_3=0;delay(1);P2_3=1;//-
P0=tab[days];P2_1=0;delay(1);P2_1=1;//分十位
P0=tab[dayg];P2_6=0;delay(1);P2_6=1;//分个位
P0=tab[11];P2_4=0;delay(1);P2_4=1;//-
P0=tab[11];P2_2=0;delay(1);P2_2=1;//秒十位
P0=tab[week];P2_0=0;delay(1);P2_0=1;//秒个位
}
if(set1==5) //正常显示定时
{
P0=tab[nhhs];P2_7=0;delay(1);P2_7=1;//时十位
P0=tab[nhhg];P2_5=0;delay(1);P2_5=1;//时个位
P0=tab[10];P2_3=0;delay(1);P2_3=1;//-
P0=tab[nmms];P2_1=0;delay(1);P2_1=1;//分十位
P0=tab[nmmg];P2_6=0;delay(1);P2_6=1;//分个位
P0=tab[10];P2_4=0;delay(1);P2_4=1;//-
P0=tab[nsss];P2_2=0;delay(1);P2_2=1;//秒十位
P0=tab[nssg];P2_0=0;delay(1);P2_0=1;//秒个位
}
if(set1==6) //设置闹钟定时
{
P0=tab[nhhs];P2_7=0;delay(1);P2_7=1;//时十位
P0=tab[nhhg];P2_5=0;delay(1);P2_5=1;//时个位
P0=tab[10];P2_3=0;delay(1);P2_3=1;//-
P0=tab[nmms];P2_1=0;delay(1);P2_1=1;//分十位
P0=tab[nmmg];P2_6=0;delay(1);P2_6=1;//分个位
P0=tab[10];P2_4=0;delay(1);P2_4=1;//-
P0=tab[nsss];P2_2=0;delay(1);P2_2=1;//秒十位
P0=tab[nssg];P2_0=0;delay(1);P2_0=1;//秒个位
}
baoshi(); //整点报时
alarm(); //闹钟
}
}

void jishi() //计时函数
{
if(n==20)
{n=0;ss++;
if(ss==60)
{ss=0;mm++;
if(mm==60)
{mm=0;hh++;
if(hh==24)
{hh=0;day++;week++;
if(week==8)
{week=0;}
if(year%4==0&&year%100!=0||year%400==0) //闰年
{
if(day==table1[mon]+1)
{day=0;mon++;
if(mon==13)
{mon=0;year++;}
}
}
else //非闰年
{
if(day==table2[mon]+1)
{day=0;mon++;
if(mon==13)
{mon=0;year++;}
}
}
}
}
}
}
}

uchar incone(uchar n) //加1函数
{
if(k3==0)
{delay(20);
if(k3==0)
{
n++;
while(!k3);
}
}
return(n);
}

uchar decone(uchar m) //减1函数
{
if(k4==0)
{
delay(20);
if(k4==0)
{
m--;
while(!k4);
if(m0)
{m=0;}
}
}
return(m);
}

void key_change() //k1按键扫描
{
if(k1==0)
{
delay(20);
if(k1==0)
{
set1++;
while(!k1);
if(set1==7)
{set1=1;}
}
}
}

void key_set() //k2按键扫描
{
if(k2==0)
{
delay(20);
if(k2==0)
{
set2++;
while(!k2);
if(set2==4)
{set2=1;}
}
}
}

void baoshi() //整点报时函数
{
if(mm==00&&ss==00)
{
fm=0;
}
if(ss==1)
{
fm=1;
}
}

void alarm() //闹钟函数
{
uchar x;
if(nhh==0)
{
goto end;
}
if(hh==nhh&&mm==nmm&&ss==nss)
{
for(x=0;x6;x++)
{
fm=0;
delay(30);
fm=1;
delay(20);
fm=0;
delay(30);
fm=1;
delay(20);
fm=0;
delay(30);
fm=1;
delay(20);
fm=0;
delay(30);
fm=1;
delay(180);
}
}
end:;
}

void set_time() //设置时间函数
{
if(set1==2)
{
if(set2==1)
{
hh=incone(hh);
if(hh==24)
{hh=0;}
if(hh==-1)
{hh=23;}
hh=decone(hh);
}
if(set2==2)
{
mm=incone(mm);
if(mm==60)
{mm=0;}
if(mm==-1)
{mm=59;}
mm=decone(mm);
}
if(set2==3)
{
ss=incone(ss);
if(ss==60)
{ss=0;}
if(ss==-1)
{ss=59;}
ss=decone(ss);
}
}
}

void set_mdw() //设置月日星期函数
{
if(set1==4)
{
if(set2==1)
{
mon=incone(mon);
if(mon==13)
{mon=1;}
mon=decone(mon);
if(mon==0)
{mon=12;}
}
if(set2==2)
{
day=incone(day);
if(day==32)
{day=1;}
day=decone(day);
if(day==0)
{day=31;}
}
if(set2==3)
{
week=incone(week);
if(week==8)
{week=1;}
week=decone(week);
if(week==0)
{week=7;}
}
}
}

void set_alarm() //设置闹钟函数
{
if(set1==6)
{
if(set2==1)
{
nhh=incone(nhh);
if(nhh==24)
{nhh=0;}
if(nhh==-1)
{nhh=23;}
nhh=de cone(nhh);
}
if(set2==2)
{
nmm=incone(nmm);
if(nmm==60)
{nmm=0;}
nmm=decone(nmm);
if(nmm==-1)
{nmm=59;}
}
if(set2==3)
{
nss=incone(nss);
if(nss==60)
{nss=0;}
nss=decone(nss);
if(nss==-1)
{nss=59;}
}
}
}


关键词: 单片机 电子钟 程序

评论

技术专区