news 2026/6/10 15:42:55

基于STM32的电子钟万年历闹钟OLED显示proteus仿真+实物设计(带温湿度显示)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32的电子钟万年历闹钟OLED显示proteus仿真+实物设计(带温湿度显示)

基于STM32的电子钟万年历闹钟OLED显示设计

_带温湿度显示

本设计包含Proteus仿真+程序代码+原理图PCB+元器件清单+设计报告+讲解视频

一、开发环境

仿真图:proteus 8.17

程序编译器:keil 5

编程语言:C语言

设计编号:C0124

二、主要功能

基于STM32F103C8T6的多功能智能时钟系统

  1. 实时时钟显示:使用DS1302时钟芯片显示年、月、日、时、分、星期。

2.温湿度监测:DHT11传感器监测环境温湿度,温湿度数据显示。

温湿度超阈值黄灯亮。

3.闹钟功能:可以设置闹钟时间,具有开关闹钟选项,支持手动停止闹钟。

默认闹钟是00:01

4.具有时间设置功能:通过按键调整年月日时分秒,自动处理闰年,大小月。

5.使用0.96寸OLED显示屏显示所有信息。

主要硬件设备:STM32F103C8T6单片机、DHT11温湿度传感、OLED、蜂鸣器

资料下载链接(可点击):

链接: https://pan.baidu.com/s/1kHw9wHR0Rutz-lL5cVLVEA?pwd=9iq5

提取码: 9iq5

三、仿真设计

开始仿真后,OLED第一行显示年月日星期,第二行显示时分秒,第三行显示温度和湿度。如果温度或者湿度超过范围(温度15-30℃,湿度30-60%)指示灯黄灯亮。

闹钟时间到红色指示灯闪烁,蜂鸣器滴滴滴。

可以设置闹钟和年月日时分秒,通过OLED显示

四、程序设计

程序是用keil5 mdk版本打开的,如果打开有问题,核实下keil的版本,代码有注释方便理解。


代码

intmain(void){DHT11_Data_TypeDef DHT11_Data;// delay_init(); //延时函数 系统初始化// Delay_Init(SYSTEM_CLOCK_8M);User_Delay_Init();LED_GPIO_Config();//初始化GPIO接口KEY_Init();//按键初始化BEEP_Init();//蜂鸣器初始化GENERAL4_TIM_Init();//10ms 通用定时器3初始化 10msNVIC_Configuration();//中断优先级设置USART2_Config();ds1302_gpio_init();delay_ms(5);//初始化ds1302端口ds1032_init();ds1032_read_realTime();//读取此时时刻OLED_Init();//初始化OLEDOLED_Clear();//清屏delay_ms(100);DHT11_Init();//传感器初始化OLED_DrawBMP(0,0,128,8,BMP19);//欢迎使用开机页面delay_ms(1000);OLED_Clear();//清屏RealTime_Display_Init();//上电初始化显示实时时间UsartPrintf(USART_DEBUG,"RealTime_Display_Init...\r\n");// 初始化时间变量为当前时间UpdateTimeVariablesFromDS1302();// 初始化星期显示UpdateWeekDayDisplay();while(1){delay_ms(200);//添加延时,保证检测的稳定性ds1032_read_realTime();//读取此时时刻// 更新星期显示if(TimeData.day!=last_day){UpdateWeekDayDisplay();last_day=TimeData.day;}RealTime_Display();//实时时间日期实时刷新显示if(DHT11_Data_Read_flag)//6秒读取一次温湿度数据{if(DHT11_Read_TempAndHumidity(&DHT11_Data)==SUCCESS){humidity=DHT11_Data.humi_int;temperature=DHT11_Data.temp_int;}else{UsartPrintf(USART_DEBUG,"ERROR:DHT11_Read_TempAndHumidity_fault\r\n");}DHT11_Data_Read_flag=0;//复位读取DHT11数据标志}// 闹钟报警程序段if(Alarm_Clock&&!Alarm_Manual_Stop_flag){if((TimeData.hour==Alarm_Hour)&&(TimeData.minute==Alarm_Minute)){Alarm_Clock_flag=1;// 闹钟报警标志位}else{Alarm_Clock_flag=0;// 闹钟报警标志位}}else{Alarm_Clock_flag=0;// 闹钟报警标志位}// 闹钟报警过程中停止按键if(!KEY_DEC){delay_ms(10);if(KEY_DEC==0){while(!KEY_DEC);Alarm_Manual_Stop_flag=1;}}// 一旦设定值与当前时间不一致则手动终端报警复位if(TimeData.minute!=Alarm_Minute){Alarm_Manual_Stop_flag=0;}// 按键修改时间和日期程序段if(!KEY_ADJ){delay_ms(10);if(KEY_ADJ==0){while(!KEY_ADJ);// 关键修改:在进入时间设置前,更新时间为当前时间UpdateTimeVariablesFromDS1302();OLED_Clear();// 清屏OLED_ShowChinese(0,0,21);// 年OLED_ShowChinese(68,0,22);// 月OLED_ShowChinese(0,3,23);// 日OLED_ShowChinese(68,3,24);// 时OLED_ShowChinese(0,6,25);// 分OLED_ShowChinese(68,6,26);// 周(只显示,不可修改)Show_Modify_Data(num);// 显示默认的时间日期设定参数while(1){// 在设置界面中也要实时更新星期显示u8 temp_w=CalculateWeekDay(y,m,d);OLED_ShowNum(88,6,temp_w,2,16);OLED_ShowNum(20,0,y,2,16);OLED_ShowNum(88,0,m,2,16);OLED_ShowNum(20,3,d,2,16);OLED_ShowNum(88,3,h,2,16);OLED_ShowNum(20,6,mi,2,16);if(!KEY_ALM){delay_ms(10);if(KEY_ALM==0){while(!KEY_ALM);num++;if(num>4)num=0;// 最大值为4,跳过星期选项Show_Modify_Data(num);}}if(!KEY_ADD){delay_ms(10);if(KEY_ADD==0){while(!KEY_ADD);switch(num){case0:y++;if(y>59)y=0;// 年循环:0-59break;case1:m++;if(m>12)m=1;// 月循环:1-12// 月份改变后,需要检查日期是否超出新月份的最大天数if(d>GetMaxDaysInMonth(y,m)){d=GetMaxDaysInMonth(y,m);}break;case2:d++;if(d>GetMaxDaysInMonth(y,m))d=1;// 日循环:1-当月最大天数break;case3:h++;if(h>23)h=0;// 时循环:0-23break;case4:mi++;if(mi>59)mi=0;// 分循环:0-59break;}}}if(!KEY_DEC){delay_ms(10);if(KEY_DEC==0){while(!KEY_DEC);switch(num){case0:if(y>0){y--;}else{y=59;// 年循环:0-59}// 年份改变后,需要检查日期是否超出新年份二月的最大天数if(m==2&&d>GetMaxDaysInMonth(y,m)){d=GetMaxDaysInMonth(y,m);}break;case1:if(m>1){m--;}else{m=12;// 月循环:1-12}// 月份改变后,需要检查日期是否超出新月份的最大天数if(d>GetMaxDaysInMonth(y,m)){d=GetMaxDaysInMonth(y,m);}break;case2:if(d>1){d--;}else{d=GetMaxDaysInMonth(y,m);// 日循环:1-当月最大天数}break;case3:if(h>0){h--;}else{h=23;// 时循环:0-23}break;case4:if(mi>0){mi--;}else{mi=59;// 分循环:0-59}break;}}}if(!KEY_ADJ){delay_ms(10);if(KEY_ADJ==0){while(!KEY_ADJ);// 设置时间时,使用计算得到的星期w=CalculateWeekDay(y,m,d);ProcessTimeSetting();// 处理时间设置ds1302_write_time();// 修改时间,写入OLED_Clear();// 清屏ds1032_read_realTime();// 读取此时时刻Modify_RealTime_Display();// 修改后时间日期刷新一次显示break;}}}}}// 修改闹钟时间和闹钟设定程序段if(!KEY_ALM){delay_ms(10);if(KEY_ALM==0){while(!KEY_ALM);OLED_Clear();// 清屏OLED_ShowChinese(32,0,27);// 闹钟设定OLED_ShowChinese(48,0,28);OLED_ShowChinese(64,0,29);OLED_ShowChinese(80,0,30);OLED_ShowChar(60,3,':',16);Show_Modify_Alarm(num2);// 显示修改闹钟信息while(1){OLED_ShowNum(44,3,Alarm_Hour,2,16);OLED_ShowNum(68,3,Alarm_Minute,2,16);// 闹钟开关显示if(Alarm_Clock){OLED_ShowChinese(104,3,31);}else{OLED_ShowChinese(104,3,32);}// 防止显示1位数,不整齐if(Alarm_Minute<10){OLED_ShowChar(68,3,'0',16);}if(!KEY_ADJ){delay_ms(10);if(KEY_ADJ==0){while(!KEY_ADJ);num2++;if(num2>2)num2=0;Show_Modify_Alarm(num2);}}if(!KEY_ADD){delay_ms(10);if(KEY_ADD==0){while(!KEY_ADD);switch(num2){case0:Alarm_Hour++;if(Alarm_Hour>23)Alarm_Hour=0;// 时循环:0-23break;case1:Alarm_Minute++;if(Alarm_Minute>59)Alarm_Minute=0;// 分循环:0-59break;case2:Alarm_Clock++;if(Alarm_Clock>1)Alarm_Clock=0;// 开关循环:0-1break;}}}if(!KEY_DEC){delay_ms(10);if(KEY_DEC==0){while(!KEY_DEC);switch(num2){case0:if(Alarm_Hour>0){Alarm_Hour--;}else{Alarm_Hour=23;// 时循环:0-23}break;case1:if(Alarm_Minute>0){Alarm_Minute--;}else{Alarm_Minute=59;// 分循环:0-59}break;case2:if(Alarm_Clock>0){Alarm_Clock--;}else{Alarm_Clock=1;// 开关循环:0-1}break;}}}if(!KEY_ALM){delay_ms(10);if(KEY_ALM==0){while(!KEY_ALM);OLED_Clear();ds1032_read_realTime();// 读取此时时刻Modify_RealTime_Display();// 修改后时间日期刷新一次显示break;}}}}}//*

五、原理图PCB

六、元器件清单

11BS-02-A1AJ010B1
212.3kHzBUZ1
311N4007D1
44K4-6×6_THKEY1,KEY2,KEY3,KEY4
51LED-TH-3mm_RLED2
61XL-302UYDLED3
710.96OLED模块_4POLED
81SS8550Q1
914K7R1
102100R3,R7
1111kR5
12110kR6
131DHT11S1
141DS1302ZNU2
151LCKFB-DKX-STM32F103C8T6U6
16132.768KHZX1

七、实物图

八、设计报告

6541字设计报告,内容包括硬件设计、软件设计、调试、结论等。

随着物联网技术和智能家居的快速发展,传统时钟已不能满足现代生活需求。智能时钟作为智能家居系统的重要组成部分,不仅需要提供准确的时间信息,还应具备环境监测、智能提醒等扩展功能。STM32微控制器以其高性能、低功耗和丰富的外设接口,成为开发此类嵌入式系统的理想选择。

尤为值得关注的是,本设计经过了严格的验证流程,利用Proteus仿真软件进行了全面的功能测试与稳定性评估。通过仿真,设计团队不仅提前发现并修正了潜在的硬件冲突与软件逻辑错误,还对系统的实际工作性能进行了细致的校验,确保了最终实物制作与应用时的高可靠性和稳定性。这一仿真验证过程的加入,不仅提升了设计的科学严谨性,也为后续的优化迭代提供了宝贵的参考依据。

九、资料清单&下载链接

0、常见使用问题及解决方法–必读!!!!

1、程序代码

2、Proteus仿真

3、功能要求

4、开题报告

5、设计报告

6、讲解视频

7、原理图PCB

8、元器件清单

9、实物图

10、相关框图

Altium Designer 安装破解

filename.bat

KEIL+proteus 单片机仿真设计教程

KEIL安装破解

Proteus元器件查找

Proteus安装

Proteus简易使用教程

单片机学习资料

相关数据手册

答辩技巧

设计报告常用描述

鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

资料下载链接(可点击):

链接: https://pan.baidu.com/s/1kHw9wHR0Rutz-lL5cVLVEA?pwd=9iq5

提取码: 9iq5

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 7:58:02

AI增强的模糊测试变异策略

随着软件系统复杂度的指数级增长&#xff0c;传统模糊测试方法在漏洞挖掘效率方面面临严峻挑战。2025年&#xff0c;全球网络安全市场规模预计突破3000亿美元&#xff0c;而模糊测试作为软件安全检测的核心手段&#xff0c;其技术演进直接影响着软件产品的安全质量。AI技术的深…

作者头像 李华
网站建设 2026/6/10 12:40:43

生产环境中的智能金丝雀测试:策略与实践

在当今快速迭代的软件交付环境中&#xff0c;生产环境的稳定性直接关系到用户体验和业务连续性。传统测试方法虽能在预生产阶段发现部分问题&#xff0c;但难以覆盖真实流量的复杂场景。智能金丝雀测试&#xff08;Intelligent Canary Testing&#xff09;作为一种渐进式发布策…

作者头像 李华
网站建设 2026/6/7 11:15:17

智能电动汽车赛道测试开发面试深度解析

一、行业背景与面试范式转变 随着新能源汽车市场竞争进入白热化阶段&#xff0c;蔚来、小鹏、理想等头部车企的软件部门已成为测试人才流动的重要方向。2023-2025年期间&#xff0c;这些企业的测试开发岗位面试呈现出明显的架构驱动和场景深化特征。与传统互联网面试相比&…

作者头像 李华
网站建设 2026/6/7 7:01:05

Cerebro插件开发终极指南:从入门到精通的完整教程

Cerebro插件开发终极指南&#xff1a;从入门到精通的完整教程 【免费下载链接】cerebro &#x1f535; Cerebro is an open-source launcher to improve your productivity and efficiency 项目地址: https://gitcode.com/gh_mirrors/ce/cerebro 想象一下&#xff0c;只…

作者头像 李华
网站建设 2026/6/9 17:54:43

更新后的数据保存到数据库之后,为什么还要保存到Redis中?

保存更新后的用户数据到 Redis 中通常是为了提高系统的性能和响应速度。以下是一些常见的原因&#xff1a; 缓存加速Redis 是一个内存数据库&#xff0c;访问速度非常快。将用户数据缓存到 Redis 中可以在后续的请求中快速获取用户信息&#xff0c;而不需要每次都查询数据库。减…

作者头像 李华
网站建设 2026/6/10 12:52:20

Solara终极指南:如何用Python快速构建企业级Web应用

在当今数据驱动的时代&#xff0c;Python开发者面临着从Jupyter笔记本快速过渡到生产级Web应用的挑战。Solara开源项目正是为解决这一痛点而生&#xff0c;作为一个纯Python实现的React风格框架&#xff0c;它让开发者能够轻松扩展Jupyter和Web应用&#xff0c;实现从原型到生产…

作者头像 李华