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

📄 ds1302.c

📁 一个基于PIC18F单片机的开发的流量计量仪表
💻 C
字号:
////////////////////////////////// ds1302.c ///////////////////////////////////////
//                   			 DS1302                     PIC18F6720
// 						SCLK  <--------------->  RD6/PSP6 PIN50  DSCLK
//						 I/O  <--------------->	 RD5/PSP6 PIN51  DSDA_IN/_OUT
//                      		\RST  <--------------->  RD4/PSP5 PIN52  DSRST
//                     		 PIN1  <---|+3.6Vcc
//						PIN8  <---|+3.6Vbt
//						PIN4  <---|    GND
///////////////////////////////////////////////////////////////////////////////////
#include "PIC18F6720_IO.h"
#include "PIC18F6720_PERIPHERYDEVICE.h"
#include "p18f6720.h"
#include "delays.h"		//soft delay Head Flie
						//Delay1TCY();  delay one TCY
                       		//Delay10TCYx(uchar t); (255~0)*10TCY 
						//.....100........ 
						//.....1K.........
 						//.....10K........
						//if uchar t = 0  that delay time = 2560000tCY
#define uchar unsigned char

//I/O define for PIC18F6720 
#define DSCLK			LATDbits.LATD6
#define DSRST			LATDbits.LATD4
#define DSDA_OUT		LATDbits.LATD5
#define DSDA_IN		PORTDbits.RD5
#define DDRDSDA		DDRDbits.RD5	

/*
------------------------------ Function -------------------------------------------
void	ResetDs(void);
void	OutByte(unsigned char outdata);
unsigned char	InByte(void);
void	WriteByteDs(unsigned char addr,unsigned char outdata);
unsigned char	ReadByteDs(unsigned char addr);
void	ReadTime(unsigned char * time);
void	WriteTime(unsigned char * time);
void	En_dswork(void);                             //enaible ds1302 work
*/
//---------------------------------- Value ------------------------------------------//
unsigned char systemtime[7];  
//-----------------------------------------------------------------------------------//
void ResetDs(void)
{
	 DSCLK = 0;
	 Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
	 DSRST = 0;
	 Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
	 DSRST = 1;
}

//-------------------------------------------------
// Output one byte data
//-------------------------------------------------
void OutByte(uchar outdata)
{
	uchar iob;
	for(iob=0;iob<8;iob++)
  	{
   		if((outdata&1)==1) {
    		DSDA_OUT = 1;
    	}
   		else {
    		DSDA_OUT = 0;
    	}
	   Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
	   DSCLK = 0;
	   outdata >>= 1;
	   Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
	   DSCLK = 1;			        //上升沿打入数据
	   Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
 	}
}

//-------------------------------------------------
//Get one byte of data
//-------------------------------------------------
uchar InByte(void)
{
	 uchar indata,iIB;
	 DSDA_OUT = 1;
	 DDRDSDA = 1;
	 for(iIB=0,indata=0;iIB<8;iIB++)
  	 {
	   DSCLK = 1;				//下降沿读入数据
	   Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
	   DSCLK = 0;
	   Delay1TCY();Delay1TCY();Delay1TCY();Delay1TCY();
	   indata>>=1;
	   if(DSDA_IN)
	    {
          indata |= 0x80;
       	}
       else
          indata &= 0x7f;
  	}
    DDRDSDA = 0;
 	return indata;
}

//----------------------------------------
// Wrirte one byte to pointed addr
//-----------------------------------------------
void WriteByteDs(uchar addr,uchar outdata)
{
//	 DSGIE;
	 ResetDs();
	 OutByte(addr);
	 OutByte(outdata);
	 DSRST = 0;
	 ResetDs();
//	 ENGIE;
}

//-------------------------------------------------
// Read one byte from pointed addr
//-------------------------------------------------
uchar ReadByteDs(uchar addr)
{
	 uchar indata;
//	 DSGIE;
	 ResetDs();
	 OutByte(addr);
	 indata=InByte();
	 ResetDs();
	 DSRST = 0;
//	 ENGIE;
 	 return indata;
}

//-------------------------------------------------
//Read time from ds1302
//-------------------------------------------------
void ReadTime(uchar * time)
{
	 uchar i;
//	 DSGIE;
	 ResetDs();
	 OutByte(0xbf);
	 for(i=0;i<7;i++) {
	   *(time++)=InByte();
   	 }
	 DSRST = 0;
	 ResetDs();
     DSCLK = 1;//HIGH FOR LOWPOWER
//	 ENGIE;
}

//-------------------------------------------------
//Write new time to ds1302
//-------------------------------------------------
void WriteTime(uchar * time)
{
	 uchar iWT;
//	 DSGIE;
	 ResetDs();
	 OutByte(0xbe);
	 for(iWT=0;iWT<8;iWT++) {
		 OutByte(*(time++));
	 }
 	 ResetDs();
	 DSRST = 0;
     DSCLK = 1;//HIGH FOR LOWPOWER
//	 ENGIE;
}

void En_dswork(void)
{
//	    DSGIE;
        ResetDs();
		WriteByteDs(0x80,0);	//允许时钟工作
        ResetDs();
        WriteByteDs(0x84,0);    //24小时制
        ResetDs();
        WriteByteDs(0x8e,0);    //write enable
        ResetDs();
//	   ENGIE;
}

⌨️ 快捷键说明

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