⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dianzishizhong.c

📁 这是我第一次用C编的单片机程序(以前用汇编)
💻 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 + -