基于STM32处理器 的RTC只是个能靠电池维持运行的32位定时器! 并不像实时时钟芯片,读出来就是年月日时分秒。

此程序 第一次运行时候 从超级终端 输入时间

关键代码

/*******************************************************************************

* Function Name : Time_Regulate

* Description    : Returns the time entered by user, using Hyperterminal.

* Input          : None

* Output         : None

* Return         : Current time RTC counter value

*******************************************************************************/

//u32 Month_Days[13] =     {0,31,28,31,30, 31, 30, 31, 31, 30, 31, 30, 31};

u32 Month_Days_Accu_C[13] = {0,31,59,90,120,151,181,212,243,273,304,334,365};

u32 Month_Days_Accu_L[13] = {0,31,60,91,121,152,182,213,244,274,305,335,366};

#define SecsPerDay (3600*24)

u32 Time_Regulate(void)

{

#if 1

u32 Tmp_Year=0xFFFF, Tmp_Month=0xFF, Tmp_Date=0xFF;

u32 LeapY, ComY, TotSeconds, TotDays;

#endif

u32 Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;

printf("\r\n==============Time Settings=====================================");

#if 1

printf("\r\n Please Set Year");

while(Tmp_Year == 0xFFFF)

{

/*32-bit counter at Second Unit--> 4*1024*1024(s) --> 49710(day) --> 136(year)*/

Tmp_Year = USART_Scanf(2136);

}

//Tmp_Year=2010;

printf(": %d", Tmp_Year);

printf("\r\n Please Set Month");

while(Tmp_Month == 0xFF)

{

Tmp_Month = USART_Scanf(12);

}

printf(": %d", Tmp_Month);

printf("\r\n Please Set Date");

while(Tmp_Date == 0xFF)

{

Tmp_Date = USART_Scanf(31);

}

printf(": %d", Tmp_Date);

#endif

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);

#if 1

{

/* change Year-Month-Data-Hour-Minute-Seconds into X(Second) to set RTC->CNTR */

if(Tmp_Year==2000)

LeapY = 0;

else

LeapY = (Tmp_Year - 2000 -1)/4 +1;

ComY = (Tmp_Year - 2000)-(LeapY);

if (Tmp_Year%4)

//common year

TotDays = LeapY*366 + ComY*365 + Month_Days_Accu_C[Tmp_Month-1] + (Tmp_Date-1);

else

//leap year

TotDays = LeapY*366 + ComY*365 + Month_Days_Accu_L[Tmp_Month-1] + (Tmp_Date-1);

TotSeconds = TotDays*SecsPerDay + (Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS);

}

#endif

/* Return the value to store in RTC counter register */

//return((Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS));

return TotSeconds;

}

===============================================

/**

* @brief Displays the current time.

* @param TimeVar: RTC counter value.

* @retval None

*/

#define SecsPerComYear 3153600//(365*3600*24)

#define SecsPerLeapYear 31622400//(366*3600*24)

#define SecsPerFourYear 126230400//((365*3600*24)*3+(366*3600*24))

#define SecsPerDay      (3600*24)

s32 Year_Secs_Accu[5]={0,

31622400,

63158400,

94694400,

126230400};

s32 Month_Secs_Accu_C[13] = { 0,

2678400,

5097600,

7776000,

10368000,

13046400,

15638400,

18316800,

20995200,

23587200,

26265600,

28857600,

31536000};

s32 Month_Secs_Accu_L[13] = {0,

2678400,

5184000,

7862400,

10454400,

13132800,

15724800,

18403200,

21081600,

23673600,

26352000,

28944000,

31622400};

void Time_Display(uint32_t TimeVar)

{

#if 0

uint32_t 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);

#endif

//----------------------------------------------

#if 1

u32 TY = 0, TM = 1, TD = 0;

s32 Num4Y,NumY, OffSec, Off4Y = 0;

u32 i;

//s32 NumDay, OffDay;

s32 NumDay;

#endif

u32 THH = 0, TMM = 0, TSS = 0;

#if 0

/* Compute hours */

THH = TimeVar/3600;

/* Compute minutes */

TMM = (TimeVar % 3600)/60;

/* Compute seconds */

TSS = (TimeVar % 3600)% 60;

#endif

#if 1

{

Num4Y = TimeVar/SecsPerFourYear;

OffSec = TimeVar%SecsPerFourYear;

i=1;

while(OffSec > Year_Secs_Accu[i++])

Off4Y++;

/* Numer of Complete Year */

NumY = Num4Y*4 + Off4Y;

/* 2000,2001,...~2000+NumY-1 complete year before, so this year is 2000+NumY*/

TY = 2000+NumY;

OffSec = OffSec - Year_Secs_Accu[i-2];

/* Month (TBD with OffSec)*/

i=0;

if(TY%4)

{// common year

while(OffSec > Month_Secs_Accu_C[i++]);

TM = i-1;

OffSec = OffSec - Month_Secs_Accu_C[i-2];

}

else

{// leap year

while(OffSec > Month_Secs_Accu_L[i++]);

TM = i-1;

OffSec = OffSec - Month_Secs_Accu_L[i-2];

}

/* Date (TBD with OffSec) */

NumDay = OffSec/SecsPerDay;

OffSec = OffSec%SecsPerDay;

TD = NumDay+1;

/* Compute hours */

THH = OffSec/3600;

/* Compute minutes */

TMM = (OffSec % 3600)/60;

/* Compute seconds */

TSS = (OffSec % 3600)% 60;

}

#endif

printf("Date: %0.4d-%0.2d-%0.2d Time: %0.2d:%0.2d:%0.2d\r",TY, TM, TD,THH, TMM, TSS);

//----------------------------------------------------

}

===========================================

/**

* @brief Gets numeric values from the hyperterminal.

* @param None

* @retval None

*/

//注意返回值一定不能是 uint8_t

uint32_t USART_Scanf(uint32_t value)

{

u32 index = 0;

u32 tmp[4] = {0, 0};

u32 Num;

if (value==2136)

Num = 4;

else

Num = 2;

while(index < Num)

{

/* Loop until RXNE = 1 */

while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)

{

}

tmp[index++] = (USART_ReceiveData(USART1));

if((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39))

{

printf("\n\rPlease enter valid number between 0 and 9");

index--;

}

}

/* Calculate the Corresponding value */

if (value!=2136)

index = ((tmp[0] - 0x30) * 10) + (tmp[1] - 0x30);

else

index = ((tmp[0] - 0x30) * 1000) + ((tmp[1] - 0x30) * 100) + ((tmp[2] - 0x30) * 10) + (tmp[3] - 0x30);

/* Checks */

if(index > value)

{

printf("\n\rPlease enter valid number between 0 and %d", value);

return 0xFF;

}

return index;

}

=============

程序下载地址

显示年月日 时分秒的程序(注意是板凳的回复)

转自Tony嵌入式论坛,地址:http://www.cevx.com/bbs/thread-26329-1-1.html

===================

附:年月日转化为星期的函数

int Ymd2Wday(int year, int month, int days) //年月日 to 星期        ******* 已验证******

{

static int mdays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };

int i, y = year - 1;

for (i=0; i

if (month>2) { // Increment date if this is a leap year after February

if (((year%400)==0) || ((year&3)==0 && (year%100))) ++days;

}

return (y+y/4-y/100+y/400+days)%7;

}

//由年月日计算星期

//判断是否是闰年,闰年2月是29天 公式:366%7=2;如真是是要计算万年用if(((y%4==0)&&(y%100!=0))||(y%400==0))) 这里为了减少编译代码长度

unsigned char getweek(unsigned char year,unsigned char month,unsigned char day)

{

unsigned char week,tp;

tp=0;week=5;                 //初始化2000-01-01星期六

while(tp!=year){             //处理年(2000开始)

week++;               //是上一年的星期的下一天 公式:365%7=1

if(tp%4==0)week++;    //判断是否是閏年,閏年2月是29天 公式:366%7=2

tp++;                 //下一年的1月1日

}

tp=1;

while(tp!=month){                            //处理月(1月开始)

switch(tp){

case 1:case 3:case 5:case 7:case 8:case 10:case 12: week=week+3;break;   //大月天数31%7

case 2: if(year%4==0)week++;break;            //閏月天数,閏年2月是29天 公式:366%7=2 29%7

case 4:case 6:case 9:case 11: week=week+2;break;                          //小月天数30%7

}

tp++;                                               //处理月

}

week=week+day;   //处理日(從1日开始)

week=week%7;

if(week==0) week=7;

return week;         //返回星期

}

-------------------------------------------

我也贡献一个

unsigned char week(void)

{

int Y;

unsigned char A;

Y=2000+t.n;

/*下面的四条语句用来计算输入日期的星期数,是程序的核心部分,缺一不可 */

A = Y>0?(5+(Y+1)+(Y-1)/4-(Y-1)/100+(Y-1)/400)%7:(5+Y+Y/4-Y/100+Y/400)%7;

A = t.y>2?(A+2*(t.y+1)+3*(t.y+1)/5)%7:(A+2*(t.y+2)+3*(t.y+2)/5)%7;

if (((Y%4 == 0 && Y%100 != 0) || (Y%100==0 &&Y%400 == 0)) && t.y>2)   {A =(A+1)%7;}

A=(A+t.r)%7;

if (A==0) A=8;/*星期日显示 8*/

return A;

}

当前的

t.n   年

t.y   月

t.r   日

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

stm32万年历流程图_STM32 万年历 显示年月日 时分秒 星期相关推荐

  1. C#表格table时间显示年月日时分秒格式设置

    C#表格table时间显示年月日时分秒格式设置 作者:张国军_Suger 开发工具与关键技术:Visual Studio 2015.C#..NET 在做C#项目是遇到的前端表格的时间处理问题,一般都是 ...

  2. linux ls 显示文件年份 并支持自定义显示年月日时分秒

    linux ls 显示文件年份 并支持自定义显示年月日时分秒 #linux ls 显示文件年份 并支持自定义显示年月日时分秒 默认情况下ls -l命令只显示月和日,不显示年份: $ ls -l lrw ...

  3. android自定义显示年月日,显示年月日时分秒

    整合了一下别人自定义日期控件,自定义年月日,自定义年月日时分秒,下载地址 http://download.csdn.net/detail/qq_28759359/9647207 showalltime ...

  4. Java日期Date类,格式化,年月日时分秒星期

    Date类 1.由java.util包提供 2.封装了当前日期和时间 3.共有两个构造函数, 无参构造:Date() 使用当前日期及时间初始化对象 有参构造:Date(long number)参数为毫 ...

  5. EXCEL中显示年月日时分秒

    一开始数据只显示年月日时分,不显示秒 查了一下,选中你想要修改的部分,右键选"设置单元格格式",选择"自定义" 在年月日时分格式的后面,加上:ss即可 修改后如 ...

  6. 51单片机c语言年月日设定,综合实例:51单片机(AT89C52)万年历(温度闹钟年月日时分秒星期)...

    功能说明: LCD1602液晶显示年.月.日.时.分.秒.星期.温度,三个按键控制时间日期调整以及闹钟设定. 三个按键: 1."校时"键,每次按下分别对应调整秒.调整分钟.调整小时 ...

  7. html显示年月日分钟,html页面显示年月日时分秒和星期几的两种方式

    Js代码 //-----------------------------方式一--------------------------------------------- function startT ...

  8. js获取年月日时分秒星期,并且动态展示时间

    // 格式化时间 年月日 function formatDate(date) {var myyear = date.getFullYear();var mymonth = date.getMonth( ...

  9. win10系统excel2019单元格显示完整的年月日时分秒设置方法

    https://www.pianshen.com/article/88671983757/ win10系统excel2019单元格显示完整的年月日时分秒设置方法 技术标签: Windows  exce ...

最新文章

  1. ​每日一皮:​你的Frozen Throne...
  2. 数学图形之克莱因瓶(klein bottle)
  3. erlang在NotePad++下的高亮
  4. Servlet 组件相关的接口、抽象类关系图
  5. 静态网页托管_视频教程:如何在IPFS上托管网站!
  6. vue人员轨迹_Vue项目(vuecli3.0搭建)集成高德地图实现路线轨迹绘制
  7. hibernate简单入门教程(四)---------关联映射
  8. kindle刷机ttl_kindle paper white 2 (kpw) 无限重启救砖方法
  9. Redis的下载安装
  10. 新版火狐 拖 功能_Firefox 3:新功能,新功能和新功能
  11. C#微信公众号与订阅号接口开发示例代码
  12. pod、pvc删不掉怎么办?
  13. websocket使用springboot实现的详细步骤
  14. python读文本并写入另一个文本文件中怎么做_使用文本Python将文件中的文本写入另一个文件...
  15. 有关swin transformer相对位置编码的理解:
  16. 指令集架构、微架构、处理器架构、CPU架构、内核
  17. intel芯片内核linux,Linux:再见了Intel 386处理器
  18. Android自定义带标题边框的Layout
  19. 为什么无法运行谷歌play_什么是Google Play积分,以及如何使用它们?
  20. bilibili自动挂机PHP_Bilibili数据接口整理(不定期更新)

热门文章

  1. tcp_tw_reuse 为什么默认是关闭的?
  2. Kindle PaperWhite 3
  3. 小秦的《大地测量学》笔记1
  4. AMD 7nm服务器处理器带来的市场破局
  5. 初学者对于大数据的看法
  6. 论文投稿指南——中文核心期刊推荐(生物科学 2)
  7. Access数据库到Mysql数据库实时更新
  8. STM32 以太网W5500
  9. 安装最好用的计算机软件,8个职场人必装的电脑软件,用过以后就离不开了,太好用!...
  10. Linux常用命令总结(基于杭电泛雅平台)-Linux(13)