久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
stm32超強日歷源碼(含24節氣和閏平年)
[打印本頁]
作者:
深海之藍
時間:
2018-6-1 09:38
標題:
stm32超強日歷源碼(含24節氣和閏平年)
本歷程使用STM32F103VET6編寫的電子日歷,除了常有的日期和星期外,領加了24節氣;
單片機源程序如下:
/******************** (C) COPYRIGHT 2011 野火嵌入式開發工作室 ********************
* 文件名 :main.c
* 描述 :超強的日歷,支持農歷,24節氣幾乎所有日歷的功能 日歷時間以1970年為元年,
* 用32bit的時間寄存器可以運行到2100年左右。
* 實驗平臺:野火STM32開發板
* 庫版本 :ST3.0.0
**********************************************************************************/
#include "stm32f10x.h"
#include "stdio.h"
#include "calendar.h"
#include "date.h"
__IO uint32_t TimeDisplay = 0;
void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
int fputc(int ch, FILE *f);
void RTC_Configuration(void);
//u32 Time_Regulate(void);
void Time_Regulate(struct rtc_time *tm);
void Time_Adjust(void);
void Time_Display(uint32_t TimeVar);
void Time_Show(void);
u8 USART_Scanf(u32 value);
#define RTCClockSource_LSE
u8 const *WEEK_STR[] = {"日", "一", "二", "三", "四", "五", "六"};
u8 const *zodiac_sign[] = {"豬", "鼠", "牛", "虎", "兔", "龍", "蛇", "馬", "羊", "猴", "雞", "狗"};
struct rtc_time systmtime;
int main()
{
/* System Clocks Configuration */
RCC_Configuration();
/* NVIC configuration */
NVIC_Configuration();
GPIO_Configuration();
USART_Configuration();
/*在啟動時檢查備份寄存器BKP_DR1,如果內容不是0xA5A5,則需重新配置時間并詢問用戶調整時間*/
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
printf("\r\n\n RTC not yet configured....");
/* RTC Configuration */
RTC_Configuration();
printf("\r\n RTC configured....");
/* Adjust time by users typed on the hyperterminal */
Time_Adjust();
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
}
else
{
/*啟動無需設置新時鐘*/
/*檢查是否掉電重啟*/
if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
{
printf("\r\n\n Power On Reset occurred....");
}
/*檢查是否Reset復位*/
else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
{
printf("\r\n\n External Reset occurred....");
}
printf("\r\n No need to configure RTC....");
/*等待寄存器同步*/
RTC_WaitForSynchro();
/*允許RTC秒中斷*/
RTC_ITConfig(RTC_IT_SEC, ENABLE);
/*等待上次RTC寄存器寫操作完成*/
RTC_WaitForLastTask();
}
#ifdef RTCClockOutput_Enable
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);
/* Disable the Tamper Pin */
BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper
functionality must be disabled */
/* Enable RTC Clock Output on Tamper Pin */
BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
#endif
/* Clear reset flags */
RCC_ClearFlag();
/* Display time in infinite loop */
Time_Show();
}
void RCC_Configuration()
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
}
void NVIC_Configuration()
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable the RTC Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*******************************************************************************
* Function Name : USART_Configuration
* Description : Configures the USART1.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART_Configuration()
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
/*******************************************************************************
* Function Name : fputc
* Description : Retargets the C library printf function to the USART or ITM Viewer.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int fputc(int ch, FILE *f)
{
/* 將Printf內容發往串口 */
USART_SendData(USART1, (unsigned char) ch);
while (!(USART1->SR & USART_FLAG_TXE));
return (ch);
}
/***********************************************************************
*函數名:RTC_Configuration
*描述:配置RTC
*輸入:無
*輸出:無
*返回:無
************************************************************************/
void RTC_Configuration()
{
/*允許PWR和BKP時鐘*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/*允許訪問BKP域*/
PWR_BackupAccessCmd(ENABLE);
/*復位備份域*/
BKP_DeInit();
#ifdef RTCClockSource_LSI
/*允許LSI*/
RCC_LSICmd(ENABLE);
/*等待LSI準備好*/
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET)
{
}
/*選擇LSI作為RTC時鐘源*/
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
#elif defined RTCClockSource_LSE
/*允許LSE*/
RCC_LSEConfig(RCC_LSE_ON);
/*等待LSE準備好*/
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)
{
}
/*選擇LSE作為RTC時鐘源*/
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
#endif
/* Enable RTC Clock */
RCC_RTCCLKCmd(ENABLE);
#ifdef RTCClockOutput_Enable
/*禁止Tamper引腳*/
BKP_TamperPinCmd(DISABLE);/*為了將RTCCLK/64在Tamper引腳輸出,Tamper功能必須被禁止*/
/*允許RTC時鐘在Tamper引腳上輸出*/
BKP_RTCCalibrationClockOutputCmd(ENABLE);
#endif
/*等待寄存器同步*/
RTC_WaitForSynchro();
/*等待上次RTC寄存器寫操作完成*/
RTC_WaitForLastTask();
/*允許RTC秒中斷*/
RTC_ITConfig(RTC_IT_SEC, ENABLE);
/*等待上次RTC寄存器寫操作完成*/
RTC_WaitForLastTask();
#ifdef RTCClockSource_LSI
/*設置分頻系數*/
RTC_SetPrescaler(31999); /*RTC周期=RTCCLK/RTC_PR=(32.000kHz/(31999+1))*/
#elif defined RTCClockSource_LSE
RTC_SetPrescaler(32767); /*RTC周期=RTCCLK/RTC_PR=(32.768kHz/(31767+1))*/
#endif
/*等待上次RTC寄存器寫操作完成*/
RTC_WaitForLastTask();
}
/*******************************************************************************
* Function Name : Time_Regulate
* Description : Returns the time entered by user, using Hyperterminal.
* Input : None
* Output : None
* Return : Current time RTC counter value
*******************************************************************************/
//u32 Time_Regulate()
//{
// u32 Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;
//
// printf("\r\n==============Time Settings=====================================");
// printf("\r\n Please Set Hours");
//
// while (Tmp_HH == 0xFF)
// {
// Tmp_HH = USART_Scanf(23);
// }
// printf(": %d", Tmp_HH);
// printf("\r\n Please Set Minutes");
// while (Tmp_MM == 0xFF)
// {
// Tmp_MM = USART_Scanf(59);
// }
// printf(": %d", Tmp_MM);
// printf("\r\n Please Set Seconds");
// while (Tmp_SS == 0xFF)
// {
// Tmp_SS = USART_Scanf(59);
// }
// printf(": %d", Tmp_SS);
//
// /* 返回用戶輸入值,以便存入RTC計數寄存器 */
// return((Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS));
//}
void Time_Regulate(struct rtc_time *tm)
{
u32 Tmp_YY = 0xFF, Tmp_MM = 0xFF, Tmp_DD = 0xFF, Tmp_HH = 0xFF, Tmp_MI = 0xFF, Tmp_SS = 0xFF;
printf("\r\n=========================Time Settings==================");
printf("\r\n 請輸入年份(Please Set Years): 20");
while (Tmp_YY == 0xFF)
{
Tmp_YY = USART_Scanf(99);
}
printf("\n\r 年份被設置為: 20%0.2d\n\r", Tmp_YY);
tm->tm_year = Tmp_YY+2000;
Tmp_MM = 0xFF;
printf("\r\n 請輸入月份(Please Set Months): ");
while (Tmp_MM == 0xFF)
{
Tmp_MM = USART_Scanf(12);
}
printf("\n\r 月份被設置為: %d\n\r", Tmp_MM);
tm->tm_mon= Tmp_MM;
Tmp_DD = 0xFF;
printf("\r\n 請輸入日期(Please Set Dates): ");
while (Tmp_DD == 0xFF)
{
Tmp_DD = USART_Scanf(31);
}
printf("\n\r 日期被設置為: %d\n\r", Tmp_DD);
tm->tm_mday= Tmp_DD;
Tmp_HH = 0xFF;
printf("\r\n 請輸入時鐘(Please Set Hours): ");
while (Tmp_HH == 0xFF)
{
Tmp_HH = USART_Scanf(23);
}
printf("\n\r 時鐘被設置為: %d\n\r", Tmp_HH );
tm->tm_hour= Tmp_HH;
Tmp_MI = 0xFF;
printf("\r\n 請輸入分鐘(Please Set Minutes): ");
while (Tmp_MI == 0xFF)
{
Tmp_MI = USART_Scanf(59);
}
printf("\n\r 分鐘被設置為: %d\n\r", Tmp_MI);
tm->tm_min= Tmp_MI;
Tmp_SS = 0xFF;
printf("\r\n 請輸入秒鐘(Please Set Seconds): ");
while (Tmp_SS == 0xFF)
{
Tmp_SS = USART_Scanf(59);
}
printf("\n\r 秒鐘被設置為: %d\n\r", Tmp_SS);
tm->tm_sec= Tmp_SS;
}
/*******************************************************************************
* Function Name : Time_Adjust
* Description : Adjusts time.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
//void Time_Adjust()
//{
// /* Wait until last write operation on RTC registers has finished */
// RTC_WaitForLastTask();
//
// /* 修改當前RTC計數寄存器內容 */
// RTC_SetCounter(Time_Regulate());
//
// /* Wait until last write operation on RTC registers has finished */
// RTC_WaitForLastTask();
//}
void Time_Adjust()
{
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Get time entred by the user on the hyperterminal */
Time_Regulate(&systmtime);
/* Get wday */
GregorianDay(&systmtime);
/* 修改當前RTC計數寄存器內容 */
RTC_SetCounter(mktimev(&systmtime));
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
/*******************************************************************************
* Function Name : Time_Display
* Description : Displays the current time.
* Input : - TimeVar: RTC counter value.
* Output : None
* Return : None
*******************************************************************************/
//void Time_Display(u32 TimeVar)
//{
// u32 THH = 0, TMM = 0, TSS = 0;
//
// /* Compute hours */
// THH = TimeVar / 3600;
// /* Compute minutes */
// TMM = (TimeVar % 3600) / 60;
// /* Compute seconds */
// TSS = (TimeVar % 3600) % 60;
//
// printf("Time: %0.2d:%0.2d:%0.2d\r", THH, TMM, TSS);
//}
void Time_Display(uint32_t TimeVar)
{
static uint32_t FirstDisplay = 1;
u8 str[15]; // 字符串暫存
to_tm(TimeVar, &systmtime);
if((!systmtime.tm_hour && !systmtime.tm_min && !systmtime.tm_sec) || (FirstDisplay))
{
GetChinaCalendar((u16)systmtime.tm_year, (u8)systmtime.tm_mon, (u8)systmtime.tm_mday, str);
printf("\n\r\n\r 今天農歷:%0.2d%0.2d,%0.2d,%0.2d", str[0], str[1], str[2], str[3]);
GetChinaCalendarStr((u16)systmtime.tm_year,(u8)systmtime.tm_mon,(u8)systmtime.tm_mday,str);
printf(" %s", str);
if(GetJieQiStr((u16)systmtime.tm_year, (u8)systmtime.tm_mon, (u8)systmtime.tm_mday, str))
printf(" %s\n\r", str);
FirstDisplay = 0;
}
/* 輸出公歷時間 */
printf("\r 當前時間為: %d年(%s年) %d月 %d日 (星期%s) %0.2d:%0.2d:%0.2d",
systmtime.tm_year, zodiac_sign[(systmtime.tm_year-3)%12], systmtime.tm_mon, systmtime.tm_mday,
WEEK_STR[systmtime.tm_wday], systmtime.tm_hour,
systmtime.tm_min, systmtime.tm_sec);
}
/*******************************************************************************
* Function Name : Time_Show
* Description : Shows the current time (HH:MM:SS) on the Hyperterminal.
* Input : None
* Output : None
* Return : None
******************************************************************************/
void Time_Show()
{
printf("\n\r");
/* Infinite loop */
while (1)
{
/* 每過1s */
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
超強日歷(含24節氣和閏平年).rar
(255.87 KB, 下載次數: 245)
2018-6-2 04:07 上傳
點擊文件名下載附件
功能最齊全的電子日歷
下載積分: 黑幣 -5
作者:
scybyq
時間:
2019-3-23 17:59
很想要這資源
作者:
Andy-Yeung
時間:
2019-11-15 13:50
贊,跑得很6,感謝樓主分享,,,之前在論壇下載別人的f103cb_FreeRTOS跑到硬件故障中斷了
作者:
256655
時間:
2019-11-30 10:53
想要這程序可黑幣還差一顆星,我籌齊了過來哈
作者:
huangye-008
時間:
2019-11-30 23:32
收藏學習了,謝謝分享!!
作者:
vvv64
時間:
2019-12-4 23:44
可算找到了,收藏學習,謝謝分享!
作者:
委曲求全
時間:
2019-12-23 07:55
戰艦的板子能跑嗎
作者:
570480785@qq.co
時間:
2020-2-26 14:30
收藏學習了,謝謝分享
作者:
HWL0541
時間:
2020-2-26 18:44
下載了,樓主辛苦了
作者:
15509091486stf
時間:
2020-12-7 16:47
MiniSTM32開發板能跑嗎?
作者:
ab.c
時間:
2021-6-26 21:38
proteus誰有能分享學習一下嗎?
作者:
dcc024
時間:
2021-6-28 11:04
我也開發了一個呢,還修正了天之地干表
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
免费黄色大片
|
99一区二区
|
成人羞羞网站
|
在线播放国产精品
|
国产精品一区二区在线免费观看
|
欧美精品黄色
|
成人一区二区在线
|
黄色网址在线免费观看
|
亚洲乱色
|
国产福利视频
|
亚洲人精品
|
久久福利社
|
国产精品久久久精品
|
黄色小说网站在线观看
|
黄网站免费大全入口
|
午夜精品国产精品大乳美女
|
成av人片一区二区三区久久
|
日韩小视频
|
日批视频网站
|
国产一级片视频
|
黄色大毛片
|
天天干天天做
|
久艹视频在线观看
|
中文字幕精品一区久久久久
|
成人激情视频网
|
六十路av
|
日韩黄色一级
|
日韩一区二区三区在线
|
婷色
|
亚洲一区二区三区视频
|
99一区二区
|
a级片在线免费观看
|
美国一级大黄一片免费中文
|
激情视频小说
|
欧美成人综合
|
欧美日韩国产片
|
麻豆成人91精品二区三区
|
国产精品一区二区免费
|
黄色小视频免费观看
|
国产精品三级视频
|
国产成人久久精品麻豆二区
|