单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看: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)


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

Powered by 单片机教程网