常用的計時時鐘芯片有 DS1302、DS1307、DS3231,各型號還有衍生型號。都是 Dallas 生產的芯片。其中 DS1302 和 DS1307 可以看成是同一芯片的不同協議版本(I2C 和 SPI)。他們在樹莓派 Pico 上的用法幾乎一致,下面將簡單介紹 DS1302 的用法。
硬件連接
時鐘模塊的 VCC 引腳接 Pico 的 VSYS。
時鐘模塊的 GND 引腳接 Pico 的 GND。
時鐘模塊的 CLK 引腳接 Pico 的 GP21。
時鐘模塊的 DAT 引腳接 Pico 的 GP20。
時鐘模塊的 RST 引腳接 Pico 的 GP19。
使用開源的 MicroPython DS1302 庫,可以在這里下載源碼。也可以將下面的代碼保存在 Pico 上,命名為 DS1302.py。
from machine import Pin W_SECOND = const(0x80) W_MINUTE = const(0x82) W_HOUR = const(0x84) W_DATE = const(0x86) W_MONTH = const(0x88) W_WEEK = const(0x8A) W_YEAR = const(0x8C) W_WP = const(0x8E) R_SECOND = const(0x81) R_MINUTE = const(0x83) R_HOUR = const(0x85) R_DATE = const(0x87) R_MONTH = const(0x89) R_WEEK = const(0x8B) R_YEAR = const(0x8D) class DS1302(): def __init__(self,SCLK,DAT,RST): self.resetPin = DAT self.SCLK = Pin(SCLK,Pin.OUT) self.DAT = Pin(DAT,Pin.OUT) self.RST = Pin(RST,Pin.OUT) self.SCLK.off() self.RST.off() def SetTime(self,YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,WEEK): self.WriteByte(W_WP,0x00); YEAR = int(YEAR/10)*16+YEAR%10 self.WriteByte(W_YEAR,YEAR); MONTH = int(MONTH/10)*16+MONTH%10 self.WriteByte(W_MONTH,MONTH); DAY = int(DAY/10)*16+DAY%10 self.WriteByte(W_DATE,DAY); self.WriteByte(W_HOUR,HOUR); MINUTE = int(MINUTE/10)*16+MINUTE%10 self.WriteByte(W_MINUTE,MINUTE); SECOND = int(SECOND/10)*16+SECOND%10 self.WriteByte(W_SECOND,SECOND); self.WriteByte(W_WEEK,WEEK); self.WriteByte(W_WP,0x80); def GetTime(self): date = [] Temp = self.ReadByte(R_YEAR) Temp = ((Temp&0xF0)>>4)*10+(Temp&0x0F) date.append(Temp) Temp = self.ReadByte(R_MONTH) Temp = ((Temp&0x10)>>4)*10+(Temp&0x0F) date.append(Temp) Temp = self.ReadByte(R_DATE) Temp = ((Temp&0x20)>>4)*10+(Temp&0x0F) date.append(Temp) Temp = self.ReadByte(R_HOUR) Temp = (Temp&0x1F) date.append(Temp) Temp = self.ReadByte(R_MINUTE) Temp = ((Temp&0x70)>>4)*10+(Temp&0x0F) date.append(Temp) Temp = self.ReadByte(R_SECOND) Temp = ((Temp&0x70)>>4)*10+(Temp&0x0F) date.append(Temp) Temp = self.ReadByte(R_WEEK) date.append(Temp) return date def Now(self): date = self.GetTime() Now = [] Year = "20{0}".format(date[0]) Now.append(Year) Month = "0{0}".format(date[1]) if (date[1]/10)<1 else "{0}".format(date[1]) Now.append(Month) Day = "0{0}".format(date[2]) if (date[2]/10)<1 else "{0}".format(date[2]) Now.append(Day) Hour = "0{0}".format(date[3]) if (date[3]/10)<1 else "{0}".format(date[3]) Now.append(Hour) Minute = "0{0}".format(date[4]) if (date[4]/10)<1 else "{0}".format(date[4]) Now.append(Minute) Second = "0{0}".format(date[5]) if (date[5]/10)<1 else "{0}".format(date[5]) Now.append(Second) Now.append(date[6]) return Now def WriteByte(self,Command,Data): self.RST.on() Pin(self.resetPin,Pin.OUT) for i in range(0,8): if Command&(0x01<
將下面的代碼命名為 main.py 保存在 Pico 上。首次使用,或者需要修改時鐘模塊上的時間時,可以將代碼中的 ds1302.SetTime(23,11,22,18,00,00,3) 這行代碼前的注釋去除,并將參數指定為你想要的時間。SetTime 方法有 7 個參數,分別是年(兩位數,23 表示 2023 年)、月、日、小時(24 小時制)、分、秒、星期(1-7)。
from machine import Pin,I2C from DS1302 import DS1302 import time ds1302 = DS1302(21,20,19) # 設置時鐘模塊的時間 2023-11-22 1800 星期三 # ds1302.SetTime(23,11,22,18,00,00,3) while True: date = ds1302.Now() print("{0}-{1}-{2} {3}:{4}:{5}".format(date[0],date[1],date[2],date[3],date[4],date[5])) time.sleep(1)
運行上面的代碼之后,Shell 窗口將會每一秒鐘打印一行從時鐘模塊獲取的當前時間。
審核編輯:劉清
-
時鐘芯片
+關注
關注
2文章
245瀏覽量
39851 -
DS1302
+關注
關注
8文章
449瀏覽量
50621 -
時鐘模塊
+關注
關注
1文章
50瀏覽量
14363 -
CLK
+關注
關注
0文章
127瀏覽量
17129 -
樹莓派
+關注
關注
116文章
1699瀏覽量
105537
原文標題:在樹莓派 Pico 上編程使用 DS1302 時鐘模塊
文章出處:【微信號:趣無盡,微信公眾號:趣無盡】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論