单片机获取真实时间的实现方法

单片机获取真实时间(即当前的年月日、时分秒等)通常需要依赖外部时间源或模块,因为单片机本身没有内置的实时时钟(RTC)功能。

在 C 语言环境下,单片机获取真实时间通常需要依赖 外部硬件模块(如 RTC、GPS)或 网络协议(如 NTP)。以下是几种常见方法的详细实现(基于 C 语言,不依赖 Arduino 库):


1. 通过外部 RTC 模块(如 DS3231)

硬件连接
  • 使用 I²C 接口连接 RTC 模块(如 SDA→P1.0, SCL→P1.1)。

  • 为 RTC 模块连接备用电池(如 CR2032)。

C 语言代码示例
#include <stdint.h>
#include "i2c.h"  // 假设已实现 I2C 底层驱动#define DS3231_ADDR 0x68 // DS3231 的 I2C 地址// 从 DS3231 读取时间(BCD 格式)
void ds3231_get_time(uint8_t *sec, uint8_t *min, uint8_t *hour, uint8_t *day, uint8_t *month, uint8_t *year) {uint8_t buf[7];i2c_start();i2c_write(DS3231_ADDR << 1); // 写模式i2c_write(0x00);             // 从寄存器 0 开始读i2c_stop();i2c_start();i2c_write((DS3231_ADDR << 1) | 1); // 读模式for (int i = 0; i < 6; i++) buf[i] = i2c_read(1); // 带 ACKbuf[6] = i2c_read(0);             // 最后一个字节不带 ACKi2c_stop();*sec   = buf[0] & 0x7F; // 去掉最高位(时钟停止标志)*min   = buf[1];*hour  = buf[2];*day   = buf[4];*month = buf[5];*year  = buf[6];
}// BCD 转十进制
uint8_t bcd_to_dec(uint8_t bcd) {return (bcd >> 4) * 10 + (bcd & 0x0F);
}int main() {uint8_t sec, min, hour, day, month, year;ds3231_get_time(&sec, &min, &hour, &day, &month, &year);printf("20%02d-%02d-%02d %02d:%02d:%02d\n",bcd_to_dec(year), bcd_to_dec(month), bcd_to_dec(day),bcd_to_dec(hour), bcd_to_dec(min), bcd_to_dec(sec));return 0;
}

2. 通过网络协议(NTP)获取时间

适用于 ESP8266/ESP32 等带网络功能的单片机。

C 语言代码示例(基于 ESP-IDF)
#include <stdio.h>
#include <time.h>
#include "esp_sntp.h"
#include "esp_wifi.h"
#include "nvs_flash.h"void initialize_sntp() {sntp_setoperatingmode(SNTP_OPMODE_POLL);sntp_setservername(0, "pool.ntp.org");sntp_init();
}void print_local_time() {time_t now;struct tm timeinfo;time(&now);localtime_r(&now, &timeinfo);printf("当前时间: %04d-%02d-%02d %02d:%02d:%02d\n",timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday,timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
}void app_main() {nvs_flash_init();wifi_init_sta(); // 假设已实现 WiFi 连接initialize_sntp();while (sntp_get_sync_status() != SNTP_SYNC_STATUS_COMPLETED) {vTaskDelay(1000 / portTICK_PERIOD_MS);}print_local_time();
}

3. 通过 GPS 模块获取时间

解析 GPS 模块输出的 NMEA 协议(如 $GPRMC 语句)中的 UTC 时间。

C 语言-解析GPRMC语句代码示例
#include <string.h>// 解析 GPRMC 语句中的时间(格式:$GPRMC,hhmmss.ss,A,ddmm.mm,N,...*hh)
void parse_gprmc_time(const char *nmea, uint8_t *hour, uint8_t *min, uint8_t *sec) {char *token = strtok((char *)nmea, ",");for (int i = 0; i < 7; i++) token = strtok(NULL, ","); // 跳过前7字段if (token != NULL && strlen(token) >= 6) {*hour = (token[0] - '0') * 10 + (token[1] - '0');*min  = (token[2] - '0') * 10 + (token[3] - '0');*sec  = (token[4] - '0') * 10 + (token[5] - '0');}
}int main() {const char *gprmc = "$GPRMC,123519.00,A,4807.038,N,01131.000,E,022.4,084.4,230394,,,*6A";uint8_t hour, min, sec;parse_gprmc_time(gprmc, &hour, &min, &sec);printf("UTC 时间: %02d:%02d:%02d\n", hour, min, sec);return 0;
}

GNRMC语句获取时间, 具体实现代码可以参考上篇文章https://blog.csdn.net/kivenx/article/details/147441407?fromshare=blogdetail&sharetype=blogdetail&sharerId=147441407&sharerefer=PC&sharesource=kivenx&sharefrom=from_link


4. 手动设置时间(无外部模块)

如果无需高精度,可通过用户输入或编译时间初始化:

#include <stdio.h>
#include <time.h>void set_manual_time() {struct tm manual_time = {.tm_year = 124,  // 2024 - 1900.tm_mon  = 4,     // 5月(0-based).tm_mday = 1,.tm_hour = 12,.tm_min  = 0,.tm_sec  = 0};time_t t = mktime(&manual_time);printf("手动设置时间: %s", ctime(&t));
}

关键点总结

方法优点缺点适用场景
RTC 模块高精度,掉电不丢失需额外硬件离线设备(如电子钟)
NTP自动同步网络时间依赖网络联网设备(如 IoT)
GPS全球可用,自带定位功耗高,需户外信号车载/户外设备
手动设置无需外部模块不精确,需人工干预调试或简单应用

根据需求选择合适方案,并注意 时区转换 和 数据格式处理(如 BCD 编码)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——进程优先级/切换/调度

1.进程优先级 1.进程优先级是什么&#xff1a;进程获取CPU资源的先后顺序 2.为什么要有进程优先级&#xff1a;因为一般CPU只有一块&#xff0c;资源短缺&#xff0c;所以就需要优先级来确定谁先谁后的问题 3.值越低 进程的优先级越高 ps -l进行查看 UID&#xff1a;user id …

铸铁划线平板:多行业的精密测量工具(北重十字滑台加工厂家)

铸铁划线平板是一种用于精密测量和校准的工具&#xff0c;广泛应用于各个行业。它通常由铸铁制成&#xff0c;表面经过精密加工&#xff0c;能够保证较高的平整度和准确度。铸铁划线平板的主要作用是用来检验工件的平整度和垂直度&#xff0c;也常用于划线、校准和测量工件的平…

Excel/WPS表格中图片链接转换成对应的实际图片

Excel 超链图变助手&#xff08;点击下载可免费试用&#xff09; 是一款将链接转换成实际图片&#xff0c;批量下载表格中所有图片的转换工具&#xff0c;无需安装&#xff0c;双击打开即可使用。 表格中链接如下图所示&#xff1a; 操作方法&#xff1a; 1、双击以下图标&a…

STM32---串口通信USART

目录 一、串口通信协议 二、USART模块介绍 &#xff08;1&#xff09;移位寄存器 &#xff08;2&#xff09;控制电路 &#xff08;3&#xff09;波特率 &#xff08;4&#xff09;C语言接口 三、串口的引脚初始化 &#xff08;1&#xff09;引脚分布表 &…

流程架构是什么?为什么要构建流程架构,以及如何构建流程结构?

本文从&#xff1a;流程架构是什么&#xff1f;为什么要构建流程架构&#xff1f;如何构建流程结构三个方面来介绍。 一、首先&#xff0c;我们来了解流程架构是什么&#xff1f; 流程架构是人体的骨架&#xff0c;是大楼的砌筑&#xff0c;是课本的目录&#xff0c;是流程管理…

网络结构及安全科普

文章目录 终端联网网络硬件基础网络协议示例&#xff1a;用户访问网页 OSI七层模型网络攻击&#xff08;Hack&#xff09;网络攻击的主要类别&#xff08;一&#xff09;按攻击目标分类&#xff08;二&#xff09;按攻击技术分类 网络安全防御 典型攻击案例相关名词介绍网络连接…

同z科技面经

同z科技-2025-4-23 1.自我介绍 个人信息 校园经历 实习经历 项目经历 个人技能掌握 目前学习技术 2.封装缓存工具类怎么封装的 先介绍使用缓存的问题 解决的逻辑 封装的逻辑 应用 缓存穿透&#xff1a; 缓存雪崩&#xff1a; 缓存击穿&#xff1a; https://www…

基于LoRA的Llama 2二次预训练实践:高效低成本的大模型领域适配

引言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;如Meta的Llama 2系列凭借其强大的生成和理解能力成为NLP领域的核心工具。然而&#xff0c;直接将通用预训练模型应用于垂直领域&#xff08;如医疗、法律、金融&#xff09;时&#xff0c;常面临领域知识不足的问…

Python爬虫(2)Python爬虫入门:从HTTP协议解析到豆瓣电影数据抓取实战

目录 一、背景与需求‌二、 Web基础与HTTP协议核心解析‌2.1 HTTP协议&#xff1a;数据交互的基石‌2.2 为何爬虫需理解HTTP协议&#xff1f;‌ 三、 Python爬虫实战&#xff1a;Requests库核心用法‌3.1 安装与环境配置‌3.2 案例1&#xff1a;GET请求抓取豆瓣电影Top250‌3.3…

深度学习--ResNet残差神经网络解析

文章目录 前言一、什么是ResNet网络二、传统卷积神经网络存在的问题1、梯度消失和梯度爆炸2、退化问题 三、如何解决问题四、残差结构五、18层残差网络1、解释2、隔层相加优点3、隔层相加数值增大问题 六、18层残差网络以外的表格示例七、BN层&#xff08;Batch Normalization&…

【go】go run-gcflags常用参数归纳,go逃逸分析执行语句,go返回局部变量指针是安全的

go官方参考文档&#xff1a; https://pkg.go.dev/cmd/compile 基本语法 go run 命令用来编译并运行Go程序&#xff0c;-gcflags 后面可以跟一系列的编译选项&#xff0c;多个选项之间用空格分隔。基本语法如下&#xff1a; go run -gcflags "<flags>" main.…

K8S探针的应用

目录&#xff1a; 1、探针的简介2、启用探针2.1、启用就绪探针2.2、启用存活探针2.3、启用启动探针&#xff08;可选&#xff09; 1、探针的简介 在Kubernetes中&#xff0c;探针&#xff08;Probes&#xff09;是用来检查容器健康状况的工具&#xff0c;它们帮助Kubernetes了…

体积小巧的 Word 转 PDF 批量工具

软件介绍 今天给大家介绍一款能批量把 Word 文档转换成 PDF 的实用小工具。 软件特点 这款 Word 批量转 PDF 软件&#xff0c;身材小巧&#xff0c;体积不到 1M&#xff0c;还没界面呢&#xff01;使用时&#xff0c;只要把软件和要转换的 Word 文档放在一个文件夹&#xff…

JMeter介绍

文章目录 1. JMeter简介2. JMeter 下载3. JMeter修改编码集4. 启动并运行JMeter 1. JMeter简介 JMeter 是 Apache 组织使用 Java 开发的一款测试工具&#xff1a; 1、可以用于对服务器、网络或对象模拟巨大的负载 2、通过创建带有断言的脚本来验证程序是否能返回期望的结果 优…

URP-UGUI相关知识

一、UGUI的基本组成部分 Canvas &#xff08;画布&#xff09;所有UI都需要放在Canvas画布下面&#xff0c;不然无法显示EventSystem 所有的事件响应系统都需要依赖于EventSystem,若删除该组件&#xff0c;交互效果就 不会显示 1.Canvas(画…

ShenNiusModularity项目源码学习(20:ShenNius.Admin.Mvc项目分析-5)

ShenNiusModularity项目的系统管理模块主要用于配置系统的用户、角色、权限、基础数据等信息&#xff0c;上篇文章中学习的日志列表页面相对独立&#xff0c;而后面几个页面之间存在依赖关系&#xff0c;如角色页面依赖菜单页面定义菜单列表以便配置角色的权限&#xff0c;用户…

JavaFX 实战:从零打造一个功能丰富的英文“刽子手”(Hangman)游戏

大家好&#xff01;今天我们要挑战一个经典的单词猜谜游戏——“刽子手”&#xff08;Hangman&#xff09;&#xff0c;并使用 JavaFX 这个强大的 GUI 工具包来赋予它现代化的交互体验。这个项目不仅有趣&#xff0c;而且是学习和实践 JavaFX 核心概念的绝佳途径&#xff0c;涵…

【自我介绍前端界面分享】附源码

我用夸克网盘分享了「800套HTML模板」&#xff0c;链接&#xff1a;https://pan.quark.cn/s/a205a794552c <!DOCTYPE HTML> <html> <head> <title>Miniport</title> <meta http-equiv"content-type" content&q…

安宝特分享|AR智能装备赋能企业效率跃升

AR装备开启智能培训新时代 在智能制造与数字化转型浪潮下&#xff0c;传统培训体系正面临深度重构。安宝特基于工业级AR智能终端打造的培训系统&#xff0c;可助力企业构建智慧培训新生态。 AR技术在不同领域的助力 01远程指导方面 相较于传统视频教学的单向输出模式&#x…

今日html笔记

原手写笔记 ------------------------------------------------------------------------------------------------------- 关于超链接的使用 <a href"https://www.luogu.com.cn/" target"_blank">//href属性指定了超链接的目标地址,即当用户点击超…