找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15954|回复: 3
收起左侧

51单片机C语言万年历程序(在数码管上显示年月日,时分秒,星期,闹钟,用独立按键可调...

[复制链接]
ID:491833 发表于 2019-3-17 10:21 | 显示全部楼层 |阅读模式
可以实现万年历的基本功能,基于八位数码管的程序,可切屏,内含功能键。C语言小白,多有不成熟之处,望谅解。
以下是电路图:

1

1

3

3


以下是所需元器件:

QQ图片20190323203100.png QQ图片20190323203108.png


单片机源程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint);

sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;
sbit beep=P3^7;
uint nian;
uchar count=0;
uchar zhou,yue,ri,shi,fen,miao,anao,bnao,cnao;
uchar s1num=0;
uchar s2num=1;
uchar nian1,nian2,nian3,nian4,yue1,yue2,ri1,ri2;
uchar nao1,nao2,nao3,nao4,nao5,nao6;
uchar shi1,shi2,fen1,fen2,miao1,miao2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
  void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

void di()
{
beep=0;
delay(1);
beep=1;
}


  void rili()           //显示日历
  {
  
  nian1=nian/1000;
  nian2=nian%1000/100;
  nian3=nian%100/10;
  nian4=nian%10;
  yue1=yue/10;
  yue2=yue%10;
  ri1=ri/10;
  ri2=ri%10;
  P2=0x1c;
  P0=table[nian1];
  delay(1);
  P2=0x18;
  P0=table[nian2];
  delay(1);
  P2=0x14;
  P0=table[nian3];
  delay(1);
  P2=0x10;
  P0=table[nian4];
  delay(1);
  P2=0x0c;
  P0=table[yue1];
  delay(1);
  P2=0x08;
  P0=table[yue2];
  delay(1);
  P2=0x04;
  P0=table[ri1];
  delay(1);
  P2=0x00;
  P0=table[ri2];
  delay(1);
  }
  
  void shijian()         //显示时间
  {

  shi1=shi/10;
  shi2=shi%10;
  fen1=fen/10;
  fen2=fen%10;
  miao1=miao/10;
  miao2=miao%10;
  P2=0x1c;
  P0=table[shi1];
  delay(1);
  P2=0x18;
  P0=table[shi2];
  delay(1);
  P2=0x14;
  P0=0x80;
  delay(1);
  P2=0x10;
  P0=table[fen1];
  delay(1);
  P2=0x0c;
  P0=table[fen2];
  delay(1);
  P2=0x08;
  P0=0x80;
  delay(1);
  P2=0x04;
  P0=table[miao1];
  delay(1);
  P2=0x00;
  P0=table[miao2];
  delay(1);
   
  }
void nao()            //显示闹钟
{
  nao1=anao/10;
    nao2=anao%10;
   nao3=bnao/10;
   nao4=bnao%10;
   nao5=cnao/10;
   nao6=cnao%10;
  P2=0x1c;
   P0=table[nao1];
   delay(1);
  P2=0x18;
   P0=table[nao2];
   delay(1);
   P2=0x14;
   P0=0x80;
    delay(1);
  P2=0x10;
    P0=table[nao3];
     delay(1);
     P2=0x0c;
     P0=table[nao4];
   delay(1);
   P2=0x08;
   P0=0x80;
  delay(1);
     P2=0x04;
     P0=table[nao5];
    delay(1);
    P2=0x00;
    P0=table[nao6];
    delay(1);
}
   


         
   void xingqi()               //显示星期
   {
     
  P2=0x1c;
  P0=table[zhou];
  }
  
   
  void run()
{
  if(nian%400==0||nian%100!=0&&nian%4==0)  
   {
    if(yue==2)
   {
    ri++;
    {
     if(ri==30)
     {
      ri=1;
      yue++;
     }
    }
   }
  }
}

void zhoubian()
{
  uint yue1,nian1;         /星期数随着年月日的变化自行改变
  yue1=yue;
  nian1=nian;

  if(yue==1||yue==2)
  {
   yue1=yue+12;
   nian1=nian-1;
  }

  zhou=(ri+2*yue1+3*(yue1+1)/5+nian1+nian1/4-nian1/100+nian1/400)%7+1;
  }

void timer0()interrupt 1       //中断
   {  

     TH0=(65534-50000)/256;
     TL0=(65534-50000)%256;
     count++;
  
      if(count==20)
        {
            count=0;
            miao++;
      if(miao==60)
      {
             miao=0;
       fen++;
       if(fen==60)
       {
              fen=0;
        shi++;
        if(shi==24)
        {
                  shi=0;        
         zhou++;
         {
          if(zhou==8)
          {
           zhou=1;
          }
         }   
         if(yue==4||yue==6||yue==9||yue==11)    //在小月的前提
         {
          ri++;
          if(ri==31)
          {
                    ri=1;
           yue++;
         
              }
           }
         if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)    //在大月的前提
         {
          ri++;
          if(ri==32)
          {
                    ri=1;
           yue++;
         
          }
         }
           run();
           if(nian%4!=0||nian%400==0)
           {
         if(yue==2)
         {
          ri++;
          if(ri==29)
          {
           ri=1;
           yue++;
          }
         }
         
           if(yue==13)
           {
                     yue=1;
            nian++;
           }           
          }
         }
        }
          if(zhou==7)
      {
       zhou=0;
      }   
     }
    }
    if(shi==anao&&fen==bnao&&miao>=cnao)
    {
        
        
         
         di();
       }
   
   }   
   
         
void init()
{
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)/256;
    EA=1;
    ET0=1;
    TR0=1;    //开启定时器
  nian=2019;
     yue=11;
     ri=27;
     shi=0;
     fen=0;
     miao=0;
  anao=0;
  bnao=0;
  cnao=0;
   }                  
void tiaobnao()
{
if(s3==0)
{
  delay(5);
  if(s3==0)
  {
   bnao++;
   while(!s3);
   if(bnao==60)
   {
    bnao=0;
   }
  }
}
if(s4==0)
{
  delay(5);
  if(s4==0)
  {
   bnao--;
   while(!s4);
   if(bnao==-1)
   {
    bnao=59;
   }
  }
}
}
void tiaoanao()
{
if(s3==0)
{
  delay(5);
  if(s3==0)
  {
   anao++;
   while(!s3);
   if(anao==24)
   {
    anao=0;
   }
  }
}
if(s4==0)
{
  delay(5);
  if(s4==0)
  {
   anao--;
   while(!s4);
   if(anao==-1)
   {
    anao=23;
   }
  }
}
}
void tiaofen()
{
if(s3==0)
{
  delay(5);
  if(s3==0)
  {
   fen++;
   while(!s3);
   if(fen==60)
   {
    fen=0;
   }
  }
}
if(s4==0)
{
  delay(5);
  if(s4==0)
  {
   fen--;
   while(!s4);
   if(fen==-1)
   {
    fen=59;
   }
  }
}
}
void tiaoshi()
{
if(s3==0)
{
  delay(5);
  if(s3==0)
  {
   shi++;
   while(!s3);
   if(shi==24)
   {
    shi=0;
   }
  }
}
if(s4==0)
{
  delay(5);
  if(s4==0)
  {
   shi--;
   while(!s4);
   if(shi==-1)
   {
    shi=23;
   }
  }
}
}
void dzhx()             //大月转小月
{
if(ri==31)
{
  if(yue==4||yue==6||yue==9||yue==11)
  {
   ri=30;
  }
}
}
void dxtpr()             //大小月调平润 月
{
if(ri==30||ri==31)
{
  if(yue==2)
  {
   if(nian%4!=0||nian%400==0)
   {
    ri=28;
   }
   if(nian%400==0||nian%100!=0&&nian%4==0)
   {
    ri=29;
   }
  }
}
}
void rzhp()            //特殊年份调整
{
if(ri==29)
{
  if(yue==2)
  {
   if(nian%4!=0||nian%400==0)   //当是平年时
   {
    ri=28;
   }
  }
}
}  
void tiaori()
{
if(s3==0)
{
  delay(5);
  if(s3==0)
  {
   if(yue==4||yue==6||yue==9||yue==11)
   {
    ri++;
    while(!s3);
   
    if(ri==31)
    {
    ri=1;
    }
   }
   if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
   {
    ri++;
    while(!s3);
   
    if(ri==32)
    {
     ri=1;
    }
         }
   if(nian%400==0||nian%100!=0&&nian%4==0)     //当是闰年时二月运行
    {
     if(yue==2)
    {
     ri++;
     {
         while(!s3);
   
      if(ri==30)
      {
       ri=1;
     
      }
     }
    }
   }
   if(nian%4!=0||nian%400==0)
   {         
     if(yue==2)        //当是平年时二月运行
    {
     ri++;
     while(!s3);
   
     if(ri==29)
     {
      ri=1;
     }
    }   
   }
  }
}
if(s4==0)
{
  delay(5);
  if(s4==0)
  {
   if(yue==4||yue==6||yue==9||yue==11)
   {
    ri--;
    while(!s4);
   
    if(ri==-1)
    {
    ri=30;
    }
   }
   if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
   {
    ri--;
    while(!s4);
   
    if(ri==-1)
    {
     ri=31;
    }
         }
   if(nian%400==0||nian%100!=0&&nian%4==0)     //当是闰年时二月运行
    {
     if(yue==2)
    {
     ri--;
     {
         while(!s4);
   
      if(ri==-1)
      {
       ri=29;
     
      }
     }
    }
   }
   if(nian%4!=0||nian%400==0)
   {         
     if(yue==2)        //当是平年时二月运行
    {
     ri--;
     while(!s4);
   
     if(ri==-1)
     {
      ri=28;
     }
    }   
   }
  }
}

}
void tiaozhou()
{
zhoubian();
if(s3==0)
   {
  delay(5);
  if(s3==0)
  {
   zhou++;
   if(zhou==8)
   {
    zhou=1;
   }
   while(!s3);
  
  }
}
   if(s4==0)
   {
  delay(5);
  if(s4==0)
  {
   zhou--;
   if(zhou==0)
   {
    zhou=7;
   }
   while(!s4);
  
  }
}
}
void tiaoyue()
{

if(s3==0)
   {
  delay(5);
  if(s3==0)
  {
   yue++;
   if(yue==13)
   {
    yue=1;
   }
   while(!s3);
  
  }
}
   if(s4==0)
   {
  delay(5);
  if(s4==0)
  {
   yue--;
   if(yue==0)
   {
    yue=12;
   }
   while(!s4);
  
  }
}
  dxtpr();
  dzhx();
}
   void tiaonian()
{

if(s3==0)
   {
  delay(5);
  if(s3==0)
  {
   nian++;
  
   while(!s3);
  
  }
}
   if(s4==0)
   {
  delay(5);
  if(s4==0)
  {
   nian--;
  
   while(!s4);
  
  }
}
     rzhp();
}
void keyscan()    //按键      
{
  if(s1==0)
   {
    delay(5);
   if(s1==0)
   {
    s1num++;
    while(!s1);
  
   }
   }
  switch(s1num)
  {
   case 0:
  shijian();
   break;
  case 1:
  rili();
  break;
  case 2:
  xingqi();
  break;
  case 3:
  nao();
  break;
  case 4:
  s1num=0;
  break;
  }
  }
  void qie()
   {
  if(s2==0)
  {
   delay(5);
   if(s2==0)
   {
    s2num++;
    while(!s2);
    }}
if(s1num==0)
  {
   switch(s2num)
   {
    case 1:
     tiaofen();
      break;
    case 2:
     tiaoshi();
      break;
    case 3:
     s2num=0;
     break;
   }}

   if(s1num==1)
   {
    switch(s2num)
    {
    case 1:
     tiaori();
     break;
    case 2:
     tiaoyue();
     break;
    case 3:
     tiaonian();
     break;
    case 4:
    s2num=0;
    break;
     }}
   if(s1num==2)
   {
    tiaozhou();
    }

    if(s1num==3)
   {
   switch(s2num)
   {
    case 1:
     tiaoanao();
     break;
    case 2:
     tiaobnao();
     break;
    case 3:
    s2num=0;
    break;
   }
    }
     }
     void main()                //新作
     {
       init();  
       while(1)
       {
      keyscan();
     qie();
   
     }
     }

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:675216 发表于 2019-12-27 10:25 | 显示全部楼层
怎么用
回复

使用道具 举报

ID:491833 发表于 2019-3-19 19:31 来自手机 | 显示全部楼层
admin 发表于 2019-3-17 16:17
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)

好哒,我知道了
回复

使用道具 举报

ID:1 发表于 2019-3-17 16:17 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表