123456789 发表于 2024-2-11 23:19:47

ds1302模块显示不出来时间就是000000,该怎么解决?

程序如下,
/****************************
       DS1302内部函数
*****************************/
#ifndef _ds1302_h_
#define _ds1302_h_
sbit T_RST=P3^5;
sbit T_CLK=P3^6;
sbit T_IO=P3^4;

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
typedef struct systemtime
{
   uchar second;
      uchar minute;
      uchar hour;
      uchar week;
      uchar day;
      uchar month;
      uchar year;
      uchar DateString;
      uchar TimeString;
}systemtime;      //定义的时间类型
/*向DS1302中写入1BYTE数据*/
void writeB(uchar ucda)
{
   uchar i;
   ACC=ucda;
      for(i=8;i>0;i--)
          {
            T_IO=ACC0;
               T_CLK=1;
               T_CLK=0;
               ACC=ACC>>1;
          }
//      T_IO=0;
}
/*从DS1302中读出1BYTE数据*/
uchar readB()
{
uchar i;
for(i=8;i>0;i--)
    {
         ACC=ACC>>1;
                ACC7=T_IO;
                T_CLK=1;
                T_CLK=0;
         }
return(ACC);
}
/*单字节读,向DS1302某地址中读出数据,
先写地址后写命令/数据*************/
uchar r_ds1302(uchar ucaddr)
{
uchar ucda;
T_RST=0;
T_CLK=0;
T_RST=1;
writeB(ucaddr);
ucda=readB();
T_CLK=1;
T_RST=0;
return(ucda);
}
/**********************************
读取 DS1302当前时间,
格式为:
   秒,分,时,日,月,星期,年
**********************************/
void get_ds1302(systemtime *Time)
{
   uchar readtime;
   readtime = r_ds1302(0x81);//秒寄存器读操作0x81
      Time->second = ((readtime&0x70)>>4)*10 + (readtime&0x0f); //十位+个位
      readtime = r_ds1302(0x83);//分寄存器读操作0x83
      Time->minute = ((readtime&0x70)>>4)*10 + (readtime&0x0f);
      readtime = r_ds1302(0x85);
      Time->hour = ((readtime&0x70)>>4)*10 + (readtime&0x0f);
      readtime = r_ds1302(0x87);
      Time->day = ((readtime&0x70)>>4)*10 + (readtime&0x0f);      

      readtime = r_ds1302(0x89);
      Time->month = ((readtime&0x70)>>4)*10 + (readtime&0x0f);
      readtime = r_ds1302(0x8d);
      Time->year = ((readtime&0x70)>>4)*10 + (readtime&0x0f);

          //将十进制数转换为液晶显示的ASCII值
      Time->DateString = Time->year/10 + '0';
      Time->DateString = Time->year%10 + '0';
      Time->DateString = '-';
      Time->DateString = Time->month/10 + '0';
      Time->DateString = Time->month%10 + '0';
      Time->DateString = '-';
      Time->DateString = Time->day/10 + '0';
      Time->DateString = Time->day%10 + '0';
      Time->DateString = '\0';

      //将十进制数转换为液晶显示的ASCII值
      Time->TimeString = Time->hour/10 + '0';
      Time->TimeString = Time->hour%10 + '0';
      Time->TimeString = ':';
      Time->TimeString = Time->minute/10 + '0';
      Time->TimeString = Time->minute%10 + '0';
      Time->TimeString = ':';
      Time->TimeString = Time->second/10 + '0';
      Time->TimeString = Time->second%10 + '0';
      Time->TimeString = '\0';
}
#endif
页: [1]
查看完整版本: ds1302模块显示不出来时间就是000000,该怎么解决?