找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15126|回复: 7
打印 上一主题 下一主题
收起左侧

DS1302断电后时间如何保持?

[复制链接]
跳转到指定楼层
楼主
ID:24736 发表于 2010-6-26 19:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,我在51hei开发板上对DS1302实例进行修改,使其能在LCD1602上显示,但是关闭开发板电源后时间不能保持!这个芯片不是能够断电保持时间吗,怎样开启这个功能啊,我的板子上是有电池的。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2010-6-26 21:00 | 只看该作者

   原因在于你关闭电源后,程序他又重新初始化一次时间为你所设置的值,所以你每次开电源都是显示的一样的时间值,你必须要把那一段初始化的代码删掉才行.

 

   在开发板的例程中我给出了一个可以断电保存的,你下载进去就可以发现他断电后时间依然是在跑的.
源代码下载地址是:http://www.51hei.com/bbs/dpj-2810-1.html

[此贴子已经被作者于2010-6-26 21:04:55编辑过]
回复

使用道具 举报

板凳
ID:24736 发表于 2010-6-28 15:27 | 只看该作者
  1. /************************************************
  2. 跳线设置:默认跳线位
  3. 晶振:11.0592M
  4. 硬件结构框架:
  5.             1,四位八段数码管
  6.             2,MCU  STC89C52
  7. 显示效果:
  8.             1,数码管上显示:时,分
  9.             2,数码管分位的小数点闪烁表示秒
  10.             3,时间初始值10.59.50秒
  11. 相关知识点:
  12.             1,DS1302实时时钟的操作
  13. ************************************************/

  14. #include"AT89x52.h"

  15. #define  uchar  unsigned char
  16. #define  unint   unsigned int

  17. sbit T_CLK=P1^0;  /* 实时时钟的时钟线引脚*/
  18. sbit T_IO=P1^1;   /* 实时时钟的数据线*/
  19. sbit T_RST=P2^0;  /* 实时时钟的复位线引脚*/

  20. sbit DUAN=P2^6;     //74HC573的LE端    LED的段选端
  21. sbit WEI=P2^7;      //74HC573的LE端    LED的位选端

  22. unint  a[6];//={0,0,0,0,0,0};             /*位段的数字*/
  23. uchar code ledk[]=
  24.       {
  25.         0x3f,/*0*/
  26.         0x06,/*1*/
  27.         0x5b,/*2*/
  28.         0x4f,/*3*/
  29.         0x66,/*4*/
  30.         0x6d,/*5*/
  31.         0x7d,/*6*/
  32.         0x07,/*7*/
  33.         0x7f,/*8*/
  34.         0x6f,/*9*/
  35.           0x40,}; /*-*/

  36. unint  ucCurtime[7]={50,59,10,6,4,1,9}; // 秒 分 时 日 月 星期 年
  37. unint temp;
  38. uchar jg1,jg2,temp1;

  39. void delay()               //延时
  40. {
  41.     uchar m,n;
  42.     for(m=10;m>0;m--)
  43.     for(n=100;n>0;n--);
  44. }

  45. void wei_1(uchar wei)       //锁存器573的数码管位控制
  46. {
  47.     WEI=1;
  48.     P0=wei;
  49.     WEI=0;
  50. }

  51. void duan_1(uchar duan)       //锁存器573的数码管段控制
  52. {
  53.     unint i;
  54.     DUAN=1;
  55.     P0=ledk[duan];
  56.     DUAN=0;
  57.     for(i=200;i>0;i--);
  58. }

  59. void v_RTInputByte(uchar ucDa)        //写
  60. {
  61.     uchar i;
  62.     ACC=ucDa;
  63.     for(i=8;i>0;i--)
  64.     {
  65.         if((ACC&0x01)==1)  
  66.         //T_IO=ACC0;  /* 相当于汇编中的RRC */
  67.         T_IO=1;
  68.         else T_IO=0;//if((ACC&0x01)==0)
  69.         T_CLK=1;
  70.         T_CLK=0;
  71.         ACC=ACC>>1;
  72.     }
  73. }

  74. uchar uc_RTOutputByte(void)          //读
  75. {
  76.     uchar i,ACC;
  77.     ACC=0;
  78.     for(i=0;i<8;i++)
  79.     {
  80.         ACC=ACC>>1;   /*相当于汇编中的RRC*/
  81.         if(T_IO==1)
  82.         ACC=ACC|0x80;
  83.         T_CLK=1;
  84.         T_CLK=0;
  85.     }
  86.     return(ACC);
  87. }

  88. void v_W1302(uchar ucAddr,uchar ucDa)     //指定地址写数据
  89. {
  90.     T_RST=0;
  91.     T_CLK=0;
  92.     T_RST=1;
  93.     v_RTInputByte(ucAddr);  /*地址,命令*/
  94.     v_RTInputByte(ucDa);    /*写1Byte数据*/
  95.     T_CLK=1;
  96.     T_RST=0;
  97. }

  98. uchar uc_R1302(uchar ucAddr)     //指定地址读数据
  99. {
  100.     unsigned char ucDa,k;  //BCD转换成16进制
  101.     k=0x00;
  102.     T_RST=0;
  103.     T_CLK=0;
  104.     T_RST=1;
  105.     v_RTInputByte(ucAddr);  /*地址,命令*/
  106.     ucDa=uc_RTOutputByte(); /*读取1Byte数据*/
  107.     T_CLK=1;
  108.     T_RST=0;
  109.     k=ucDa/16;
  110.     ucDa=ucDa%16;
  111.     ucDa=ucDa+k*10;
  112.     return(ucDa);
  113. }

  114. void v_Set1302()//uchar *pSecDa)    设置初始时间值
  115. {
  116.     uchar i,j;
  117.     uchar ucAddr=0x80;         //秒写地址
  118.     v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
  119.     for(i=0;i<7;i++)       //连续写入7个时间
  120.     {
  121.         j=ucCurtime[i];       //代入初始时间
  122.         v_W1302(ucAddr,j); /* 秒 分 时 日 月 星期 年 */
  123.         ucAddr +=2;         //地址+2
  124.     }
  125.     v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
  126. }

  127. void v_Get1302()         //记录时间
  128. {
  129.     uchar i;
  130.     uchar ucAddr=0x81;     //秒读地址
  131.     for (i=0;i<7;i++)       //连续读数据
  132.     {
  133.         ucCurtime[i]=uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
  134.         ucAddr +=2;
  135.     }
  136. }

  137. void  t2_10()         //数码管段数字显示内容
  138. {
  139.     unint k;
  140.     a[5]=temp1/10;
  141.     a[4]=temp1%10;
  142.     a[3]=temp/1000;
  143.     k=temp%1000;
  144.     a[2]=k/100;
  145.     k=k%100;
  146.     a[1]=k/10;
  147.     a[0]=k%10;
  148. }

  149. void display2()         //显示
  150. {
  151.     t2_10();
  152.     wei_1(0x7f);    /*秒*/
  153.     duan_1(a[0]);
  154.     wei_1(0xbf);
  155.     duan_1(a[1]);
  156.     wei_1(0xdf);    /*-*/
  157.     duan_1(10);
  158.     wei_1(0xef);   /*分*/
  159.     duan_1(a[2]);
  160.     wei_1(0xf7);
  161.     duan_1(a[3]);
  162.     wei_1(0xfb);    /*-*/
  163.     duan_1(10);
  164.     wei_1(0xfd);   /*时*/
  165.     duan_1(a[4]);
  166.     wei_1(0xfe);
  167.     duan_1(a[5]);
  168.     wei_1(0xff);   /*灭*/
  169. }

  170. void main2(void)
  171. {
  172.     v_Get1302();                              //记录时间
  173.     temp1=ucCurtime[2];                       //时
  174.     temp=ucCurtime[1]*100+ucCurtime[0];       //分+秒
  175.     display2();                               //显示
  176. }

  177. void main()
  178. {
  179.     unint i,k;
  180.     for(i=0;i<7;i++)       //将10进制转换成16进制
  181.     {
  182.         k=ucCurtime[i]/10;
  183.         ucCurtime[i]=ucCurtime[i]%10;
  184.         ucCurtime[i]=ucCurtime[i]+16*k;
  185.     }
  186.     v_Set1302();           //时间初值
  187.     while(1)main2();
  188. }

复制代码
回复

使用道具 举报

地板
ID:1 发表于 2010-6-29 02:54 | 只看该作者

倒数第2行,干掉他就行了,不过干掉之前别忘记了装上电池初始化ds1302的时间

v_Set1302();   //时间初值

回复

使用道具 举报

5#
ID:92231 发表于 2015-11-6 14:50 来自手机 | 只看该作者
很好的实例,学习中进步
回复

使用道具 举报

6#
ID:36359 发表于 2020-2-13 20:47 | 只看该作者
借鉴一下 学些学习
回复

使用道具 举报

7#
ID:950830 发表于 2021-11-1 20:10 来自手机 | 只看该作者
admin 发表于 2010-6-29 02:54
倒数第2行,干掉他就行了,不过干掉之前别忘记了装上电池初始化ds1302的时间
v_Set1302();  &nb ...

有用,非常感谢
回复

使用道具 举报

8#
ID:976070 发表于 2021-12-18 23:09 | 只看该作者
留爪,好用!!!!!!111
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表