游乐游手机版
首页/AI热点日报/热点详情

树莓派Pico驱动DS1302时钟模块教程

类型:热点整理2026-07-21
DS1302时钟模块通过SPI协议与树莓派Pico连接:VCC接VSYS,GND共地,CLK、DAT、RST分别接GP21、GP20、GP19。利用MicroPython的DS1302库可编程设置和读取时间,实现数据打标、定时任务及闹钟功能,支持电池备份掉电保持,广泛应用于数据采集、智能家居等需要精确时间戳的嵌入式系统。

在嵌入式开发领域,时钟模块是极为常见的需求——无论是为数据添加时间戳、执行定时任务,还是记录系统日志,都离不开精确的时钟支持。市面上主流的计时时钟芯片包括 DS1302、DS1307 和 DS3231 及其衍生型号,均来自 Dallas 半导体。将 DS1302 与 DS1307 对比后可发现,两者本质上是同一款芯片的不同通信协议版本:一个采用 SPI 通信,另一个采用 I2C 通信。对于树莓派 Pico 而言,两者的使用方法几乎一致。下面以 DS1302 为例,详细拆解具体用法和代码实现,帮助开发者快速上手。

如何在树莓派Pico上编程使用DS1302时钟模块?

硬件连接

接线逻辑非常直观,无需额外电平转换电路。

  • 时钟模块的 VCC 引脚 → 连接到 Pico 的 VSYS(即 5V 供电)
  • 时钟模块的 GND 引脚 → 连接到 Pico 的 GND
  • 时钟模块的 CLK 引脚 → 连接到 Pico 的 GP21
  • 时钟模块的 DAT 引脚 → 连接到 Pico 的 GP20
  • 时钟模块的 RST 引脚 → 连接到 Pico 的 GP19

注意,这里选用的 GPIO 为 21、20、19,你也可以根据实际板子的走线灵活调整,只需在代码中同步修改引脚号即可。

编程实现

软件方面,推荐直接使用开源社区提供的 MicroPython DS1302 库。你可以从 GitHub 下载源码,更简便的方式是直接复制以下代码,保存到 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,其中 1 通常代表周日或周一,具体请参考 DS1302 数据手册确认)。

from machine import Pin,I2C
from DS1302 import DS1302
import time

ds1302 = DS1302(21,20,19)
# 设置时钟模块的时间 2023-11-22 18:00 星期三
# 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 窗口会每隔一秒打印一行从 DS1302 模块读取的当前时间。无需复杂配置,也没有繁琐的依赖,只需几行代码就能让树莓派 Pico 拥有可靠的实时时钟功能。对于需要精确时间戳的 IoT 项目或离线数据记录场景,这个组合已经足够实用。

来源:https://m.elecfans.com/article/2325928.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。