ds1302的断电保护功能怎么用呀

2019-03-24 17:44发布

用1302写的时钟,断电后又是初始界面,电池没起到作用,哪位大神会教教我,万分感谢
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
lcofjp
1楼-- · 2019-03-25 03:31
 精彩回答 2  元偷偷看……
狼牙小帅
2楼-- · 2019-03-25 06:55
硬件就在上面加了一个纽扣电池,应该是软件问题
狼牙小帅
3楼-- · 2019-03-25 08:55
  1. #include"ds1302.h"
  2. /***********************************************************************
  3. 以下是DS1302芯片的操作程序
  4. ************************************************************************/
  5. //extern uchar inittime[7]={0x50,0x59,0x23,0x24,0x07,0x05,0x09};        //初始化后设置为:09年7月24日星期5 23点59分50秒
  6. /*****************************************************
  7. 函数功能:延时若干微秒
  8. 入口参数:n
  9. ***************************************************/
  10. void delaynus(unsigned char n)
  11. {
  12. unsigned char i;
  13. for(i=0;i<n;i++)
  14.       ;
  15. }
  16. /*****************************************************
  17. 函数功能:向1302写一个字节数据
  18. 入口参数:x
  19. ***************************************************/
  20. void Write1302(unsigned char dat)
  21. {
  22.   unsigned char i;
  23.   SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备
  24.   delaynus(2);       //稍微等待,使硬件做好准备
  25.   for(i=0;i<8;i++)      //连续写8个二进制位数据
  26.     {
  27.             DATA=dat&0x01;    //取出dat的第0位数据写入1302
  28.                 delaynus(2);       //稍微等待,使硬件做好准备
  29.                  SCLK=1;           //上升沿写入数据
  30.                  delaynus(2);      //稍微等待,使硬件做好准备
  31.                  SCLK=0;           //重新拉低SCLK,形成脉冲
  32.                  dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位
  33.           }
  34.        
  35. }
  36. /*****************************************************
  37. 函数功能:根据命令字,向1302写一个字节数据
  38. 入口参数:Cmd,储存命令字;dat,储存待写的数据
  39. ***************************************************/
  40. void WriteSet1302(unsigned char Cmd,unsigned char dat)
  41. {

  42.    RST=0;           //禁止数据传递
  43.    SCLK=0;          //确保写数居前SCLK被拉低
  44.         RST=1;           //启动数据传输
  45.         delaynus(2);     //稍微等待,使硬件做好准备
  46.         Write1302(Cmd);  //写入命令字
  47.         Write1302(dat);  //写数据
  48.         SCLK=1;          //将时钟电平置于已知状态
  49.         RST=0;           //禁止数据传递
  50. }
  51. /*****************************************************
  52. 函数功能:从1302读一个字节数据
  53. 入口参数:x
  54. ***************************************************/
  55. unsigned char Read1302(void)
  56. {
  57.    unsigned char i,dat;
  58.         delaynus(2);       //稍微等待,使硬件做好准备
  59.         for(i=0;i<8;i++)   //连续读8个二进制位数据
  60.          {
  61.            dat>>=1;       //将dat的各数据位右移1位,因为先读出的是字节的最低位
  62.                 if(DATA==1)    //如果读出的数据是1
  63.                  dat|=0x80;    //将1取出,写在dat的最高位
  64.                  SCLK=1;       //将SCLK置于高电平,为下降沿读出
  65.                  delaynus(2);  //稍微等待
  66.                  SCLK=0;       //拉低SCLK,形成脉冲下降沿
  67.                  delaynus(2);  //稍微等待
  68.           }         
  69.   return dat;        //将读出的数据返回
  70. }  
  71. /*****************************************************
  72. 函数功能:根据命令字,从1302读取一个字节数据
  73. 入口参数:Cmd
  74. ***************************************************/
  75. unsigned char  ReadSet1302(unsigned char Cmd)
  76. {
  77.   unsigned char dat;
  78.   RST=0;                 //拉低RST
  79.   SCLK=0;                //确保写数居前SCLK被拉低
  80.   RST=1;                 //启动数据传输
  81.   Write1302(Cmd);       //写入命令字
  82.   dat=Read1302();       //读出数据
  83.   SCLK=1;              //将时钟电平置于已知状态
  84.   RST=0;               //禁止数据传递
  85.   return dat;          //将读出的数据返回
  86. }
  87. /********************************************************************
  88. 函 数 名:Set1302()
  89. 功    能:设置初始时间
  90. 说    明:先写地址,后读命令/数据(寄存器多字节方式)
  91. 调    用:W1302()
  92. 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
  93.                                7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
  94. 返 回 值:无
  95. ***********************************************************************/
  96. void Set1302(uchar *pClock)
  97. {
  98.     uchar i;
  99.     uchar ucAddr = 0x80;
  100.     WriteSet1302(0x8e,0x00);           /* 控制命令,WP=0,写操作*/
  101.     for(i =7; i>0; i--)
  102.     {
  103.         WriteSet1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */
  104.         pClock++;
  105.         ucAddr +=2;
  106.     }
  107.     WriteSet1302(0x8e,0x80);           /* 控制命令,WP=1,写保护*/
  108. }
  109. /*****************************************************
  110. 函数功能: 1302进行初始化设置
  111. ***************************************************/
  112. void Init_DS1302(void)
  113. {       
  114.     WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令
  115.     WriteSet1302(0x80,((0/10)<<4|(0%10)));   //根据写秒寄存器命令字,写入秒的初始值
  116.         WriteSet1302(0x82,((0/10)<<4|(0%10)));   //根据写分寄存器命令字,写入分的初始值
  117.         WriteSet1302(0x84,((12/10)<<4|(12%10))); //根据写小时寄存器命令字,写入小时的初始值
  118.         WriteSet1302(0x86,((16/10)<<4|(16%10))); //根据写日寄存器命令字,写入日的初始值
  119.         WriteSet1302(0x88,((11/10)<<4|(11%10))); //根据写月寄存器命令字,写入月的初始值
  120.         WriteSet1302(0x8a,((7/10)<<4|(7%10)));          //根据写周寄存器命令字,写入周的初始值
  121.         WriteSet1302(0x8c,((8/10)<<4|(8%10)));   //根据写年寄存器命令字,写入年的初始值
  122. }
复制代码
狼牙小帅
4楼-- · 2019-03-25 12:32
 精彩回答 2  元偷偷看……
ienglgge
5楼-- · 2019-03-25 15:12
不知道主函数里是怎么执行的。执行初始化之前,应该有判断吧。直接初始化,就会覆盖之前的数据啊。
狼牙小帅
6楼-- · 2019-03-25 16:43
ienglgge 发表于 2016-2-14 22:40
不知道主函数里是怎么执行的。执行初始化之前,应该有判断吧。直接初始化,就会覆盖之前的数据啊。

断电之后直接上电,怎么个判断法呢

一周热门 更多>