设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 1579|回复: 0
收起左侧

年月日算星期 已知年月日求星期几的算法公式 C51(STC)系列8位单片机实现 Keil编译

[复制链接]
发表于 2018-10-10 20:35:57 | 显示全部楼层 |阅读模式
本帖最后由 哒哒哒 于 2018-10-10 20:41 编辑
该算法是 /thread-1485-1-1.html 的移植版本。

  1. #include "reg51.h"
  2. #define U8 unsigned char
  3. #define U16 unsigned int
  4. #define U32 unsigned long
  5. U8 code fymt[12]={31,28,31,30,31,30,31,31,30,31,30,31};        //平年月数表
  6. U8 code lymt[12]={31,29,31,30,31,30,31,31,30,31,30,31};        //闰年月数表
  7. U8 code fywt[12]={6,2,2,5,0,3,5,1,4,6,2,4};                        //平年月代码
  8. U8 code lywt[12]={5,1,2,5,0,3,5,1,4,6,2,4};                        //闰年月代码

  9. bit is_leap_year(U32 year){         //是否为闰年
  10.         return (year %4 == 0 && year %100 !=0 || year %400 ==0);
  11. }

  12. U16 g1yd(U32 year){                //取当前年天数
  13.         return is_leap_year(year)?366:365;
  14. }

  15. U32 gln(U32 year){                 //取闰年数
  16.         return year/4-year/100+year/400;
  17. }

  18. U32 gydn(U32 year){                 //取年天数
  19.         return year*365 + gln(year);
  20. }

  21. U8 ym2d(U32 year,U8 month){                //已知年月取1个月有多少天
  22.         return is_leap_year(year) ? lymt[month-1] : fymt[month-1];
  23. }

  24. bit is_ymd(U32 y,U8 m,U8 d){                 //检测年月日是否有效
  25.         if(y < 0 || m <1 || d<1 || m >12) return 0;
  26.         return d <= ym2d(y,m);
  27. }

  28. U8 g11w(U32 year){                 //已知年求元旦(1月1日)是星期几
  29.         return ((1+gydn(year)-g1yd(year))%7);
  30. }

  31. U8 ymd2w(U32 y,U8 m,U8 d){                //已知年月日求星期几 星期日为1 星期1为2 失败返回0
  32.         U8 yw,yc,mc,w;
  33.         bit leap=is_leap_year(y);                //是否闰年
  34.         if(!is_ymd(y,m,d)) return 0;                //无效日期
  35.         yw=g11w(y);                        //元旦星期
  36.         yc=leap?((yw+2)%7):((yw+8)%7);        //年代码
  37.         mc=leap?lywt[m-1]:fywt[m-1];                //月代码
  38.         w=(yc+mc+d)%7;                        //星期
  39.         if(w == 0) w=7;                        //0则为星期6
  40.         return w;

  41.         
  42. }

  43. void main(){

  44.         while(1){
  45.         P3=ymd2w(2018,12,31);
  46.         }
  47. }

复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-26 03:29 , Processed in 1.267073 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表