登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

请教关于DS1302的问题

作者:hubo450 栏目:单片机
请教关于DS1302的问题
    小弟根据网上找到的程序,结合读DS1302的datasheet,写了程序,但是设置日期和时间后,读出来都是ff或者fe等,怎么改也没有成功。有两个问题请教高手:
1、使用示波器量了DS1302的晶振脚,没有振荡波形,我搞不清楚是否一加电,32768HZ的晶体就开始振荡?
2、我读到的资料中是DS1302应该在上升沿触发,把数据总线上的数据写进去,读也是这样,我的程序如下:
;////////////////////////////////////////////
;    DS1302的控制程序
;/////////////////////////////////////////////
;    DS1302的引脚定义
;////////////////////////////////////////////
    rtc_rst equ P2.7
        rtc_clk equ P2.0
        rtc_io  equ P2.1
;////////////////////////////////////////////
;                     DS1302用到的寄存器定义
;///////////////////////////////////////////
        address equ 60h
        tmdata  equ 61h
        year    equ 62h
        month   equ 63h
        day     equ 64h
        hour    equ 65h
        min     equ 66h
        sec     equ 67h
        year1   equ 68h
        month1  equ 69h
        day1    equ 6ah
        hour1   equ 6bh
        min1    equ 6ch
        sec1    equ 6dh
         org 0000H
         ljmp main
         org 0100h
main:
         mov year, #06h
         mov month,#03h
         mov day,  #13h
         mov hour, #00h
         mov min,  #10h
         mov sec,  #00h
         lcall ds_op
         nop
         lcall ds_setday
         nop
         nop
         lcall  ds_settm
         nop
         lcall  ds_rdday
         nop
         nop
         lcall  ds_rdtm
         nop


;///////////////////////////////////////////////
;                DS1302读日期
;///////////////////////////////////////////////
ds_rdday:
         lcall ds_op
         mov address,#8bh
         lcall ds_rddata
         mov day1,r7;读日期
         mov address,#89h
         lcall ds_rddata
         mov month1,r7;读月份
         mov address,#8dh
         lcall ds_rddata
         mov year1,r7;读年份
         ret
;///////////////////////////////////////////////
;                DS1302读时间
;///////////////////////////////////////////////
ds_rdtm:   lcall ds_op
           mov address,#81h
           lcall ds_rddata
           mov  sec1,r7 ;读秒
           mov address,#83h
           lcall ds_rddata
           mov min1,r7  ;读分
           mov address,#85h
           lcall ds_rddata
           mov hour1,r7 ;读小时
           ret
;///////////////////////////////////////////////
;                DS1302设置日期
;//////////////////////////////////////////////
ds_setday: lcall ds_op
           mov address,#8ah
           mov tmdata,day
           lcall ds_wrdata ;写日期
           mov address,#88h
           mov tmdata,month
           lcall ds_wrdata;写月份
           mov address,#8ch
           mov tmdata,year
           lcall ds_wrdata;写年
           ret
;///////////////////////////////////////////////
;                DS1302设置时间
;//////////////////////////////////////////////
ds_settm:  lcall ds_op;打开写保护
           mov address,#80h
           mov tmdata,sec
           lcall ds_wrdata;写秒
           mov address,#82h
           mov tmdata,min
           lcall ds_wrdata;写分
           mov address,#84h
           mov tmdata,hour
     &nbs
2楼: >>参与讨论
leituoxin
你的程序我没看
你的程序我没看,如果是没有振荡的话,你可能振荡的控制字没有写,DS1302有停振的控制字

3楼: >>参与讨论
sixpower
我能通过的程序
void rd_DS1302(void)               
           {
         byte i;
         byte t2;
         byte ddd;
        
         IO=1;
         RST=0;
         CLK=0;

         t2=10;
           while(t2){t2--;}
        RST=1;
        t2=10;

      for(i=0;i<8;i++) {
        CLK=0;

        ddd=ds_add;
        ddd=ddd & 0x01;
        if(ddd==0x00) IO=0;  
          else IO=1;
         
          t2=10;
        while(t2){t2--;}
           CLK=1;
          ds_add=ds_add>>1;

       t2=10;
        while(t2){t2--;}
         }
      
         IO=1;
         ds_data=0;
        for(i=0;i<8;i++) {
        CLK=0;
         t2=5;
         while(t2){t2--;}
        ds_data=ds_data>>1;
       if(IO==1) ds_data=ds_data | 0x80;
       CLK=1;
       t2=5;
       while(t2){t2--;}
        ;

         }
       RST=0;
    }


void wr_DS1302(void)               
           {
         byte i;
         byte t2;
         byte ddd;
        
         IO=1;
         RST=0;
         CLK=0;

         t2=3;
           while(t2){t2--;}
        RST=1;
        t2=10;

      for(i=0;i<8;i++) {
        CLK=0;

        ddd=ds_add;
        ddd=ddd & 0x01;
        if(ddd==0x00) IO=0;  
          else IO=1;
         
          t2=3;
        while(t2){t2--;}
           CLK=1;
          ds_add=ds_add>>1;

       t2=3;
        while(t2){t2--;}
         }
      

            for(i=0;i<8;i++) {
        CLK=0;

        ddd=ds_data;
        ddd=ddd & 0x01;
        if(ddd==0x00) IO=0;  
          else IO=1;
         
          t2=3;
        while(t2){t2--;}
           CLK=1;
          ds_data=ds_data>>1;

       t2=10;
        while(t2){t2--;}

         }
    RST=0;
    }



         ds_add=0x81;  // DS1302读数据
         rd_DS1302();

         ds_add=0x80;    //DS1302写数据
         ds_data=mem_data;
         wr_DS1302();



4楼: >>参与讨论
hubo450
振荡的命令字是把秒寄存器清0吗?
 
5楼: >>参与讨论
leituoxin
振荡的命令字是把秒寄存器清0吗?
是的。

6楼: >>参与讨论
winhiwang
上电后32768是不振的,要软件启动,我之前发过帖子可查找一下
 
7楼: >>参与讨论
sdyxm21
[


参与讨论
昵称:
讨论内容:
 
 
相关帖子
软硬件复位
急求编程一份
求助,只有一个串口怎么扩展,进行多单片机通讯呀
单片机引脚刚好少一个最好怎么办
12M晶体得到9600波特率
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号