转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi
一、本次实验所需器材
1、TPYboard V102板 一块
2、DS3231模块 一块
3、NOKIA 5110 LCD 屏 一块
4、杜邦线:若干
===感谢某宝“萝卜城”提供的TPYboard V102豪华版套餐===
二、DS3231模块
1、什么是DS3231
DS3231是低成本、高精度I2C实时时钟(RTC),具有集成的温补晶振(TCXO)和晶体。该器件包含电池输入端,断开主电源时仍可保持精确的计时。集成晶振提高了器件的长期精确度,并减少了生产线的元件数量。DS3231提供商用级和工业级温度范围,采用16引脚300mil的SO封装。RTC保存秒、分、时、星期、日期、月和年信息。少于31天的月份,将自动调整月末的日期,包括闰年的修正。时钟的工作格式可以是24小时或带/AM/PM指示的12小时格式。提供两个可设置的日历闹钟和一个可设置的方波输出。地址与数据通过I2C双向总线串行传输。
2、DS3231与TPYBoardv102的连接(IIC连接)
DS3231与TPYBoard V102使用IIC连接方法,使用DS3231的SCL,SDA,VCC,GND四个针脚即可设定读出当前时间,对应如下表:
DS3231 | TPYboard V102 |
GND | GND |
SCL | X9 |
SDA | X10 |
VCC | 3.3V |
这里IIC常用命令如下:
》 i2c.deinit(),解除I2C定义
》 i2c.init(mode, *, addr=0x12, baudrate=400000, gencall=False),初始化
. mode,只能是 I2C.MASTER 或 I2C.SLAVE
.addr,7位I2C地址
.baudrate,时钟频率
.gencall,通用调用模式
》 i2c.is_ready(addr),检测I2C设备是否响应,只对主模式有效
》 i2c.mem_read(data, addr, memaddr, *, timeout=5000, addr_size=8),读取数据
.data,整数或者缓存
.addr,设备地址
. memaddr,内存地址
. timeout,读取等待超时时间
.addr_size,memaddr的大小。8位或16位
》 i2c.mem_write(data, addr, memaddr, *, timeout=5000, addr_size=8),写入数据,参数含义同上
》 i2c.recv(recv, addr=0x00, *, timeout=5000),从总线读取数据
. recv,需要读取数据数量,或者缓冲区
. addr,I2C地址
. timeout,超时时间
》 i2c.send(send, addr=0x00, *, timeout=5000)
. send,整数或者缓冲区
. addr,I2C地址
. timeout,超时时间
》 i2c.scan(),搜索I2C总线上设备。
三、调试DS3231模块
1、TPYBoard V102的调试
如何能够时时对TPYBoard V102的输出进行调试和查看呢?这里需要用到putty工具。
第一步:将TPYBoard V102与pc通过usb线进行连接,然后通过设备管理器查看其对应的端口号。
第二步:打开putty,如下图进行填写。
第三步:点击确定,进入调试窗口,此时屏幕上显示"hello world",是因为main.py程序做了修改,否则不显示。
#main.py
# main.py -- put your code here!
import pyb
print "hello world!!"
第四步:这时就可以在命令行进行调试,常用的几个组合键如下:
Ctrl + C:终止程序
Ctrl + D:重新运行。
2、连接DS3231进行调试
DS3231的连接方法见上文。
第一步:DS3231时间设定,以设定2017年1月25日为例。在TPYBoard V102里添加DS3231.py文件,修改main.py,具体代码如下:
#DS3231.py
import pyb
from pyb import I2C
DS3231_ADDR = const(0x68)
DS3231_REG_SEC = const(0x00)
DS3231_REG_MIN = const(0x01)
DS3231_REG_HOUR = const(0x02)
DS3231_REG_WEEKDAY= const(0x03)
DS3231_REG_DAY = const(0x04)
DS3231_REG_MONTH = const(0x05)
DS3231_REG_YEAR = const(0x06)
DS3231_REG_A1SEC = const(0x07)
DS3231_REG_A1MIN = const(0x08)
DS3231_REG_A1HOUR = const(0x09)
DS3231_REG_A1DAY = const(0x0A)
DS3231_REG_A2MIN = const(0x0B)
DS3231_REG_A2HOUR = const(0x0C)
DS3231_REG_A2DAY = const(0x0D)
DS3231_REG_CTRL = const(0x0E)
DS3231_REG_STA = const(0x0F)
DS3231_REG_OFF = const(0x10)
DS3231_REG_TEMP = const(0x11)
class ds3231(object):
def __init__(self, i2c_num):
self.i2c = I2C(i2c_num, I2C.MASTER, baudrate = 100000)
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
buf[1] = dat
self.i2c.send(buf, DS3231_ADDR)
def getREG_DEC(self, reg):
self.i2c.send(reg, DS3231_ADDR)
t = self.i2c.recv(1, DS3231_ADDR)[0]
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='