微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 跪求一个基于AT89S51单片机的万年历和电子时钟程序、电路原

跪求一个基于AT89S51单片机的万年历和电子时钟程序、电路原

时间:10-02 整理:3721RD 点击:
跪求一个基于AT89S51单片机的万年历和电子时钟程序、电路原

刷积分下载文件

#include <REG52.H>
#include <STDIO.H>
#define unchar unsigned char
#define unint unsigned int
int code dispcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};      //数码管字形表,0-9
int timecnt=19;  //定时0中断计数器
int delaycnt=15;  //定时1中断计数器
int shift=0;         
int timeadd1=0;    //时间加1判断
int dateadd1=0;    //日期加1
int p=0;
int q=0;    //p设置位,q调整;
int data time[]={15,10,11};
int data date[]={2012,10,29};
#define yiwei  0Xfe    //定义位选
#define erwei  0Xfd
#define sanwei  0Xfb
#define siwei  0Xf7

//////////////////////////////////////////////////////////////
void timeadd(int i)   //时间加1函数
{
if(i)
  {
     timeadd1--;
     if(time[2]==59)    //秒加1
       {time[2]=0;
        time[1]=time[1]+1;
      if(time[1]==60) //分加1
        {time[1]=0;
         time[0]=time[0]+1;  
       if(time[0]==24)  //小时加1
         {
                 time[0]=0;
                 dateadd1++;
                  }
   }
  }
   else
    time[2]=time[2]+1;
}
}
//////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////
void dateadd(int i)   //日期加1函数
{
if(i)
{
    dateadd1--;
        switch(date[1])
        {
          case 1:  if( date[2]==31)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 2:  if((date[0]%400==0)||(date[0]%4==0&&date[0]%100!=0))
                      {
                                  if(date[2]==29)
                                  {date[1]=date[1]+1;
                                   date[2]=1;
                                   break;
                                   }
                                   else date[2]=date[2]+1;
                                   break;
                                   }
                                  else
                                  {
                                  if(date[2]==28)
                                  {date[1]=date[1]+1;
                                   date[2]=1;
                                   break;
                                   }
                                   else date[2]=date[2]+1;
                                   break;
                                   }
          case 3:  if( date[2]==31)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 4:  if( date[2]==30)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 5:  if( date[2]==31)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 6:  if( date[2]==30)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 7:  if( date[2]==31)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 8:  if( date[2]==31)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 9:  if( date[2]==30)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 10:  if( date[2]==31)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 11:  if( date[2]==30)
                     {
                                 date[1]=date[1]+1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          case 12:  if( date[2]==31)
                     {
                 date[0]=date[0]+1;
                                 date[1]=1;
                                 date[2]=1;
                                 break;
                                 }
                           else date[2]=date[2]+1;
                           break;
          default:break;
         }
         }
}

//延时函数
void delay(int i)   
{
int j=0;
while(j<i)
        j++;
}

//显示函数:
void display(int x,int y,int a,int b,int c)      
{  
  switch(p)
  {
case 0:
  {
   if(q!=0)
   { q=0;
   do
   {
   P1=yiwei;
   P2=dispcode[b/10];
   delay(120);
   P1=erwei;  
   P2=dispcode[b%10];
   delay(120);
   P1=sanwei;
   P2=dispcode[c/10];
   delay(120);
   P1=siwei;
   P2=dispcode[c%10];
   delay(120);
   }while(delaycnt>1) ;
   }
   else
   {
   P1=yiwei;
   P2=dispcode[x/10];
   delay(120);
   P1=erwei;
   P2=dispcode[x%10];
   delay(120);
   P1=sanwei;
   P2=dispcode[y/10];
   delay(120);
   P1=siwei;
   P2=dispcode[y%10];
   delay(120);
   }
   break;
   }
case 1:                        //调分钟
   {
   if(q!=0)
   {
   q=0;
   if(time[1]==59)
   time[1]=0;
   else time[1]=time[1]+1;
   }
   if(delaycnt>=8)
   {
   P1=sanwei;
   P2=dispcode[y/10];
   delay(120);
   P1=siwei;
   P2=dispcode[y%10];
   delay(120);
   P1=yiwei;
   P2=dispcode[x/10];
   delay(120);
   P1=erwei;
   P2=dispcode[x%10];
   delay(120);
   }
   P1=yiwei;
   P2=dispcode[x/10];
   delay(120);
   P1=erwei;
   P2=dispcode[x%10];
   delay(120);
   break;
   }
case 2:                        //调小时
   {
   if(q!=0)
   {
   q=0;
   if(time[0]==23)
   time[0]=0;
   else time[0]=time[0]+1;
   }
   if(delaycnt>=8)
   {
   P1=yiwei;
   P2=dispcode[x/10];
   delay(120);
   P1=erwei;
   P2=dispcode[x%10];
   delay(120);
   P1=sanwei;
   P2=dispcode[y/10];
   delay(120);
   P1=siwei;
   P2=dispcode[y%10];
   delay(120);
   }
   P1=sanwei;
   P2=dispcode[y/10];
   delay(120);
   P1=siwei;
   P2=dispcode[y%10];
   delay(120);
   break;
   }
case 3:                                 //调日期-日
   {
   if(q!=0)
   {
   q=0;
   if(date[1]==1||date[1]==3||date[1]==5||date[1]==7||date[1]==8||date[1]==10||date[1]==12)
   {
   if(date[2]==31)
   date[2]=1;
   else date[2]=date[2]+1;
   }
   else if(date[1]==4||date[1]==6||date[1]==9||date[1]==11)
   {
   if(date[2]>=30)
   date[2]=1;
   else date[2]=date[2]+1;
   }
      
   else if(date[1]==2)
   {
   if((date[0]%400==0)||(date[0]%4==0&&date[0]%100!=0))
   {
   if(date[2]>=29)
   date[2]=1;
   else date[2]=date[2]+1;
   }
   
   else if(date[2]>=28)
   date[2]=1;
   else date[2]=date[2]+1;
   }
   }
   if(delaycnt>=8)
   {
   P1=sanwei;
   P2=dispcode[c/10];
   delay(120);
   P1=siwei;
   P2=dispcode[c%10];
   delay(120);
   P1=yiwei;
   P2=dispcode[b/10];
   delay(120);
   P1=erwei;
   P2=dispcode[b%10];
   delay(120);
   }
   P1=yiwei;
   P2=dispcode[b/10];
   delay(120);
   P1=erwei;
   P2=dispcode[b%10];
   delay(120);
   break;
   }
case 4:                         //调日期-月份
   {
   if(q!=0)
   {
   q=0;
   if(date[1]==12)
   date[1]=1;
   else date[1]=date[1]+1;
   if((date[2]==31)&&(date[1]==2||date[1]==4||date[1]==6||date[1]==9||date[1]==11))
    date[2]=1;
   if(date[2]==30&&date[1]==2)
    date[2]=1;
   if(date[2]==29&&date[1]==2)
     if(!((date[0]%400==0)||(date[0]%4==0)&&(date[0]%100!=0)))
         date[2]=1;
        }
   if(delaycnt>=8)
   {
   P1=yiwei;
   P2=dispcode[b/10];
   delay(120);
   P1=erwei;
   P2=dispcode[b%10];
   delay(120);
   P1=sanwei;
   P2=dispcode[c/10];
   delay(120);
   P1=siwei;
   P2=dispcode[c%10];
   delay(120);
   }
   P1=sanwei;
   P2=dispcode[c/10];
   delay(120);
   P1=siwei;
   P2=dispcode[c%10];
   delay(120);
   break;
   }
case 5:                  //调日期-年份
   {
   if(q!=0)
   {
   q=0;
   date[0]=date[0]+1;
   if(!((date[0]%400==0)||(date[0]%4==0)&&(date[0]%100!=0)))
    if(date[1]==2&&date[2]==29)
          date[2]=1;
   }
   if(delaycnt>=8)
   {
   P1=yiwei;
   P2=dispcode[a/1000];
   delay(300);
   P1=erwei;
   P2=dispcode[a/100%10];
   delay(300);
   P1=sanwei;
   P2=dispcode[a/10%10];
   delay(300);
   P1=siwei;
   P2=dispcode[a%10];
   delay(300);
   }
   else P1=0xff;
   break;
   }
   default:break;
  
}
}

void main(void)    //  主函数
{
   
  TMOD=0x11;
  TH0=((65535-50000)/256);  //定时器赋初值
  TL0=((65535-50000)%256);
  TH1=((65535-50000)/256);  //定时器赋初值
  TL1=((65535-50000)%256);
  ET0=1;
  ET1=1;
  IT0=1;
  IT1=1;
  EX0=1;
  EX1=1;
  EA=1;
  TR0=1;
  TR1=1;
  while(1)
    {
        timeadd(timeadd1);
        dateadd(dateadd1);
        display(time[0],time[1],date[0],date[1],date[2]);
    }
}
//////////////////////////////////////////////////////////////////////////////////
  void tiaozheng(void) interrupt 0  //中断0中断函数,设置位数
{
p++;
if(p==6)
p=0;   
}
  void shezhi(void) interrupt 2   //中断2中断函数,调整
{
  q++;
}
//////////////////////////////////////////////////////////////////////////////////////
void t0(void) interrupt 1 using 0  //定时器0中断函数,实现秒
{
  
  TH0+=((65536-50000)/256);
  TL0+=((65536-50000)%256);
  timecnt--;
  if(timecnt==0)
  {
  timecnt=19;
  timeadd1++;
   }
}
void t1(void) interrupt 3 using 0  //定时器1中断函数,实现闪烁延时
{
  
  TH0+=((65536-50000)/256);
  TL0+=((65536-50000)%256);
  delaycnt--;
  if(delaycnt==0)
  delaycnt=15;
}

谢谢您`````

学习

也想要!

看看

虽然我没写过 估计也不难吧

找同校的师兄问问!至少不会的地方能给你讲讲

为了积分

低调学习

挺长的

求图

oooooooooooooooooooooooooooooooooooooo

同求

这种自己一点都不动脑子,只想不劳而获的帖子就应该删了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top