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

📄 ds1302.h

📁 avr常用功能程序中包含了pwm、adc、中断、定时、i2c等各程序可供开发者直接使用
💻 H
字号:
#include <avr/io.h>
#define uchar unsigned char 
#define uint  unsigned int
//static uchar year=2,month=2,day=2,week=2;
//hour=0x19表示将时间设为19小时,minute=0x45设为45分钟
static uchar year=0x06,month=0x02,day=0x17,week=0x05;
static uchar hour=0x10,minute=0x54,second=0x00;
uchar data_Int1,data_Int2;

#define 	ds1302_rst   			PC3 
#define 	ds1302_io   			PC5 
#define 	ds1302_sclk  			PC4 

#define 	set_ds1302_rst_ddr()    DDRC|=1<<ds1302_rst 
#define 	set_ds1302_rst()     	PORTC|=1<<ds1302_rst 
#define 	clr_ds1302_rst()     	PORTC&=~(1<<ds1302_rst) 
#define 	set_ds1302_io_ddr()     DDRC|=1<<ds1302_io 
#define 	set_ds1302_io()       	PORTC|=1<<ds1302_io 
#define 	clr_ds1302_io()       	PORTC&=~(1<<ds1302_io) 
#define 	clr_ds1302_io_ddr()     DDRC&=~(1<<ds1302_io) 
//#define 	in_ds1302_io()       	PINC&=(1<<ds1302_io) 
#define 	set_ds1302_sclk_ddr()   DDRC|=1<<ds1302_sclk 
#define 	set_ds1302_sclk()    	PORTC|=1<<ds1302_sclk 
#define 	clr_ds1302_sclk()    	PORTC&=~(1<<ds1302_sclk) 

//此定义为写地址
#define 	ds1302_sec_reg     		0x80 
#define 	ds1302_min_reg     		0x82 
#define 	ds1302_hr_reg     		0x84 
#define 	ds1302_date_reg     	0x86 
#define 	ds1302_month_reg  		0x88 
#define 	ds1302_day_reg    		0x8a 
#define 	ds1302_year_reg     	0x8c 
#define 	ds1302_control_reg 	 	0x8e 
#define 	ds1302_charger_reg  	0x90 
//#define 	ds1302_clkburst_reg 	0xbe 

//----------------------------delay----------
void delay_1us(void)                 //1us延时函数
  {
/*   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");*/
   asm("nop");
  }
//===============================
void delay_nus(unsigned int n)       //N us延时函数
  {
   for (;n>0;n--)
		//delay_1us();
		asm("nop");
  }
//===============================
 void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for(i=0;i<1000;i++)
		delay_1us();
  }
 
//===============================
void delay_nms(unsigned int n)       //N ms延时函数
{
	for(;n>0;n--)
		delay_1ms();
}
void IO_INIT(void)
{
	DDRC=0Xff;				//key_bord
} 

void ds1302_write(uchar reg,uchar data) 
{ 
	char i=0; 
	set_ds1302_rst_ddr();
	set_ds1302_sclk_ddr();
	set_ds1302_io_ddr(); 	/*设为输出*/
	
	clr_ds1302_rst(); 		/*置0*/
	clr_ds1302_sclk(); 		/*置0,在RST置1时,SCLK必须为0*/
	set_ds1302_rst(); 		/*置1,启动数据传送*/
	for(i=8;i>0;i--) 		/*写地址*/
	{     
		
		if((reg&0x01)==0x01) 
			set_ds1302_io(); 
		else 
			clr_ds1302_io(); 
		set_ds1302_sclk(); /*时钟*/
		clr_ds1302_sclk(); 
		reg>>=1; 
	} 
	for(i=8;i>0;i--) 		/*写数据*/
	{     
		clr_ds1302_sclk(); 
		delay_nus(500); 
		if((data&0x01)==0x01) 
			set_ds1302_io(); 
		else 
			clr_ds1302_io(); 
		set_ds1302_sclk(); /*时钟*/
		
		data>>=1; 
	} 
	clr_ds1302_rst(); 		/*置0,结束本次数据传送,I/O引脚变为高阻态*/
	clr_ds1302_io_ddr(); 	/*设为输入*/
} 
/******************************************************************/
uchar ds1302_read(uchar reg) 
{ 
	uchar data=0; 
	char i=0; 
	reg+=1;		//读标志 
	set_ds1302_rst_ddr();
	set_ds1302_sclk_ddr();
	set_ds1302_io_ddr(); 		/*设为输出*/
	
	clr_ds1302_rst(); 
	clr_ds1302_sclk(); 
	set_ds1302_rst(); 
	for(i=8;i>0;i--) 
	{ 
		clr_ds1302_sclk(); 
		if((reg&0x01)==0x01) 
			set_ds1302_io(); 
		else 
			clr_ds1302_io(); 
		set_ds1302_sclk(); 
		
		reg>>=1; 
	} 
	clr_ds1302_io_ddr(); //PA1 in
	for(i=8;i>0;i--) 
	{   
		if((PINC&0X20)==0X20)  
			data|=0x80;
		else 
			data&=0x7f;
		set_ds1302_sclk(); 
		clr_ds1302_sclk(); 
		
		data>>=1; 
	} 
	clr_ds1302_rst(); 
   return(data);
} 
/******************************************************************/
uchar check_ds1302(void) 
{ 
	ds1302_write(ds1302_control_reg,0x80); 
	if(ds1302_read(ds1302_control_reg)==0x80) return 1; 
		else return 0; 
} 
void ds1302_read_time(void) 
{ 
	year=ds1302_read(ds1302_year_reg);  	//年 
	month=ds1302_read(ds1302_month_reg);	//月 
	day=ds1302_read(ds1302_date_reg);  		//日 
	week=ds1302_read(ds1302_day_reg);  		//周 
	hour=ds1302_read(ds1302_hr_reg);   		//时 
	minute=ds1302_read(ds1302_min_reg);		//分 
	second=ds1302_read(ds1302_sec_reg);		//秒 
} 
/******************************************************************/
void ds1302_write_time(void) 
{ 
	ds1302_write(ds1302_control_reg,0x00);   //关闭写保护   
	ds1302_write(ds1302_sec_reg,0x80);    	 //暂停    
	delay_nms(10); 
	//ds1302_write(ds1302_charger_reg,0xa9);   //涓流充电 
	ds1302_write(ds1302_year_reg,year);    	 //年 
	ds1302_write(ds1302_month_reg,month);  	 //月 
	ds1302_write(ds1302_date_reg,day);    	 //日 
	ds1302_write(ds1302_day_reg,week);    	 //周 
	ds1302_write(ds1302_hr_reg,hour);     	 //时 
	ds1302_write(ds1302_min_reg,minute);  	 //分 
	ds1302_write(ds1302_sec_reg,second);  	 //秒   
	ds1302_write(ds1302_control_reg,0x80);   //打开写保护 
}


⌨️ 快捷键说明

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