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

📄 ds1302.c

📁 以C8051F020单片机做的多功能计数器
💻 C
字号:
/*********************************************************************/   
/*   		实时时钟模块   时钟芯片型号:DS1302   					 */   
/*																	 */
/*		外部接口有两个,分别为v_Set1302()和v_Get1302(),				 */
/*	    	其参数的返回值为10进制数据,而非BCD码,可直接使用			 */
/*                                                  LiuWei  2008-1-15*/
/*********************************************************************/  

#include "DS1302.h"
 

void rtcDelay(unsigned int num)
{
	while(num--);
}
/********************************************************************     
*   
*   名称:   v_RTInputByte   
*   说明:     
*   功能:   往DS1302写入1Byte数据   
*   调用:   
*   输入:   ucDa   写入的数据     
*   返回值:   无   
***********************************************************************/   
void   v_RTInputByte(uchar ucDa)     
{     
	uchar   i,Data;   
    Data=ucDa;
	for(i=8;   i>0;   i--)   
	{   
   	    if(Data&0x01)
		    T_IO=1;
		else
		    T_IO=0;
        Data>>=1;
		T_CLK   =   1; 
 	    rtcDelay(100);
		T_CLK   =   0;
		rtcDelay(100);          
		
	}    
}   
/********************************************************************     
*   
*   名称:   uchar   uc_RTOutputByte   
*   说明:     
*   功能:   从DS1302读取1Byte数据   
*   调用:     
*   输入:     
*   返回值:   ACC   
***********************************************************************/   
uchar   uc_RTOutputByte(void)     
{     
	uchar   i,tem; 
    tem=0;
    P2MDOUT=0xfd;
	T_IO=1;
	for(i=8;   i>0;   i--)   
	{   
        tem>>=1;
        if(T_IO)
           tem|=0X80;
		T_CLK   =   1;  
        rtcDelay(100);  
		T_CLK   =   0;
		rtcDelay(100);        
	} 
    P2MDOUT=0xff;
	return(tem);     
}   
/********************************************************************     
*   
*   名称:   v_W1302   
*   说明:   先写地址,后写命令/数据   
*   功能:   往DS1302写入数据   
*   调用:   v_RTInputByte()     
*   输入:   ucAddr:   DS1302地址,   ucDa:   要写的数据   
*   返回值:   无   
***********************************************************************/   
void   v_W1302(uchar   ucAddr,   uchar   ucDa)   
{   
	T_RST   =   0;   
	T_CLK   =   0; 
    rtcDelay(50);     
	T_RST   =   1; 
   
	v_RTInputByte(ucAddr);   /*   地址,命令   */   
	v_RTInputByte(ucDa);   /*   写1Byte数据*/   
	T_CLK   =   1;   
	T_RST   =0;   
}     
/********************************************************************     
*   
*   名称:   uc_R1302   
*   说明:   先写地址,后读命令/数据   
*   功能:   读取DS1302某地址的数据   
*   调用:   v_RTInputByte()   ,   uc_RTOutputByte()   
*   输入:   ucAddr:   DS1302地址   
*   返回值:   ucDa   :读取的数据   
***********************************************************************/   
uchar   uc_R1302(uchar   ucAddr)   
{   
	uchar   ucDa;   
    P2MDOUT=0xfd;
	T_RST   =   0;   
	T_CLK   =   0;
    rtcDelay(50);    
	T_RST   =   1;   
    
	v_RTInputByte(ucAddr);   /*   地址,命令   */   
	ucDa   =   uc_RTOutputByte();   /*   读1Byte数据   */   
	T_CLK   =   1;   
	T_RST   =0;   
	return(ucDa);   
}   

/********************************************************************     
*   
*   名称:   v_Set1302   
*   说明:     
*   功能:   设置初始时间   
*   调用:   v_W1302()     
*   输入:   pSecDa:   初始时间地址。初始时间格式为:   秒   分   时   日   月   星期   年     
*   7Byte   (BCD码)   1B   1B   1B   1B   1B   1B   1B   
*   返回值:   无   
***********************************************************************/   
void   v_Set1302(uchar   *pSecDa)     
{   
	uchar   i;   
	uchar   ucAddr   =   0x80;     
	v_W1302(0x8e,0x00);   /*   控制命令,WP=0,写操作?*/   
  	for(i  =7;i>0;i--)   
 	{     
  		v_W1302(ucAddr,*pSecDa);   /*   秒   分   时   日   月   星期   年   */   
    
 		 pSecDa++;   
		 ucAddr   +=2;   
  	}   
  	v_W1302(0x8e,0x80);   /*   控制命令,WP=1,写保护?*/   
 }   
/********************************************************************     
*   
*   名称:   v_Get1302   
*   说明:     
*   功能:   读取DS1302当前时间   
*   调用:   uc_R1302()     
*   输入:   ucCurtime:   保存当前时间地址。当前时间格式为:   秒   分   时   日   月   星期   年     
*   7Byte   (BCD码)   1B   1B   1B   1B   1B   1B   1B   
*   返回值:   无   
***********************************************************************/   
void   v_Get1302(uchar   ucCurtime[])     
{   
	uchar   m;   
	uchar   ucAddr   =   0x81;   
  for   (m=0;m<7;m++)   
  {   
  ucCurtime[m]   =   uc_R1302(ucAddr);/*格式为:   秒   分   时   日   月     
  星期   年   */   
  ucAddr   +=   2;   
  }   

}     


void start1302()
{
   
	v_W1302(0x8e,0x00);   /*   控制命令,WP=0,写操作?*/   
	v_W1302(0x80,0);
	v_W1302(0x8e,0x80);   /*   控制命令,WP=1,写保护?*/   

}

⌨️ 快捷键说明

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