又经过本人亲身测试,发现你的程序有一些问题。第一:DS1302初始化有问题,
- void ds1302init(void)
- {
- uchar n,tmp;
- for (n=0; n<7; n++)
- {
- tmp = time[n] / 10;
- time[n] = time[n] % 10;
- time[n] = time[n] + tmp*16;
- }
- ds1302write(0x8E,0x00);
- for(n=0;n<7;n++)
- {
- ds1302write(writeaddr[n],time[n]);
- }
- ds1302write(0x8E,0x80);
- }
第一个for循环可以去掉,根本不用什么转换了,比如time[7]={0, 0, 0x12, 0x30, 0x03, 0x07, 0x14};
直接保存进去就是2014-03-30 12-00-00了。
第二:你程序不能正常显示是因为你的读取有问题,以此总是显示0.我发我改过后的程序给你,不懂再来问。
- void ds1302init(void)
- {
- uchar n; //temp也不要了
- /* for (n=0; n<7; n++)
- {
- tmp = time[n] / 10;
- time[n] = time[n] % 10;
- time[n] = time[n] + tmp*16;
- } */ //这部分可以去掉
- ds1302write(0x8E,0x00);
- for(n=0;n<7;n++)
- {
- ds1302write(writeaddr[n],time[n]);
- }
- ds1302write(0x8E,0x80);
- }
- uchar ds1302read(uchar addr)
- {
- uchar n,dat; //dat1去掉
- RST=0;
- _nop_();
- SCLK=0;
- _nop_();_nop_();_nop_();
- 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;
- // dat=dat1<<7; // 这句也不要
- if(DSIO) //我换一个方法,DSIO为1的时候最高位为1,否则为0
- {
- dat|=0x80; //每次传输低字节
- }
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- }
- RST=0;
- _nop_();
- SCLK=1;
- _nop_();
- DSIO=0;
- _nop_();
- DSIO=1;
- _nop_();
- return dat;
- }
又经过本人亲身测试,发现你的程序有一些问题。第一:DS1302初始化有问题,
- void ds1302init(void)
- {
- uchar n,tmp;
- for (n=0; n<7; n++)
- {
- tmp = time[n] / 10;
- time[n] = time[n] % 10;
- time[n] = time[n] + tmp*16;
- }
- ds1302write(0x8E,0x00);
- for(n=0;n<7;n++)
- {
- ds1302write(writeaddr[n],time[n]);
- }
- ds1302write(0x8E,0x80);
- }
第一个for循环可以去掉,根本不用什么转换了,比如time[7]={0, 0, 0x12, 0x30, 0x03, 0x07, 0x14};
直接保存进去就是2014-03-30 12-00-00了。
第二:你程序不能正常显示是因为你的读取有问题,以此总是显示0.我发我改过后的程序给你,不懂再来问。
- void ds1302init(void)
- {
- uchar n; //temp也不要了
- /* for (n=0; n<7; n++)
- {
- tmp = time[n] / 10;
- time[n] = time[n] % 10;
- time[n] = time[n] + tmp*16;
- } */ //这部分可以去掉
- ds1302write(0x8E,0x00);
- for(n=0;n<7;n++)
- {
- ds1302write(writeaddr[n],time[n]);
- }
- ds1302write(0x8E,0x80);
- }
- uchar ds1302read(uchar addr)
- {
- uchar n,dat; //dat1去掉
- RST=0;
- _nop_();
- SCLK=0;
- _nop_();_nop_();_nop_();
- 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;
- // dat=dat1<<7; // 这句也不要
- if(DSIO) //我换一个方法,DSIO为1的时候最高位为1,否则为0
- {
- dat|=0x80; //每次传输低字节
- }
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- }
- RST=0;
- _nop_();
- SCLK=1;
- _nop_();
- DSIO=0;
- _nop_();
- DSIO=1;
- _nop_();
- return dat;
- }
举报