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简易闹钟相关推荐

  1. 【Arduino 和 DS3231 实时时钟教程】

    [Arduino 和 DS3231 实时时钟教程] 1. 概述 2. 原理分析 3. DS3231 实时时钟 4. 编程 1. 概述 在本Arduino教程中,我们将学习如何使用DS3231实时时钟模 ...

  2. ESP32连接DS3231实时时钟(RTC)的方法

    在本篇文章中,我们将学习如何将RTC实时时钟模块DS3231连接到ESP32开发板和0.96英寸I2C OLED显示屏.我们将使用DS3231实时时钟模块跟踪正确的时间和日期,在OLED显示屏上进行显 ...

  3. 基于DS3231时钟模块的stm32 Hal库程序,源码

    关于DS3231模块介绍我在我的博客基于DS3231时钟模块的stm32 程序,源码中有介绍 ,大家可以自己看下.我这篇直接讲HAL的代码. 一.配置IO /**/****************** ...

  4. ESP32设备驱动-DS3231实时时钟(RTC)驱动

    DS3231实时时钟(RTC)驱动 1.DS3231介绍 DS3231 是一款低成本.极其精确的 I2C 实时时钟 (RTC),具有集成的温度补偿晶体振荡器 (TCXO) 和晶体. 该设备包含电池输入 ...

  5. linux设置rx8010时间,【经验】实时时钟模块RX8010SJ精度的软件校准方法

    RX8010SJ,由于使用简单.标准SOP8封装和高性价比等特点,已经被广泛的应用于各种电子产品的设计中.虽然RX8010SJ内置出厂时经过校准的32.768KHz的晶体单元,能够很大程度上保证了其精 ...

  6. Arduino开发实例-DS3231实时时钟+LCD显示

    DS3231实时时钟+LCD显示 1.DS3231介绍 DS3231是低成本.高精度I2C实时时钟(RTC),具有集成的温补晶振(TCXO)和晶体.该器件包含电池输入端,断开主电源时仍可保持精确的计时 ...

  7. 树莓派基础实验32:DS1302实时时钟模块实验

    一.介绍   现在有很多流行的串行时钟芯片,如DS1302,DS1307,PCF8485等,由于简单的接口,低成本和易用性,他们被广泛应用于电话.传真.便携式仪器等产品领域.在本实验中,我们将使用DS ...

  8. 基于DS3231时钟模块的stm32 程序,源码

    目录 一.模块简介 DS3231时钟芯片结构原理 引脚图 内部结构图 DS3231典型应用电路 DS3231时钟芯片结构 二.与stm32通信 1.配置IO 2.初始化与函数 3.主函数调用 4.使用 ...

  9. PCF8563实时时钟模块功能实现

    1.概述 PCF8563是为低功耗而优化的CMOS实时时钟/日历.提供了可编程时钟输出.中断输出和低电压检测器.所有地址和数据都是通过两路双向IIC总线串行传输的.最大总线速度为400kbits/s. ...

  10. 关于实时时钟模块DS1302使用心得

    最近在做万年历,用到实时时钟DS1302模块,花了两天时间看资料和写驱动,想记录一下我的学习经过,顺便做一下总结. 首先就是在图书馆查各种资料,于是查到的大多是这些,主要时硬件方面的资料: 其实能查到 ...

最新文章

  1. Cocos Studio的动画系统介绍
  2. Scala 学习笔记(2)
  3. 【机器学习基础】对样本不均衡的处理
  4. 技术分享 | 基于EOS的Dapp开发
  5. FCKeidtor的toolbarset的设置
  6. java函_Java 8的函式重用
  7. 配置Setting.xml文件提高maven更新下载jar包速度
  8. HR:不录用她,是因为她“太傻白甜了……”
  9. nc扫描端口-curl-手动查杀木马过程之生成木马程序病原体并自动运行
  10. Android学习系列(7)--App轮询服务器消息
  11. 20200703每日一句
  12. KL散度、交叉熵与JS散度数学公式以及代码例子
  13. HTML基本结构标签
  14. wince 德赛西威2413_德赛西威NAV230凯立德2016春季专版C2134-C7M07-3921J0S
  15. APS生产计划排产在装备制造业的应用
  16. 如何在WinXP下查看软硬件端口的占用情况
  17. iOS开发所需英语词汇整理
  18. SQL server in 用法
  19. Linux:命令 执行操作符
  20. 2020年中国IT咨询行业市场现状及发展趋势

热门文章

  1. Charles 使用
  2. 需求分析报告模板(免费)
  3. cadence 怎么拼版_ALLEGRO 拼版教程
  4. 【认知无线网络】认知无线网络基础知识学习
  5. Web多媒体:编解码器和容器
  6. ria技术_JavaFXpert RIA示例挑战截止日期已延长
  7. 亲测:解决“正在进行另一Java安装,您必须先完成该安装,然后才能运行此安装程序”的问题
  8. 禁用Chrome Frame
  9. 高性能Mysql(第三版)
  10. QTsocket网络编程