天天看點

51讀寫時鐘晶片DS1302的程式

51單片機讀寫DS1302的程式,希望對初學者有幫助

#include <reg51.h>
#include <intrins.h>

#define REG_SEC_ADD 0x80     //秒寄存器位址
#define REG_MIN_ADD 0x82     //分寄存器位址
#define REG_HR_ADD 0x84      //時寄存器位址
#define REG_DATE_ADD 0x86    //日期寄存器位址
#define REG_MONTH_ADD 0x88   //月份寄存器位址
#define REG_DAY_ADD 0x8A     //星期寄存器位址
#define REG_YEAR_ADD 0x8C    //年寄存器位址
#define REG_CONTROL_ADD 0x8E //控制寄存器

#define REG_TRICKLE_ADD 0x90 //慢速充電積存器
#define REG_CLOCK_BURST_ADD 0xBE //多位元組方式
#define REG_BASE_RAM 0xC0; //RAM的基位址

sbit DS_CLK=P1^6;  //串行時鐘
sbit DS_IO=P1^7;   //資料輸入/輸出
sbit DS_RST=P1^5;  //複位

void DS_Write_Byte(unsigned char tdata)
{  unsigned char i;
  
   for( i=0;i<8;i++ )
   { DS_CLK = 0;
     if( tdata&0x01 )
    DS_IO = 1;
     else
    DS_IO = 0;
     tdata = tdata>>1;
   
 DS_CLK = 1;   
    _nop_();  _nop_();  
   }
}
unsigned char DS_READ_Byte(void)
{  unsigned char i, tData;

   DS_IO=1;
   for( i=0;i<8;i++ )
   { DS_CLK = 1;
     _nop_();  _nop_();
     DS_CLK = 0;   
  _nop_();_nop_();
     tData = tData>>1;
     if(DS_IO) tData = tData|0x80 ;
   }
   return (tData);
}
unsigned char DS_Read( unsigned char CMD )
{ unsigned char dd=0;

  DS_RST = 0;
  _nop_();  
  DS_CLK = 0;
  _nop_();
  DS_RST = 1; 
  DS_Write_Byte(CMD); // Write Command Byte
  dd = DS_READ_Byte();// Read Data  
  DS_RST=0;
  DS_CLK=1;
  return(dd);
}
void DS_Write(unsigned char COMD,unsigned char Data)
{
  DS_RST = 0;
  _nop_();
  DS_CLK = 0;
  _nop_();
  DS_RST = 1; // Enable  
  DS_Write_Byte( COMD ); // Write Command
  DS_Write_Byte( Data ); // Write Data
  DS_RST = 0;
  DS_CLK = 1;
}

//寫時鐘時間到DS1302
void DS_SetClock(unsigned char tdata[7])
{
  DS_Write(REG_CONTROL_ADD,0); // Disabled Write Protect
  DS_Write(REG_SEC_ADD,0x80); // Disabled Clock

  DS_Write(REG_DAY_ADD,tdata[6]);   //Week Day
  DS_Write(REG_YEAR_ADD,tdata[5]);  //Year
  DS_Write(REG_MONTH_ADD,tdata[4]); //Month
  DS_Write(REG_DATE_ADD,tdata[3]);  //Date
  DS_Write(REG_HR_ADD,tdata[2]);    //Hour(24)
  DS_Write(REG_MIN_ADD,tdata[1]);   //Minute
  DS_Write(REG_SEC_ADD,tdata[0]&0x7F); //Second
                                     //MSB:0 Enabled Clock 
  DS_Write(REG_CONTROL_ADD,0x80);    //Enabled Write Protect
}


//從DS1302讀時鐘和時間
void DS_ReadClock(unsigned char tdata[7])
{
  tdata[6]=DS_Read(REG_DAY_ADD+1); // Week
  tdata[5]=DS_Read(REG_YEAR_ADD+1); // Year
  tdata[4]=DS_Read(REG_MONTH_ADD+1); // Month
  tdata[3]=DS_Read(REG_DATE_ADD+1); // Date
  tdata[2]=DS_Read(REG_HR_ADD+1); // Hour
  tdata[1]=DS_Read(REG_MIN_ADD+1)&0x7F; // Minute
  tdata[0]=DS_Read(REG_SEC_ADD+1)&0x7F; // Second
}

void DS_WriteRAM()
{ unsigned char i;
  DS_Write(REG_CONTROL_ADD,0); // Disabled Write Protect 
  //add範圍 0xc1-0xff 中的偶數
  for(i=0xc0;i<=0xfd; i=i+2) DS_Write(i,i-10);//寫測試值

  DS_Write(REG_CONTROL_ADD,0x80);    //Enabled Write Protect
}

unsigned char  DS_RedaRAM(unsigned char add)
{  //add範圍 0xc1-0xff 中的奇數
   unsigned char i;
   i=DS_Read(add);
   return(i);
}

void delayms(unsigned char ms) 
// 延時子程式
{ unsigned char i;
 while(ms--)
    for(i = 0; i < 120; i++);
}

void main()

{ 

  unsigned char SetData[7],RecData[7],itemp;

  //初始化時間為  07-01-08 18:09:03   星期一
   SetData[6]=0x01;//Week
   SetData[5]=0x07;//Year
   SetData[4]=0x01;//month
   SetData[3]=0x08;//date
   SetData[2]=0x18;//Hour
   SetData[1]=0x09;//Minute 
   SetData[0]=0x03;//Second    
 
   DS_SetClock(SetData);

  DS_WriteRAM();
   while(1)
   {  
       delayms(200);

      itemp= DS_RedaRAM(0xe7);
      DS_ReadClock(RecData);

   }

}