电子文章 | 电子资料下载 | 家电维修 | 维修资料下载 | 加入收藏 | 全站地图
您现在所在位置:电子爱好者电子文章电子制作电子小制作单片机电子钟c程序

单片机电子钟c程序

11-21 22:50:19 | http://www.5idzw.com | 电子小制作 | 人气:829
标签:小制作,电子样本制作,http://www.5idzw.com 单片机电子钟c程序,http://www.5idzw.com

//**单片机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);

[1] [2]  下一页

,单片机电子钟c程序
关于《单片机电子钟c程序》的更多文章