万年历星期的算法(C语言)
字体放大 字体缩小 字体恢复 杏仁黄 秋叶褐 胭脂红 芥末绿 天蓝 雪青 灰 银河白(默认色)

#include <stdio.h>

code unsigned char WeekTab[] = {//闰年月星期表
  (3 << 5) + 31,//1月
  (6 << 5) + 29,//2月
  (0 << 5) + 31,//3月
  (3 << 5) + 30,//4月
  (5 << 5) + 31,//5月
  (1 << 5) + 30,//6月
  (3 << 5) + 31,//7月
  (6 << 5) + 31,//8月
  (1 << 5) + 30,//9月
  (4 << 5) + 31,//10月
  (0 << 5) + 30,//11月
  (2 << 5) + 31 //12月
};

/*------------------------------------------------------------------------------
----------
                                2000年~2099年星期算法
--------------------------------------------------------------------------------
---------*/
unsigned char WeekDay20(unsigned char y, unsigned char m, unsigned char d)
{
unsigned char week, day;
  day = WeekTab[m - 1];//月表
  week = day >> 5;//月星期数
  day &= 0x1f;//月天数
  if ((m < 3) && (y & 0x03)){//平年
    if (m == 2) day--;//平年月天数
    week++;//平年月表+1
  }
  y = y + (y >> 2);//年+年/4
  week = (week +  y + d + 2) % 7;//(星期=年+年/4+月表+2日)%7
  return (week << 5) | day;//返回星期和月天数
}

/*------------------------------------------------------------------------------
----------
                                0000年~9999年星期算法
--------------------------------------------------------------------------------
---------*/
unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m,
unsigned char d)
{
unsigned char week, day;
  c &= 0x03;//百年%4
  c = c | (c << 2);//百年%4*5
  day = WeekTab[m - 1];//月表
  week = day >> 5;//月星期数
  day &= 0x1f;//月天数
  if ((m < 3) && !((c == 0) | (y & ((y & 0x03) == 0)))){//平年
    if (m == 2) day--;//平年月天数
    week++;//平年月表+1
  }
  y = y + (y >> 2);//年+年/4
  week = (week + c + y + d + 2) % 7;//(星期=百年%4*5+年+年/4+月表+日+2)%7
  return (week << 5) | day;//返回星期和月天数
}

unsigned char BcdToBin(unsigned char val)
{
  val = (val >> 4) * 10 + (val & 0x0f);//将BCD码转换为10进制数
  return val;//返回10进制数
}

void main(void)
{
unsigned char c, y, m, d;
unsigned char cx, yx, mx, dx;  
unsigned char WDay, Week, Day;
/*---------------------------------------------------------
     0001年1月1日 星期天
---------------------------------------------------------*/
  c    = 0x00;
  y    = 0x01;
  m    = 0x01;
  d    = 0x01;
  cx   = BcdToBin(c);//百年
  yx   = BcdToBin(y);//年
  mx   = BcdToBin(m);//月
  dx   = BcdToBin(d);//日
  WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数
  Week = WDay >> 5;//得到星期
  Day  = WDay & 0x1f;//得到最大月天数
/*---------------------------------------------------------
     1918年1月21日 星期一
---------------------------------------------------------*/
  c    = 0x19;
  y    = 0x18;
  m    = 0x01;
  d    = 0x21;
  cx   = BcdToBin(c);//百年
  yx   = BcdToBin(y);//年
  mx   = BcdToBin(m);//月
  dx   = BcdToBin(d);//日
  WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数
  Week = WDay >> 5;//得到星期
  Day  = WDay & 0x1f;//得到最大月天数
/*---------------------------------------------------------
     9999年12月31日 星期天
---------------------------------------------------------*/
  c    = 0x00;
  y    = 0x01;
  m    = 0x01;
  d    = 0x01;
  cx   = BcdToBin(c);//百年
  yx   = BcdToBin(y);//年
  mx   = BcdToBin(m);//月
  dx   = BcdToBin(d);//日
  WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数
  Week = WDay >> 5;//得到星期
  Day  = WDay & 0x1f;//得到最大月天数
/*---------------------------------------------------------
     2004年6月18日 星期五
---------------------------------------------------------*/
  c    = 0x20;
  y    = 0x04;
  m    = 0x06;
  d    = 0x18;
  cx   = BcdToBin(c);//百年
  yx   = BcdToBin(y);//年
  mx   = BcdToBin(m);//月
  dx   = BcdToBin(d);//日
  WDay = WeekDay20(yx, mx, dx);//取星期和月天数
  Week = WDay >> 5;//得到星期
  Day  = WDay & 0x1f;//得到最大月天数
/*---------------------------------------------------------
     2018年3月8日 星期四
---------------------------------------------------------*/
  c    = 0x20;
  y    = 0x18;
  m    = 0x03;
  d    = 0x08;
  cx   = BcdToBin(c);//百年
  yx   = BcdToBin(y);//年
  mx   = BcdToBin(m);//月
  dx   = BcdToBin(d);//日
  WDay = WeekDay20(yx, mx, dx);//取星期和月天数
  Week = WDay >> 5;//得到星期
  Day  = WDay & 0x1f;//得到最大月天数
  while(1);
}
日期:2005年06月11日   来源: 
相关文章:
·用超低功耗MSP430单片机设计数据采集系统 2005-06-27
·Atmega16在开关磁阻电机调速系统中的应用 2005-06-28
·火灾探测器受干扰的原因及改进方法 2005-07-02
·特殊构件的焊接技术 2005-10-18
·触摸屏的工作原理及典型应用 2005-11-25
·高质量C++/C编程指南---类的构造函数,析构函数,赋值 2005-12-13
·基于ATmega8的新型电动自行车调速控制系统设计 2005-12-20
·电子产品高温老化的原理以及一间智能温控老化室的应用 2006-01-05
·新近成功开发无霍尔传感器无刷电机控制器 2006-01-20
·归纳一下最近比较流行的电动自行车技术 2006-01-23
·电子工作台 --- workbench 电子仿真软件 2006-05-23
·液晶字模工具 ------ HZDotReader V3 2006-05-23
·51系列单片机仿真软件----伟福e6000w  2006-05-23
·无传感器无刷电机驱动控制器系统的优点 2006-06-10
·PIC单片机C语言编译器 --PICC 8.05 完整破解版 2006-07-09