专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于单片机,ds1302设计的电子时钟(带涓流)

作者:佚名   来源:本站原创   点击数:  更新时间:2012年01月02日   【字体:

  该设计是基于单片机设计的电子时钟,显示时分秒,本设计加入了ds1302带有涓细电流充电功能的RTC(实时时钟),直接用单片机对1302写初值后,直接读1302即可,该设计能保证在系统掉电后时间不会乱。还可调时,本设计只能调时间,年月日调节未作,因为和时间的调节方法大同小异。

 

源程序:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^0;
sbit lcdrw=P3^1;
sbit lcden=P3^2;
sbit rst=P1^3;
sbit sclk=P1^4;
sbit io=P1^5;
sbit ACC_7=ACC^7;
sbit menu=P1^0;
sbit jia=P1^1;
sbit jian=P1^2;
uchar code table[]="  20  -  -  ";
uchar code table1[]="    :  :  day:";
uchar code table2[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
     0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,
     0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,
     0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,
     0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,0x51,0x52,0x53,
     0x54,0x55,0x56,0x57,0x58,0x59};
uchar unm,miao,fen,shi,nian,yue,ri,zhou,kkk;

void delay(int z)
 {
  int x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
 }
void writen1302(uchar addr,dat)
 {
  uchar i,temp;
  rst=0;
  sclk=0;
  rst=1;
  for(i=0;i<8;i++)
   {
    sclk=0;
 temp=addr;
 io=(bit)(temp&0x01);
 addr>>=1;
 sclk=1;
   }
  for(i=0;i<8;i++)
   {
    sclk=0;
 temp=dat;
 io=(bit)(temp&0x01);
 dat>>=1;
 sclk=1;
   }
   rst=0;
 }
uchar read1302(addr)
 {
  uchar i,temp,dat1,dat2;
  rst=0;
  sclk=0;
  rst=1;
  for(i=0;i<8;i++)
   {
    sclk=0;
 temp=addr;
 io=(bit)(temp&0x01);
 addr>>=1;
 sclk=1;
   }
  for(i=0;i<8;i++)
   {
    ACC_7=io;
 sclk=1;
 ACC>>=1;
 sclk=0;
   }
   rst=0;
  dat1=ACC;
  dat2=dat1/16;
  dat1=dat1%16;
  dat1=dat1+dat2*10;
  return (dat1);
 }
void writen_com(uchar com)
 {
  lcdrs=0;
  P0=com;
  delay(5);
  lcden=1;
  delay(5);
  lcden=0;
 }
void writen_date(uchar date)
 {
  lcdrs=1;
  P0=date;
  delay(5);
  lcden=1;
  delay(5);
  lcden=0;
 }
 void writen_sfm(uchar add,uchar date)
{
   uchar shi,ge;
   shi=date/10;
   ge=date%10;
   writen_com(0x80+0x40+add);
   writen_date(0x30+shi);
   writen_date(0x30+ge);
}
 void writen_nyr(uchar add,uchar date)
{
   uchar shi,ge;
   shi=date/10;
   ge=date%10;
   writen_com(0x80+add);
   writen_date(0x30+shi);
   writen_date(0x30+ge);
}
void keyscan()
 {
  if(menu==0)
  {
   delay(1);
   if(menu==0)
   {
    while(!menu);
    writen_com(0x0f);
    writen_com(0x80+0x40+8);
 while(menu)
  {
  if(jia==0)
      {
    delay(1);
    if(jia==0);
     {
      while(!jia);
      if(miao==59)
       {
    miao=-1;
    }
    miao++;
      writen1302(0x80,table2[miao]);
      writen_sfm(8,miao);
      writen_com(0x80+0x40+8); 
      }
    }
          }
  if(menu==0)
   {
    delay(1);
     if(menu==0)
   {
    while(!menu);
    writen_com(0x0f);
          writen_com(0x80+0x40+5);
     while(menu)
        {
         if(jia==0)
      {
    delay(1);
    if(jia==0);
     {
      while(!jia);
      if(fen==59)
       {
    fen=-1;
    }
    fen++;
      writen1302(0x82,table2[fen]);
      writen_sfm(5,fen);
      writen_com(0x80+0x40+5); 
      }
    }
          }
   }
     if(menu==0)
      {
    delay(1);
              if(menu==0)
      {
       while(!menu);
    writen_com(0x0f);
                writen_com(0x80+0x40+2);
     while(menu)
                 {
                 if(jia==0)
                {
              delay(1);
              if(jia==0);
              {
               while(!jia);
                if(shi==23)
                    {
                    shi=-1;
                    }
                 shi++;
         writen1302(0x84,table2[shi]);
         writen_sfm(2,shi);
         writen_com(0x80+0x40+2);
         writen1302(0x8e,0x80); 
           }
         }
               }
     
     if(menu==0)
     {
      delay(1);
       if(menu==0)
        {
      writen_com(0x0c);
                     writen_com(0x06);
     }
     }
      }
   }
   }
   }
  }
 }
void init()
 {
  lcdrw=0;
  lcden=0;
  writen_com(0x38);
  writen_com(0x0c);
  writen_com(0x06);
  writen_com(0x80);
  writen1302(0x8a,0x02);
  for(unm=0;unm<13;unm++)
   {
    writen_date(table[unm]);
   }
  writen_com(0x80+0x40);
  for(unm=0;unm<16;unm++)
   {
    writen_date(table1[unm]);
   }
 }
void main()
 {
 init();
 while(1)
 {
  keyscan();
  miao=read1302(0x81);
  writen_sfm(8,miao);
  writen_com(0x80+0x40+8);
  fen=read1302(0x83);
  writen_sfm(5,fen);
  writen_com(0x80+0x40+5);
  shi=read1302(0x85);
  writen_sfm(2,shi);
  writen_com(0x80+0x40+2);
  zhou=read1302(0x8b);
  writen_sfm(14,zhou);
  writen_com(0x80+0x40+14);
  nian=read1302(0x8d);
  writen_nyr(4,nian);
  writen_com(0x80+4);
  yue=read1302(0x89);
  writen_nyr(7,yue);
  writen_com(0x80+7);
  ri=read1302(0x87);
  writen_nyr(10,ri);
  writen_com(0x80+10);
  }
 }
关闭窗口

相关文章