星光大道2008年4月28:DS1302时钟芯片读写详解

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 20:21:54
DS1302时钟芯片读写详解2008-09-26 13:07

/*DS1302读写程序(C51)*/

sbit DS13CLK =P1^5; /*DS1302的SCLK脚脉冲*/
sbit DS13IO   =P1^6; /*DS1302的IO脚数据*/
sbit DS13CS   =P1^7; /*DS1302的RST脚片选*/

/*向DS1302写一个字节*/
void _wds13byte(uchar _code)
{
uchar i;
DS13CLK =0;
DS13CLK =0;
for(i=0;i<8;i++)
{
if(_code&0x01) DS13IO =1;
else DS13IO =0;
DS13CLK =1;
DS13CLK =1;
DS13CLK =0;
DS13CLK =0;
_code =_code >> 1;
}
}
/*从DS1302读一个字节*/
uchar _rds13byte(void)
{
uchar i,_code;
_code=0;
DS13CLK =0;
DS13CLK =0;
DS13IO =1;
for(i=0;i<8;i++)
{
_code =_code >>1;
if(DS13IO) _code =_code|0x80;
DS13CLK =1;
DS13CLK =1;
DS13CLK =0;
DS13CLK =0;
}
return _code;
}
/*读功能 _code读功能命令   */
uchar readds1302(uchar _code)
{
DS13CS =0;         /*关闭DS1302*/
DS13CLK =0;
DS13CLK =0;
DS13CS =1;          /*使能DS1302*/
_wds13byte(_code);   /*读代码*/
_code=_rds13byte(); /*返回读取数字*/
DS13CLK =1;
DS13CS =0;         /*关闭DS1302*/
return _code;
}
/*写功能 fp写的地址,_code写的内容*/
void writeds1302(uchar fp,uchar _code)
{
DS13CS =0;         /*关闭DS1302*/
DS13CLK =0;
DS13CLK =0;
DS13CS =1;          /*使能DS1302*/
_wds13byte(fp);     /*写控制命令*/
_wds13byte(_code); /*写入数据*/
DS13CLK=1;
DS13CS =0;          /*关闭DS1302*/
}
/*******DS1302设置快速充电***************/
void ds13_charg(void)
{
writeds1302(0x8e,0x00); /*解除写保护*/
writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/
writeds1302(0x8e,0x80); /*置位写保护*/
}

 

 

;;;DS1302读写程序(汇编);;;

;*********************************************************************/
T_CLK Bit P1.5                         ;实时时钟时钟线引脚
T_IO Bit P1.6                         ;实时时钟数据线引脚
T_RST Bit P1.7                         ;实时时钟复位线引脚
;**********************************************************
;子程序名:Set1302
;功    能:设置DS1302 初始时间,并启动计时。
;说    明:
;调    用:RTInputByte
;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续)
;出口参数:无
;影响资源:A B R0 R1 R4 R7
;**********************************************************
Set1302:
          CLR    T_RST
          CLR    T_CLK
          SETB   T_RST
          MOV    B,     #8EH        ;控制寄存器
          LCALL RTInputByte
          MOV    B,     #00H        ;写操作前WP=0
          LCALL RTInputByte
          SETB   T_CLK
          CLR    T_RST

          MOV    R0,    #Second;
          MOV    R7,    #7        ;秒分 时 日 月 星期 年
          MOV    R1,    #80H      ;秒写地址
S13021:   CLR    T_RST
          CLR    T_CLK
          SETB   T_RST
          MOV    B,     R1        ;写秒分 时 日 月 星期 年 地址
          LCALL RTInputByte
          MOV    A,     @R0       ;写秒数据
          MOV    B,     A
          LCALL RTInputByte
          INC    R0
          INC    R1
          INC    R1
          SETB   T_CLK
          CLR    T_RST
          DJNZ   R7,    S13021
          CLR    T_RST
          CLR    T_CLK
          SETB   T_RST
          MOV    B,     #8EH        ;控制寄存器
          LCALL RTInputByte
          MOV    B,     #80H        ;控制,WP=1,写保护
          LCALL RTInputByte
          SETB   T_CLK
          CLR    T_RST
          RET
;**********************************************************
;子程序名:Get1302
;功    能:从DS1302 读时间
;说    明:
;调    用:RTInputByte,RTOutputByte
;读    出: Second,Minute,Hour,Day,Month,Week.YearL
;出口参数:无
;影响资源:A B R0 R1 R4 R7
;**********************************************************
Get1302:     
          MOV    R0,    #Second;
          MOV    R7,    #7
          MOV    R1,    #81H       ;秒地址
G13021:   CLR    T_RST
          CLR    T_CLK
          SETB   T_RST
          MOV    B,     R1        ;秒分 时 日 月 星期 年 地址
          LCALL RTInputByte
          LCALL RTOutputByte
          MOV    @R0,   A         ;秒
          INC    R0
          INC    R1
          INC    R1
          SETB   T_CLK
          CLR    T_RST
          DJNZ   R7,    G13021
          RET
;**********************************************************
;功    能:写1302一字节 (内部子程序)
;**********************************************************
RTInputByte:
          MOV    R4,    #8
Inbit1:   MOV    A,     B
          RRC    A
          MOV    B,     A
          MOV    T_IO, C
          SETB   T_CLK
          CLR    T_CLK
          DJNZ   R4,   Inbit1
          RET
;**********************************************************
;功    能:读1302一字节 (内部子程序)
;**********************************************************
RTOutputByte:
          MOV    R4,    #8
Outbit1: MOV    C,     T_IO
          RRC    A
          SETB   T_CLK
          CLR    T_CLK
          DJNZ   R4,    Outbit1
          RET