51单片机连接ds1302时钟芯片,为什么不能正常工作,2秒走时,还超过60。

问题1:时间初值设置的是11时22分33秒,但是上电后的时间是31时35分31秒
问题2:2秒走时,中途还会退数走下,在进数走,还会超过60。
----------------------------------------------------
硬件是没有问题的,用他们的程序是可以正常工作的,

冲电方式是按他们的方式写的(write_data(0x90,0xa6); //一个二极管+4K电阻充电)
-----------------------------------------------------
sec,min,hour直接读取1302对应0x80,0x83,0x85寄存器,然后数码管直接显示。
-----------------------------------------------------
程序自认为没有问题的(如下图),就是不知道为什么不能正常工作???
高手朋友,分析下,谢谢!
-------------------------------------------------------
#include "DS1302.h"
uchar hour,min,sec;
sbit CLK=P1^0; //ds1302的时钟线
sbit DIO=P1^1; //ds1302的数据线
sbit CE=P1^2; //ds1302的复位线
//--------------写入1字节------------
void write_byte(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
DIO=x&0x01;

CLK=1;
x>>=1;
}
}
//-------------读1个字节--------------
uchar read_byte(void) //读一个字节函数
{
uchar i,datt;
for(i=0;i<8;i++)
{
CLK=1;
datt>>=1;
if(DIO==1)
datt|=0x80;

CLK=0;
}
DIO=0; //消除85显示
return ((datt&0x70)>>4)*10+(datt&0x0f); // 返回:BCD码转10进制
}
//-------------读取数据---------------
uchar read_data(uchar addr)
{
uchar dat;
CLK=0;
CE=1;
write_byte(addr);
dat=read_byte();
CLK=1;
CE=0;
return dat;
}
//------------写入命令和数据-----------
void write_data(uchar addr,uchar dat)
{
CLK=0;
CE=1;
write_byte(addr);
write_byte(dat);
CLK=0; //CLK=1也是一样的问题
CE=0;
}
//------------初始化--------------
void init_1302()
{
write_data(0x8e,0x00); //关闭写保
write_data(0x80,(33/10<<4)|(33%10)); //初始化秒 10进制转BCD码
write_data(0x82,(22/10<<4)|(22%10)); //初始化分 ---
write_data(0x84,(11/10<<4)|(11%10)); //初始化时 ---
write_data(0x90,0xa6); //一个二极管+4K电阻充电
write_data(0x8e,0x80); //打开写保护。
}
//---------ds1302中读取时间-----------
void ds1302_time()
{
sec=read_data(0x81);
min=read_data(0x83);
hour=read_data(0x85);
}

读时序的程序写错了,好好看看手册,什么时候1302输出(单片机才能读)。追问

秒的走时1,3,5,7,9,11,13,15,11,13,21,23,25,27,29,31,33,36,31,33,41,45,47,49,51,53,55,51,53,51,53,65,57,59,71,73,75,71,73,(1)一个周期分进位1。

单独试了,写0,读出来是1,写1读出来是2,与秒走时是对应的,请问这是怎么了。
BCD码与10进制转换好像没问题的呢???

追答

读DS1302时,数据是在下降沿后输出来的。你程序读时序是错的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-01-10
你好!你是仿真还是用的实物?程序不全追问

是学习板,程序不全指的是哪里。数码管的程序就没有复制上来,数码管显示是正常的。1302就只读sec,min,hour给数码管显示的。

相似回答