⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.h

📁 RTC DS1302 driver working perfectly with AT89C51
💻 H
字号:
//////////////////////////////////////////////////////////////////////////
////                               DS1302.h                        ////
////                     Driver for Real Time Clock                   ////
////                                                                  ////
////  rtc_init()                                   Call after power up////
////                                                                  ////
////  rtc_set_datetime(day,mth,year,dow,hour,min)  Set the date/time  ////
////                                                                  ////
////  rtc_get_date(day,mth,year,dow)               Get the date       ////
////                                                                  ////
////  rtc_get_time(hr,min,sec)                     Get the time       ////
////                                                                  ////
////  rtc_write_nvr(address,data)                  Write to NVR       ////
////                                                                  ////
////  data = rtc_read_nvr(address)                 Read from NVR      ////
////                                                                  ////
////  get_bcd(data)                              Convert data to BCD  ////
////                                                                  ////
////  rm_bcd(data)                               Convert data to int  ////
////                                                                  ////
//////////////////////////////////////////////////////////////////////////

////                     Driver for Real Time Clock                   ////

void rtc_init(void);
void write_ds1302_byte(BYTE cmd);
BYTE read_ds1302_byte();
void write_ds1302(BYTE cmd, BYTE dat);
BYTE get_bcd(BYTE dat);
void wait_rtc();
void set_time(BYTE hr,BYTE min,BYTE sec);
void set_date(BYTE dt,BYTE mn,BYTE yr);
BYTE bcdtoint(BYTE dat);

//////////////////////////////////////////////////////////////////////////


sbit RTC_SCLK =	0xB4;
sbit RTC_IO   	  =	0xB5;
sbit RTC_RST   = 	0xB3;


//command for RTC
code BYTE	READ_SEC	=	0x81,
			WRITE_SEC	=	0x80,
			READ_MIN	=	0x83,
			WRITE_MIN	=	0x82,
			READ_HR	=	0x85,
			WRITE_HR	=	0x84,
			READ_START_RAM_ADD	=	0xC1,
			WRITE_START_RAM_ADD	=	0xC0,
			READ_DT	=	0x87,
			WRITE_DT	=	0x86,
			READ_MN	=	0x89,
			WRITE_MN	=	0x88,
			READ_DY	=	0x8B,
			WRITE_DY	=	0x8B,
			READ_YR	=	0x8D,
			WRITE_YR	=	0x8C,
			ZERO		=	0x00;


//wait Routine
void wait_rtc()
{
  BYTE i;
  	for(i=ZERO;i<250;i++)
  	 {
  	 	;
	 }
}


//RTC init routine
void rtc_init(void)
{
	//BYTE i;
	RTC_IO=RTC_SCLK=RTC_RST=ZERO;
	//for(i=ZERO;i<16;i+=2)
		//	write_ds1302((WRITE_START_RAM_ADD+i),ZERO);
}		


//RTC cmd byte write routine
void write_ds1302_byte(BYTE cmd)
{
   BYTE mask=0x01,temp=ZERO,i=ZERO;
   RTC_SCLK=0;
   
   for(i=ZERO;i<=7;i++) 
   {
			   temp=cmd;
			   temp=temp&mask;

			   if(temp==0x01)
		    		RTC_IO=1;
			   else
		    		RTC_IO=0;
	

			   		
					wait_rtc();
					RTC_SCLK=1;
					   wait_rtc();
					 RTC_SCLK=0;
					wait_rtc();	
					

				  cmd=cmd>>1;   
   	}
   
   RTC_SCLK=0;
   
	    
}


//RTC data byte write routine
void write_ds1302(BYTE cmd, BYTE dat)
{

   RTC_RST=1;
   write_ds1302_byte(cmd);
   write_ds1302_byte(dat);
   RTC_RST=0;
   wait_rtc();
  
}

//RTC data byte read routine
BYTE read_ds1302_byte()
{
	BYTE i,temp = ZERO;   
	   RTC_IO = 1;   
   			wait_rtc();
		   for(i=8; i>ZERO; i--)   
		   {   
		      temp >>= 1;   
		      if(RTC_IO)   
		         temp |= 0x80;   
		      else   
		         temp &= 0x7F;   
		      RTC_SCLK= 1;   
		   	wait_rtc();
		
		      RTC_SCLK= 0;  
			  wait_rtc();
			
		   
		   }   
   return(temp);   
}


//RTC read routine
BYTE read_ds1302(BYTE cmd)
{
   BYTE dat=ZERO;
	RTC_RST=0;
   RTC_SCLK=0;
     RTC_RST=1;
	write_ds1302_byte(cmd);
   dat=read_ds1302_byte();
   
	RTC_RST=0;
	 wait_rtc();
		  return(dat);
   
}


//BCD convert routine
BYTE get_bcd(BYTE dat)
{
   BYTE nibh,nibl;

   nibh=dat/10;
   nibl=dat%10;

   return((nibh<<4)|nibl);
}


void set_time(BYTE hr,BYTE min,BYTE sec)
{

	write_ds1302(WRITE_SEC,get_bcd(sec));
	write_ds1302(WRITE_MIN,get_bcd(min));
	write_ds1302(WRITE_HR,get_bcd(hr)); 


}

void set_date(BYTE dt,BYTE mn,BYTE yr)
{


	write_ds1302(WRITE_DT,get_bcd(dt));
	write_ds1302(WRITE_MN,get_bcd(mn));
	write_ds1302(WRITE_YR,get_bcd(yr)); 



}

BYTE bcdtoint(BYTE dat)
{
	BYTE temp;
	
		temp=dat;
		temp&=0xF0;
		temp>>=4;
		temp=temp*10;
		dat&=0x0F;
		temp=temp+dat;
		
		return(temp);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -