找回密码
 立即注册

QQ登录

只需一步,快速开始

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

IIC RTC DS1307模块Arduino源程序

[复制链接]
跳转到指定楼层
#
ID:125378 发表于 2019-8-7 11:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
Arduino源程序如下:
  1. extern "C" {
  2. #include <../Wire/Wire.h>
  3. }
  4. #include "DS1307.h"

  5. DS1307::DS1307()
  6. {
  7.   Wire.begin();
  8. }

  9. DS1307 RTC=DS1307();

  10. // PRIVATE FUNCTIONS

  11. // Aquire data from the RTC chip in BCD format
  12. // refresh the buffer
  13. void DS1307::read(void)
  14. {
  15.   // use the Wire lib to connect to tho rtc
  16.   // reset the resgiter pointer to zero
  17.   Wire.beginTransmission(DS1307_CTRL_ID);
  18.     Wire.send(0x00);
  19.   Wire.endTransmission();

  20.   // request the 7 bytes of data    (secs, min, hr, dow, date. mth, yr)
  21.   Wire.requestFrom(DS1307_CTRL_ID, 7);
  22.   for(int i=0; i<7; i++)
  23.   {
  24.     // store data in raw bcd format
  25.     rtc_bcd[i]=Wire.receive();
  26.   }
  27. }

  28. // update the data on the IC from the bcd formatted data in the buffer
  29. void DS1307::save(void)
  30. {
  31.   Wire.beginTransmission(DS1307_CTRL_ID);
  32.   Wire.send(0x00); // reset register pointer
  33.   for(int i=0; i<7; i++)
  34.   {
  35.     Wire.send(rtc_bcd[i]);
  36.   }
  37.   Wire.endTransmission();
  38. }


  39. // PUBLIC FUNCTIONS
  40. void DS1307::get(int *rtc, boolean refresh)   // Aquire data from buffer and convert to int, refresh buffer if required
  41. {
  42.   if(refresh) read();
  43.   for(int i=0;i<7;i++)  // cycle through each component, create array of data
  44.   {
  45.         rtc[i]=get(i, 0);
  46.   }
  47. }

  48. int DS1307::get(int c, boolean refresh)  // aquire individual RTC item from buffer, return as int, refresh buffer if required
  49. {
  50.   if(refresh) read();
  51.   int v=-1;
  52.   switch(c)
  53.   {
  54.   case DS1307_SEC:
  55.     v=(10*((rtc_bcd[DS1307_SEC] & DS1307_HI_SEC)>>4))+(rtc_bcd[DS1307_SEC] & DS1307_LO_BCD);
  56.         break;
  57.   case DS1307_MIN:
  58.     v=(10*((rtc_bcd[DS1307_MIN] & DS1307_HI_MIN)>>4))+(rtc_bcd[DS1307_MIN] & DS1307_LO_BCD);
  59.         break;
  60.   case DS1307_HR:
  61.     v=(10*((rtc_bcd[DS1307_HR] & DS1307_HI_HR)>>4))+(rtc_bcd[DS1307_HR] & DS1307_LO_BCD);
  62.         break;
  63.   case DS1307_DOW:
  64.     v=rtc_bcd[DS1307_DOW] & DS1307_LO_DOW;
  65.         break;
  66.   case DS1307_DATE:
  67.     v=(10*((rtc_bcd[DS1307_DATE] & DS1307_HI_DATE)>>4))+(rtc_bcd[DS1307_DATE] & DS1307_LO_BCD);
  68.         break;
  69.   case DS1307_MTH:
  70.     v=(10*((rtc_bcd[DS1307_MTH] & DS1307_HI_MTH)>>4))+(rtc_bcd[DS1307_MTH] & DS1307_LO_BCD);
  71.         break;
  72.   case DS1307_YR:
  73.     v=(10*((rtc_bcd[DS1307_YR] & DS1307_HI_YR)>>4))+(rtc_bcd[DS1307_YR] & DS1307_LO_BCD)+DS1307_BASE_YR;
  74.         break;
  75.   } // end switch
  76.   return v;
  77. }

  78. void DS1307::set(int c, int v)  // Update buffer, then update the chip
  79. {
  80.   switch(c)
  81.   {
  82.   case DS1307_SEC:
  83.     if(v<60 && v>-1)
  84.     {
  85.         //preserve existing clock state (running/stopped)
  86.         int state=rtc_bcd[DS1307_SEC] & DS1307_CLOCKHALT;
  87.         rtc_bcd[DS1307_SEC]=state | ((v / 10)<<4) + (v % 10);
  88.     }
  89.     break;
  90.   case DS1307_MIN:
  91.     if(v<60 && v>-1)
  92.     {
  93.         rtc_bcd[DS1307_MIN]=((v / 10)<<4) + (v % 10);
  94.     }
  95.     break;
  96.   case DS1307_HR:
  97.   // TODO : AM/PM  12HR/24HR
  98.     if(v<24 && v>-1)
  99.     {
  100.         rtc_bcd[DS1307_HR]=((v / 10)<<4) + (v % 10);
  101.     }
  102.     break;
  103.   case DS1307_DOW:
  104.     if(v<8 && v>-1)
  105.     {
  106.         rtc_bcd[DS1307_DOW]=v;
  107.     }
  108.     break;
  109.   case DS1307_DATE:
  110.     if(v<31 && v>-1)
  111.     {
  112.         rtc_bcd[DS1307_DATE]=((v / 10)<<4) + (v % 10);
  113.     }
  114.     break;
  115.   case DS1307_MTH:
  116.     if(v<13 && v>-1)
  117.     {
  118.         rtc_bcd[DS1307_MTH]=((v / 10)<<4) + (v % 10);
  119.     }
  120.     break;
  121.   case DS1307_YR:
  122.     if(v<13 && v>-1)
  123.     {
  124.         rtc_bcd[DS1307_YR]=((v / 10)<<4) + (v % 10);
  125.     }
  126.     break;
  127.   } // end switch
  128.   save();
  129. }

  130. void DS1307::stop(void)
  131. {
  132.         // set the ClockHalt bit high to stop the rtc
  133.         // this bit is part of the seconds byte
  134.     rtc_bcd[DS1307_SEC]=rtc_bcd[DS1307_SEC] | DS1307_CLOCKHALT;
  135.     save();
  136. }

  137. void DS1307::start(void)
  138. {
  139.         // unset the ClockHalt bit to start the rtc
  140.         // TODO : preserve existing seconds
  141.     rtc_bcd[DS1307_SEC]=rtc_bcd[DS1307_SEC] & (~DS1307_CLOCKHALT);
  142.         save();
  143. }


  144. void DS1307::SetOutput(int c)  
  145. {
  146.   int out;
  147.   switch(c)
  148.   {
  149.   case HIGH :
  150.         out=DS1307_HIGH_BIT;
  151.   break;
  152.   case LOW :
  153.         out=DS1307_LOW_BIT;
  154.   break;
  155.   case DS1307_SQW1HZ :
  156.         out=DS1307_SQW1HZ_BIT;
  157.   break;
  158.   case DS1307_SQW4KHZ :
  159.         out=DS1307_SQW4KHZ_BIT;
  160.   break;
  161.   case DS1307_SQW8KHZ :
  162.         out=DS1307_SQW8KHZ_BIT;
  163.   break;
  164.   case DS1307_SQW32KHZ :
  165.         out=DS1307_SQW32KHZ_BIT;
  166.   break;
  167.   default:
  168.         out=DS1307_LOW_BIT;
  169.   }
  170.   
  171.   Wire.beginTransmission(DS1307_CTRL_ID);
  172.   Wire.send(0x07);
  173.   Wire.send(out);
  174.   Wire.endTransmission();
  175. }

  176. int DS1307::GetOutput(void)  
  177. {
  178.   Wire.beginTransmission(DS1307_CTRL_ID);
  179.   Wire.send(0x07);
  180.   Wire.endTransmission();

  181.   Wire.requestFrom(DS1307_CTRL_ID, 1);
  182.   int out=Wire.receive();
  183.   
  184.   int c=-1;
  185.   switch(out)
  186.   {
  187.   case DS1307_HIGH_BIT :
  188.         c=HIGH;
  189.   break;
  190.   case DS1307_LOW_BIT :
  191.         c=LOW;
  192.   break;
  193.   case DS1307_SQW1HZ_BIT :
  194.         c=DS1307_SQW1HZ;
  195.   break;
  196.   case DS1307_SQW4KHZ_BIT :
  197.         c=DS1307_SQW4KHZ;
  198.   break;
  199.   case DS1307_SQW8KHZ_BIT :
  200.         c=DS1307_SQW8KHZ;
  201.   break;
  202.   case DS1307_SQW32KHZ_BIT :
  203.         c=DS1307_SQW32KHZ;
  204.   break;
  205.   }
  206.   return c;
  207. }
复制代码

所有资料51hei提供下载:
【Realplay】 Tiny RTC I2C模块 24C32存储器 DS1307时钟模块.rar (742.75 KB, 下载次数: 15)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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