初学51单片机之实时时钟(DS1302编写) 

这个程序注释比较少,有什么需要的,可以Hi我。。。。

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

uchar code table1[]="DS1302";
uchar code table2[]="Day-";

uchar code table5[]="0123456789";

char date1,date2,date3,date4,date5,date6,date7;
uchar sec1,sec2,min1,min2,hr1,hr2,day1,dat1,dat2,month1,month2,year1,year2;
uchar day;

sbit rs=P2^4;
sbit rw=P2^5;
sbit lcden=P2^6;

sbit clk=P1^0;
sbit io=P1^1;
sbit rst=P1^2;

sbit key1=P3^7;
sbit key2=P3^6;
sbit key3=P3^5;
sbit key4=P3^4;
sbit key5=P3^3;
sbit key6=P3^2;

void delay(uint ms)
{
  uint i,j;
  for(i=ms;i>0;i--)
    for(j=110;j>0;j--);
}

void write_com(uchar com)
{
  rs=0;
  rw=0;
  lcden=0;
  P0=com;   //送指令
  delay(5);
  lcden=1;
  delay(5);
  lcden=0;
}

void write_date(uchar date)
{
  rs=1;
  rw=0;
  lcden=0;
  P0=date;   //送数据
  delay(5);
  lcden=1;
  delay(5);
  lcden=0;
}

void lcd1602_init()
{
  write_com(0x38);
  delay(2);
  write_com(0x0c);
  delay(2);
  write_com(0x06);
  delay(2);
  write_com(0x01);
  delay(2);
  write_com(0x80);
  delay(2); 
}


void write_ds1302_byte(uchar temp)   //写一个字节
{
  uchar i;
  for (i=0;i<8;i++)      //循环8次写入数据
  {
    clk=0;
    io=(bit)(temp&0x01);     //每次传输低字节
    temp>>=1;         //右移一位
    clk=1;
  }
}


void write_ds1302(uchar add,uchar date)        //向寄存器写数据
{
  rst=0;  //关闭ds1302
  _nop_();
  clk=0;  
  _nop_();
  rst=1;      //使能ds1302
  _nop_();

  write_ds1302_byte(add);   //发送地址
  write_ds1302_byte(date);  //发送数据
  rst=0;
  clk=1;
}

uchar read_ds1302_byte()                   //读一个字节
{
  uchar i;
  uchar temp=0x00;
  for(i=0;i<8;i++)
  {
    temp>>=1;
    clk=1;
 _nop_();
 clk=0;
 if(io==1)
    temp|=0x80;   //如果检测到最低位为1,将最低位放在temp的最高位,依次检测,循环8次,返回temp
 else
    temp&=0x7f;   //若检测为0,同上,可以不写   
  }
  return(temp);
}
 
          
uchar read_ds1302(uchar add)                 //从寄存器读数据
{
  uchar date;
  rst=0;  //关闭ds1302
  _nop_();
  clk=0;  
  _nop_();
  rst=1;      //使能ds1302
  _nop_();

  write_ds1302_byte(add);
  date=read_ds1302_byte();
  rst=0;
  _nop_();  
  clk=1;
  return(date);
}


void ds1302_init()
{
  write_ds1302(0x8e,0x00);      //关闭写保护
  write_ds1302(0x90,0xaa);      //定义充电
  write_ds1302(0x80,0x53);      //秒
  write_ds1302(0x82,0x59);   //分
  write_ds1302(0x84,0x08);      //时
  write_ds1302(0x86,0x02);      //日
  write_ds1302(0x88,0x08);      //月
  write_ds1302(0x8a,0x02);      //周
  write_ds1302(0x8c,0x11);      //年
  write_ds1302(0x8e,0x80);      //打开写保护
}

 

void display()
{
  uchar i,j;
  write_com(0x80);
  for(i=0;i<6;i++)
  {
    write_date(table1[i]);
 delay(5);
  }
 
  write_com(0x80+0x40+1);
  for(j=0;j<4;j++)
  {
    write_date(table2[j]);
 delay(5);
  }

  date1=read_ds1302(0x81);
  sec1=(date1&0x0f);
  sec2=(date1>>4);

  date2=read_ds1302(0x83);
  min1=(date2&0x0f);
  min2=(date2>>4);

  date3=read_ds1302(0x85);
  hr1=(date3&0x0f);
  hr2=(date3>>4);

  date4=read_ds1302(0x87);
  dat1=(date4&0x0f);
  dat2=(date4>>4);

  date5=read_ds1302(0x89);
  month1=(date5&0x0f);
  month2=(date5>>4);

  date6=read_ds1302(0x8b);
  day1=(date6&0x0f);

  date7=read_ds1302(0x8d);
  year1=(date7&0x0f);
  year2=(date7>>4);


  write_com(0xc0+15);
  write_date(table5[sec1]);

  write_com(0xc0+14);
  write_date(table5[sec2]);

  write_com(0xc0+13);
  write_date(':');

  write_com(0xc0+12);
  write_date(table5[min1]);

  write_com(0xc0+11);
  write_date(table5[min2]);

  write_com(0xc0+10);
  write_date(':');

  write_com(0xc0+5);
  write_date(table5[day1]);

  write_com(0x80+15);
  write_date(table5[dat1]);

  write_com(0x80+14);
  write_date(table5[dat2]);

  write_com(0x80+13);
  write_date('-');

  write_com(0x80+12);
  write_date(table5[month1]);

  write_com(0x80+11);
  write_date(table5[month2]);

  write_com(0x80+10);
  write_date('-');

  write_com(0x80+9);
  write_date(table5[year1]);

  write_com(0x80+8);
  write_date(table5[year2]);

}


/*void keyscan()
{
   uchar num;
   if(key1==0)
   {
     delay(5);
  if(key1==0)
  {
    num++;
    while(!key1);
    if(num==1)
    {
      write_com(0x80+0x40+15);
      write_com(0x0f);
    }
   
    if(num==2)
    {
      write_com(0x80+0x40+12);
    }

    if(num==3)
    {
      write_com(0x80+0x40+9);
    }

    if(num==4)
    {
      write_com(0x80+15);
    }

    if(num==5)
    {
      write_com(0x80+12);
    }

    if(num==6)
    {
      write_com(0x80+0x40+5);
    }

    if(num==7)
    {
      write_com(0x80+9);
    }

    if(num==8)
    {
      num=0;
      write_com(0x0c);
    }

  }
   }

   if(num!=0)
   {
     if(key2==0)
  {
    delay(5);
    if(key2==0)
    {
      while(!key2);
   if(num==1)
   {
     date1++;
     if(date1==60)
          date1=0;
     write_sfm(14,date1);
     write_com(0x80+0x40+15);    
   }

   if(num==2)
   {
      date2++;
   if(date2==60)
       date2=0;   
   write_sfm(11,date2);
   write_com(0x80+0x40+12); 
   }

   if(num==3)
   {
      date3++;
   if(date3==24)
       date3=0;   
   write_sfm(8,date3);
   write_com(0x80+0x40+9); 
   }

   if(num==4)
   {
      date4++;
   if(date4==32)
       date4=1;   
   write_nyr(14,date4);
   write_com(0x80+15); 
   }

   if(num==5)
   {
      date5++;
   if(date5==13)
       date5=1;   
   write_nyr(11,date5);
   write_com(0x80+12); 
   }

   if(num==6)
   {
      date6++;
   if(date6==8)
       date6=1;   
   write_date(0x30+day);
   write_com(0x80+0x40+5); 
   }

   if(num==7)
   {
      date7++;
   if(date7==100)
       date7=0;   
   write_nyr(8,date2);
   write_com(0x80+7); 
   }

    }
  }

  if(key3==0)
  {
     delay(5);
    if(key3==0)
    {
      while(!key3);
   if(num==1)
   {
     date1--;
     if(date1==-1)
          date1=59;
     write_sfm(14,date1);
     write_com(0x80+0x40+15);    
   }

   if(num==2)
   {
      date2--;
   if(date2==-1)
       date2=59;   
   write_sfm(11,date2);
   write_com(0x80+0x40+12); 
   }

   if(num==3)
   {
      date3--;
   if(date3==-1)
       date3=23;   
   write_sfm(8,date3);
   write_com(0x80+0x40+9); 
   }

   if(num==4)
   {
      date4--;
   if(date4==0)
       date4=31;   
   write_nyr(14,date4);
   write_com(0x80+15); 
   }

   if(num==5)
   {
      date5--;
   if(date5==0)
       date5=1;   
   write_nyr(11,date5);
   write_com(0x80+12); 
   }

   if(num==6)
   {
      date6--;
   if(date6==0)
       date6=7;   
   write_date(0x30+day);
   write_com(0x80+0x40+5); 
   }

   if(num==7)
   {
      date7--;
   if(date7==-1)
       date7=99;   
   write_nyr(8,date2);
   write_com(0x80+7); 
   }

    }

  }
   }
}   */


void main()
{
  lcd1602_init();
  delay(5);
 
  ds1302_init();
  delay(5);
   
  while(1)
  {
 //keyscan;
    display();

  }
}

posted on 2013-03-19 21:01  爱哎唉  阅读(1223)  评论(0)    收藏  举报