單片機獲取真實時間的實現方法

單片機獲取真實時間(即當前的年月日、時分秒等)通常需要依賴外部時間源或模塊,因為單片機本身沒有內置的實時時鐘(RTC)功能。

在 C 語言環境下,單片機獲取真實時間通常需要依賴?外部硬件模塊(如 RTC、GPS)或?網絡協議(如 NTP)。以下是幾種常見方法的詳細實現(基于 C 語言,不依賴 Arduino 庫):


1. 通過外部 RTC 模塊(如 DS3231)

硬件連接
  • 使用?I2C?接口連接 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.pswp.cn/pingmian/77948.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77948.shtml
英文地址,請注明出處:http://en.pswp.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屬性指定了超鏈接的目標地址,即當用戶點擊超…