实验目的:
² LED是什么²
光敏电阻是什么²
DS3231模块²
电阻阻值的色环计算²
时钟模块DS3231()库的应用
所需器材:²
TurnipBit开发板 1块²
下载数据线 1条²
废旧纸盒 1个²
导线若干²
DS3231时钟模块 1个²
光敏电阻 1个²
LED 灯 1个²
1K电阻 1个²
接入互联网的电脑 1台(推荐使用Google Chome或者Firefox浏览器)
TurnipBit扩展板TurnipBit扩展板是用来将TurnipBit的引脚和主要功能脚引出的一个开发板。利用扩展板,我们可以完成一些更加复杂的工作和任务。TurnipBit扩展板包含以下几个区域:1、金手指插槽,主要用于与TurnipBit开发板进行连接,只需进行正常的插拔即可。2、电源区,包括GND、3.3V和5V区域,提供电源供电。3、USB接口,负责电源接入。4、GPIO口,主要包括P0到P20的GPIO接口、I2C接口、串口以及SPI接口。


意图DS3231的连接DS3231(图11-12)是一个时钟模块,其实就是像一个电子时钟,它自身带有电池,当设置好时间后,DS3231就会自动走时。DS3231与开发板之间的通讯是通过I2C接口来完成的。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要SDA(串行数据线)和SCL(串行时钟线)两根线即可在连接于总线上的器件之间传送信息。SDA和SCL都是双向I/O线,连接时,只需要将DS3231上的SDA和SCL与TurnipBit扩展板上的SDA和SCL相连即可。表 11-1 DS3231连线表
DS3231 TurnipBit扩展板
GND GND
VCC 3.3V
SCL SCL
SDA SDA

DS3231 线路设计本实验中需要进行连接的器件主要包括LED、光敏电阻、电阻、DS3231,具体连接方法:1、LED的长引脚(正极)与扩展板的P1相连,短引脚也就是负极与GND相连。我们只需要控制P1输出高电平还是低电平就可以控制LED是亮还是灭。当P1输出高电平时,LED两条引脚形成回路,LED亮起。当P1输出低电平时,LED熄灭。2、光敏电阻与1K阻串联后,一端连接正极,一端连接负责,中间引出一个引线,连接到扩展板的P2处。这里我们只需要读取P2引脚的模拟电压,就可以获取光线的变化。3、DS3231与扩展板的连接参见表11-1。具体连接实物图,如下:
连线图具体代码具体代码如下:

- 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()
- while True:
- Date=ds.DATE()
- Time=ds.TIME()
- Time_s='20'
- for i in Date:
- Time_s+=str(i)+'-'
- Time_s=Time_s[:-1]+' '
- for i in Time:
- Time_s+=str(i)+':'
- hour=Time[0]
- sumnum=0
- for j in range(0,5): #计算5次电压平均值
- sumnum=sumnum+pin2.read_analog()
- averagenum=sumnum/5
- if averagenum < 54: #如果小于54说明光线弱
- pin1.write_digital(1) #打开LED
- else: #如果大于或者等于54,说明光线强
- pin1.write_digital(0) #关闭LED
- display.scroll(Time_s[:-1]) #显示时钟时间
- if button_a.get_presses() > 0 or button_b.get_presses() > 0:
- display.scroll(Time_s[:-1]) #如果按过按键,显示时钟时间
- sleep(1000)
将以上代码,复制到TurnipBit编程区域,然后保存hex文件,并复制到TURNIPBIT磁盘后,会发现Turnipbit已经开始工作了。
|