天天看點

初學51單片機之實時時鐘(DS1302編寫)

初學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();

  }

}