找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
收起左侧

[原创]ESP32-C3 + DS12C887 + TM1637 桌面时钟系统 (模块化版)

[复制链接]
ID:1175769 发表于 2026-8-25 20:38 | 显示全部楼层 |阅读模式
ESP32-C3 + DS12C887 + TM1637 桌面时钟系统 (模块化版)

/*
    * 项目名称: ESP32-C3 + DS12C887 + TM1637 桌面时钟系统 (模块化版)
    * 硬件平台: ESP32-C3


    | 文件 | 职责 | 说明 |
    |------|------|------|
    | ClockProject.ino | 主程序 | `setup()` / `loop()`,编排各模块协作 |
    | config.h | 配置层 | 引脚定义、DS12C887 寄存器地址、Wi-Fi/NTP 参数 |
    | ds12c887.h | DS12C887 驱动(头) | 函数声明 + `dataBusPins` 数组 |
    | ds12c887.cpp | DS12C887 驱动(实现) | `setBusOutput`、`ds_read`、`ds_write`、BCD 转换 |
    | tm1637.h | TM1637 驱动(头) | 段码表声明 + 函数声明 + `tm_brightness`  extern |
    | tm1637.cpp | TM1637 驱动(实现) | `tm_init`、`tm_display_time`、`tm_set_brightness` |
    | commands.h | 串口命令(头) | `handleSerialCommand` 声明 |
    | commands.cpp | 串口命令(实现) | C/R/B/D/S 五组命令处理逻辑 |


    ClockProject.ino
    └─ includes → commands.h ──┬→ config.h
                                ├→ ds12c887.h ──→ config.h
                                └→ tm1637.h ────→ config.h
*/


#include "config.h"
#include "ds12c887.h"
#include "tm1637.h"
#include "commands.h"


// 【修复】在这里定义 serialBuffer,让 ClockProject.ino 也能使用
String serialBuffer;


void setup() {
  Serial.begin(115200);
  delay(1000);


  // 初始化 DS12C887 控制引脚
  pinMode(DS_AS, OUTPUT);
  pinMode(DS_RD, OUTPUT);
  pinMode(DS_WR, OUTPUT);
  pinMode(DS_CS, OUTPUT);
  digitalWrite(DS_CS, HIGH);
  digitalWrite(DS_AS, LOW);
  digitalWrite(DS_RD, HIGH);
  digitalWrite(DS_WR, HIGH);


  // 初始化 TM1637
  tm_init();


  // 检查 RTC 是否初始化,若未配置则写入默认时间
  uint8_t regB = ds_read(REG_B);
  if (regB == 0x00 || regB == 0xFF) {
    Serial.println("⚠️ RTC not initialized. Setting default time...");
    ds_write(REG_YEAR, dec2bcd(26));
    ds_write(REG_MON, dec2bcd(8));
    ds_write(REG_DATE, dec2bcd(7));
    ds_write(REG_HOUR, dec2bcd(12));
    ds_write(REG_MIN, dec2bcd(0));
    ds_write(REG_SEC, dec2bcd(0));
    ds_write(REG_B, 0x06);
  }


  Serial.println("\n=================================");
  Serial.println("  DS12C887 Clock System Ready");
  Serial.println("=================================");
  Serial.println("C:<ts> | R: | B:<0-7> | D: | S:");
  Serial.println("=================================\n");


  Syncing_NTP_Time();
}


void loop() {
  // 处理串口命令
  while (Serial.available()) {
    char c = Serial.read();
    if (c == '\n' || c == '\r') {
      if (serialBuffer.length() > 0) {
        handleSerialCommand(serialBuffer);
        serialBuffer = "";
      }
    } else {
      serialBuffer += c;
      if (serialBuffer == "C:") { Serial.print("\n>> Format: C:<UTC_Timestamp>\n>> Input: C:"); }
    }
  }


  // 读取并显示时间
  uint8_t sec = bcd2dec(ds_read(REG_SEC));
  uint8_t min = bcd2dec(ds_read(REG_MIN));
  uint8_t hour = bcd2dec(ds_read(REG_HOUR));


  bool colon = (sec % 2 == 0);
  tm_display_time(hour, min, colon);
  delay(500);
}

全部源码可编译(Arduino)、烧录到ESP32-C3中,源码详情见附件:

1.JPG
2.JPG
3.JPG
4.JPG

DS12C887ClockProject_OK.rar

8.44 KB, 下载次数: 0, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表