个人用C51写的时钟芯片DS1302程序代码,开始上电就是无法正常显示读取时间,按一下单片机的复位就可以

开始上电时八位七段码数显管总是显示00-00-00,按一下复位按键才可以正常显示想要的数据,问题倒底出在哪里,求大神指点迷经!以下是程序内容:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define LED P2
#define wei P1
sbit SCL=P1^3; //时钟
sbit IO=P1^4; //数据
sbit RST=P1^5; //复位
/*************************************函数声明*****************************************************/
uchar Read_DS1302(uchar address); //根据地址读取数据
void WriteByteDS1302(uchar dat); //字节写入
void Write_DS1302(uchar address,uchar dat); //根据地址写入数据
void SetDS1302(); //设置初值
void JSHS(uchar val,uchar i); //BCD码数据处理
void ECHO(uchar lc,uchar *lp); //显示函数
void delay(uchar t); //延时
void Read_RTC(); //读取秒、分、时寄存器
/**************************************************************************************************/
uchar code temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //'0~9' '-' 数显段码
uchar code Rcmd[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,0x8f,0x91,0xbf}; //读命令字
uchar code Wcmd[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,0x90,0xbe}; //写命令字
uchar disp[8]={1,2,10,3,0,10,3,4}; //显示缓冲区
uchar l_temp[]={0x00,0x20,0x23}; //设置 秒,分,时 初值

void main(void)
{ SetDS1302();
while(1)
{ Read_RTC();
ECHO(8,disp);
}
}

void Read_RTC()
{ uchar i,j;
for(i=0,j=2;i<3;i++)
{ l_temp[i]=Read_DS1302(Rcmd[i]);
JSHS(l_temp[i],j);
j--;
}
}
void delay(uchar t) //延时函数;
{ while(--t); }

void SetDS1302() //设置初值函数;
{ uchar i;
Write_DS1302(Wcmd[7],0x00); //解除写保护;
for(i=0;i<3;i++)
{ Write_DS1302(Wcmd[i],l_temp[i]); //循环设置 秒、分、时 寄存器;
}
Write_DS1302(Wcmd[7],0x80); //写保护;
}

void JSHS(uchar val,uchar i) //BCD码转换函数;
{
disp[2]=10;disp[5]=10;
disp[i*3]=val>>4;
disp[i*3+1]=val&0x0f;
}
uchar Read_DS1302(uchar address) //根据地址读取字节函数;
{ uchar i,dat;
RST=0;
_nop_();
SCL=0;
_nop_();
RST=1;
_nop_();
WriteByteDS1302(address);
for(i=0;i<8;i++)
{ dat>>=1;
SCL=0;
_nop_();
if(IO)
dat|=0x80;
SCL=1; //尾高
}
RST=0;
_nop_();
IO=0;
return(dat);
}

void Write_DS1302(uchar address,uchar dat) //根据地址写入数据;
{ RST=0;
_nop_();
SCL=0;
_nop_();
RST=1;
_nop_();
WriteByteDS1302(address);
WriteByteDS1302(dat);
RST=0;
}

void WriteByteDS1302(uchar dat) //写入字节函数;
{ uchar i;
for(i=0;i<8;i++)
{ SCL=0;
IO=dat&0x01;
dat>>=1;
SCL=1; //尾高
}
}

void ECHO(uchar lc,uchar *lp) //显示函数;
{ uchar i;
for(i=0;i<lc;i++)
{ wei=i;
LED=temp[lp[i]];
delay(250);
LED=0;
}
}

这个问题好解决,把main修改一下,增加下面的四行应该就好了:

void main(void)


  uchar i; 
  for(i=0;i<100;i++){ 
      delay(250);
  }   
  SetDS1302();

   while(1)

 { Read_RTC();   

   ECHO(8,disp);

   }

}

追问

想必您加上这四句的用的用意是为让时钟芯片有时间做好准备。但我已按照您说的加入进去,问题依旧。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答