高级会员 
 
主题
回帖0
积分2289
阅读权限30
注册时间2008-11-17
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 本帖最后由 飞雪008 于 2012-6-8 09:25 编辑  
 
拿这个用用看,我以前在网上找的,还可以 
 
//DS1302管脚定义 
sbit T_CLK  = P3^5;  
sbit T_IO   = P3^6;    
sbit T_RST  = P3^7;  
 
sbit ACC0   = ACC^0; 
sbit ACC1   = ACC^1; 
sbit ACC2   = ACC^2; 
sbit ACC3   = ACC^3; 
sbit ACC4   = ACC^4; 
sbit ACC5   = ACC^5; 
sbit ACC6   = ACC^6; 
sbit ACC7   = ACC^7; 
//------------------------------------------------------------------------------------------ 
//时钟数据(7字节BCD码)格式为: 秒   分   时   日    月星期   年----------------------------- 
unsigned char idata Time[7];//={0x30,0x42,0x23,0x18,0x06,0x04,0x09}; 
//------------------------------------------------------------------------------------------ 
bit flag; //flag-闰年标记 
unsigned char idata second,minute,hour,day,month,week,year; 
unsigned char BCD2HEX(unsigned char BCDChar); 
unsigned char HEX2BCD(unsigned char HEXChar); 
void WriteByteDS1302(unsigned char Data); 
unsigned char ReadByteDS1302(void);  
void WriteDS1302(unsigned char Addr,unsigned char Data); 
unsigned char ReadDS1302(unsigned char Addr); 
void Set(unsigned char sel,unsigned char selby); 
void SetTime(unsigned char  *pClock); 
void ReadTime(); 
void WriteTime(); 
void StopTime(); 
void StartTime(); 
void bucang(void); 
/*******************************************************************************************  
*  函数名: BCD2HEX     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************/  
unsigned char BCD2HEX(unsigned char BCDChar)      
{  
    unsigned char temp;  
    temp=(BCDChar/16*10+BCDChar%16);  
    return temp;  
}  
/*******************************************************************************************  
*  函数名: HEX2BCD     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************  
unsigned char HEX2BCD(unsigned char HEXChar)  
{ 
    unsigned char temp;  
    temp=(HEXChar/10*16+HEXChar%10);  
    return temp;  
} 
/*******************************************************************************************  
*  函数名: WriteByteDS1302     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************/   
void WriteByteDS1302(unsigned char Data)  
{  
    unsigned char i; 
    ACC = Data; 
    for(i=8; i>0; i--) 
    { 
        T_IO = ACC0;          
        T_CLK = 1; 
        T_CLK = 0; 
        ACC = ACC >> 1;  
    }  
} 
/*******************************************************************************************  
*  函数名: ReadByteDS1302     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************/   
unsigned char ReadByteDS1302(void)  
{  
    unsigned char i; 
    for(i=8; i>0; i--) 
    { 
        ACC = ACC >>1;        
        ACC7 = T_IO; 
        T_CLK = 1; 
        T_CLK = 0; 
    }  
    return(ACC);  
} 
/*******************************************************************************************  
*  函数名: WriteDS1302     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************/   
void WriteDS1302(unsigned char Addr,unsigned char Data) 
{ 
    T_RST = 0; 
    T_CLK = 0; 
    T_RST = 1; 
    WriteByteDS1302(Addr);     
    WriteByteDS1302(Data);   
    T_CLK = 1; 
    T_RST = 0; 
} 
/*******************************************************************************************  
*  函数名: ReadDS1302     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************/   
unsigned char ReadDS1302(unsigned char Addr) 
{ 
    unsigned char Data; 
    T_RST = 0; 
    T_CLK = 0; 
    T_RST = 1; 
    WriteByteDS1302(Addr);           
    Data = ReadByteDS1302();      
    T_CLK = 1; 
    T_RST = 0; 
    return(Data); 
} 
/*******************************************************************************************  
*  函数名: Set     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************/  
void Set(unsigned char sel,unsigned char selby)  
{ 
    unsigned char address; 
        char item; 
    unsigned char max,min; 
 
    if(sel==0)  {address=0x80; max=59;min=0;}    //秒 
    if(sel==1)  {address=0x82; max=59;min=0;}    //分钟 
    if(sel==2)  {address=0x84; max=23;min=0;}    //小时 
        if(month==2) 
                if(flag==1) 
                { 
                        if(sel==3)  {address=0x86; max=28;min=1;}  
                } 
                else 
                { 
                        if(sel==3)  {address=0x86; max=27;min=1;} 
                } 
        else 
        { 
                   if(month==1|month==3|month==5|month==7|month==8|month==10|month==12) 
                {     
                        if(sel==3)  {address=0x86; max=31;min=1;} 
                } 
                if(month==4|month==6|month==9|month==11) 
                {     
                        if(sel==3)  {address=0x86; max=30;min=1;} 
                } 
        } 
    if(sel==4)  {address=0x88; max=12;min=1;}    //月 
    if(sel==5)  {address=0x8a; max=7; min=1;}    //星期 
    if(sel==6)  {address=0x8c; max=99;min=0;}    //年 
    item=ReadDS1302(address+1)/16*10+ReadDS1302(address+1)%16; 
    if (selby==0) item++;  else item--; 
    if(item>max) item=min;    
    if(item<min) item=max; 
            
    WriteDS1302(0x8e,0x00); 
    WriteDS1302(address,item/10*16+item%10); 
    WriteDS1302(0x90,0xa5);  
    WriteDS1302(0x8e,0x80);   
} 
/*******************************************************************************************  
*  函数名: SetTime     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************   
void SetTime(unsigned char  *pClock)  
{ 
    unsigned char  h; 
    unsigned char  Addr=0x80;  
    WriteDS1302(0x8e,0x00);         
    for(h=7; h>0; h--) 
    {  
        WriteDS1302(Addr,*pClock);  
        pClock++; 
        Addr+=2; 
    } 
    WriteDS1302(0x90,0xa5);  
        WriteDS1302(0x8e,0x80);       
} 
/*******************************************************************************************  
*  函数名: ReadTime     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************/   
void ReadTime() 
{ 
    second = BCD2HEX(Time[0]=ReadDS1302(0x81));  
        minute = BCD2HEX(Time[1]=ReadDS1302(0x83)); 
        hour   = BCD2HEX(Time[2]=ReadDS1302(0x85)); 
        day    = BCD2HEX(Time[3]=ReadDS1302(0x87)); 
        month  = BCD2HEX(Time[4]=ReadDS1302(0x89)); 
        year   = BCD2HEX(Time[5]=ReadDS1302(0x8d)); 
    week   = BCD2HEX(Time[6]=ReadDS1302(0x8b)); 
} 
/*******************************************************************************************  
*  函数名: WriteTime     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************  
void WriteTime() 
{ 
    WriteDS1302(0x8e,0x00);  
    WriteDS1302(0x80,HEX2BCD(second)); 
        WriteDS1302(0x82,HEX2BCD(minute)); 
        WriteDS1302(0x84,HEX2BCD(hour)); 
        WriteDS1302(0x86,HEX2BCD(day)); 
        WriteDS1302(0x88,HEX2BCD(month)); 
        WriteDS1302(0x8A,HEX2BCD(week)); 
    WriteDS1302(0x8C,HEX2BCD(year)); 
    WriteDS1302(0x90,0xa5);  
        WriteDS1302(0x8e,0x80); 
} 
/*******************************************************************************************  
*  函数名: StopTime     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
*******************************************************************************************  
void StopTime() 
{ 
    second = BCD2HEX(Time[0]=ReadDS1302(0x81));  
    WriteDS1302(0x8e,0x00);  
    WriteDS1302(0x80,HEX2BCD(second)|0x80); 
    WriteDS1302(0x90,0xa5);  
        WriteDS1302(0x8e,0x80); 
} 
/*******************************************************************************************  
*  函数名: StartTime     
*  功能描述:   
*  入口参数:  无  
*  出口参数:  无  
******************************************************************************************* 
void StartTime() 
{ 
    WriteDS1302(0x8e,0x00);  
    WriteDS1302(0x80,HEX2BCD(second)&0x7f); 
    WriteDS1302(0x90,0xa5);  
        WriteDS1302(0x8e,0x80); 
} 
/*****************************************************************************/ 
//设置1302的初始时间(自动初始化) 
void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一) 
        unsigned char f; 
        if(ReadDS1302(0xc1) != 0xaa){ 
                WriteDS1302(0x8e,0x00);//允许写操作 
                WriteDS1302(0x8c,0x10);//年 
                WriteDS1302(0x8a,0x05);//星期 
                WriteDS1302(0x88,0x06);//月 
                WriteDS1302(0x86,0x11);//日 
                WriteDS1302(0x84,0x16);//小时 
                WriteDS1302(0x82,0x09);//分钟 
                WriteDS1302(0x80,0x00);//秒 
                WriteDS1302(0x90,0xa5);//充电         
                WriteDS1302(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置) 
                for(f=0;f<60;f=f+2){//清除闹钟RAM位为0 
                        WriteDS1302(0xc2+f,0x00); 
                } 
                WriteDS1302(0x8e,0x80);//禁止写操作 
        } 
} |   
 
 
 
 |