找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS1302.H 头文件

[复制链接]
跳转到指定楼层
楼主
ID:75926 发表于 2015-4-3 01:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. DS1302.H 头文件:
  2. /*********************************************************************
  3. 公司名称:
  4. 模块名称:DS1302.c
  5. 功    能:实时时钟模块           时钟芯片型号:DS1302
  6. 说    明:
  7. 程序设计:zhaojunjie        
  8. 设计时间:2002.03.02        
  9. 版 本 号: 20020302
  10. *********************************************************************/
  11. #include
  12. sbit     T_CLK      = P2^7;   /*实时时钟时钟线引脚 */
  13. sbit     T_IO       = P1^4;   /*实时时钟数据线引脚 */
  14. sbit     T_RST      = P1^5;   /*实时时钟复位线引脚 */
  15. sbit  ACC0 = ACC^0;
  16. sbit  ACC7 = ACC^7;

  17. void   RTInputByte(uchar);       /* 输入 1Byte */
  18. uchar  RTOutputByte(void);       /* 输出?1Byte */
  19. void   W1302(uchar, uchar);
  20. uchar  R1302(uchar);
  21. void   Set1302(uchar *);         /* 设置时间 */
  22. void   Bcd2asc(uchar,uchar *);
  23. void   Get1302(uchar curtime[]); /* 读取1302当前时间 */
  24. /********************************************************************
  25. 函 数 名:RTInputByte()
  26. 功    能:实时时钟写入一字节
  27. 说    明:往DS1302写入1Byte数据 (内部函数)
  28. 入口参数:d 写入的数据
  29. 返 回 值:无  
  30. 设    计:zhaojunjie           日    期:2002-03-19
  31. 修    改:                     日    期:
  32. ***********************************************************************/
  33. void RTInputByte(uchar d)
  34. {
  35.     uchar i;
  36.     ACC = d;
  37.     for(i=8; i>0; i--)
  38.     {
  39.         T_IO = ACC0;           /*相当于汇编中的 RRC */
  40.         T_CLK = 1;
  41.         T_CLK = 0;
  42.         ACC = ACC >> 1;
  43.     }
  44. }
  45. /********************************************************************
  46. 函 数 名:RTOutputByte()
  47. 功    能:实时时钟读取一字节
  48. 说    明:从DS1302读取1Byte数据 (内部函数)
  49. 入口参数:无  
  50. 返 回 值:ACC
  51. 设    计:zhaojunjie           日    期:2002-03-19
  52. 修    改:                     日    期:
  53. ***********************************************************************/
  54. uchar RTOutputByte(void)
  55. {
  56.     uchar i;
  57.     for(i=8; i>0; i--)
  58.     {
  59.         ACC = ACC >>1;         /*相当于汇编中的 RRC */
  60.         ACC7 = T_IO;
  61.         T_CLK = 1;
  62.         T_CLK = 0;
  63.     }
  64.     return(ACC);
  65. }
  66. /********************************************************************
  67. 函 数 名:W1302()
  68. 功    能:往DS1302写入数据
  69. 说    明:先写地址,后写命令/数据 (内部函数)
  70. 调    用:RTInputByte() , RTOutputByte()
  71. 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
  72. 返 回 值:无
  73. 设    计:zhaojunjie           日    期:2002-03-19
  74. 修    改:                     日    期:
  75. ***********************************************************************/
  76. void W1302(uchar ucAddr, uchar ucDa)
  77. {
  78.     T_RST = 0;
  79.     T_CLK = 0;
  80.     T_RST = 1;
  81.     RTInputByte(ucAddr);       /* 地址,命令 */
  82.     RTInputByte(ucDa);       /* 写1Byte数据*/
  83.     T_CLK = 1;
  84.     T_RST = 0;
  85. }
  86. /********************************************************************
  87. 函 数 名:R1302()
  88. 功    能:读取DS1302某地址的数据
  89. 说    明:先写地址,后读命令/数据 (内部函数)
  90. 调    用:RTInputByte() , RTOutputByte()
  91. 入口参数:ucAddr: DS1302地址
  92. 返 回 值:ucData :读取的数据
  93. 设    计:zhaojunjie           日    期:2002-03-19
  94. 修    改:                     日    期:
  95. ***********************************************************************/
  96. uchar R1302(uchar ucAddr)
  97. {
  98.     uchar ucData;
  99.     T_RST = 0;
  100.     T_CLK = 0;
  101.     T_RST = 1;
  102.     RTInputByte(ucAddr);             /* 地址,命令 */
  103.     ucData = RTOutputByte();         /* 读1Byte数据 */
  104.     T_CLK = 1;
  105.     T_RST = 0;
  106.     return(ucData);
  107. }
  108. /********************************************************************
  109. 函 数 名:BurstW1302T()
  110. 功    能:往DS1302写入时钟数据(多字节方式)
  111. 说    明:先写地址,后写命令/数据
  112. 调    用:RTInputByte()
  113. 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
  114.                             8Byte (BCD码)1B 1B 1B 1B 1B  1B  1B 1B
  115. 返 回 值:无
  116. 设    计:zhaojunjie           日    期:2002-03-19
  117. 修    改:                     日    期:
  118. ***********************************************************************/
  119. void BurstW1302T(uchar *pWClock)
  120. {
  121.     uchar i;
  122.     W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作?*/
  123.     T_RST = 0;
  124.     T_CLK = 0;
  125.     T_RST = 1;
  126.     RTInputByte(0xbe);        /* 0xbe:时钟多字节写命令 */
  127.     for (i = 8; i>0; i--)     /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
  128.     {
  129.         RTInputByte(*pWClock); /* 写1Byte数据*/
  130.         pWClock++;
  131.     }
  132.     T_CLK = 1;
  133.     T_RST = 0;
  134. }
  135. /********************************************************************
  136. 函 数 名:BurstR1302T()
  137. 功    能:读取DS1302时钟数据
  138. 说    明:先写地址/命令,后读数据(时钟多字节方式)
  139. 调    用:RTInputByte() , RTOutputByte()
  140. 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
  141.                                7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
  142. 返 回 值:无
  143. 设    计:zhaojunjie           日    期:2002-03-19
  144. 修    改:                     日    期:
  145. ***********************************************************************/
  146. void BurstR1302T(uchar *pRClock)
  147. {
  148.     uchar i;
  149.     T_RST = 0;
  150.     T_CLK = 0;
  151.     T_RST = 1;
  152.     RTInputByte(0xbf);             /* 0xbf:时钟多字节读命令 */
  153.     for (i=8; i>0; i--)
  154.     {
  155.        *pRClock = RTOutputByte();   /* 读1Byte数据 */
  156.        pRClock++;
  157.     }
  158.     T_CLK = 1;
  159.     T_RST = 0;
  160. }
  161. /********************************************************************
  162. 函 数 名:BurstW1302R()
  163. 功    能:往DS1302寄存器数写入数据(多字节方式)
  164. 说    明:先写地址,后写数据(寄存器多字节方式)
  165. 调    用:RTInputByte()
  166. 入口参数:pWReg: 寄存器数据地址
  167. 返 回 值:无
  168. 设    计:zhaojunjie           日    期:2002-03-19
  169. 修    改:                     日    期:
  170. ***********************************************************************/
  171. void BurstW1302R(uchar *pWReg)
  172. {
  173.     uchar i;
  174.     W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作*/
  175.     T_RST = 0;
  176.     T_CLK = 0;
  177.     T_RST = 1;
  178.     RTInputByte(0xfe);         /* 0xbe:时钟多字节写命令 */
  179.     for (i=31; i>0; i--)       /* 31Byte 寄存器数据 */
  180.     {
  181.         RTInputByte(*pWReg);    /* 写1Byte数据*/
  182.         pWReg++;
  183.     }
  184.     T_CLK = 1;
  185.     T_RST = 0;
  186. }
  187. /********************************************************************
  188. 函 数 名:BurstR1302R()
  189. 功    能:读取DS1302寄存器数据
  190. 说    明:先写地址,后读命令/数据(寄存器多字节方式)
  191. 调    用:RTInputByte() , RTOutputByte()
  192. 入口参数:pRReg: 寄存器数据地址
  193. 返 回 值:无
  194. 设    计:zhaojunjie           日    期:2002-03-19
  195. 修    改:                     日    期:
  196. ***********************************************************************/
  197. void BurstR1302R(uchar *pRReg)
  198. {
  199.     uchar i;
  200.     T_RST = 0;
  201.     T_CLK = 0;
  202.     T_RST = 1;
  203.     RTInputByte(0xff);            /* 0xff:时钟多字节读命令 */
  204.     for (i=31; i>0; i--)          /*31Byte 寄存器数据 */
  205.     {
  206.         *pRReg = RTOutputByte();  /* 读1Byte数据 */
  207.         pRReg++;
  208.     }
  209.     T_CLK = 1;
  210.     T_RST = 0;
  211. }
  212. /********************************************************************
  213. 函 数 名:Set1302()
  214. 功    能:设置初始时间
  215. 说    明:先写地址,后读命令/数据(寄存器多字节方式)
  216. 调    用:W1302()
  217. 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
  218.                                7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
  219. 返 回 值:无
  220. 设    计:zhaojunjie           日    期:2002-03-19
  221. 修    改:                     日    期:
  222. ***********************************************************************/
  223. void Set1302(uchar *pClock)
  224. {
  225.     uchar i;
  226.     uchar ucAddr = 0x80;
  227.     W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
  228.     for(i =7; i>0; i--)
  229.     {
  230.         W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */
  231.         pClock++;
  232.         ucAddr +=2;
  233.     }
  234.     W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
  235. }
  236. /********************************************************************
  237. 函 数 名:Get1302()
  238. 功    能:读取DS1302当前时间
  239. 说    明:
  240. 调    用:R1302()
  241. 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
  242.                                         7Byte (BCD码)   1B 1B 1B 1B 1B  1B  1B
  243. 返 回 值:无
  244. 设    计:zhaojunjie           日    期:2002-03-19
  245. 修    改:                     日    期:
  246. ***********************************************************************/
  247. void Get1302(uchar ucCurtime[])
  248. {
  249.     uchar i;
  250.     uchar ucAddr = 0x81;
  251.     for (i=0; i<7; i++)
  252.     {
  253.         ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
  254.         ucAddr += 2;
  255.     }
  256. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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