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

📄 ds1302.h

📁 AVR单片机m48 8m晶振
💻 H
字号:

/******************************************************************** 
 功            能:DS1302串行时钟读写程序
 说            明:MCU:atmage48v  8M
 设            计:   
 修            改:Joe Yuan  QQ:16693799
 日            期:2007.04.30
********************************************************************/

#ifndef _DS1302_H
#define _DS1302_H
/************端口定义**********/
#define DS1302_PORT PORTD
#define DS1302_INPORT PIND
#define	DS1302_DDR	DDRD
#define DS1302_RST  PD1
#define DS1302_IO   PD0
#define DS1302_SCLK PD2 

#define Set_ds1302_rst_ddr()  DS1302_DDR |=BIT(DS1302_RST)
#define Set_ds1302_rst()      DS1302_PORT|=BIT(DS1302_RST) 
#define Clr_ds1302_rst()      DS1302_PORT &=~ BIT(DS1302_RST)

#define Set_ds1302_io_ddr()   DS1302_DDR|=BIT(DS1302_IO) 
#define Clr_ds1302_io_ddr()   DS1302_DDR&=~ BIT(DS1302_IO) 
#define Set_ds1302_io()       DS1302_PORT|=BIT(DS1302_IO) 
#define Clr_ds1302_io()       DS1302_PORT&=~ BIT(DS1302_IO) 
#define In_ds1302_io()        DS1302_INPORT&=~ BIT(DS1302_IO) 

#define Set_ds1302_sclk_ddr() DS1302_DDR |=BIT(DS1302_SCLK)
#define Set_ds1302_sclk()     DS1302_PORT|=BIT(DS1302_SCLK) 
#define Clr_ds1302_sclk()     DS1302_PORT&=~ BIT(DS1302_SCLK) 

#define ds1302_second_reg     	0x80 
#define ds1302_minute_reg     	0x82 
#define ds1302_hour_reg     	0x84
#define ds1302_date_reg     0x86 
#define ds1302_month_reg   	0x88 
#define ds1302_week_reg     0x8a 
#define ds1302_year_reg     0x8c 
#define ds1302_control_reg  0x8e 
#define ds1302_charger_reg  0x90 
#define ds1302_clkburst_reg 0xbe 

void Ds1302_writebyte(Byte data);		//DS1302数据的写字节
void Ds1302_write(Byte reg,Byte data);//DS1302数据的字节写
Byte Ds1302_read(Byte reg);			//DS1302数据的字节读
void Ds1302_write_time(void);			//DS1302时间的设置
void Ds1302_read_time(void);			//DS1302时间的读取
Byte Check_ds1302(void); 			//DS1302设备的检查
void Delay1302(void);					//scLk延时
void Ds1302_initral(void);				//初始化1302



void Ds1302_writebyte(Byte data)//DS1302数据的写1字节
{  
	unsigned char  i; 
	for(i=0; i<8;i++) 
	{ 
		if(data&BIT(i))
			Set_ds1302_io();
		else
			Clr_ds1302_io();
		Set_ds1302_sclk(); 
		Delay1302();
		Clr_ds1302_sclk();
		Delay1302();
	}	  
} 
	

void Ds1302_write(unsigned char ucAddr, unsigned char ucDa) 
{ 
	//willzhao modify:07/04/30
	Clr_ds1302_rst();  // RST  to L 
	Clr_ds1302_sclk();  // CLK  to L 
	Delay1302();
	Set_ds1302_rst();  // RST  to H 
	Delay1302();
	Ds1302_writebyte(ucAddr);       // 地址,命令

	Delay1302();
	Ds1302_writebyte(ucDa);         // 写1Byte数据 

	Delay1302();

	Set_ds1302_sclk(); //CLK  to H	
	Clr_ds1302_rst(); //RST  to L
} 	

unsigned char Ds1302_readbyte(void)  
{
	unsigned char i,k,AA=0;    
	//willzhao modify:07/04/30
	Clr_ds1302_io_ddr();    
	for(i=0; i<8; i++) 
	{                 
		k = (DS1302_INPORT & BIT(DS1302_IO));    //读数据,从低位开始  
		if(k)  
			AA |= BIT(i);  
		else  
			AA &= ~ BIT(i);  
		Set_ds1302_sclk(); 
		Delay1302();
		Clr_ds1302_sclk();
		Delay1302();
	}     
	Set_ds1302_io_ddr(); 
	return(AA);  
} 



unsigned char Ds1302_read(unsigned char ucAddr) 
{ 
	unsigned char ucData,AA;
	ucAddr |= BIT(0);
	//willzhao modify:07/04/30
	Clr_ds1302_rst();  // RST  to L 
	Clr_ds1302_sclk();  // CLK  to L 
	Delay1302();
	Set_ds1302_rst();  // RST  to H  // RST  to H 
	Delay1302();
	Ds1302_writebyte(ucAddr);             // 地址,命令 
	Delay1302();
	ucData = Ds1302_readbyte();         // 读1Byte数据  
	Delay1302();

	Set_ds1302_sclk(); //CLK  to H	
	Clr_ds1302_rst(); //RST  to L
	return(ucData); 
} 



Byte Check_ds1302(void) 
{ 
	Ds1302_write(ds1302_control_reg,0x80); 
	if(Ds1302_read(ds1302_control_reg)==0x80)
		return 1; 
	else
		return 0; 
} 


void Ds1302_initral(void)
{	
	Ds1302_write(ds1302_control_reg,0x00);   //关闭写保护   
	Ds1302_write(ds1302_second_reg,0x80);       //暂停     
	Ds1302_write(ds1302_charger_reg,0xa5);   //涓流充电 1个2极管2k电阻
				//判断1302数据和新设置的数据一样
				//一样以设置数据为准
	if(year>=Ds1302_read(ds1302_year_reg))
		Ds1302_write(ds1302_year_reg,year);   //年 
	else if(month>=Ds1302_read(ds1302_month_reg))
		Ds1302_write(ds1302_month_reg,month); //月
	else if(date>=Ds1302_read(ds1302_date_reg))	
		Ds1302_write(ds1302_date_reg,date);   //日
	else if(week>=Ds1302_read(ds1302_week_reg))
		Ds1302_write(ds1302_date_reg,week);	  //周
	else if(hour>=Ds1302_read(ds1302_hour_reg))										         
		Ds1302_write(ds1302_hour_reg,hour);     //时 
	else if(minute>=Ds1302_read(ds1302_minute_reg))
		Ds1302_write(ds1302_minute_reg,minute);  //分
	else if(second>=Ds1302_read(ds1302_second_reg))	
		Ds1302_write(ds1302_second_reg,second);  //秒
		
	Ds1302_write(ds1302_second_reg,second&0x7f); //启动振荡
	Ds1302_write(ds1302_control_reg,0x80);    //打开写保护		
}

void Delay1302(void)
{
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
}


#endif





⌨️ 快捷键说明

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