调试DS1302遇到问题,时钟不走

2020-02-08 12:19发布

DS1302的驱动程序是参考别人的,略作修改,我读到的数据都是我设置的初始数据,时钟不走,秒寄存器我初始设置的0,也就是把启动时钟的那个CH位给清零了,按道理来说应该走才对啊,晶振两个引脚电压一个是2.6V(连接1302 X2引脚)、一个是0V(连接1302 X1引脚),IO SCLK CE我都没给上拉电阻,只是开启了单片机的内部上拉
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
surf_131
1楼-- · 2020-02-08 22:53
在程序对时钟初始化时,先设置reset=0,然后再开reset=1,初始化后时钟一般就会行走了。我碰到时钟不走就用这个方法解决的。请看下面的程序片断。

void WriteDs1302(unsigned char addr, unsigned char code)
{
     RST = 0;                                              //便能清零
     CLK = 0;                                              //时钟清零
     RST = 1;                                              //使用有效
      
     WriteByte(addr & 0xfe);                               //写入地址
     WriteByte(code);                                      //写入数据
   
     CLK = 1;                                              //时钟置位
     RST = 0;                                              //便能失效
}
//DS1302初始化函数
void ds1302_init()
  {
   CLK=0;                            //拉低时钟信号
   RST =0;                            //复位DS1302
   RST=1;                             //使能DS1302
   WriteDs1302(0x8e,0);                //发控制命令
   RST=0;                             //复位
  }
4fwnf
2楼-- · 2020-02-09 05:04
回复【3楼】surf_131
-----------------------------------------------------------------------

感谢了 ,我之前也是时间一直不动,接受你的建议给每个写都加了,终于动了


;#################################################################################
; 使用r0控制位数
;
;
;
;#################################################################################

SCLK EQU p3.6
RST  EQU p3.5
IO   EQU p3.4
         
           org 0000h

           ;org 0030h
START  :
       ;mov p0,#71H
           ;mov p2,#00h
           ;mov r0,#10
           ;CALL Delay_1s

           mov dptr,#TABLE
           CLR RST                                   ;给个起始点
           CLR SCLK
           CALL Init_1302

Read_Time :
;*************************************************************************
         CLR RST                                   ;给个起始点
         CLR SCLK
         SETB RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #1

         mov r0,#8
         mov a,#8eh         ;取消写保护=> 控制字
         CALL Write_1302

         mov r0,#8
         mov a,#00000000b         ;取消写保护 =>数据
         CALL Write_1302

         CLR RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #2
;******************* 读时间数据 START ***************************************
     CLR p1.1
         CLR RST                                   ;给个起始点
         CLR SCLK
         SETB RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #1

         mov r1,#8

         mov r0,#8
         mov a,#81h         ;读秒=> 控制字
         CALL Write_1302

         ;mov r0,#8
         ;CLR C
         mov a,#00h         ;读秒 =>数据
         CALL Read_1302  

         CLR RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #2
;*************************读时间数据 END ***************************************


         CALL Display_Time
         JMP Read_Time
         ;JMP $

Init_1302 :
;*************************************************************************
         CLR RST                                   ;给个起始点
         CLR SCLK
         SETB RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #1

         mov r0,#8
         mov a,#8eh         ;取消写保护=> 控制字
         CALL Write_1302

         mov r0,#8
         mov a,#00000000b         ;取消写保护 =>数据
         CALL Write_1302

         CLR RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #2
;************************************************************************
         CLR RST                                   ;给个起始点
         CLR SCLK
         SETB RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #1

         mov r0,#8
         mov a,#84h         ;时的初始化=> 控制字
         CALL Write_1302

         mov r0,#8
         mov a,#00010000b         ;时的初始化 =>数据
         CALL Write_1302

         CLR RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #2
;***********************************************************************
         CLR RST                                   ;给个起始点
         CLR SCLK
         SETB RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #1

         mov r0,#8
         mov a,#82h         ;分的初始化=> 控制字
         CALL Write_1302

         mov r0,#8
         mov a,#00000000b         ;分的初始化 =>数据
         CALL Write_1302

         CLR RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #2
;*************************************************************************
         CLR RST                                   ;给个起始点
         CLR SCLK
         SETB RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #1

         mov r0,#8
         mov a,#80h         ;秒的初始化=> 控制字
         CALL Write_1302

         mov r0,#8
         mov a,#00000000b         ;秒的初始化 =>数据
         CALL Write_1302

         CLR RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #2
;*************************************************************************
         CLR RST                                   ;给个起始点
         CLR SCLK
         SETB RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #1

         mov r0,#8
         mov a,#8eh         ;使能写保护=> 控制字
         CALL Write_1302

         mov r0,#8
         mov a,#10000000b         ;使能写保护 =>数据
         CALL Write_1302

         CLR RST         ; 在写控制字/读数据时必须卡在 控制字与数据 两头 #2
;***********************************************************************

            RET
         
Write_1302 :
     CLR SCLK
         RRC a
         mov IO,C
         NOP
         SETB SCLK
         DJNZ r0,Write_1302

         RET

Read_1302  :
         CLR SCLK
         NOP
         NOP
         mov C,IO
         NOP
         RRC a
         SETB SCLK
         DJNZ r1,Read_1302  

     RET


;####################数码管显示 START ########################################

Display_Time :
      ANL a,#0fh
          movc a,@a+dptr
          mov p0,a
          mov p2,#00h
          mov r1,#10
          CLR p1.0
          CALL Delay_1s

          RET
;######################数码管显示 END ##############################################

;########################  延时 START#################################


Delay_1s :
      CALL Delay
          DJNZ r1,Delay_1s           
Delay :
      mov r7,#180
Delay1:
      mov r6,#250
          DJNZ r6,$
          DJNZ r7,Delay1

          RET
;########################  延时 END  #################################

TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H    ;共阴字码表

          END
role_2099
3楼-- · 2020-02-08 17:20
问题解决了,是IC问题。买了两片居然不良率50%
mbq168
4楼-- · 2020-02-08 18:06
楼主 你好 我也是你一样的问题 我买了4片 只有一片能走 我了个擦
kerrwang1982
5楼-- · 2020-02-09 00:03
 精彩回答 2  元偷偷看……
yealien
6楼-- · 2020-02-09 02:42
3楼你好:

“WriteDs1302(0x8e,0);                //发控制命令 ”是什么意思呢?8eH的地址是写保护寄存器的地址啊?如果WP=1,写保护,寄存器数据不能写入啊?
还有80H寄存器的CH位你也没有写啊,振荡器片么工作呢?



求解答一下。

多谢了!

一周热门 更多>