4255|0

1万

帖子

25

TA的资源

版主

楼主
 

【MicroPython】DS3231驱动(RTC) [复制链接]

 
DS3231是一个低成本高精度的I2C接口RTC芯片,它内置了高精度的TXCO晶体 (温补晶体,0°C - +40°C 时 ±2ppm,-40°C - +85°C 时 ±3.5ppm,普通32K晶体的精度通常是100ppm),可以很方便的读取和设置年月日时分秒,还可以设置两个独立的闹钟。此外它还支持闰年、可编程方波输出、可修正老化寄存器等。


下面是使用MicroPython编写的驱动,可以通过它读取和设置时间。

  1. """
  2. DS3231 RTC drive
  3. Author: shaoziyang
  4. 2016.May

  5. >>> from DS3231 import DS3231
  6. >>> ds = DS3231(1)
  7. >>> ds.sec()
  8. >>> ds.sec(10)
  9. >>> ds.TIME()
  10. >>> ds.TEMP()

  11. """

  12. import pyb
  13. from pyb import I2C

  14. DS3231_ADDR       = const(0x68)
  15. DS3231_REG_SEC    = const(0x00)
  16. DS3231_REG_MIN    = const(0x01)
  17. DS3231_REG_HOUR   = const(0x02)
  18. DS3231_REG_WEEKDAY= const(0x03)
  19. DS3231_REG_DAY    = const(0x04)
  20. DS3231_REG_MONTH  = const(0x05)
  21. DS3231_REG_YEAR   = const(0x06)
  22. DS3231_REG_A1SEC  = const(0x07)
  23. DS3231_REG_A1MIN  = const(0x08)
  24. DS3231_REG_A1HOUR = const(0x09)
  25. DS3231_REG_A1DAY  = const(0x0A)
  26. DS3231_REG_A2MIN  = const(0x0B)
  27. DS3231_REG_A2HOUR = const(0x0C)
  28. DS3231_REG_A2DAY  = const(0x0D)
  29. DS3231_REG_CTRL   = const(0x0E)
  30. DS3231_REG_STA    = const(0x0F)
  31. DS3231_REG_OFF    = const(0x10)
  32. DS3231_REG_TEMP   = const(0x11)

  33. class DS3231(object):
  34.     def __init__(self, i2c_num):
  35.         self.i2c = I2C(i2c_num, I2C.MASTER, baudrate = 100000)

  36.     def DATE(self, dat=[]):
  37.         if dat==[]:
  38.             t = []
  39.             t.append(self.year())
  40.             t.append(self.month())
  41.             t.append(self.day())
  42.             return t
  43.         else:
  44.             self.year(dat[0])
  45.             self.month(dat[1])
  46.             self.day(dat[2])

  47.     def TIME(self, dat=[]):
  48.         if dat==[]:
  49.             t = []
  50.             t.append(self.hour())
  51.             t.append(self.min())
  52.             t.append(self.sec())
  53.             return t
  54.         else:
  55.             self.hour(dat[0])
  56.             self.min(dat[1])
  57.             self.sec(dat[2])

  58.     def DateTime(self, dat=[]):
  59.         if dat==[]:
  60.             return self.DATE() + self.TIME()
  61.         else:
  62.             self.year(dat[0])
  63.             self.month(dat[1])
  64.             self.day(dat[2])
  65.             self.hour(dat[3])
  66.             self.min(dat[4])
  67.             self.sec(dat[5])

  68.     def dec2hex(self, dat):
  69.         return (int(dat/10)<<4) + (dat%10)

  70.     def setREG(self, dat, reg):
  71.         buf = bytearray(2)
  72.         buf[0] = reg
  73.         buf[1] = dat
  74.         self.i2c.send(buf, DS3231_ADDR)
  75.         
  76.     def getREG_DEC(self, reg):
  77.         self.i2c.send(reg, DS3231_ADDR)
  78.         t = self.i2c.recv(1, DS3231_ADDR)[0]
  79.         return (t>>4)*10 + (t%16)

  80.     def sec(self, sec=''):
  81.         if sec == '':
  82.             return self.getREG_DEC(DS3231_REG_SEC)
  83.         else:
  84.             self.setREG(self.dec2hex(sec), DS3231_REG_SEC)

  85.     def min(self, min=''):
  86.         if min == '':
  87.             return self.getREG_DEC(DS3231_REG_MIN)
  88.         else:
  89.             self.setREG(self.dec2hex(min), DS3231_REG_MIN)

  90.     def hour(self, hour=''):
  91.         if hour=='':
  92.             return self.getREG_DEC(DS3231_REG_HOUR)
  93.         else:
  94.             self.setREG(self.dec2hex(hour), DS3231_REG_HOUR)

  95.     def day(self, day=''):
  96.         if day=='':
  97.             return self.getREG_DEC(DS3231_REG_DAY)
  98.         else:
  99.             self.setREG(self.dec2hex(day), DS3231_REG_DAY)

  100.     def month(self, month=''):
  101.         if month=='':
  102.             return self.getREG_DEC(DS3231_REG_MONTH)
  103.         else:
  104.             self.setREG(self.dec2hex(month), DS3231_REG_MONTH)

  105.     def year(self, year=''):
  106.         if year=='':
  107.             return self.getREG_DEC(DS3231_REG_YEAR)
  108.         else:
  109.             self.setREG(self.dec2hex(year), DS3231_REG_YEAR)

  110.     def TEMP(self):
  111.         self.i2c.send(DS3231_REG_TEMP, DS3231_ADDR)
  112.         t1 = self.i2c.recv(1, DS3231_ADDR)[0]
  113.         self.i2c.send(DS3231_REG_TEMP+1, DS3231_ADDR)
  114.         t2 = self.i2c.recv(1, DS3231_ADDR)[0]
  115.         if t1>0x7F:
  116.             return t1 - t2/256 -256
  117.         else:
  118.             return t1 + t2/256
复制代码

注:
  • 目前闹钟功能还没有实现。
  • 内置的温度转换时间比较慢,可以通过控制寄存器进行强制转换。

点赞 关注(1)
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表