stm32萬年歷仿真+keil5程序

stm32萬年歷

本設計是利用單片機實現一個簡易萬年歷系統,能夠準確顯示時、分、秒信息。用戶可通過特定按鍵對時間進行設置調整,具備基本的時間校準功能,可滿足日常簡易計時需求。運用了stm32單片機模塊內部定時器 / 計數器功能來實現精確計時。單片機通過編程,可對輸入輸出端口進行控制,并通過按鍵模塊讀取按鍵狀態并驅動數碼管顯示時間信息。當按鍵按下時,改變對應引腳的電平狀態,單片機通過掃描引腳電平變化來識別按鍵操作,進而執行相應的時間調整功能。另外還有數碼管顯示模塊:使用共陰極,與單片機的輸出引腳相連。通過單片機輸出不同的段碼和位碼,控制數碼管的各個段點亮或熄滅,從而顯示出對應的數字,實現時間的可視化呈現。計時方案:利用單片機內部定時器產生精確的定時中斷,以 1 秒為時間基準進行計時累加。通過設置定時器的初值和計數模式,使其每隔一定時間(如 50ms)產生一次中斷,在中斷服務程序中對計時變量進行累加,當達到 1 秒時,對秒計數變量加 1 ,并進行分、時的進位處理。按鍵處理方案:采用軟件消抖的方式處理按鍵信號。當檢測到按鍵按下時,延遲一定時間(如 10ms)再次檢測按鍵狀態,若仍為按下狀態,則確認按鍵有效。根據不同按鍵的功能定義,對時間進行相應的調整,如秒的清零、分和時的增減等操作。顯示方案:采用動態掃描顯示方式,將數碼管分為位選和段選。單片機按照一定的時間間隔依次選通各個數碼管的位選引腳,同時輸出對應的段碼,使人眼產生視覺暫留效果,從而實現穩定的時間顯示。

題目:簡易萬年歷設計
要求:采用單片機自帶的定時器,實現萬年歷功能。要求包含“年月日”和“時分秒”顯示,通過數碼管顯示,要求初始值顯示為“25-06-19”“23-58-XX”。請結合自身能力選擇以下難度系數進行設計:
(1)通過數碼管切屏顯示,每隔1S切換一次。
(2)增加按鍵實現“年月日”和“時分秒”的切換顯示。
(3)實現時間初值設置功能。

#include "stm32f10x.h"
#include "Delay.h"
#include "MAX7219.h"
#include "Timer.h"
#include "LED.h"
#include "Key.h"// 時間數據結構
typedef struct
{uint8_t year;	// 年 (0-99)uint8_t month;	// 月 (1-12)uint8_t day;	// 日 (1-31)uint8_t hour;	// 時 (0-23)uint8_t minute; // 分 (0-59)uint8_t second; // 秒 (0-59)
} DateTime;DateTime currentTime = {25, 6, 19, 23, 58, 0}; // 初始時間 25-06-19 23:58:00// 數碼管顯示緩沖區
uint8_t displayDigits[8] = {0};// 顯示模式:0 - 年月日,1 - 時分秒
uint8_t displayMode = 1;
uint8_t flag;
// 時間設置狀態:0-正常模式,1-設置年,2-設置月,3-設置日,4-設置時,5-設置分,6-設置秒
uint8_t settingMode = 0;
uint8_t blinkCounter = 0;// 更新時間設置
void UpdateTimeSetting(uint8_t key)
{switch (settingMode){case 1: // 設置年if (key == 3) // 按鍵PB11增加{currentTime.year = (currentTime.year + 1) % 100;}else if (key == 4) // 按鍵PB12減少{currentTime.year = (currentTime.year - 1 + 100) % 100;}break;case 2: // 設置月if (key == 3){currentTime.month = (currentTime.month + 1 > 12) ? 1 : currentTime.month + 1;}else if (key == 4){currentTime.month = (currentTime.month - 1 < 1) ? 12 : currentTime.month - 1;}break;case 3: // 設置日if (key == 3){currentTime.day = (currentTime.day + 1 > 31) ? 1 : currentTime.day + 1;}else if (key == 4){currentTime.day = (currentTime.day - 1 < 1) ? 31 : currentTime.day - 1;}break;case 4: // 設置時if (key == 3){currentTime.hour = (currentTime.hour + 1 > 23) ? 0 : currentTime.hour + 1;}else if (key == 4){currentTime.hour = (currentTime.hour - 1 < 0) ? 23 : currentTime.hour - 1;}break;case 5: // 設置分if (key == 3){currentTime.minute = (currentTime.minute + 1 > 59) ? 0 : currentTime.minute + 1;}else if (key == 4){currentTime.minute = (currentTime.minute - 1 < 0) ? 59 : currentTime.minute - 1;}break;case 6: // 設置秒if (key == 3){currentTime.second = (currentTime.second + 1 > 59) ? 0 : currentTime.second + 1;}else if (key == 4){currentTime.second = (currentTime.second - 1 < 0) ? 59 : currentTime.second - 1;}break;default:break;}
}// 更新數碼管顯示
void UpdateDisplay(void)
{if (displayMode == 0){// 日期顯示: DD-MM-YYdisplayDigits[0] = currentTime.year / 10;displayDigits[1] = currentTime.year % 10;displayDigits[2] = 0x0A; // '-'符號displayDigits[3] = currentTime.month / 10;displayDigits[4] = currentTime.month % 10;displayDigits[5] = 0x0A; // '-'符號displayDigits[6] = currentTime.day / 10;displayDigits[7] = currentTime.day % 10;}else{// 時間顯示: HH-MM-SSdisplayDigits[0] = currentTime.hour / 10;displayDigits[1] = currentTime.hour % 10;displayDigits[2] = 0x0A; // ':'符號displayDigits[3] = currentTime.minute / 10;displayDigits[4] = currentTime.minute % 10;displayDigits[5] = 0x0A; // ':'符號displayDigits[6] = currentTime.second / 10;displayDigits[7] = currentTime.second % 10;}for (int i = 0; i < 8; i++){MAX7219_ShowNum(i + 1, displayDigits[i], 0);}
}// 更新時間
void UpdateTime(void)
{// 秒數加5currentTime.second+=5;// 判斷秒數是否達到60秒if (currentTime.second >= 60){currentTime.second = 0;currentTime.minute++;// 判斷分鐘數是否達到60分鐘if (currentTime.minute >= 60){currentTime.minute = 0;currentTime.hour++;// 判斷小時數是否達到24小時if (currentTime.hour >= 24){currentTime.hour = 0;currentTime.day++;// 簡單日期處理(不考慮月份天數差異)if (currentTime.day > 31){currentTime.day = 1;currentTime.month++;// 判斷月份是否超過12月if (currentTime.month > 12){currentTime.month = 1;currentTime.year++;}}}}}// 更新數碼管顯示UpdateDisplay();
}int main(void)
{Timer_Init();MAX7219_Init(0xFF, 0x0F, 8); // 初始化MAX7219,全開BCD譯碼,亮度最大,顯示所有數碼管Key_Init();                  // 初始化按鍵// 初始顯示UpdateDisplay();while (1){uint8_t key = Key_GetNum();blinkCounter = (blinkCounter + 1) % 20; // 用于閃爍計時if (flag){flag = 0;if (settingMode == 0){ // 僅在非設置模式下更新時間UpdateTime();}}if (key == 1){ // 按鍵PB6切換顯示模式displayMode = !displayMode;UpdateDisplay();}else if (key == 2){ // 按鍵PB9進入/退出設置模式if (settingMode == 0){settingMode = 1; // 進入設置模式,從年開始}else{settingMode = 0; // 退出設置模式}UpdateDisplay();}else if (key == 3 || key == 4){if (settingMode > 0 && settingMode <= 6){UpdateTimeSetting(key);UpdateDisplay();}}else if (key == 5) // 新增按鍵PB13處理邏輯{if (settingMode > 0 && settingMode <= 6){settingMode = (settingMode % 6) + 1; // 自動跳轉到下一設置項UpdateDisplay();}}}
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){static int count=0;count++;if(count>=5){flag = 1;count=0;}TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}

在該電路中,數碼管與 MAX219 芯片相連,MAX219 芯片的各引腳(如 DIG0 - DIG7、DOUT 等)通過線路連接到相應位置 ,并通過 R2(10k)電阻進行相關配置。STM32F103C8 芯片的 PA15 引腳連接到 MAX219 的 LOAD 引腳,PB 端口(PB0 - PB15 )連接多個按鍵用于功能操作(如顯示切換、設置等 )。NRST 引腳通過 R1(10k)電阻和 C3(10μF)電容組成復位電路 ,PC13 - RTC、PC14 - OSC32_IN 等引腳也有對應連接,實現系統相關功能。

?

單片機定制(vx):yeyu_zx8888

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86031.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統--名稱解釋

第一章: 操作系統:位于硬件層之上,所有軟件層之下的一個系統軟件,是管理系統中各種軟硬件資源,方便用戶使用計算機系統的程序集合 并發:宏觀上是同時發生,但是再微觀是交替發生的(若干事件在同一時間間隔內發生,單CPU) 并行:微觀上同時發生(要求多個CPU) 共享:系統的資源可以…

2025.6.16-實習

2025.6.18--2025.6.23 1.使用Cocos&#xff0c;從0開發老虎棒子雞2D游戲。實現&#xff1a;AI自動選擇&#xff0c;倒計時&#xff0c;對戰邏輯&#xff0c;播放動畫&#xff0c;設置背景音樂等功能。 2.使用Cocos&#xff0c;開發2D手術游戲。實現&#xff1a;視頻、音頻控制播…

構建你的 AI 模塊宇宙:Spring AI MCP Server 深度定制指南

引言&#xff1a;當模塊化遇見 AI 在微服務架構的海洋中&#xff0c;MCP&#xff08;Module Communication Protocol&#xff09;就像一艘智能帆船&#xff0c;它讓不同 AI 模塊的通信變得優雅而高效。本文將帶你構建一艘屬于自己的 AI 智能帆船——自定義 Spring AI MCP Serv…

從數據到洞察:UI前端如何利用大數據優化用戶體驗

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在當今數字化時代&#xff0c;數據如同蘊藏著無限價值的寶藏&#xff0c;源源不斷地產生并積累…

SQLite3 在嵌入式C環境中存儲音頻/視頻文件的專業方案

SQLite3 在嵌入式C環境中存儲音頻/視頻文件的專業方案 在嵌入式系統中存儲大型媒體文件需要平衡存儲效率、訪問速度和資源限制。以下是針對嵌入式C環境的優化方案&#xff1a; 一、存儲策略選擇 1. 直接存儲 vs 文件路徑存儲 方法優點缺點適用場景BLOB直接存儲數據一致性高…

區塊鏈技術概述:從比特幣到Web3.0

目錄 區塊鏈技術概述&#xff1a;從比特幣到Web3.0引言&#xff1a;數字革命的下一篇章1. 區塊鏈技術基礎1.1 區塊鏈定義與核心特征1.2 區塊鏈數據結構可視化 2. 比特幣&#xff1a;區塊鏈的開端2.1 比特幣的核心創新2.2 比特幣交易生命周期 3. 以太坊與智能合約革命3.1 以太坊…

Petrel導入well數據

加載井口位置數據&#xff1a;井頭文件應包括name, X, Y, KB, TD這些基本信息&#xff0c;文件格式為txt或prn格式都可。具體步驟&#xff1a;① input面板下?右鍵import file&#xff0c;進入import file界面&#xff0c;選擇文件格式?well heads&#xff08;*.*&#xff09…

51c嵌入式~電路~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12175265 一、高頻電路布線的十大絕招 1 多層板布線 高頻電路往往集成度較高&#xff0c;布線密度大&#xff0c;采用多層板既是布線所必須&#xff0c;也是降低干擾的有效手段。在PCB Layout階段&#xff0c;合理的…

【LLM學習筆記3】搭建基于chatgpt的問答系統(下)

目錄 一、檢查結果檢查有害內容檢查是否符合產品信息 二、搭建一個簡單的問答系統三、評估輸出1.當存在一個簡單的正確答案2.當不存在一個簡單的正確答案 一、檢查結果 本章將引領你了解如何評估系統生成的輸出。在任何場景中&#xff0c;無論是自動化流程還是其他環境&#x…

多項目資料如何統一歸檔與權限管理

在多項目管理環境中&#xff0c;統一資料歸檔與權限管控的關鍵在于&#xff1a;規范化文件結構、自動化歸檔流程、分級權限控制。其中&#xff0c;規范化文件結構是實現統一歸檔的第一步&#xff0c;它直接決定后續歸類、檢索和審計的效率。通過預設項目模板&#xff0c;明確文…

【RTP】基于mediasoup的RtpPacket的H.264打包、解包和demo 1:不含擴展

目前打包、解包沒有對擴展進行操作 測試結果 === H.264 RTP Packetization and Depacketization Test ===1. Generating simulated H.264 frames... Generated 6 H.264 frames2. Packetizing H.264 frames to RTP packets...Frame #0 (size: 1535 bytes, I-fra

【AI論文】Sekai:面向世界探索的視頻數據集

摘要&#xff1a;視頻生成技術已經取得了顯著進展&#xff0c;有望成為交互式世界探索的基礎。然而&#xff0c;現有的視頻生成數據集并不適合用于世界探索訓練&#xff0c;因為它們存在一些局限性&#xff1a;地理位置有限、視頻時長短、場景靜態&#xff0c;以及缺乏關于探索…

websocket服務端開發

websocket技術在服務端實時消息的推送和im聊天系統中得到了廣泛應用。作為一名后端研發人員,這其中又有哪些需要了解和注意的問題點呢?接下來,我一一進行闡明。 SpringBoot項目中引入依賴 引入依賴 <!--websocket支持包--> <dependency> <…

學歷信息查詢API (IVYZ9A2B) 的對接實戰 | 天遠API

摘要 本文是天遠API學歷信息查詢API&#xff08;接口代碼&#xff1a;IVYZ9A2B&#xff09;的深度技術解析文檔。作為一名開發者&#xff0c;我將從實際應用場景出發&#xff0c;詳細介紹該接口的調用方法、數據結構和最佳實踐。無論您是在開發招聘系統、教育管理平臺&#xf…

2025年- H84-Lc192--75.顏色分類(技巧、三路指針排序)--Java版

1.題目描述 2.思路 3.代碼實現 class Solution {public void sortColors(int[] nums) {int low 0; // 下一個 0 應該放的位置int mid 0; // 當前檢查的位置int high nums.length - 1; // 下一個 2 應該放的位置while (mid < high) {if (nums[mid] …

使用markRaw實例化echarts對象

在Vue 3中&#xff0c;markRaw 函數用于標記一個對象&#xff0c;使其永遠不會轉換為響應式代理。在 this.chart markRaw(echarts.init(chartDom)); 這行代碼中&#xff0c;加與不加 markRaw 的主要區別在于Vue是否會將ECharts實例轉換為響應式對象。以下是詳細分析&#xff1…

硬件-DAY08(中斷)

一、蜂鳴器學習&#xff08;中斷&#xff09; 二、BSP工程管理 利用BSP工程管理&#xff0c;使文檔顯示不雜亂&#xff1b; 將這些文件分為4類&#xff0c;并保存到4個不同的文件夾里。 首先在新的工程文件夾里創建一個之后我們編寫的類似led驅動&#xff0c;clk驅動等等外設驅…

【Datawhale組隊學習202506】YOLO-Master task04 YOLO典型網絡模塊

系列文章目錄 文章目錄 系列文章目錄前言4.1 DFL 模塊4.1.1 DFL的核心思想 4.2 SPP 模塊4.2.1 核心思想 4.3 SPPF 模塊4.3.1 核心思想 總結 前言 Datawhale是一個專注于AI與數據科學的開源組織&#xff0c;匯集了眾多領域院校和知名企業的優秀學習者&#xff0c;聚合了一群有開…

springboot中表是以int為主鍵id的,寫了一個生成不重復id的方法

【初衷】 由于系統改造&#xff0c;之前的單應用改成了分布式應用&#xff0c;但是系統底層在搭建的時候部分關聯id定義為了int類型&#xff0c;導致分布式id生成的long類型無法插入到int中&#xff0c;且由于是多系統部署&#xff0c;為了把損失降到最低&#xff0c;故此決定…

天氣查詢API集成指南

天氣查詢API集成指南 引言 在互聯網和移動應用快速發展的今天&#xff0c;天氣查詢API已經成為開發人員構建各種應用程序時不可或缺的工具之一。無論是為用戶提供日常出行建議、幫助農民規劃農作時間&#xff0c;還是支持物流行業優化配送路線&#xff0c;實時且準確的天氣信息…