www.pudn.com > LED-dianzheng.zip > ds1302.h, change:2012-11-18,size:3195b


	/*******DS1302模块*************/ 
sbit SCLK=P1^2;	//DS1302时钟输入 
sbit DATE=P1^1;	//DS1302数据输入								 
sbit REST=P1^0;	//DS1302复位端口 
sbit ACC0=ACC^0; 
sbit ACC7=ACC^7; 
#define uchar unsigned char 
#define uint unsigned int 
int second,minute,hour,year,month,date,week; 
void Write1302(unsigned char date)//向1302写数据 
 { 
 	unsigned char i; 
	SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备 
	for(i=0;i<8;i++)//连续写入8个二进制位数据,即一个字节 
	{ 
		DATE=date&0x01;//取出DATE的最低位数据写入寄存器中 
		SCLK=1;//上升沿写入数据 
		SCLK=0;//重新拉低SCLK,准备数据 
		date>>=1;//将DATE的个位数据右移一位,准备写入下一个数据位 
 
	} 
 } 
void WriteSet1302(unsigned char cmd,unsigned char date) //根据相应的命令输入相应的数据 
 { 
 		REST=0;//拉低SCLK,关闭DS1302整体工作的使能端 
		SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备 
		REST=1;//拉高SCLK,打开DS1302整体工作的使能端 
		Write1302(cmd);//写入相应的命令 
		Write1302(date);//写入相应的数据 
		SCLK=1;//上升沿写入数据 
		REST=0;//拉低SCLK,关闭DS1302整体工作的使能端 
 } 
unsigned char Read1302()	//读取1302数据 
 { 
 	unsigned char i,temp; 
	for(i=0;i<8;i++)//连续读取8个二进制位数据,即一个字节 
	{ 
		temp>>=1;//将DATE的个位数据右移一位,因为先读出的是字节的最低位 
		if(DATE==1)//如果读出的数据是1 
		temp|=0x80;//将1取出,写在date的最高位 
		SCLK=1;//将SCLK置高电平,准备读数据 
		SCLK=0;//将SCLK置低电平,读出数据 
	}  
	return temp;//将读出的数据返回 
 } 
 
unsigned char  ReadSet1302(unsigned char cmd)//根据命令读取1302相应的值 
{ 
	unsigned char date; 
	REST=0;//拉低SCLK,关闭DS1302整体工作的使能端 
	SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备 
	REST=1;//拉高SCLK,打开DS1302整体工作的使能端 
	Write1302(cmd);//写入相应的命令 
	date=Read1302();//将读取的数据返回给变量date 
	SCLK=1;//上升沿读取数据 
	REST=0;//拉低SCLK,关闭DS1302整体工作的使能端 
	return date;//根据相应命令读取的数据再次返回 
} 
void IntDS1302(void) //DS1302初始化 
{	 
    WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令  
   	WriteSet1302(0x80,0x50); //根据写秒寄存器命令字,写入秒的初始值 
	WriteSet1302(0x82,0x59); //根据写分寄存器命令字,写入分的初始值 
	WriteSet1302(0x84,0x23); //根据写小时寄存器命令字,写入小时的初始值 
	WriteSet1302(0x86,0x22); //根据写日寄存器命令字,写入日的初始值 
	WriteSet1302(0x88,0x08); //根据写月寄存器命令字,写入月的初始值 
	WriteSet1302(0x8c,0x12); //根据写年寄存器命令字,写入年的初始值 
	WriteSet1302(0X8a,0x06); //根据写星期寄存器命令字,写入星期的初始值 
	WriteSet1302(0x90,0xa5); //打开充电功能 选择2K电阻充电方式 
	WriteSet1302(0x8E,0x80);  //根据写状态寄存器命令字,写入保护指令 
  } 
 
void get_ds1302()  
{ 
	second = (ReadSet1302(0x81)/16)*10+(ReadSet1302(0x81)%16);//读取十六进制秒钟 
	minute = (ReadSet1302(0x83)/16)*10+(ReadSet1302(0x83)%16);//读取十六进制分钟 
	hour   = (ReadSet1302(0x85)/16)*10+(ReadSet1302(0x85)%16);//读取十六进制小时 
	date   = (ReadSet1302(0x87)/16)*10+(ReadSet1302(0x87)%16);//读取十六进制日期 
	month  = (ReadSet1302(0x89)/16)*10+(ReadSet1302(0x89)%16);//读取十六进制月份 
	year   = (ReadSet1302(0x8D)/16)*10+(ReadSet1302(0x8D)%16);//读取十六进制年份 
	week   = (ReadSet1302(0x8B)/16)*10+(ReadSet1302(0x8B)%16);//读取十六进制星期 
}