MicroPython實戰之TurnipBit開發板DIY電子時鐘

   1、 實驗目的:
    ?學習在PC機系統中擴展簡單I/O 接口的方法
    ?學習TurnipBit拼插編程
    ?學習TurnipBit擴展板與DS3231時鐘模塊鏈接接線方式
    ?學習時鐘模塊的使用python

    2、所需原器件:
    ?TurnipBit一塊
    ?TurnipBit擴展板一塊
    ?DS3231時鐘模塊一個
    ?杜邦線若干
    ?usb數據線一條編程

    3、實驗原理:
    1. DS3231時鐘模塊原理
    DS3231(圖11-12)是一個時鐘模塊,其實就是像一個電子時鐘,它自身帶有電池,當設置好時間後,DS3231就會自動走時。DS3231與開發板之間的通信是經過I2C接口來完成的。I2C總線是由Philips公司開發的一種簡單、雙向二線制同步串行總線。它只須要SDA(串行數據線)和SCL(串行時鐘線)兩根線便可在鏈接於總線上的器件之間傳送信息。SDA和SCL都是雙向I/O線,鏈接時,只須要將DS3231上的SDA和SCL與TurnipBit擴展板上的SDA和SCL相連便可。app


    4、接線方法:
    TurnipBit擴展板與發光二極管接口對應以下表:學習


    5、 源代碼:
 3d

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[0])
            self.month(dat[1])
            self.day(dat[2])
            
    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[0])
            self.min(dat[1])
            self.sec(dat[2])
    def DateTime(self, dat=[]):
        if dat==[]:
            return self.DATE() + self.TIME()
        else:
            self.year(dat[0])
            self.month(dat[1])
            self.day(dat[2])
            self.hour(dat[3])
            self.min(dat[4])
            self.sec(dat[5])

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

    def setREG(self, dat,reg):
        buf = bytearray(2)
        buf[0] = reg[0]
        buf[1] = dat
        i2c.write(DS3231_ADDR,buf, repeat=False)
        
    def getREG_DEC(self,reg):
        i2c.write(DS3231_ADDR,reg)
        t = i2c.read(DS3231_ADDR,1)[0]
        #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)[0]
        i2c.write(DS3231_ADDR,b'\x12', repeat=False)
        t2 = i2c.read(DS3231_ADDR,1, repeat=False)[0]
        if t1>0x7F:
            return t1 - t2/256 -256
        else:
            return t1 + t2/256
ds=DS3231()
ds.DATE([17,10,24])
ds.TIME([10,03,00])
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)
相關文章
相關標籤/搜索