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];
}
-
一周热门 更多>