为什么DS1302读取的时间不走?

2020-01-27 11:44发布

#include<reg52.h>
#include<lcd1602xs.h>
#define uchar unsigned char
#define uint unsigned int
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define WRITE_PROTECT 0x8E
sbit ACC_7=ACC^7;//位寻址寄存器定义
sbit SCLK=P1^6; // DS1302时钟信号         6脚
sbit DIO=P1^7;  // DS1302数据信号         7脚
sbit CE=P1^5;   // DS1302片选            5脚
void Initial( );
void Write1302 ( uchar addr,dat ) ;
uchar Read1302 (uchar addr );
uchar miao;            
void main()
{
  lcdinit();//1602初始化
  Initial();//时钟初始化
  while(1)
{
  miao=Read1302(READ_SECOND);//读取秒
  lcddisp(10,miao);//显示秒
}
}
void Write1302 ( uchar addr,dat ) //地址、数据发送子程序   
{
       uchar i,temp;
       CE=0;                         //CE引脚为低,数据传送中止
       SCLK=0;                    //清零时钟总线
       CE = 1;                       //CE引脚为高,逻辑控制有效//发送地址
       for ( i=8; i>0; i-- ) //循环8次移位
       {     
              SCLK=0;
              temp=addr;
              DIO=(bit)(temp&0x01);//每次传输低字节
              addr>>= 1;//右移一位
              SCLK=1;//发送数据
       }
      
       for ( i=8; i>0; i-- )
       {     
              SCLK=0;
              temp=dat;
              DIO=(bit)(temp&0x01);         
              dat>>=1;                  
              SCLK=1;
       }
              CE=0;         
}
uchar Read1302 (uchar addr )//数据读取子程序
{
       uchar i,temp,dat1,dat2;
       CE=0;           
       SCLK=0;            
       CE=1;
      
       for ( i=8; i>0; i-- ) //发送地址                      //循环8次移位
       {     
              SCLK=0;
              temp=addr;
              DIO=(bit)(temp&0x01);//每次传输低字节
              addr>>=1;         //右移一位
              SCLK=1; //读取数据
       }
      
       for ( i=8;i>0;i--)
       {
              ACC_7=DIO;
              SCLK=0;
              ACC>>=1;
              SCLK=1;
       }     
       CE=0;
       dat1=ACC;
       dat2=dat1/16;         //数据进制转换
       dat1=dat1%16;        //十六进制转十进制
       dat1=dat1+dat2*10;
       return (dat1);
}
void Initial( )//初始化DS1302   
{
       Write1302(WRITE_PROTECT,0X00);          //禁止写保护
       Write1302(WRITE_SECOND,0x56);          //秒位初始化
       Write1302(WRITE_MINUTE,0x34);         //分钟初始化
       Write1302(WRITE_HOUR,0x12);          //小时初始化
       Write1302(WRITE_PROTECT,0x80);      //允许写保护
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
jxcylxh
1楼-- · 2020-01-27 13:58
要使能时钟吧。
jxcylxh
2楼-- · 2020-01-27 18:49
 精彩回答 2  元偷偷看……
4758866
3楼-- · 2020-01-27 18:54
找到问题了是时序的问题
hehz966
4楼-- · 2020-01-27 22:32
写入的数据错误或受到干扰后ds1302内部数据错误也会停走,重新写入正确数据即可
armku
5楼-- · 2020-01-28 02:04
1302读取的秒钟是60以上的,时间不走,需要把秒设为60以下写入1302,时间就走了。
5000
6楼-- · 2020-01-28 03:41
最近做了个时钟,遇到同样的问题,求具体一点的指教啊。

一周热门 更多>