DS1302短暂工作没问题,长时间工作时间存在问题

2019-07-14 18:08发布

我用STM32驱动DS1302,纽扣电池做备用电池。程序能正常显示时间,走时也没问题。关电后再上电也是正常的时间继续在显示。但是不知道从哪一刻起再上电时间就错了显示2099年15月……,这是为什么

#include "DS1302.h"
#include "delay.h"
#include "stdio.h"



extern char buffert1[30];
extern char buffert2[30];


void ds1302_GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;

        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;        
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStruct);

        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;                       
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
        GPIO_Init(GPIOB, &GPIO_InitStruct);

}

void write_1302byte(uint8_t dat)                                                                                        //
{
        uint8_t i = 0;
        GPIO_ResetBits(GPIOB,GPIO_Pin_13);                                                                                //ds1302clk=0
       
  delay_us(2);//?óê±2us
       
        for(i = 0;i < 8;i ++)
            {
                        GPIO_ResetBits(GPIOB,GPIO_Pin_13);                                                     //ds1302clk=0;
                        if(dat&0x01)
                                GPIO_SetBits(GPIOB,GPIO_Pin_15);
                        else                                                                                                                                                                                //ds1302dat=(dat&0x01)
                                GPIO_ResetBits(GPIOB,GPIO_Pin_15);                               
                         delay_us(2);
                        GPIO_SetBits(GPIOB,GPIO_Pin_13);                                                                       
                         dat >>= 1;
                         delay_us(1);
                }       
        }
       
uint8_t read_1302(uint8_t add)                                                                                                //?áêy?Y
{
        uint8_t i=0;
        uint8_t Return_dat=0x00;
        GPIO_ResetBits(GPIOB,GPIO_Pin_14);                                                                          //ds1302rst=0;
        GPIO_ResetBits(GPIOB,GPIO_Pin_13);                                                                                //ds1302clk=0;
        delay_us(3);                                                                                                                                                                //????2us
        GPIO_SetBits(GPIOB,GPIO_Pin_14);                                                                                  //ds1302rst=1;
        delay_us(3);                                                                                                                                                                //?????3us
        write_1302byte(add);                                                                                                                                //????????
        for(i=0;i<8;i++)
        {
                GPIO_SetBits(GPIOB,GPIO_Pin_13);                                                                                 //ds1302clk=1;
                Return_dat >>= 1;
                GPIO_ResetBits(GPIOB,GPIO_Pin_13);                                                                        //ds1302clk=0;//?????,????????
                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==1)                        //?????????
                {Return_dat = Return_dat|0x80;}
        }
          delay_us(1);
          GPIO_ResetBits(GPIOB,GPIO_Pin_14);                                                                   //ds1302rst=0;????
          return Return_dat;
        }
void write_1302(uint8_t add,uint8_t dat)                                                        //???????????????
{
        GPIO_ResetBits(GPIOB,GPIO_Pin_14);                                                                                //???rst???????????????
        GPIO_ResetBits(GPIOB,GPIO_Pin_13);                                                                                //??clk???????,rst????????
        //ds1302rst=0;
        //ds1302clk=0;
        delay_us(1);                                                                                                                                                                //????
        GPIO_SetBits(GPIOB,GPIO_Pin_14);                                                                                        //clk = 0??,???rst??,??????
        //ds1302rst=1;
        delay_us(2);                                                                                                                                                                //????2us
        write_1302byte(add);                                                                                                                                //????
        write_1302byte(dat);                                                                                                                                //?????
        GPIO_ResetBits(GPIOB,GPIO_Pin_14);                                                                                //??????
        GPIO_ResetBits(GPIOB,GPIO_Pin_13);                                                                                //??clk,?????????
        //ds1302clk=0;
        //ds1302rst=0;
        delay_us(1);

}
void ds1302_init(uint8_t *write,uint8_t *time1)                                //3?ê??ˉ1302
{
        uint8_t i=0,j=0;
        write_1302(0x8e,0x00);                                                                                                                        //1?±?D′±£?¤
        for(i=0;i<7;i++)                                                                                                                                                //ê?????BCD??
        {
                j=time1%10;                                                                                                                                                        //????êy2?·?
                time1=(time1/10)*16+j;       
        }
        for(i=0;i<7;i++)                                                                                                                                                //??ê±
        {
                write_1302(write,time1);                                                                                        //?ú?àó|μ???′??÷é?D′è???ó|μ?ê?áù????êy?Y
               
        }
    write_1302(0x8e,0x80);                                                                                                                //′ò?aD′±£?¤
}
void ds1302_data(uint8_t *read)                                                                                                //′|àíêy?Y
{
        uint8_t i=0,g[7],time[7];
//        static uint8_t s = 1;
        for(i=0;i<7;i++)
        {
                time=read_1302(read);                                                                                                //?áêy?Yíê3é
        }
        for(i=0;i<7;i++)
        {
                g=time%16;                                                                                                                                        //??????êy?Y
                time=time/16;                                                                                                                                //??ê???êy?Y
        }
        //10????êy?Y,g′?·???·?ê±è????ü?êμ?????êy?Y
        //time′?·?ê???
        sprintf(buffert1,"20%d%d?ê%d%d??%d%dè?",time[6],g[6],time[4],g[4],time[3],g[3]);
sprintf(buffert2,"%d%d:%d%d:%d%d D??ú%d ",        time[2],g[2],time[1],g[1],time[0],g[0],g[5]);
  //s = time[0]+g[0];       
}




1.png
0条回答

一周热门 更多>