[求助] DS1302不走了

chenbingjy   2017-11-28 18:36 楼主

上程序:
#include "ds1302.h"
//#include "delay.h"

//3õê¼»ˉ걼䶨òå
u8 time_buf[8] = {0x20,0x17,0x01,0x01,0x23,0x59,0x55,0x02}; //3õê¼ê±¼ä2010Äê6ÔÂ1oÅ23μã59·Ö55Ãë DÇÆú¶t
extern u8 Year,Mon,Day,Hour,Min,Sec;

void delay_us(unsigned int x)
{
        unsigned int i,j;
        for(i=0;i                 for(j=0;j<20;j++);
}
//DS13023õê¼»ˉ
void DS1302_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_SetBits(GPIOA, GPIO_Pin_4);                 //PA4à-¸ß
        GPIO_ResetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_6); //PA5£¬PA6ÖÃμí
}

//ÏòDS1302D′èëò»¸ö×Ö½úêy¾Y
void DS1302_Write_Byte(u8 addr, u8 data)
{
  u8 i;
        DS1302_RST_L;      //í£Ö1DS1302×üÏß
        delay_us(10);
        DS1302_RST_H;      //Æô¶ˉDS1302×üÏß
        addr = addr & 0xFE;  //×îμíλÖÃá㣬D′êy¾Y
        DS1302_IO_OUT();
        for(i = 0; i < 8; i ++)  //D′μØÖ·
        {
          if (addr & 0x01)
                        DS1302_DATA_OUT_H;
                else
                        DS1302_DATA_OUT_L;

                DS1302_SCK_H;    //2úéúê±Öó
                delay_us(10);
                DS1302_SCK_L;
                addr = addr>>1;
        }
        for (i = 0; i < 8; i ++) //D′êy¾Y
        {
          if(data & 0x01)
                        DS1302_DATA_OUT_H;
                else
                        DS1302_DATA_OUT_L;

                DS1302_SCK_H;   //2úéúê±Öó
                delay_us(10);
                DS1302_SCK_L;
          data = data>>1;
        }
        DS1302_RST_L;      //í£Ö1DS1302×üÏß
}

//′óDS1302¶á3öò»¸ö×Ö½úêy¾Y
u8 DS1302_Read_Byte(u8 addr)
{
  u8 i,temp;
        DS1302_RST_L;      //í£Ö1DS1302×üÏß
        delay_us(10);
        DS1302_RST_H;      //Æô¶ˉDS1302×üÏß
        addr = addr | 0x01;  //×îμíλÖøߣ¬¶áêy¾Y
        DS1302_IO_OUT();
        for(i = 0; i < 8; i ++)  //D′μØÖ·
        {
          if (addr & 0x01)
                        DS1302_DATA_OUT_H;
                else
                        DS1302_DATA_OUT_L;

                DS1302_SCK_H;    //2úéúê±Öó
                delay_us(10);
                DS1302_SCK_L;
                addr = addr>>1;
        }
        DS1302_IO_IN();
        for (i = 0; i < 8; i ++) //¶áêy¾Y
        {
          temp = temp >> 1;
                if(DS1302_DATA_IN==1)
                        temp |= 0x80;
                else
                        temp &= 0x7F;

                DS1302_SCK_H;   //2úéúê±Öó
                delay_us(10);
                DS1302_SCK_L;
        }
        DS1302_RST_L;      //í£Ö1DS1302×üÏß
        return temp;
}

//ÏòDS1302D′èëê±¼äêy¾Y
void DS1302_Write_Time(void)
{
  DS1302_Write_Byte(ds1302_control_add, 0x00);      //1رÕD′±£»¤
  DS1302_Write_Byte(ds1302_sec_add, 0x80);          //ÔYí£ê±Öó
        //DS1302_Write_Byte(ds1302_charger_add, 0xA9);      //ä¸á÷3äμç
        DS1302_Write_Byte(ds1302_year_add,time_buf[1]);                //Äê
        DS1302_Write_Byte(ds1302_month_add,time_buf[2]);        //ÔÂ
        DS1302_Write_Byte(ds1302_date_add,time_buf[3]);                //èÕ
        DS1302_Write_Byte(ds1302_hr_add,time_buf[4]);                  //ê±
        DS1302_Write_Byte(ds1302_min_add,time_buf[5]);                //·Ö
        DS1302_Write_Byte(ds1302_sec_add,time_buf[6]);                //Ãë
        DS1302_Write_Byte(ds1302_day_add,time_buf[7]);                //Öü
        DS1302_Write_Byte(ds1302_control_add,0x80);                    //′ò¿aD′±£»¤
}
//ÏòDS1302D′èëèÕÆúêy¾Y
void DS1302_Write_Date(void)
{
        Year=((Year/10)<<4)+((Year%10)&0x0f);
        Mon=((Mon/10)<<4)+((Mon%10)&0x0f);
        Day=((Day/10)<<4)+((Day%10)&0x0f);
        Hour=((Hour/10)<<4)+((Hour%10)&0x0f);
        Min=((Min/10)<<4)+((Min%10)&0x0f);
        Sec=((Sec/10)<<4)+((Sec%10)&0x0f);
  DS1302_Write_Byte(ds1302_control_add, 0x00);      //1رÕD′±£»¤
  DS1302_Write_Byte(ds1302_sec_add, 0x80);          //ÔYí£ê±Öó
        //DS1302_Write_Byte(ds1302_charger_add, 0xA9);      //ä¸á÷3äμç
        DS1302_Write_Byte(ds1302_year_add,Year);                //Äê
        DS1302_Write_Byte(ds1302_month_add,Mon);        //ÔÂ
        DS1302_Write_Byte(ds1302_date_add,Day);                //èÕ
        DS1302_Write_Byte(ds1302_hr_add,Hour);                  //ê±
        DS1302_Write_Byte(ds1302_min_add,Min);                //·Ö
        DS1302_Write_Byte(ds1302_sec_add,Sec);                //Ãë
        DS1302_Write_Byte(ds1302_day_add,time_buf[7]);                //Öü
        DS1302_Write_Byte(ds1302_control_add,0x80);                    //′ò¿aD′±£»¤
}
//′óDS302¶á3öê±Öóêy¾Y
void DS1302_Read_Time(void)  
{
        time_buf[1] = DS1302_Read_Byte(ds1302_year_add);                   //Äê
        time_buf[2] = DS1302_Read_Byte(ds1302_month_add);                   //ÔÂ
        time_buf[3] = DS1302_Read_Byte(ds1302_date_add);                   //èÕ
        time_buf[4] = DS1302_Read_Byte(ds1302_hr_add);                     //ê±
        time_buf[5] = DS1302_Read_Byte(ds1302_min_add);                     //·Ö
        time_buf[6] = (DS1302_Read_Byte(ds1302_sec_add))&0x7f; //Ã룬Æá±ÎÃëμÄμú7룬±üÃa3¬3ö59
        time_buf[7] = DS1302_Read_Byte(ds1302_day_add);                     //Öü         
}

//DS1302ÏòéÏ2ã·μ»Øê±¼äêy¾Y
void DS1302_Get_Time(u8 *time)
{
        DS1302_Read_Time();
        time[0]=(time_buf[0]>>4);   //Äê   
  time[1]=(time_buf[0]&0x0f);

  time[2]=(time_buf[1]>>4);   
  time[3]=(time_buf[1]&0x0f);

  time[4]=(time_buf[2]>>4);   //Ô  
  time[5]=(time_buf[2]&0x0f);

  time[6]=(time_buf[3]>>4);   //èÕ   
  time[7]=(time_buf[3]&0x0f);

  time[8]=(time_buf[7]&0x07); //DÇÆú

  time[9]=(time_buf[4]>>4);   //ê±   
  time[10]=(time_buf[4]&0x0f);   

  time[11]=(time_buf[5]>>4);  //·Ö   
  time[12]=(time_buf[5]&0x0f);   

  time[13]=(time_buf[6]>>4);  //Ãë
  time[14]=(time_buf[6]&0x0f);
}








原来走的,后来用DS1302_Write_Date()这个程序设置了一下,就不走了。

用DS1302_Write_Time()再设置也不行。高手支招,谢谢!

为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

回复评论 (5)

好了。设置秒的时候,最高位要清零。
Sec&=0x7f
为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
点赞  2017-11-29 10:04
引用: chenbingjy 发表于 2017-11-29 10:04
好了。设置秒的时候,最高位要清零。
Sec&=0x7f

又不行了
为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
点赞  2017-11-29 13:37
我怕虚焊,又重新过了一下锡,结果走了,可是走的快了。
为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
点赞  2017-11-29 13:59
DS1302要走精确的时间很难的,主要是受到晶振精度的影响
点赞  2017-11-29 14:22
引用: zh2790 发表于 2017-11-29 14:22
DS1302要走精确的时间很难的,主要是受到晶振精度的影响

好了。我感觉快了,感觉不靠谱。
实测和电脑时间差不多
为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
点赞  2017-11-29 15:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复