fanpu 发表于 2024-10-17 08:28:27

DS1302 自用代码 (通用)

DS1302 自用代码 STC32G12K128 测没有问题

#define SCLK P22      //DS-S
#define DSIO P21      //DS-I      
#define RSTP20   //DS-R      

unsigned charREAD_RTC_ADDR         = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};//读取地址
unsigned charWRITE_RTC_ADDR = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //写入地址

unsigned charTIME = {0,0,         0,         0,         0,         0,         0};

unsigned char Year=0, Month=0,day=0, Week=0, Hour=0, Minute=0, Second=0;//年月日周时分秒


unsigned char Ds1302Read(unsigned char addr)
{
      unsigned char n,dat,dat1;
      RST = 1;               
      _nop_();

      for(n=0; n<8; n++)               
      {
                DSIO = addr & 0x01;               
                addr >>= 1;
                SCLK = 1;               
                _nop_();
                SCLK = 0;               
                _nop_();
      }
      _nop_();
      
      for(n=0; n<8; n++)
      {
                dat1 = DSIO;               
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;               
                _nop_();
      }

      RST = 0;
      _nop_();      
      DSIO = 0;
      _nop_();
      return dat;      
}


void Ds1302Write(unsigned char addr, unsigned char dat)
{
      unsigned char n;
      RST = 1;
      _nop_();
      for (n=0; n<8; n++)
      {
                DSIO = addr & 0x01;
                addr >>= 1;
                SCLK = 1;
                _nop_();
                SCLK = 0;
                _nop_();
      }
      for (n=0; n<8; n++)
      {
                DSIO = dat & 0x01;
                dat >>= 1;
                SCLK = 1;
                _nop_();
                SCLK = 0;
                _nop_();      
      }      
               
      RST = 0;
      _nop_();
}

void Ds1302Init()
{
      unsigned char n;
      Ds1302Write(0x8E,0X00);               
      for (n=0; n<7; n++)                                       
      {
                Ds1302Write(WRITE_RTC_ADDR,TIME);      
      }
      Ds1302Write(0x8E,0x80);               
}




//========================================================================
//                                                                                                 读取时间
// ***********************************************************************
//========================================================================      
void Ds1302ReadTime()
{
      unsigned char n;
      unsigned char dd="";
      for (n=0; n<7; n++)
      {
                TIME = Ds1302Read(READ_RTC_ADDR);
      }
      for (n=0; n<7; n++)
      {
                TIME = Ds1302Read(READ_RTC_ADDR);
      }
      Year=BCD_DEC(TIME);
      Week=BCD_DEC(TIME);
      Month=BCD_DEC(TIME);
      day=BCD_DEC(TIME);
      Hour=BCD_DEC(TIME);
      Minute=BCD_DEC(TIME);
      Second=BCD_DEC(TIME);
}

unsigned char *WEEK_ZH(unsigned char aa)
{
      static unsigned char dd="";
      if(aa==1) strcpy(dd,"一") ;
      if(aa==2) strcpy(dd,"二") ;
      if(aa==3) strcpy(dd,"三\xfd") ;
      if(aa==4) strcpy(dd,"四") ;
      if(aa==5) strcpy(dd,"五") ;
      if(aa==6) strcpy(dd,"六") ;
      if(aa==7) strcpy(dd,"日") ;
      return dd;
}

邮箱 发表于 2024-10-17 10:33:50

{:4_250:}

soma 发表于 2024-10-17 11:34:05

1302还不错啊可以宽压使用

社区闲人 发表于 2024-10-17 13:12:33

unsigned char *WEEK_ZH(unsigned char aa)
{
      static unsigned char dd="";
      if(aa==1) strcpy(dd,"一") ;
      if(aa==2) strcpy(dd,"二") ;
      if(aa==3) strcpy(dd,"三\xfd") ;
      if(aa==4) strcpy(dd,"四") ;
      if(aa==5) strcpy(dd,"五") ;
      if(aa==6) strcpy(dd,"六") ;
      if(aa==7) strcpy(dd,"日") ;
      return dd;
}

上面的代码应该使用 else if, 或switch来实现:

unsigned char *WEEK_ZH(unsigned char aa)
{
      static unsigned char dd="";
      if(aa==1) strcpy(dd,"一") ;
      else if(aa==2) strcpy(dd,"二") ;
      else if(aa==3) strcpy(dd,"三\xfd") ;
      else if(aa==4) strcpy(dd,"四") ;
      else if(aa==5) strcpy(dd,"五") ;
      else if(aa==6) strcpy(dd,"六") ;
      else if(aa==7) strcpy(dd,"日") ;
      return dd;
}

wpy621206 发表于 2024-10-17 14:20:29

我用的DS1302,总是走快,一天能快5-6秒,有没人知道是什么原因?

fanpu 发表于 2024-10-17 15:27:42

wpy621206 发表于 2024-10-17 14:20
我用的DS1302,总是走快,一天能快5-6秒,有没人知道是什么原因?

看下晶振和电容是否匹配

fanpu 发表于 2024-10-17 15:34:20

社区闲人 发表于 2024-10-17 13:12
unsigned char *WEEK_ZH(unsigned char aa)
{
      static unsigned char dd="";


{:4_250:}{:4_250:}{:4_250:}{:4_250:}{:4_250:}{:4_250:}

soma 发表于 2024-10-17 15:48:00

wpy621206 发表于 2024-10-17 14:20
我用的DS1302,总是走快,一天能快5-6秒,有没人知道是什么原因?

晶振频率偏高,调节一下谐振电容

wpy621206 发表于 2024-10-17 17:57:49

soma 发表于 2024-10-17 15:48
晶振频率偏高,调节一下谐振电容

收到,谢谢

wpy621206 发表于 2024-10-17 17:58:35

fanpu 发表于 2024-10-17 15:27
看下晶振和电容是否匹配

收到,谢谢
页: [1] 2
查看完整版本: DS1302 自用代码 (通用)