单片机电子钟c程序

11-21| http://www.dianzi6.com | 电子制作 - 电子小制作|人气:829

单片机电子钟c程序

//**单片机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;i<m;i++)
   {
     for(j=0;j<500;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(m<0)
{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;x<6;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;}
}
}
}

如果觉得 单片机电子钟c程序这篇文章不错,可以推荐给朋友分享哦。
本文Tags:小制作,电子样本制作,电子制作 - 电子小制作,
相关电子小制作资料


温馨提示; 本站的资料全部免费下载,为方便下次找到本站记得将本站加入收藏夹哦,牢记网址http://www.dianzi6.com

此页提供单片机电子钟c程序小制作,电子样本制作, 电子制作 - 电子小制作参考。本站还有更多的电子小制作相关资料分享。
Copyright© www.dianzi6.com Inc. All rights reserved 。 1 2 3 4 5 6 7 8