基于DS3231实时时钟模块的stm32简易闹钟
stm32简易闹钟
设计、制作一个简易的闹钟。要求如下:
(1)作品需设有电源指示灯(绿),上电后,指示灯亮;
(2)该闹钟能够显示当前的日期和时间,显示界面如下:
Alarm Clock
Date:年-月-日 (日期)
Time:时:分:秒 (时间)
Alm: 时:分:秒 (报警时间)
(3)报警时间可调。设4个按键,分别为调时、调分、调秒、确定
(4)当报警时间到达时,采用蜂鸣器报警,蜂鸣器要求响5S钟。
系统系统
时钟模块设计与论证
方案一:直接采用STM32单片机自身集成的RTC实时时钟,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是单片机掉电会丢失数据,需要外部32.768KHz晶振和纽扣电池供电。
方案二:采用DS1302为计时时钟芯片
该芯片是串行电路,与单片机接口简单,但需另备电池和32.768kHz晶振,因焊接工艺和晶振质量等原因会导致精度降低。
方案三:采用DS3231实时时钟模块
该芯片与单片机通过IIC串行通信,传递速度比较快。自带有电池,不需要外部晶振,完整的时钟日历功能包括秒、分、时、星期、日期、月和年计时,并提供有效期到2100年的闰年补偿,两个日历闹钟。还有集成了温度传感器,成本低。
由于DS3231时钟芯片模块精度高,而且具有闰年补偿功能且价格经济实惠等优点,故采用方案三。
本设计采用模块
采用STM32F103C8T6作为控制器,采用独立按键输入,0.96寸OLED显示屏spi四线通信作为显示模块,DS3231M模块作为实时时钟模块,发声模块采用有源蜂鸣器模块。
原理图如下:
主程序:
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "oled.h"
#include "picture.h"
#include "ds3231.h"
#include "key.h"_calendar_part calendar;//声明时钟结构体_Alarmclock_part Alarmclock;//声明闹钟结构体typedef struct
{u8 sure_flag;u8 stop_flag;
}_Alarm_flag; //标志结构体_Alarm_flag flag;void display(void);
void Key_Control(void);int main()
{SysTick_Init(72);//系统时钟初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组LED_Init(); //led初始化OLED_Init(); //OLED初始化DS3231_Init(); //DS3231初始化KEY_Init(); //按键初始化Alarmclock.hour = 8;//闹钟初始值Alarmclock.min = 50;Alarmclock.sec = 0;Alarmclock1_close();//初始先将闹钟关闭并清除闹钟标志位Alarmclock1_cmd(0);beep = 1;while(1){get_time();display(); //oled显示Key_Control(); //按键控制if(flag.sure_flag){Alarmclock1_cmd(1); //闹钟使能SetAlarmclock(Alarmclock.hour,Alarmclock.min,Alarmclock.sec);//设置闹钟if(Alarmclock1state()==1&&!flag.stop_flag)//检测闹钟标志位{beep = 0; //蜂鸣器打开Alarmclock1_cmd(0); //闹钟失能Alarmclock1_close(); //关闭闹钟并清理标志位flag.stop_flag = 1; }}else{beep = 1; //蜂鸣器关闭}if(flag.stop_flag) //使闹钟5秒钟后停止{Alarmclock1_cmd(1); SetAlarmclock(Alarmclock.hour,Alarmclock.min,Alarmclock.sec+5); if(Alarmclock1state()==1){beep = 1;Alarmclock1_cmd(0);Alarmclock1_close();flag.stop_flag = 0;flag.sure_flag = 0;}}}
}void display(void)//OLED显示
{/*****日期显示****/OLED_ShowNum(0,0,2000+calendar.year,4,16);OLED_ShowFontHZ(16*2,0,0,16,1); //年OLED_ShowNum(16*3,0,calendar.month,2,16);OLED_ShowFontHZ(16*4,0,1,16,1); //月OLED_ShowNum(16*5,0,calendar.day,2,16);OLED_ShowFontHZ(16*6,0,2,16,1); //日/*****时间显示*****/OLED_ShowChar(24*0,16,calendar.hour/10+'0',24,1); //时OLED_ShowChar(12*1,16,calendar.hour%10+'0',24,1); //时OLED_ShowChar(6*5,16,':',24,1);OLED_ShowChar(24*2,16,calendar.min/10+'0',24,1); //分OLED_ShowChar(12*5,16,calendar.min%10+'0',24,1); //分OLED_ShowChar(6*13,16,':',24,1);OLED_ShowChar(24*4,16,calendar.sec/10+'0',24,1); //秒OLED_ShowChar(12*9,16,calendar.sec%10+'0',24,1); //秒/******闹钟******/if(flag.sure_flag)OLED_ShowString(16*0,48,"A",16);else OLED_ShowString(16*0,48," ",16);OLED_ShowChar(16*1,48,Alarmclock.hour/10+'0',16,1); //时OLED_ShowChar(8*3,48,Alarmclock.hour%10+'0',16,1); //时OLED_ShowChar(4*9,48,':',16,1);OLED_ShowChar(16*3,48,Alarmclock.min/10+'0',16,1); //分OLED_ShowChar(8*7,48,Alarmclock.min%10+'0',16,1); //分OLED_ShowChar(4*17,48,':',16,1);OLED_ShowChar(16*5,48,Alarmclock.sec/10+'0',16,1); //秒OLED_ShowChar(8*11,48,Alarmclock.sec%10+'0',16,1); //秒OLED_Refresh_Gram(); //刷新GRAM数组}void Key_Control(void)//按键控制
{u8 temp = 0;temp = KEY_Scan(0);switch(temp){case 1: Alarmclock.hour+=1;if(Alarmclock.hour>=24) Alarmclock.hour=0;break;case 2: Alarmclock.min+=1;if(Alarmclock.min>=60) Alarmclock.min=0;break;case 3: Alarmclock.sec+=1;if(Alarmclock.sec>=60) Alarmclock.sec=0;break;case 4: flag.sure_flag =~ flag.sure_flag;break;}}
源程序这里https://download.csdn.net/download/qq_44702247/12581386
基于DS3231实时时钟模块的stm32简易闹钟相关推荐
- 【Arduino 和 DS3231 实时时钟教程】
[Arduino 和 DS3231 实时时钟教程] 1. 概述 2. 原理分析 3. DS3231 实时时钟 4. 编程 1. 概述 在本Arduino教程中,我们将学习如何使用DS3231实时时钟模 ...
- ESP32连接DS3231实时时钟(RTC)的方法
在本篇文章中,我们将学习如何将RTC实时时钟模块DS3231连接到ESP32开发板和0.96英寸I2C OLED显示屏.我们将使用DS3231实时时钟模块跟踪正确的时间和日期,在OLED显示屏上进行显 ...
- 基于DS3231时钟模块的stm32 Hal库程序,源码
关于DS3231模块介绍我在我的博客基于DS3231时钟模块的stm32 程序,源码中有介绍 ,大家可以自己看下.我这篇直接讲HAL的代码. 一.配置IO /**/****************** ...
- ESP32设备驱动-DS3231实时时钟(RTC)驱动
DS3231实时时钟(RTC)驱动 1.DS3231介绍 DS3231 是一款低成本.极其精确的 I2C 实时时钟 (RTC),具有集成的温度补偿晶体振荡器 (TCXO) 和晶体. 该设备包含电池输入 ...
- linux设置rx8010时间,【经验】实时时钟模块RX8010SJ精度的软件校准方法
RX8010SJ,由于使用简单.标准SOP8封装和高性价比等特点,已经被广泛的应用于各种电子产品的设计中.虽然RX8010SJ内置出厂时经过校准的32.768KHz的晶体单元,能够很大程度上保证了其精 ...
- Arduino开发实例-DS3231实时时钟+LCD显示
DS3231实时时钟+LCD显示 1.DS3231介绍 DS3231是低成本.高精度I2C实时时钟(RTC),具有集成的温补晶振(TCXO)和晶体.该器件包含电池输入端,断开主电源时仍可保持精确的计时 ...
- 树莓派基础实验32:DS1302实时时钟模块实验
一.介绍 现在有很多流行的串行时钟芯片,如DS1302,DS1307,PCF8485等,由于简单的接口,低成本和易用性,他们被广泛应用于电话.传真.便携式仪器等产品领域.在本实验中,我们将使用DS ...
- 基于DS3231时钟模块的stm32 程序,源码
目录 一.模块简介 DS3231时钟芯片结构原理 引脚图 内部结构图 DS3231典型应用电路 DS3231时钟芯片结构 二.与stm32通信 1.配置IO 2.初始化与函数 3.主函数调用 4.使用 ...
- PCF8563实时时钟模块功能实现
1.概述 PCF8563是为低功耗而优化的CMOS实时时钟/日历.提供了可编程时钟输出.中断输出和低电压检测器.所有地址和数据都是通过两路双向IIC总线串行传输的.最大总线速度为400kbits/s. ...
- 关于实时时钟模块DS1302使用心得
最近在做万年历,用到实时时钟DS1302模块,花了两天时间看资料和写驱动,想记录一下我的学习经过,顺便做一下总结. 首先就是在图书馆查各种资料,于是查到的大多是这些,主要时硬件方面的资料: 其实能查到 ...
最新文章
- Cocos Studio的动画系统介绍
- Scala 学习笔记(2)
- 【机器学习基础】对样本不均衡的处理
- 技术分享 | 基于EOS的Dapp开发
- FCKeidtor的toolbarset的设置
- java函_Java 8的函式重用
- 配置Setting.xml文件提高maven更新下载jar包速度
- HR:不录用她,是因为她“太傻白甜了……”
- nc扫描端口-curl-手动查杀木马过程之生成木马程序病原体并自动运行
- Android学习系列(7)--App轮询服务器消息
- 20200703每日一句
- KL散度、交叉熵与JS散度数学公式以及代码例子
- HTML基本结构标签
- wince 德赛西威2413_德赛西威NAV230凯立德2016春季专版C2134-C7M07-3921J0S
- APS生产计划排产在装备制造业的应用
- 如何在WinXP下查看软硬件端口的占用情况
- iOS开发所需英语词汇整理
- SQL server in 用法
- Linux:命令 执行操作符
- 2020年中国IT咨询行业市场现状及发展趋势