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

📄 ds1302.c

📁 本人用avr 单片机atmega128开发控制产品的源码。
💻 C
字号:
#include <iom128v.h>
#include <Control.h>

extern unsigned char time[7];

//---------------------------------------------------------
// NAME:	w_com()
// ENTRY:	flg,add1
// RETURN:	void
// MODIFY:	2004.2.3
//--------------------------------------------------------
void w_com(unsigned char flg,unsigned char add1)
{
	unsigned char i,temp1,temp;
	PORTD|=0X40;  //DS1302_RST = 1;
	temp = 0;
	temp1 = 0;
	if(!flg)
	{
		temp1 = (add1<<1)|0x80;
		temp = temp1&0xfe;
	}
	else
		temp = (add1<<1)|0x81;
	for( i=0;i<8;i++ )
	{
		if( temp&0x01 )
		{
			PORTD&=~0X10;
			PORTD|=0X20;
		}
		else
		{
			PORTD&=~0X10;
			PORTD&=~0X20;
		}
		NOP_OP();
		NOP_OP();
		PORTD|=0X10;
		NOP_OP();
		temp >>= 1;
	}
}
//---------------------------------------------------------
// NAME:	w_cdat()
// ENTRY:	add1,dat1
// RETURN:	void
// MODIFY:	2004.2.3
//--------------------------------------------------------
void w_cdat(unsigned char add1,unsigned char dat1)
{
	unsigned char i;
	DDRD|=0X70;
	NOP_OP();
	w_com(0, add1);
	for( i=0;i<8;i++ )
	{
		PORTD&=~0X10;//DS1302_SCL = 0;
		if( dat1&0x01 )
			PORTD|=0X20;//DS1302_SDA = 1;
		else
			PORTD&=~0X20;//DS1302_SDA = 0;
		
		dat1 >>= 1;
		PORTD|=0X10;//DS1302_SCL = 1;
		NOP_OP();
		NOP_OP();
	}
	PORTD&=~0X40;//DS1302_RST = 0;
	PORTD&=~0X10;//DS1302_SCL = 0;
	NOP_OP();
	NOP_OP();
}

//---------------------------------------------------------
// NAME:	r_cdat()
// ENTRY:	add1
// RETURN:	data1
// MODIFY:	2004.2.3
//--------------------------------------------------------
unsigned char r_cdat( unsigned char add1 )
{
	unsigned char i,data1;
	DDRD|=0X70;
	w_com(1, add1);
	for( i=0;i<8;i++ )
	{
		PORTD|=0X10;//DS1302_SCL = 1;
		NOP_OP();
		PORTD&=~0X10;//DS1302_SCL = 0;
		data1 >>= 1;
		DDRD&=~0X20;
		delayus(20);
		if( PIND&0X20 )  data1 |= 0x80;
	}
	PORTD&=~0X40;//DS1302_RST = 0;
	PORTD&=~0X10;//DS1302_SCL = 0;
	NOP_OP();
	return (data1);
}
//---------------------------------------------------------
// NAME:	set_time()
// ENTRY:	sec,min,hour
// RETURN:	void
// MODIFY:	2004.2.3
//--------------------------------------------------------
void set_time(unsigned char sec,unsigned char min,unsigned char hour)
{
	w_cdat(0x00,sec&0x7f);
	w_cdat(0x01,min&0x7f);
	w_cdat(0x02,hour&0x3f);
}
//---------------------------------------------------------
// NAME:	set_date()
// ENTRY:	date,mon,day,year
// RETURN:	void
// MODIFY:	2004.2.3
//--------------------------------------------------------
void set_date(unsigned char date,unsigned char mon,unsigned char day,unsigned char year)
{
	w_cdat(0x03,date&0x3f);
	w_cdat(0x04,mon&0x1f);
	w_cdat(0x05,day&0x07);
	w_cdat(0x06,year);  
	
}
//---------------------------------------------------------
// NAME:	DS1302_init()
// ENTRY:	void
// RETURN:	void
// MODIFY:	2004.2.3
//--------------------------------------------------------
void DS1302_init( void )
{
	DDRD|=0X70;
	PORTD&=~0X40;	  //DS1302_RST = 0;
	PORTD&=~0X10;	 //DS1302_SCL = 0;
	w_cdat(0x07,0x00);   //disable the write protect
	w_cdat(0x00,0x00);   //enable the clock
	w_cdat(0x02,0x00);   //set the clock 24 hour mode
	w_cdat(0x08,0xaa);  //set the trickle charge mode
}
//---------------------------------------------------------
// NAME:	read_time_date()
// ENTRY:	void
// RETURN:	void
// MODIFY:	2004.2.3
//--------------------------------------------------------
void read_time_date(void)
{  
	time[0]  = r_cdat(0x00)&0x7f;
	time[1]  = r_cdat(0x01)&0x7f;	
	time[2]  = r_cdat(0x02)&0x3f;   
	time[3]  = r_cdat(0x03)&0x3f;
	time[4]  = r_cdat(0x04)&0x1f;
	time[5]  = r_cdat(0x05)&0x07;
	time[6]  = r_cdat(0x06);
}

⌨️ 快捷键说明

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