生活随笔
收集整理的這篇文章主要介紹了
                                
基于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
);  LED_Init();				OLED_Init();			DS3231_Init();		KEY_Init();				Alarmclock
.hour 
= 8;Alarmclock
.min 
= 50;Alarmclock
.sec 
= 0;Alarmclock1_close();Alarmclock1_cmd(0);beep 
= 1;while(1){get_time();display();	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
)		{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_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();  }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简易闹钟的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。