日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于DS3231实时时钟模块的stm32简易闹钟

發布時間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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简易闹钟的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。