ds1302 为什么每次打开都会重新设置一遍数据 各位帮帮忙.....

2019-07-16 01:00发布

数据在数码管上显示
问题:1.打开初始ds1302写保护时,数据可以设置,但是每次关掉电源数据都会重新设置一次,起不了时钟的功能
          2.关闭初始ds1302写保护时 ,数据设置不了,每次掉电都能保持原有数据
          (下方标示处为问题所在,各位帮帮忙看下,我QQ:410294170)
#include <REGX52.H>
#define uchar unsigned char
unsigned int second10,second1,minute10,minute1,hour10,hour1,date10,date1,month10,month1,year10,year1,day;
int   num;
sbit RST=P1^2;
sbit SCLK=P1^0;
sbit SDA=P1^1;
sbit key1=P1^4;
void delay(int hm)                                                          //延时函数
{
        int i,j;
        for(i=hm;i>0;i--)
        for(j=110;j>0;j--);
}
#define READ_SECOND                        0x81
#define READ_MINUTE                 0x83
#define READ_HOUR                          0x85
#define READ_DATE                          0x87 //几号
#define READ_MONTH                  0x89
#define READ_DAY                          0x8B //星期几
#define READ_YEAR                          0x8D
#define WRITE_SECOND                0x80
#define WRITE_MINUTE                0x82
#define WRITE_HOUR                  0x84
#define WRITE_DATE                  0x86 //几号
#define WRITE_MONTH                 0x88
#define WRITE_DAY                          0x8A //星期几
#define WRITE_YEAR                  0x8C

unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};        //定义共阳极字型码0123456789-                                  

void delayum(int hm)
{
        int i,j;
        for(i=hm;i>0;i--)
        for(j=110;j>0;j--);
}

void ds1302writebyte(uchar dat)
{
        uchar i;
        SCLK=0;
        for(i=0;i<8;i++)
                {               
                        SDA=dat&0x01;
                        SCLK=1;
                        SCLK=0;
                        dat>>=1;
                }

}
uchar ds1302readbyte() //
{
        uchar i,dat;
        for(i=0;i<8;i++)
                {
                        dat>>=1;
                        if(SDA==1)
                        dat|=0x80;
                        SDA=dat&0x01;
                        SCLK=1;
                        SCLK=0;
                }
                return(dat);

}
uchar ds1302read(uchar cmd)//写进去        地址 读出来数据
{                  
        uchar dat;
        RST=0;
        SCLK=0;
        RST=1;
        ds1302writebyte(cmd);
        dat=ds1302readbyte();
        SCLK=1;
        RST=0;
        return(dat);
}
void ds1302write(uchar cmd,uchar dat)
{

        RST=0;
        SCLK=0;
        RST=1;
        ds1302writebyte(cmd);
        ds1302writebyte(dat);
        SCLK=1;
        RST=0;

}

void display(second10,second1,minute10,minute1,hour10,hour1)        //显示子程序

{

        P0=0;
  P2=0xfe;
  P0=dispcode[second10];//显示秒的十位
  delayum(1);P0=0;

  P2=0xfd;
  P0=dispcode[second1];        //显示秒的个位
  delayum(1);P0=0;

  P2=0xfb;
  P0=dispcode[10];                //显示"-"
  delayum(1);P0=0;

  P2=0xf7;
  P0=dispcode[minute10];//显示分的十位
  delayum(1);P0=0;

  P2=0xef;
  P0=dispcode[minute1];        //显示分的个位
  delayum(1);P0=0;

  P2=0xdf;
  P0=dispcode[10];                //显示"-"
  delayum(1);P0=0;

  P2=0xbf;
  P0=dispcode[hour10];        //显示时的十位
  delayum(1);P0=0;

  P2=0x7f;
  P0=dispcode[hour1];        //显示时的个位
  delayum(1);
}

void init_ds1302()
{       
//        ds1302write(0x8e,0x00);// 写保护关
        ds1302write(WRITE_SECOND ,0x55);// 初始秒值为 0 0 0 0
        ds1302write(WRITE_MINUTE,0x55); // 初始分钟值为 0 0 0 0
        ds1302write(WRITE_HOUR,0x23);// 初始为 24242424 小时模式 初始时间为
        ds1302write(WRITE_DAY,0x07);//2011 年 1  月 1 日 星期 6
        ds1302write(WRITE_MONTH,0x12);
        ds1302write(WRITE_YEAR,0x13);
        ds1302write(WRITE_DATE,0x31);
        ds1302write(0x90,0x01);// 充电
        ds1302write(0xc0,0xf0); // 初始化一次标示
//        ds1302write(0x8e,0x80);
                  
}
void init_dat()
{
        second10=ds1302read(READ_SECOND)/16;
        second1=ds1302read(READ_SECOND)%16;                 
        minute10=ds1302read(READ_MINUTE)/16;
        minute1=ds1302read(READ_MINUTE)%16+num;
        hour10=ds1302read(READ_HOUR)/16;
        hour1=ds1302read(READ_HOUR)%16;
        date10=ds1302read(READ_DATE)/16;
        date1=ds1302read(READ_DATE)%16;
        month10=ds1302read(READ_MONTH)/16;
        month1=ds1302read(READ_MONTH)%16;
        year10=ds1302read(READ_YEAR)/16;
        year1=ds1302read(READ_YEAR)%16;
        day=ds1302read(READ_DAY);

}

main()
{




               
            init_ds1302();
                while(1)
                {         

                        init_dat();
                        display(minute10,minute1,hour10,hour1,second10,second1);
                }

}       

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
郑江苇
1楼-- · 2019-07-16 02:53
{:4:}{:4:}{:4:}{:4:}
郑江苇
2楼-- · 2019-07-16 06:41
各位帮帮忙啊 啊啊啊啊啊 啊
闲云悠悠
3楼-- · 2019-07-16 10:51
 精彩回答 2  元偷偷看……
郑江苇
4楼-- · 2019-07-16 15:57
闲云悠悠 发表于 2013-5-29 21:43
楼主还在不,问题解决木有 ,分享下啊

健在哈,还是那样哈,先下一遍之后改程序再下一遍才恢复正常
liubao948
5楼-- · 2019-07-16 16:57
ds1302初始化设置时间可以调整为按键触发,不要每次上电都重新赋值。   平时在上电的时候只需要判断
秒字节的第一个比特,为1时,时间不会工作。
W.Bobby.Longly
6楼-- · 2019-07-16 20:51
init_ds1302();作用是第一次下载的时候将DS1302赋初值的,之后要把init_ds1302();这个删掉。再下载一起。如果没有删掉,每次开机都会做init_ds1302();这个,这个就是每次都会赋初值,所以~~~~~~你懂的

一周热门 更多>