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

📄 ds1302.txt

📁 motorola的dsp56F807对时钟芯片DS1302的操作
💻 TXT
字号:
//功能:复位1302
//输入:
void reset_1302(void)
{
//*pdddr=0xff7f;
		*peddr|=RTC_DATA | RTC_RST | RTC_SCK ;                   //方向寄存器 0--输出
  	     delly(50);	       
		 *pedr&=~RTC_RST;		 		//rst=0
		 *pedr&=~RTC_RST;
		 *pedr&=~RTC_RST;
		 *pedr&=~RTC_RST;
		 *pedr&=~RTC_RST;
        delly(50);    
        *pedr&=~RTC_SCK;			//sck=0
        *pedr&=~RTC_SCK;
        *pedr&=~RTC_SCK;
        *pedr&=~RTC_SCK;
        delly(50);
		 *pedr|=RTC_RST;    	//RST=1
		 *pedr|=RTC_RST;    	//RST=1
		 *pedr|=RTC_RST;    	//RST=1
		 *pedr|=RTC_RST;    	//RST=1
		 *pedr|=RTC_RST;    	//RST=1
 
    	 delly(50);       
}

//功能:往1302写入1 BYTE 数据     即命令又数据
//输入:in_data
void input_1302(word in_data)
{
word i;
word code_choice;
  	 
//  *pdddr=0xff7f;	
  	*peddr|=RTC_DATA;                //方向寄存器 1--输出
  	*peddr|=RTC_SCK;                //方向寄存器 1--输出    
  	 delly(50);
        code_choice=0x01;
        for(i=0;i<8;i++)            //上升沿写数据
	{		
		*pedr&=~RTC_SCK;
		*pedr&=~RTC_SCK;
		*pedr&=~RTC_SCK;				//0x20
		*pedr&=~RTC_SCK;	
		 delly(20);
		if(in_data & code_choice){		
			*pedr|=RTC_DATA;
			*pedr|=RTC_DATA;			//0x01
			*pedr|=RTC_DATA;
			*pedr|=RTC_DATA;
		}
		else{
			*pedr&=~RTC_DATA;
			*pedr&=~RTC_DATA;
			*pedr&=~RTC_DATA;
			*pedr&=~RTC_DATA;			
		}
		 delly(20);			
		*pedr|=RTC_SCK;
		*pedr|=RTC_SCK;
		*pedr|=RTC_SCK;
		*pedr|=RTC_SCK;							
		 delly(20);
		code_choice=code_choice*2;
	}        
	
}

//功能:从1302读出1 BYTE 数据
//输出:从1302读出的数据
word output_1302()
{
word i;
word code_choice;
word out_data;

//	*pddr|= RTC_DATA;
   //    *pdddr=(~RTC_DATA)&0xff7f; 
    *peddr&=~RTC_DATA;                   //方向寄存器 0--输入       
    delly(50); 
  	*pedr|=RTC_SCK;
	*pedr|=RTC_SCK;
	*pedr|=RTC_SCK;
	*pedr|=RTC_SCK;
	delly(50);
    out_data=0;        
    for(i=0;i<8;i++)            //下降沿输出数据
	{
		*pedr&=~RTC_SCK;
		*pedr&=~RTC_SCK;
		*pedr&=~RTC_SCK;
		*pedr&=~RTC_SCK;
		delly(30);
		code_choice=*pedr;			
		*pedr|=RTC_SCK;
		*pedr|=RTC_SCK;
		*pedr|=RTC_SCK;
		*pedr|=RTC_SCK;		
		delly(30);
		out_data=out_data/2;
	    if(code_choice & RTC_DATA){  	            
	         out_data=out_data | 0x80;	            
		}		
	}   
    *peddr|=RTC_DATA;                   //方向寄存器 1--输出     
    return out_data;
}


//让DS1302时钟芯片写使能
void time_wr_en(void)
{	

	reset_1302();
    input_1302(0x8e);           //打开写保护
	input_1302(0x00); 	
	reset_1302();
	input_1302(0x90);           //R1=2K,一个二极管
	input_1302(0xab); 
	reset_1302();
    input_1302(0x80);           //启动实时时钟
	input_1302(0x00); 	
	
}

//对DS1302串读
//功能:读取当前时间,依序为:秒分时日月年,
//输出:全局变量time_str--时间变量
//耗时:1.23730ms
void time_str_rd()
{
word i;
word time_temp[7];

        reset_1302();
        input_1302(0xbf);           //串读命令
        for(i=0;i<7;i++){ 
            time_temp[i]=output_1302();            
		}            
        time_temp[0]= time_temp[0] & 0x7f;
        time_str[1]=(time_temp[0]/0x10)*10+(time_temp[0]%0x10);     //秒
        time_temp[1]=time_temp[1] & 0x7f;
        time_str[2]=(time_temp[1]/0x10)*10+(time_temp[1]%0x10);    //分
        time_temp[2]=time_temp[2] & 0x3f;
        time_str[3]=(time_temp[2]/0x10)*10+(time_temp[2]%0x10);   //时
        time_temp[3]=time_temp[3] & 0x3f; 
        time_str[4]=(time_temp[3]/0x10)*10+(time_temp[3]%0x10);   //日
        time_temp[4]=time_temp[4] & 0x1f;
        time_str[5]=(time_temp[4]/0x10)*10+(time_temp[4]%0x10);   //月
        time_temp[6]=time_temp[6] & 0x1f;
        time_str[6]=(time_temp[6]/0x10)*10+(time_temp[6]%0x10);   //年            
}


//对DS1302串写
//修改当前时间,依序为:秒分时日月年
void time_str_wr(word *tdata)
{
word  i;
			
	if((tdata[5]-0)>(0x99-0))tdata[5]=0;          //年
	if((tdata[4]-1)>(0x12-1))tdata[4]=1;          //月
	if((tdata[3]-1)>(0x31-1))tdata[3]=1;          //日
	if((tdata[2]-0)>(0x23-0))tdata[2]=0;          //时
	if((tdata[1]-0)>(0x59-0))tdata[1]=0;          //分
	if((tdata[0]-0)>(0x59-0))tdata[0]=0;          //秒
         
        tdata[6]=tdata[5];					//年变换位置
        tdata[5]=4;                         //星期
        reset_1302(); 
        input_1302(0xbe);                   //串读命令
        for(i=0;i<7;i++){ 
            input_1302(tdata[i]);            
            }
        input_1302(00);                     //写使能
        input_1302(0xab);                   //充电模式

}

⌨️ 快捷键说明

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