⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 适用于51单片机的万年历算法.htm

📁 适用于51单片机的万年历算法.rar
💻 HTM
📖 第 1 页 / 共 2 页
字号:
      gc_lunar_calendar_date;<BR>Unsigned char 
      start_day_of_week;<BR>说明:函数get_solar_day_date(void)的输入变量:gc_solar_calendar_year和gc_solar_calendar_month<BR>输出变量:start_day_of_week和temp_total_day<BR>Void 
      get_solar_day_date(void)<BR>{<BR>unsigned char 
      temp01;<BR>/*------calculate what day is the day of the current month and 
      year. Mon~Sun?---*/<BR>/*条件初始化二次,减少运算数据量. temp_total_day 
      是int型变量*/<BR>start_day_of_week = 2; temp_total_day = 0;calculate_temp = 
      1;<BR>if(gc_solar_calendar_year &gt; 99)<BR>{start_day_of_week = 
      6;calculate_temp = 100;}<BR>for(temp01 = calculate_temp; 
      temp01&lt;gc_solar_calendar_year; temp01++)<BR>{ if(temp01%4 == 
      0){start_day_of_week +=2;temp_total_day += 366; }<BR>else 
      {start_day_of_week +=1;temp_total_day += 365;}}<BR>for(temp01 = 
      1;temp01&lt;gc_solar_calendar_month;temp01++)<BR>{ switch(temp01)<BR>{case 
      1,3,5,7,8,10,12: start_day_of_week +=3;temp_total_day +=31;break;<BR>case 
      2: if(((gc_solar_calendar_year%4) == 0)&amp;&amp;(gc_solar_calendar_year 
      != 200))<BR>{start_day_of_week +=1; temp_total_day +=29;}<BR>else 
      {start_day_of_week +=0;temp_total_day +=28;} break;<BR>case 4,6,9,11: 
      start_day_of_week +=2; temp_total_day +=30; break;}}<BR>start_day_of_week 
      %=7;<BR>/*-end of calculate what day is the day(Mon~Sun?) and total day 
      --*/<BR>}</P>
      <P><BR>二、 阴历算法<BR>200年需要200 × 2 = 
      400个字节,构成阴历压缩数据表lunar_calendar_month_table[]如下:<BR>const char 
      lunar_calendar_month_table[]={ //从阴历年1900年到2100年<BR>/*the total day of 
      each month pointer */<BR>/* from 1901~2100*/<BR>/* (0110)110000001001 
      (0110)leap month,110000001001 <BR>lunar month total day: 1:29 
      0:30*/<BR>0x00,0x04,0xad,0x08,0x5a,0x01,0xd5,0x54,0xb4,0x09,0x64,0x05,0x59,0x45, 
      0x95,0x0a,0xa6,0x04,0x55,0x24,0xad,0x08,0x5a,0x62,0xda,0x04,0xb4,0x05, 
      0xb4,0x55,0x52,0x0d,0x94,0x0a,0x4a,0x2a,0x56,0x02,0x6d,0x71,0x6d,0x01, 
      0xda,0x02,0xd2,0x52,0xa9,0x05,0x49,0x0d,0x2a,0x45,0x2b,0x09,0x56,0x01, 
      0xb5,0x20,0x6d,0x01,0x59,0x69,0xd4,0x0a,0xa8,0x05,0xa9,0x56,0xa5,0x04, 
      0x2b,0x09,0x9e,0x38,0xb6,0x08,0xec,0x74,0x6c,0x05,0xd4,0x0a,0xe4,0x6a, 
      0x52,0x05,0x95,0x0a,0x5a,0x42,0x5b,0x04,0xb6,0x04,0xb4,0x22,0x6a,0x05, 
      0x52,0x75,0xc9,0x0a,0x52,0x05,0x35,0x55,0x4d,0x0a,0x5a,0x02,0x5d,0x31, 
      0xb5,0x02,0x6a,0x8a,0x68,0x05,0xa9,0x0a,0x8a,0x6a,0x2a,0x05,0x2d,0x09, 
      0xaa,0x48,0x5a,0x01,0xb5,0x09,0xb0,0x39,0x64,0x05,0x25,0x75,0x95,0x0a, 
      0x96,0x04,0x4d,0x54,0xad,0x04,0xda,0x04,0xd4,0x44,0xb4,0x05,0x54,0x85, 
      0x52,0x0d,0x92,0x0a,0x56,0x6a,0x56,0x02,0x6d,0x02,0x6a,0x41,0xda,0x02, 
      0xb2,0xa1,0xa9,0x05,0x49,0x0d,0x0a,0x6d,0x2a,0x09,0x56,0x01,0xad,0x50, 
      0x6d,0x01,0xd9,0x02,0xd1,0x3a,0xa8,0x05,0x29,0x85,0xa5,0x0c,0x2a,0x09, 
      0x96,0x54,0xb6,0x08,0x6c,0x09,0x64,0x45,0xd4,0x0a,0xa4,0x05,0x51,0x25, 
      0x95,0x0a,0x2a,0x72,0x5b,0x04,0xb6,0x04,0xac,0x52,0x6a,0x05,0xd2,0x0a, 
      0xa2,0x4a,0x4a,0x05,0x55,0x94,0x2d,0x0a,0x5a,0x02,0x75,0x61,0xb5,0x02, 
      0x6a,0x03,0x61,0x45,0xa9,0x0a,0x4a,0x05,0x25,0x25,0x2d,0x09,0x9a,0x68, 
      0xda,0x08,0xb4,0x09,0xa8,0x59,0x54,0x03,0xa5,0x0a,0x91,0x3a,0x96,0x04, 
      0xad,0xb0,0xad,0x04,0xda,0x04,0xf4,0x62,0xb4,0x05,0x54,0x0b,0x44,0x5d, 
      0x52,0x0a,0x95,0x04,0x55,0x22,0x6d,0x02,0x5a,0x71,0xda,0x02,0xaa,0x05, 
      0xb2,0x55,0x49,0x0b,0x4a,0x0a,0x2d,0x39,0x36,0x01,0x6d,0x80,0x6d,0x01, 
      0xd9,0x02,0xe9,0x6a,0xa8,0x05,0x29,0x0b,0x9a,0x4c,0xaa,0x08,0xb6,0x08, 
      0xb4,0x38,0x6c,0x09,0x54,0x75,0xd4,0x0a,0xa4,0x05,0x45,0x55,0x95,0x0a, 
      0x9a,0x04,0x55,0x44,0xb5,0x04,0x6a,0x82,0x6a,0x05,0xd2,0x0a,0x92,0x6a, 
      0x4a,0x05,0x55,0x0a,0x2a,0x4a,0x5a,0x02,0xb5,0x02,0xb2,0x31,0x69,0x03, 
      0x31,0x73,0xa9,0x0a,0x4a,0x05,0x2d,0x55,0x2d,0x09,0x5a,0x01,0xd5,0x48, 
      0xb4,0x09,0x68,0x89,0x54,0x0b,0xa4,0x0a,0xa5,0x6a,0x95,0x04,0xad,0x08, 
      0x6a,0x44,0xda,0x04,0x74,0x05,0xb0,0x25,0x54,0x03,};</P>
      <P><BR>确定阳历日和阴历日的对应关系的算法:<BR>对于其他任何一个阳历日和阴历日的对应关系,都可以通过以下算法求得结果。具体算法由如下函数get_lunar_day(void)实现:<BR>说明:函数get_lunar_day(void)的输入变量:gc_solar_calendar_year和gc_solar_calendar_month<BR>输出变量:gc_lunar_calendar_year、gc_lunar_calendar_month和gc_lunar_calendar_date<BR>void 
      get_lunar_day(void)/*计算出输入阳历年、阳历月,对应该阳历月第一天对应阴历时间,即阴历年、月、日*/<BR>{unsigned 
      char temp_leap_month;<BR>unsigned char temp_flag;<BR>unsigned char 
      calculate_temp;<BR>unsigned char mc_tpumenus_temp_loop;<BR>unsigned char 
      mc_tpumenus_temp_01;<BR>temp_leap_month = 0;temp_flag = 
      1;<BR>//条件初始化二次,减少运算数据量.<BR>if(gc_solar_calendar_year &gt; 
      99)<BR>{gc_lunar_calendar_year = 99;gc_lunar_calendar_month = 
      11;<BR>gc_lunar_calendar_date = 25;temp_total_day += 25;calculate_temp = 
      100;}<BR>else<BR>{gc_lunar_calendar_year = 0;gc_lunar_calendar_month = 
      11;<BR>gc_lunar_calendar_date = 11;temp_total_day += 11;calculate_temp = 
      1;}<BR>if(gc_solar_calendar_year 
      &gt;calculate_temp||gc_solar_calendar_month&gt;1)<BR>{ 
      for(mc_tpumenus_temp_loop = 
      1;mc_tpumenus_temp_loop&gt;0;){<BR>temp_total_day 
      -=calendar_calculate_lunar_month_total_day();<BR>temp_leap_month = 
      tpumenus_lunar_calendar_month_table[2*gc_lunar_calendar_year + 
      1];<BR>temp_leap_month = 
      (temp_leap_month&gt;&gt;4)&amp;0x0F;<BR>if(gc_lunar_calendar_month == 
      temp_leap_month)<BR>{switch(gc_lunar_calendar_year)<BR>{case 
      6,14,19,25,33,36,38,41,44,52,55,79,117,<BR>136,147,150,155,158,185,193:<BR>if(temp_total_day&lt;31){gc_lunar_calendar_date 
      = temp_total_day;<BR>mc_tpumenus_temp_loop = 0;temp_flag = 0;}<BR>else 
      temp_total_day -= 30;<BR>break; //current 
      month:temp_leap_month<BR>default:<BR>if(temp_total_day &lt; 
      30)<BR>{gc_lunar_calendar_date = temp_total_day;mc_tpumenus_temp_loop = 
      0;<BR>temp_flag = 0; /*current month:temp_leap_month*/ }<BR>else 
      temp_total_day -= 29; break;}} 
      <BR>if(temp_flag){gc_lunar_calendar_month++;<BR>if(gc_lunar_calendar_month 
      == 13){gc_lunar_calendar_month = 
      1;<BR>gc_lunar_calendar_year++;}<BR>If(temp_total_day &lt; 61) //if 
      temp_total_day&gt;60,ignore compare <BR>{mc_tpumenus_temp_01 = 
      calendar_calculate_lunar_month_total_day();<BR>if(temp_total_day &lt; 
      (mc_tpumenus_temp_01 + 1))<BR>{mc_tpumenus_temp_loop = 
      0;gc_lunar_calendar_date = temp_total_day;<BR>} }<BR>} } } 
      <BR>gc_lunar_leap_month = (temp_flag&lt;&lt;4)|temp_leap_month;/*set 
      leap_month 
      flag*/<BR>说明:函数calendar_calculate_lunar_month_total_day(void)根据输入变量gc_lunar_calendar_year和gc_lunar_calendar_month,结合压缩数据表lunar_calendar_month_table计算出对应阴历月的总的天数。<BR>unsigned 
      char calendar_calculate_lunar_month_total_day(void)<BR>{<BR>unsigned char 
      mc_tpumenus_temp_01;<BR>unsigned char 
      mc_tpumenus_temp_02;<BR>if(gc_lunar_calendar_month &lt; 
      9)<BR>{mc_tpumenus_temp_01 = 
      lunar_calendar_month_table[2*gc_lunar_calendar_year];<BR>mc_tpumenus_temp_02 
      = gc_lunar_calendar_month - 1;}<BR>else{<BR>mc_tpumenus_temp_01 = 
      lunar_calendar_month_table[2*gc_lunar_calendar_year + 
      1];<BR>mc_tpumenus_temp_02 = gc_lunar_calendar_month - 
      9;}<BR>if((mc_tpumenus_temp_01&gt;&gt; 
      mc_tpumenus_temp_02)&amp;0x01)return(29);<BR>else return(30);}</P>
      <P>阳历日和农历节气的对应关系</P>
      <P>压缩节气数据表:<BR>根据规律可以得到四个数据表(每个阳历月有两个节气,每个节气需要两个数据表):<BR>const unsigned 
      char calendar_solar_term_table_01[12][33] = 
      {<BR>{7,6,6,6,6,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,5,5,5,5,5,4,5,5}, //month 
      1<BR>{5,4,5,5,5,4,4,5,5,4,4,4,4,4,4,4,4,3,4,4,4,3,3,4,4,3,3,3}, 
      //2<BR>{6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5}, 
      //3<BR>{5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,4,4,5,5,4,4,4,5,4,4,4,4,5}, 
      //4<BR>{6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5}, 
      //5<BR>{6,6,7,7,6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5}, 
      //6<BR>{7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7}, 
      //7<BR>{8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7}, 
      //8<BR>{8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,7}, 
      //9<BR>{9,9,9,9,8,9,9,9,8,8,9,9,8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,8}, 
      //10<BR>{8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7}, 
      //11<BR>{7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7}, 
      //12<BR>}; //这个数据表表示了每个月第一个节气出现的规律<BR>const unsigned char 
      calendar_solar_term_year_01[12][9] = 
      {<BR>{13,49,85,117,149,185,201,250,250}, //month 
      1<BR>{13,45,81,117,149,185,201,250,250}, 
      //2<BR>{13,48,84,112,148,184,200,201,250}, 
      //3<BR>{13,45,76,108,140,172,200,201,250}, 
      //4<BR>{13,44,72,104,132,168,200,201,250}, //5<BR>{5 ,33,68,96 
      ,124,152,188,200,201}, //6<BR>{29,57,85,120,148,176,200,201,250}, 
      //7<BR>{13,48,76,104,132,168,196,200,201}, 
      //8<BR>{25,60,88,120,148,184,200,201,250}, 
      //9<BR>{16,44,76,108,144,172,200,201,250}, 
      //10<BR>{28,60,92,124,160,192,200,201,250}, 
      //11<BR>{17,53,85,124,156,188,200,201,250}, //12<BR>}; 
      //这个数据表表示了每个月第一个节气出现规律对应的阳历年份范围<BR>const unsigned char 
      calendar_solar_term_table_02[12][29] = 
      {<BR>{21,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,20,20,20,20,20,19,20,20,20,19,19,20},<BR>{20,19,19,20,20,19,19,19,19,19,19,19,19,18,19,19,19,18,18,19,19,18,18,18,18,18,18,18},<BR>{21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,20},<BR>{20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,19,19,20,20,19,19,19,20,20},<BR>{21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,21},<BR>{22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,21},<BR>{23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,23},<BR>{23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23},<BR>{23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23},<BR>{24,24,24,24,23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,23},<BR>{23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,22},<BR>{22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,22},<BR>}; 
      //这个数据表表示了每个月第二个节气出现的规律<BR>const unsigned char 
      calendar_solar_term_year_02[12][8] = 
      {<BR>{13,45,81,113,149,185,201},{21,57,93,125,161,193,201},{21,56,88,120,152,188,200,201},<BR>{21,49,81,116,144,176,200,201},{17,49,77,112,140,168,200,201},<BR>{28,60,88,116,148,180,200,201},{25,53,84,112,144,172,200,201},<BR>{29,57,89,120,148,180,200,201},{17,45,73,108,140,168,200,201},<BR>{28,60,92,124,160,192,200,201},{16,44,80,112,148,180,200,201},<BR>{17,53,88,120,156,188,200,201},};<BR>//这个数据表表示了每个月第二个节气出现规律对应的阳历年份范围<BR>每个阳历月对应的两个农历节气出现的日期,可根据条件规律算法,分别由以下两个函数实现:<BR>unsigned 
      char calendar_calculate_solar_term_1(void)<BR>{<BR>zpage unsigned char 
      done_index;<BR>zpage unsigned char solar_term;<BR>done_index = 
      0;<BR>while(gc_solar_calendar_year &gt;= 
      calendar_solar_term_year_01[gc_solar_calendar_month - 1][done_index]) 
      {done_index++;}<BR>solar_term = 
      calendar_solar_term_table_01[gc_solar_calendar_month - 1][4*done_index + 
      gc_solar_calendar_year%4];<BR>if((gc_solar_calendar_year == 
      121)&amp;&amp;(gc_solar_calendar_month == 4))solar_term = 
      5;<BR>if((gc_solar_calendar_year == 132)&amp;&amp;(gc_solar_calendar_month 
      == 4))solar_term = 5;<BR>if((gc_solar_calendar_year == 
      194)&amp;&amp;(gc_solar_calendar_month == 6))solar_term = 
      6;<BR>return(solar_term);<BR>} //计算阳历月对应的第一个节气<BR>unsigned char 
      calendar_calculate_solar_term_2(void)<BR>{<BR>zpage unsigned char 
      done_index;<BR>zpage unsigned char solar_term;<BR>done_index = 
      0;<BR>while(gc_solar_calendar_year &gt;= 
      calendar_solar_term_year_02[gc_solar_calendar_month - 
      1][done_index]){done_index++;}<BR>solar_term = 
      calendar_solar_term_table_02[gc_solar_calendar_month - 1][4*done_index + 
      gc_solar_calendar_year%4];<BR>if((gc_solar_calendar_year == 
      171)&amp;&amp;(gc_solar_calendar_month == 3))solar_term = 
      21;<BR>if((gc_solar_calendar_year == 
      181)&amp;&amp;(gc_solar_calendar_month == 5))solar_term = 
      21;<BR>return(solar_term);<BR>} 
      //计算阳历月对应的第二个节气<BR>以上就是万年历的完整算法。它首先计算出对应阳历月第一天对应是星期几,然后根据数据压缩算法确定,确定对应的阴历日期;而阴历节气,则有条件规律算法实现。<BR></P>
      <P></P>
      <P><BR></P>
      <P><BR><BR></P></TD></TR>
  <TR>
    <TD vAlign=bottom align=right colSpan=3 height=15>&nbsp;</TD></TR>
  <TR>
    <TD vAlign=top bgColor=#eefbff colSpan=3 height=76>
      <P><BR></P></TD></TR>
  <TR>
    <TD width=66 height=11></TD>
    <TD width=125></TD>
    <TD width=569></TD></TR>
  <TR>
    <TD vAlign=top colSpan=3 height=89>
      <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
        <TBODY>
        <TR>
          <TD vAlign=center align=middle width=760 bgColor=#666666 
            height=41><FONT color=#ffffff>邮发代号:2-892 国外代号:M179 定价:5.50元 
            零售价:6.00元<BR>通讯处:北京165信箱 邮编:100036 编辑部电话:010-68278179 
            广告部电话/传真:010-68278572<BR>E-mial:dzsj@public.bta.net.cn 网址:www.eleworld.com 
            </FONT></TD></TR>
        <TR>
          <TD vAlign=center align=middle height=36><BR>网站内容管理 
            webmaster@eleworld.com <BR>Copyright&copy;2000 《电子世界》编辑部. All Rights 
            Reserved<BR>Last modified: 一月 10, 2002 
  </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -