DS1302时钟模块驱动

/*      本驱动主要提供DS1302时钟模块的读写操作,可以完成DS1302时钟模块的绝大多数操作,如有特殊的操作请适当更改函数的调用
        提供以下几个函数可供调用
*******************************************************************************************************************************************
* 1.  ds_write(unsigned char a)    单字节写入 带初始化 供ds_read()调用 不单独用                                                      *
* 2.    unsigned char ds_read(unsigned char a)  读取数据 参数为要读取数据的地址 见下                                                   *
* 3.  unsigned char BCD_CHG(unsigned char a)   用于对读出的数据进行BCD调整                                                          *
* 4.    unsigned char ds_write_double(unsigned char a,unsigned char b)用于写入数据 第一个参数为要写入的地址 第二个参数为要写入的数据    *
* 5.    地址表:    秒      分     时     日     月     周     年     保护                                                      *
*        读: 81H 83H    85H   87H   89H  8BH 8DH    8FH                                                            *
*              写: 80H    82H    84H    86H     88H    8AH    8CH    8EH                                                                *
*******************************************************************************************************************************************
 使用时请将下面三个位连线重新设置为硬件实际连接
 写数据前请先调用ds_write_double()函数将保护位写入0x00,数据写入结束请将保护位写入0x80
*/
sbit SDA=P3^4;
sbit SCK=P3^6;
sbit RST=P3^5;
ds_write(unsigned char a)
{
 unsigned char i;
 RST=0;
 nop();
 nop();
 nop();
 SDA=0;
 nop();
 nop();
 nop();
 SCK=0;
 nop();
 nop();
 nop();
 RST=1;
 nop();
 nop();
 nop();
 for(i=0;i<8;i++)
 {
  SCK=0;
  nop();
  nop();
  nop();
  SDA=a&0x01;
  nop();
  nop();
  nop();
  a=a>>1;
  SCK=1;
  nop();
  nop();
  nop();
 }

}
unsigned char ds_read(unsigned char a)
{
  unsigned char i;
  ds_write(a);
  a=0;
  for (i=0;i<8;i++)   //循环8次 读取数据
  {  
   if(SDA)
   a|=0x80;   //每次传输低字节
  SCK=0;
  a>>=1;   //右移一位
  nop();
    nop();
    nop();
   SCK=1;
 }
  RST=0;
 nop();            //以下为DS1302复位的稳定时间
  nop();
 RST=0;
 SCK=0;
 nop();
 nop();
 nop();
 nop();
 SCK=1;
 nop();
 nop();
 SDA=0;
 nop();
 nop();
 SDA=1;
 nop();
 nop();
 return (a); 
}
unsigned char BCD_CHG(unsigned char a)
{
 unsigned b,c;
 b=a/16;
 c=a%16;
 a=b*10+c;
 return a;
}
unsigned char ds_write_double(unsigned char a,unsigned char b)

 unsigned char i,temp;
 RST=0;
 nop();
  SCK=0;
 nop();
  RST=1; 
    nop(); 
    for(i=0;i<8;i++)
   {
     SCK=0; 
  SDA=(bit)(a&0x01);
  a>>=1;
  SCK=1;
 }
  for(i=0;i<8;i++)
   {
    

  SDA=(bit)(b&0x01);
  SCK=0; 
  b>>=1;
  SCK=1;

 }
   RST=0;
 
 
}

posted @ 2011-12-26 06:42  刘静海  阅读(262)  评论(0)    收藏  举报