bodasister 发表于 2018-3-15 10:08:14

Micropython TurnipBit 电子时钟 青少年编程入门

电子时钟是一个很常用但是制作非常简单的小玩具了,对于Micropython初学者来说,制作一个电子时钟是非常简单又容易检验自己学习成果的实验了。TurnipBit相比于其他开发板,制作电子时钟就更加简单了,无需外接任何显示器,因为Turnipbit自带显示功能,只需将Turnipbit扩展板与时钟模块连接,编写相应的代码就OK了,那么接下来,就让我们一起学习下吧。                  
所需元器件:
TurnipBit一块
TurnipBit扩展板一块
DS3231时钟模块一个
杜邦线若干
usb数据线一条
实验原理:
DS3231时钟模块原理
DS3231(图11-12)是一个时钟模块,其实就是像一个电子时钟,它自身带有电池,当设置好时间后,DS3231就会自动走时。DS3231与开发板之间的通讯是通过I2C接口来完成的。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要SDA(串行数据线)和SCL(串行时钟线)两根线即可在连接于总线上的器件之间传送信息。SDA和SCL都是双向I/O线,连接时,只需要将DS3231上的SDA和SCL与TurnipBit扩展板上的SDA和SCL相连即可。
接线方法:
Turnipbit扩展板与发光二极管接口对应如下表:

TurnipBit扩展板        DS3231时钟模块
3V3                                VCC
GND                                GND
SCL                                SCL
SDA                                SDA
关于代码,这里我们就不用拼插编程了,代码太长拼插起来就有点费时间了
源代码:
from microbit import *

DS3231_ADDR       = 0x68
DS3231_REG_SEC    = b'\x00'
DS3231_REG_MIN    = b'\x01'
DS3231_REG_HOUR   = b'\x02'
DS3231_REG_DAY    = b'\x04'
DS3231_REG_MONTH= b'\x05'
DS3231_REG_YEAR   = b'\x06'
DS3231_REG_TEMP   = b'\x11'
class DS3231(object):
   
    def __init__(self):
      pass
    def DATE(self, dat=[]):
      if dat==[]:
            t = []
            t.append(self.year())
            t.append(self.month())
            t.append(self.day())
            return t
      else:
            self.year(dat)
            self.month(dat)
            self.day(dat)
         
    def TIME(self, dat=[]):
      if dat==[]:
            t = []
            t.append(self.hour())
            t.append(self.min())
            t.append(self.sec())
            return t
      else:
            self.hour(dat)
            self.min(dat)
            self.sec(dat)
    def DateTime(self, dat=[]):
      if dat==[]:
            return self.DATE() + self.TIME()
      else:
            self.year(dat)
            self.month(dat)
            self.day(dat)
            self.hour(dat)
            self.min(dat)
            self.sec(dat)

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

    def setREG(self, dat,reg):
      buf = bytearray(2)
      buf = reg
      buf = dat
      i2c.write(DS3231_ADDR,buf, repeat=False)
      
    def getREG_DEC(self,reg):
      i2c.write(DS3231_ADDR,reg)
      t = i2c.read(DS3231_ADDR,1)
      #print("--===",t,"----------")
      return (t>>4)*10 + (t%16)

    def sec(self, sec=''):
      if sec == '':
            return self.getREG_DEC(DS3231_REG_SEC)
      else:
            self.setREG(self.dec2hex(sec), DS3231_REG_SEC)

    def min(self, min=''):
      if min == '':
            return self.getREG_DEC(DS3231_REG_MIN)
      else:
            self.setREG(self.dec2hex(min), DS3231_REG_MIN)

    def hour(self, hour=''):
      if hour=='':
            return self.getREG_DEC(DS3231_REG_HOUR)
      else:
            self.setREG(self.dec2hex(hour), DS3231_REG_HOUR)

    def day(self, day=''):
      if day=='':
            return self.getREG_DEC(DS3231_REG_DAY)
      else:
            self.setREG(self.dec2hex(day), DS3231_REG_DAY)

    def month(self, month=''):
      if month=='':
            return self.getREG_DEC(DS3231_REG_MONTH)
      else:
            self.setREG(self.dec2hex(month), DS3231_REG_MONTH)

    def year(self, year=''):
      if year=='':
            return self.getREG_DEC(DS3231_REG_YEAR)
      else:
            self.setREG(self.dec2hex(year), DS3231_REG_YEAR)

    def TEMP(self):
      i2c.write(DS3231_ADDR,DS3231_REG_TEMP, repeat=False)
      t1 = i2c.read(DS3231_ADDR,1, repeat=False)
      i2c.write(DS3231_ADDR,b'\x12', repeat=False)
      t2 = i2c.read(DS3231_ADDR,1, repeat=False)
      if t1>0x7F:
            return t1 - t2/256 -256
      else:
            return t1 + t2/256
ds=DS3231()
ds.DATE()
ds.TIME()
while True:
    Time=ds.TIME()
    Time_s=''
    for i in Time:
      Time_s+=str(i)+':'
    display.scroll(Time_s[:-1]+"-")
   
    #print(Time)
    #print(ds.TEMP())
    sleep(1000)

方恨少 发表于 2018-3-15 22:13:11

有图就更好了
页: [1]
查看完整版本: Micropython TurnipBit 电子时钟 青少年编程入门