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;实时且准确的天气信息…