📄 dianzishizhong.c
字号:
/*该程序实现日期时间及星期(以1980年1月1日为基准计算)的显示,其中0表示周一,
依次类推。有外中断0和三个开关实现校时,闹钟功能。*////////////////////////
//////////////////////////////////////////////////////////////////////////
/*这是我第一次用C编的单片机程序(以前用汇编),其中定有不妥之处,请各位网友批评指正。///
如果对您有那么一点用处,吾心甚慰!电子开发论坛网名lhlshxy,QQ:250909460,
希望与各位交流经验!谢谢,如转载,请保留此段!*////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <math.h>
#include <reg51.h>
#define uint unsigned int
uint a[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*字型码*/
bit leap1,jian=1;
uint i=20;
struct xshc
{uint year;
uint month;
uint day;
uint week;uint hour;
uint m;
uint second;
uint dhour;
uint dmr;}hc={2007,1,1,1,0,0,0,0,0}; /*显示缓冲区*/
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_7=P1^7;
sbit P3_2=P3^2;
bit pdrn(uint x) /*判断是否闰年*/
{
bit leap;
if(x%4==0)
{if(x%100==0)
{if(x%400==0)
leap=1;
else leap=0;}
else leap=1;}
else leap=0;
return(leap);
}
void jsweek(void) /*计算星期几*/
{uint x=0,y,z;
bit f;
for(y=1980;y<hc.year;y++)
{f=pdrn(y);
if(f)
x+=1;}
z=hc.year-1980+x;
switch(hc.month)
{
case 1:{z=z+hc.day;}break;
case 2:{z=z+hc.day+31;}break;
case 3:{z=z+hc.day+59;}break;
case 4:{z=z+hc.day+90;}break;
case 5:{z=z+hc.day+120;}break;
case 6:{z=z+hc.day+151;}break;
case 7:{z=z+hc.day+181;}break;
case 8:{z=z+hc.day+212;}break;
case 9:{z=z+hc.day+243;}break;
case 10:{z=z+hc.day+273;}break;
case 11:{z=z+hc.day+304;}break;
case 12:{z=z+hc.day+334;}break;
}
f=pdrn(hc.year);
if(f==1&&hc.month>2)
z=z+1;
hc.week=z%7+1;
if(hc.week==7)
hc.week=0;
return;
}
void rqzh(void) /*日期转换*/
{
if(hc.day==29)
{if(hc.month==2)
{leap1=pdrn(hc.year);
if(!leap1)
{hc.month+=1;
hc.day=1;}}}
if(hc.day==30)
{if(hc.month==2)
{ hc.month+=1;
hc.day=1;}}
if(hc.day==31)
{if(hc.month==2||hc.month==4||hc.month==6||hc.month==9||hc.month ==11)
{ hc.month+=1;
hc.day=1;}}
if(hc.day==32)
{ hc.month+=1;
hc.day=1;}
return;
}
dsqzd() interrupt 1 using 1 /*定时器0中断*/
{
i=i-1;
if(i==0)
{i=20;
hc.second+=1;
if(hc.second==60)
{hc.m+=1;
hc.second=0;
if(hc.m==60)
{hc.hour+=1;
hc.m=0;
if(hc.hour==24)
{hc.day+=1;
hc.hour=0;
hc.week+=1;
if(hc.week==7)
hc.week=0;
if(hc.day==29||hc.day==30||hc.day==31||hc.day==32)
{rqzh();
if(hc.month==13)
{hc.year+=1;
hc.month=1;}}} }}}
else
{TMOD=0x01;
EX0=1;
ET0=1;
EA=1;
TH0=0x3C;
TL0=0xB0;
TR0=1;}
}
void deley(void) /*延时*/
{uint j;
for(j=0;j<=75;j++)
{}
return;}
void disphour() /*显示时间及星期*/
{uint h1,h2,m1,m2,s1,s2;
h1=hc.hour/10;
h2=hc.hour%10;
m1=hc.m/10;
m2=hc.m%10;
s1=hc.second/10;
s2=hc.second%10;
P2=0x0FE;
P0=a[s2];
deley();
deley();
P2=0x0FD;
P0=a[s1];
deley();
deley();
P2=0x0FB;
P0=a[m2];
deley();
deley();
P2=0x0F7;
P0=a[m1];
deley();
deley();
P2=0x0EF;
P0=a[h2];
deley();
deley();
P2=0x0DF;
P0=a[h1];
deley();
deley();
P2=0x0BF;
P0=0X40;
deley();
deley();
P2=0x7F;
P0=a[hc.week];
deley();
deley();
return;
}
void dispyear(void) /*显示日期*/
{uint y1,y2,y3,y4,mo1,mo2,d1,d2;
y1=hc.year/1000;
y2=(hc.year-y1*1000)/100;
y3=(hc.year-y1*1000-y2*100)/10;
y4=hc.year-y1*1000-y2*100-y3*10;
mo1=hc.month/10;
mo2=hc.month%10;
d1=hc.day/10;
d2=hc.day%10;
P2=0x0FE;
P0=a[d2];
deley();
deley();
P2=0x0FD;
P0=a[d1];
deley();
deley();
P2=0x0FB;
P0=a[mo2];
deley();
deley();
P2=0x0F7;
P0=a[mo1];
deley();
deley();
P2=0x0EF;
P0=a[y4];
deley();
deley();
P2=0x0DF;
P0=a[y3];
deley();
deley();
P2=0x0BF;
P0=a[y2];
deley();
deley();
deley();
deley();
P2=0x7F;
P0=a[y1];
deley();
deley();
deley();
deley();
return;
}
void dispd(void) /*显示定时*/
{uint h1,h2,m1,m2;
h1=hc.dhour/10;
h2=hc.dhour%10;
m1=hc.dmr/10;
m2=hc.dmr%10;
P2=0x0FE;
P0=a[m2];
deley();
P2=0x0FD;
P0=a[m1];
deley();
P2=0x0FB;
P0=a[h2];
deley();
P2=0x0F7;
P0=a[h1];
deley();
P2=0x0EF;
P0=0x40;
deley();
P2=0x0DF;
P0=0x40;
deley();
P2=0x0BF;
P0=0x40;
deley();
P2=0x7F;
P0=0x40;
deley();
return;
}
wzd0() interrupt 0 using 0 /*外中断0校时*/
{
if(P1_0==0&&P1_1==0&&P1_2==0) /*年加*/
{ uint i;
hc.year+=1;
for(i=0;i<=50;i++)
{dispyear();
deley();}
jsweek();
}
if(P1_0==0&&P1_1==0&&P1_2==1) /*调分*/
{ uint i;
hc.m+=1;
if(hc.m==60)
hc.m=0;
for(i=0;i<=50;i++)
{disphour();
deley();}
}
if(P1_0==0&&P1_1==1&&P1_2==0) /*调时*/
{uint i;
hc.hour+=1;
if(hc.hour==24)
hc.hour=0;
for(i=0;i<=50;i++)
{disphour();
deley();}
}
if(P1_0==0&&P1_1==1&&P1_2==1) /*调天*/
{uint i;
hc.day+=1;
if(hc.day==32)
hc.day=0;
for(i=0;i<=50;i++)
{dispyear();
deley();}
jsweek() ;
}
if(P1_0==1&&P1_1==0&&P1_2==0) /*调月*/
{uint i;
hc.month+=1;
if(hc.month==13)
hc.month=0;
for(i=0;i<=50;i++)
{dispyear();
deley();}
jsweek() ;
}
if(P1_0==1&&P1_1==0&&P1_2==1) /*调年减*/
{ uint i;
hc.year-=1;
for(i=0;i<=50;i++)
{if(hc.year<=1980)
hc.year=1980;
dispyear();
deley();}
jsweek();
}
if(P1_0==1&&P1_1==1&&P1_2==0) /*定分*/
{uint i;
hc.dmr+=1;
if(hc.dmr==60)
hc.dmr=0;
for(i=0;i<=50;i++)
{dispd();
deley();}
}
if(P1_0==1&&P1_1==1&&P1_2==1) /*定时*/
{uint i;
hc.dhour+=1;
if(hc.dhour==24)
hc.dhour=0;
for(i=0;i<=50;i++)
{dispd();
deley();}
EX0=1;
EA=1;}
}
main() /*主程序*/
{
TMOD=0x01;
EX0=1;
ET0=1;
EA=1;
TH0=0x3C;
TL0=0xB0;
TR0=1;
do
{P1_7=0;
disphour();
if(P1_4) /*显示日期*/
{ uint j;
for(j=0;j<=50;j++)
{dispyear();
deley();
}}
if(P1_3&&hc.hour==hc.dhour) /*闹钟*/
{ if(hc.m==hc.dmr)
{uint k;
for(k=0;k<=150;k++)
{dispd();
P1_7=1;
deley();
P1_7=0;}}
} }
while(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -