阳历转阴历c51算法
C#实现农历计算和转换

C#实现农历计算和转换/** 农历类,by aiyao at */using System;namespace YyAy.Web.WebClass{#region 使用范例// 可将这段代码取消注释运行可以得到示例结果。
// public class MyTest// {// //方法一,用LunarDate类// public string Mothed1()// {// DateTime _d = DateTime.Now;// LunarDate ld = new LunarDate(_d) ;// string result = "";// result += "干支年:"+ ld.LunarYear +"/r/n";// result += "生肖:"+ ld.Animal +"/r/n";// result += "月:"+ ld.LunarMonth +"/r/n";// result += "日:"+ ld.LunarDay +"/r/n";// result += "节气:"+ ld.SolarTerm +"/r/n";// result += "数字农历年:"+ ld.Year +"月"+ ld.Month +"日"+ ld.Day +"/r/n";// return result;// }//// //方法二,用LunarDateClass类// public string Mothed2()// {// DateTime _d = DateTime.Now;// LunarDateClass ldc = new LunarDateClass(_d) ;// string result = "";// result += "干支年:"+ ldc.LunarYear +"/r/n";// result += "生肖:"+ ldc.Animal +"/r/n";// result += "月:"+ ldc.LunarMonth +"/r/n";// result += "日:"+ ldc.LunarDay +"/r/n";// result += "节气:"+ ldc.SolarTerm +"/r/n";// //ldc.LunarDate 返回 LunarDate对象。
C51写的公历转农历和星期

0x0d,0x4A,0x51, //1931
0x0e,0xA5,0x46, //1932
0x56,0xd4,0xBA, //1933
0x05,0xAd,0x4e, //1934
0x02,0xB6,0x44, //1935
0x39,0x37,0x38, //1936
/*
函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
0x09,0x2e,0x4B, //1937
0x7C,0x96,0xBf, //1938
0x0C,0x95,0x53, //1939
0x0d,0x4A,0x48, //1940
0x6d,0xA5,0x3B, //1941
0x0B,0x55,0x4f, //1942
0x05,0x6A,0x45, //1943
0x7d,0x4A,0xBd, //2063
0x0d,0x4A,0x51, //2064
0x0d,0xA5,0x45, //2065
0x55,0xAA,0xBA, //2066
0x05,0x6A,0x4e, //2067
0x0A,0x6d,0x43, //2068
0x45,0x2e,0xB7, //2069
0x24,0xAe,0xB6, //1909
阴历阳历转换计算公式

1、阳历日期推算阴历日期的方法:前已述及阴历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月为十六日),以月晦为二十九日(大月为三十日)。
如要知道1984年6月8日是阴历几日?可以利用公式推算阴历日期:设:公元年数-1977(或1901)=4Q+R则:阴历日期=14Q+10.6(R+1)+年内日期序数-29.5n(注:式中Q、R、n均为自然数,R<4)例:1994年5月7日的阴历日期为:1994-1977=17=4×4+1故:Q=4,R=1 则:5月7日的阴历日期为:14×4+10.6(1+1)+(31+28+31+31+7)-29.5n=204.2- 29.5n然后用29.5去除204.2得商数6......27.2,6即是n值,余数27即是阴历二十七日2.公历换算为农历二十四节气在黄道上的位置是固定的,但各年有平年和闰年之分,就使得回归年天数与实际天数不等,每年在日历上可差一天。
这样可以将阴历经过任意整回归年在现在的日历上查到阳历(阳历一年相当阴历的月数为365.2422/29.530588=12.36827个月)。
例如,可先在1995年的日历上查得与(该年)阴历对应的阳历日期,这样就找到了临时落脚点,也就是找到了阴阳互换的关键。
例如,可先以阴历四月初一(日)为引数,在1995年日历上查到对应的阳历为4月30日。
由于已经计算出经过的月数,将经过的月数的尾数(小数)化为日,加在4月30日上,就得到经过(1995-1070)整年数的阳历日期,也就是起始阴历日期对应的阳历日期,即得到了待查的日期为4月30日加上0.64957×29.530588得到(1070年)5月19.1821840日。
这样就得到了所给例子的阴阳历日期换算结果……”。
0.64957月的由来,(1995-1070)×12.36827=11440.64957月已知依泽公生于梁龙德二年(922)六月二十一日,依下表提供的2099年各月初一日的公历月日数,可以算出龙德二年六月二十一日的公历月日数公元2099年农历各月初一日的公历月日(2099-922)×12.36827=1455.45379月余数为0.45379月×29.530588日=13.4O日因2099年五月初一日(包括该年闯二月)在公历6月19日,加上计算所得的13日为龙德二年六月初一日的公历月日,即该年7月2日,则该年农历六月二十一日为该年7月22日。
阳历转阴历算法

如果写完整这代码,我想要几天.你说思想,那就不写代码了,很烦忧的.1 关于农历的知识(ZT)阳历、阴历、农历阳历(即公历),是世界上多数国家通用的历法,由"儒略历"修订而成。
儒略历是公元前46年,古罗马统帅儒略、恺撒决定采用的历法。
阳历,是以地球绕太阳运动作为根据的历法。
它以地球绕太阳一周(一回归年)为一年。
一回归年的长度是365.2422日,也就是365天5小时48分46秒,积累4年共有23小时15分4秒,大约等于一天,所以每4年增加1天,加在2月的末尾,得366天,就是闰年。
但是4年加1天实际回归年多了44分56秒,积满128年左右就又多算了一天,也就是在400年中约多算了3天。
阳历闰年规定:公元年数可用4整除的,就算闰年;为了要在400年减去多算的3天,并规定公元世纪的整数,即公元年数是100的整数时,须用400来整除的才算闰年,如1600年、2000年、2200年、2400年就是闰年。
这样就巧妙地在400年中减去了3天,阳历规定每年都是12个月,月份的大小完全是人为的规定,现在规定每年的1、3、5、7、8、10、12月为大月,每月31天;4、6、9、11月为小月,每月30天;2月平年是28天,闰年是29天。
阴历,是根据月相圆缺变化的周期(即朔望月)来制订的。
因为古人称月亮为太阴,所以又有太阴历之称,是纯粹的阴历,我国使用"农历",一般人叫它"阴历",那是不对的。
农历不是一种纯粹的阴历,而是"阴阳历"。
阴历把月亮圆缺循环一次的时间算做一个月,12个月算做一年。
然而月亮圆缺循环一次--一个朔望月,是29天12时44分3秒,比29天多,又比30天少。
为方便,阴历把月份分成大月和小月两种,逢单的月是大月30天,逢双的月是小月29天,一年共是354天。
实际上,一个朔望月并不正好等于一个大月和一个小月的平均数--29天半,而是比29天半多44分2.8秒。
C语言阴阳历算法

C语言阴阳历算法2008-10-25 23:22:11 作者:来源:中国论文下载中心浏览次数:188 文字大小:【大】【中】【小】C语言阴阳历算法程序为:/*prototype: int calconv( struct convdate * );struct convdate{int source; ==0 则输入日期为西历, !=0 则输入为农历int solaryear; 输出或输入之西历年份int solarmonth; 西历月int solardate; 西历日int lunaryear; 输出或输入之农历年份int lunarmonth; 农历月int lunardate; 农历日int weekday; 该日为星期几 ( 0==星期日, 1==星期一, ... )int kan; 该日天干 ( 0==甲, 1==乙, ..., 9==癸 )int chih; 该日地支 ( 0==子, 1==丑, ..., 11==亥 )};呼叫时须设定 souce 的值, 若为 0 则为西历转农历, 否则为农历转西历. 然後视输入为西历或农历来设定西历或农历的年月日. 转换後的年月日会填入结构中( 农历或西历 ), 以及该日为星期几, 天干地支. 若函式的返回值为 0 表示没有错误, 1 为输入之年份错误, 2 为输入之月份错误, 3 为输入之日期错误. 输入之西历年须在 1937 - 2031 间输入之农历年须在 1936 - 2030 间若须扩充, 则增加 lunarcal[]*/#define firstyear 1936 /* the first year in lunarcal[] */struct convdate{int source;int solaryear;int solarmonth;int solardate;int lunaryear;int lunarmonth;int lunardate;int weekday;int kan;int chih;};struct taglunarcal{int basedays; /* 到西历 1 月 1 日到农历正月初一的累积日数 */int intercalation; /* 闰月月份. 0==此年没有闰月 */int baseweekday; /* 此年西历 1 月 1 日为星期几再减 1 */int basekanchih; /* 此年西历 1 月 1 日之干支序号减 1 */int monthdays[13]; /* 此农历年每月之大小, 0==小月(29日), 1==大月(30日)*/ };struct taglunarcal lunarcal[] = {{ 23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 }, /* 1936 */{ 41, 0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 },{ 30, 7, 5, 28, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 },{ 49, 0, 6, 33, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },{ 38, 0, 0, 38, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 }, /* 1940 */{ 26, 6, 2, 44, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 },{ 45, 0, 3, 49, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },{ 35, 0, 4, 54, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },{ 24, 4, 5, 59, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 }, /* 1944 */{ 43, 0, 0, 5, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 },{ 32, 0, 1, 10, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 },{ 21, 2, 2, 15, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },{ 40, 0, 3, 20, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 }, /* 1948 */{ 28, 7, 5, 26, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },{ 47, 0, 6, 31, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 },{ 36, 0, 0, 36, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },{ 26, 5, 1, 41, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 }, /* 1952 */{ 44, 0, 3, 47, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1 },{ 33, 0, 4, 52, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 },{ 23, 3, 5, 57, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 },{ 42, 0, 6, 2, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 }, /* 1956 */{ 30, 8, 1, 8, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 },{ 48, 0, 2, 13, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 },{ 38, 0, 3, 18, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },{ 27, 6, 4, 23, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 }, /* 1960 */{ 45, 0, 6, 29, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 },{ 35, 0, 0, 34, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },{ 24, 4, 1, 39, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 },{ 43, 0, 2, 44, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 }, /* 1964 */{ 20, 3, 5, 55, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 },{ 39, 0, 6, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0 },{ 29, 7, 0, 5, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, /* 1968 */ { 47, 0, 2, 11, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },{ 36, 0, 3, 16, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 },{ 26, 5, 4, 21, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1 },{ 45, 0, 5, 26, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 }, /* 1972 */ { 33, 0, 0, 32, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1 },{ 22, 4, 1, 37, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 },{ 41, 0, 2, 42, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1 },{ 30, 8, 3, 47, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 }, /* 1976 */ { 48, 0, 5, 53, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 },{ 37, 0, 6, 58, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },{ 27, 6, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 },{ 46, 0, 1, 8, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0 }, /* 1980 */ { 35, 0, 3, 14, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1 },{ 24, 4, 4, 19, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1 },{ 43, 0, 5, 24, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1 },{ 32, 10, 6, 29, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1 }, /* 1984 */ { 50, 0, 1, 35, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 },{ 39, 0, 2, 40, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1 },{ 28, 6, 3, 45, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0 },{ 47, 0, 4, 50, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 }, /* 1988 */ { 36, 0, 6, 56, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 },{ 26, 5, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1 },{ 45, 0, 1, 6, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0 },{ 34, 0, 2, 11, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0 }, /* 1992 */ { 22, 3, 4, 17, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 },{ 40, 0, 5, 22, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 },{ 30, 8, 6, 27, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1 },{ 49, 0, 0, 32, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1 }, /* 1996 */ { 37, 0, 2, 38, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },{ 27, 5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 },{ 46, 0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 },{ 35, 0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 }, /* 2000 */ { 23, 4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },{ 42, 0, 1, 4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },{ 31, 0, 2, 9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 },{ 21, 2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, /* 2004 */ { 39, 0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },{ 48, 0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 },{ 37, 0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 }, /* 2008 */{ 25, 5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },{ 44, 0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },{ 33, 0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },{ 22, 4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }, /* 2012 */{ 40, 0, 1, 2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },{ 30, 9, 2, 7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 },{ 49, 0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1 },{ 38, 0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 }, /* 2016 */{ 27, 6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 },{ 46, 0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0 },{ 35, 0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 },{ 24, 4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 }, /* 2020 */{ 42, 0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },{ 31, 0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 },{ 21, 2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 },{ 40, 0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 }, /* 2024 */{ 28, 6, 2, 5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 },{ 47, 0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1 },{ 36, 0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 },{ 25, 5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 }, /* 2028 */{ 43, 0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 },{ 32, 0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0 },{ 22, 3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 } };#define lastyear (firstyear+sizeof(lunarcal)/sizeof(struct taglunarcal)-1) /* 西历年每月之日数 */int solarcal[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };/* 西历年每月之累积日数, 平年与闰年 */int solardays[2][14] = {{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 396 },{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 397 } };/* 求此西历年是否为闰年, 返回 0 为平年, 1 为闰年 */int getleap( int year ){if ( year % 400 == 0 )return 1;else if ( year % 100 == 0 )return 0;else if ( year % 4 == 0 )return 1;elsereturn 0;}/* 西历农历转换 */int calconv( struct convdate *cd ){int leap, d, sm, y, im, l1, l2, acc, i, lm, kc;if ( cd->source == 0 ) /* solar */{if ( cd->solaryear <= firstyear || cd->solaryear > lastyear ) return 1;sm = cd->solarmonth - 1;if ( sm < 0 || sm > 11 )return 2;leap = getleap( cd->solaryear );if ( sm == 1 )d = leap + 28;elsed = solarcal[sm];if ( cd->solardate < 1 || cd->solardate > d )return 3;y = cd->solaryear - firstyear;acc = solardays[leap][sm] + cd->solardate;cd->weekday = ( acc + lunarcal[y].baseweekday ) % 7;kc = acc + lunarcal[y].basekanchih;cd->kan = kc % 10;cd->chih = kc % 12;if ( acc <= lunarcal[y].basedays ){y--;cd->lunaryear = cd->solaryear - 1;leap = getleap( cd->lunaryear );sm += 12;acc = solardays[leap][sm] + cd->solardate;}elsecd->lunaryear = cd->solaryear;l1 = lunarcal[y].basedays;for ( i=0; i<13; i++ ){l2 = l1 + lunarcal[y].monthdays[i] + 29;if ( acc <= l2 )break;l1 = l2;}cd->lunarmonth = i + 1;cd->lunardate = acc - l1;im = lunarcal[y].intercalation;if ( im != 0 && cd->lunarmonth > im ){cd->lunarmonth--;if ( cd->lunarmonth == im )cd->lunarmonth = -im;}if ( cd->lunarmonth > 12 )cd->lunarmonth -= 12;}else /* lunar */{if ( cd->lunaryear < firstyear || cd->lunaryear >= lastyear ) return 1;y = cd->lunaryear - firstyear;im = lunarcal[y].intercalation;lm = cd->lunarmonth;if ( lm < 0 ){if ( lm != -im )return 2;}else if ( lm < 1 || lm > 12 )return 2;if ( im != 0 ){if ( lm > im )lm++;else if ( lm == -im )lm = im + 1;}lm--;if ( cd->lunardate > lunarcal[y].monthdays[lm] + 29 )return 3;acc = lunarcal[y].basedays;for ( i=0; i acc += lunarcal[y].monthdays[i] + 29;acc += cd->lunardate;leap = getleap( cd->lunaryear );for ( i=13; i>=0; i-- )if ( acc > solardays[leap][i] )break;cd->solardate = acc - solardays[leap][i];if ( i <= 11 ){cd->solaryear = cd->lunaryear;cd->solarmonth = i + 1;}else{cd->solaryear = cd->lunaryear + 1;cd->solarmonth = i - 11;}leap = getleap( cd->solaryear );y = cd->solaryear - firstyear;acc = solardays[leap][cd->solarmonth-1] + cd->solardate; cd->weekday = ( acc + lunarcal[y].baseweekday ) % 7;kc = acc + lunarcal[y].basekanchih;cd->kan = kc % 10;cd->chih = kc % 12;}return 0;}。
用51 单片机实现公历与农历星期的转换

用51 单片机实现公历与农历星期的转换济南朱思荣一概述公历是全世界通用的历法以地球绕太阳的一周为一年一年365 天分为12 个月1 3 5 7 8 10 12 月为31 天2 月为28 天其余月份为30 天事实上地球绕太阳一周共365 天5 小时48 分46 秒比公历一年多出5 小时48分46 秒为使年误差不累积公历年用闰年法来消除年误差由于每年多出5 小时48 分46 秒每4 年累计多出23小时15 分4 秒接近1 天天文学家就规定每4 年有一个闰年把2 月由28 天改为29 天凡是公历年代能被4 整除的那一年就是闰年但是这样一来每4 年又少了44 分56 秒为了更准确地计时天文学家又规定凡能被100 整除的年份只有能被400 整除才是闰年即每400 年要减掉3 个闰年经过这样处理后实际上每400 年的误差只有2 小时53 分20 秒已相当准确了农历与公历不同农历把月亮绕地球一周作为一月因为月亮绕地球一周不是一整天所以农历把月分为大月和小月大月30 天小月29 天通过设置大小月使农历日始终与月亮与地球的位置相对应为了使农历的年份与公历年相对应农历通过设置闰月的办法使它的平均年长度与公历年相等农历是中国传统文化的代表之一并与农业生产联系密切中国人民特别是广大农民十分熟悉并喜爱农历公历与农历是我国目前并存的两种历法各有其固有的规律农历与月球的运行相对应其影响因素多它的大小月和闰月与天体运行有关计算十分复杂且每年都不一致因此要用单片机实现公历与农历的转换用查表法是最方便实用的办法51 系列单片机因其在功能上能满足大部份对速度要求不高的应用场合的要求且价格低廉开发工具普及程度高是目前应用最多的单片机之一本文介绍一种用51 单片机实现从1901 年到2099 年199 年公历日到农历日及星期的转换方法并向读者提供完整的51 汇编程序二基本原理实现公历与农历的转换一般采用查表法按日查表是速度最快的方法但51 单片机寻址能力有限不可能采用按日查表的方法除按日查外我们可以通过按月查表和按年查表的方法再通过适当的计算来确定公历日所对应的农历日期本文采用的是按年查表法最大限度地减少表格所占的程序空间对于农历月来说大月为30 天小月为29 天这是固定不变的这样我们就可用1 个BIT 位来表示大小月信息农历一年如有闰月为13 个月否则是12 个月所以一年需要用13 个BIT 闰月在农历年中所在的月份并不固定大部分闰月分布在农历2 8 月但也有少量年份在9 月以后所以要表示闰月的信息至少要4BIT 在这里我们用4BIT的值来表示闰月的月份值为0 表示本年没有闰月有了以上信息还不足以判断公历日对应的农历日因为还需要一个参照日我们选用农历正月初一所对应的公历日期作参照日公历日最大为31 日需要5BIT 来表示而春节所在的月份不是1 月就是2 月用1BIT 就够了考虑到表达方便我们用2BIT 来表示春节月2BIT 的值直接表示月份这样一年的农历信息只用3 个字节就全部包括了计算公历日对应的农历日期的方法先计算出公历日离当年元旦的天数然后查表取得当年的春节日期计算出春节离元旦的天数二者相减即可算出公历日离春节的天数以后只要根据大小月和闰月信息减一月天数调整一月农历月份即可推算出公历日所对应的农历日期如公历日不到春节日期农历年要比公历年小一年农历大小月取前一年的信息农历月从12 月向前推算公历日是非常有规律的所以公历日所对应的星期天可以通过计算直接得到理论上公元0 年1 月1 日为星期日只要求得公历日离公元0 年1 月1 日的日子数除7 后的余数就是星期天为了简化计算采用月校正法根据公历的年月日可直接计算出星期天其算法是日期年份所过闰年数月校正数之和除7 的余数就是星期天但如果是在闰年又不到3 月份上述之和要减一天再除7 其1 12 月的校正数据为6 2 2 5 0 3 5 1 4 6 2 4 在本程序中采用1 个字节表示年份闰年数也只计算1900 年以后的闰年数所以实际校正数据也和上述数据不同- 2 -三程序流程由于星期的计算很简单这里只提供公历日转农历日的程序流程图否是否是子程序入口转换数据到HEX 格式方便运算根据公历年定位数据表的地址从数据表中取得春节的公历日期,并通过计算公历日和春节离元旦的天数算出公历日离春节的天数记为X农历年=公历年减1 数据表地址减3 定位到前一年取农历月信息农历月12 闰月标志F0 0 非闰月X Y否公历日在春节以后码?取农历月天数Y是X X YF0 1是否是农历月减1农历月闰月F0 取反是否农历日Y X 1农历年=公历年取农历月信息农历月1 闰月标志F0 0 非闰月取农历月天数YX X Y X Y农历月闰月农历月加1F0 1F0 取反是农历日X 1否农历年月日数据标准化子程序出口- 3 -四程序使用说明本文提供的子程序在设计时应用了PCF8563 作时钟芯片所以其入口格式与PCF8563 芯片的时钟信号存储格式完全一致年月日均为BCD 码其中月的BIT7 表示世纪为1 表示19 世纪为0 表示20 世纪采用PCF8563 时钟芯片只要把它的年月日寄存器内容读出到time_yeAr time_month 和time_date 三个单元内即可直接调用本程序转换采用其它时钟芯片调用前要把时钟格式稍作调整或修改一下程序公历日转农历日程序在12M 晶振下执行时间最长约0.48 毫秒实际使用时只需在复位和日期变化时才需要调用一次对于公历日转星期天的子程序则只在设置时钟时才有用在设置时钟年月日后调用子程序得到对应的星期天直接写入时钟即可子程序附带了1901-2100 年的农历数据表全部编译要占600 字节空间如不需这么多可把不需要的数据删除然后修改stArt_yeAr 值即可stArt_yeAr 定义了查询表的起始年份五子程序清单start_year EQU 01; 定义查询表起始年份,01--199 表示1901-2099 年;以下三单元为需转换的公历日期是子程序的入口数据time_year DATA 30htime_month DATA 31h ;BIT7 表示世纪,为1 表示19 世纪,为0 表示20 世纪time_date DATA 32h;以下三单元存转换后农历日期与入口单元重叠,如要保留入口信息,请重定义出口地址CONvert_yeAr DATA 30hCONvert_mONth DATA 31h ;BIT7 为1 表示闰月CONvert_dAte DATA 32htemp_Byte1 DATA 37htemp_Byte2 DATA 38htemp_Byte3 DATA 39htemp_Byte4 DATA 3Ahtemp_Byte5 DATA 3Bhtime_week DATA 40h ;星期天出口;以下为公历转农历子程序CONvert: MOV A,time_year ;将年月日转化为HEX 格式MOV B,#16DIV ABMOV CONvert_yeAr,BMOV B,#10MUL ABADD A,CONvert_yeArMOV CONvert_yeAr,AMOV A,time_monthMOV C,ACC.7MOV f0,C ;f0暂存世纪标志,仅用于数据表定位CLR ACC.7JNB ACC.4,CON_02- 4 -CLR ACC.4 ;ACC.4 为1 表示大于10 月ADD A,#10CON_02: MOV CONvert_mONth,AMOV A,time_dateMOV B,#16DIV ABMOV CONvert_dAte,BMOV B,#10MUL ABADD A,CONvert_dAteMOV CONvert_dAte,AMOV dptr,#mONth_dAtA ;以下定位本年数据在表格中的位置MOV A,CONvert_yeArJB f0,CON_06 ;当前为19 世纪年跳转ADD A,#100 ;从19 世纪起定义表格起始年,20 世纪要加100 年CON_06: CLR CSUBB A,#stArt_yeArMOV B,#3 ;表格每年3 字节MUL ABADD A,dplMOV dpl,AMOV A,BADDC A,dphMOV dph,AMOV A,#2MOVC A,@A+dptr ;读本年表格最后一字节(春节日期)CLR ACC.7 ;ACC.7 是闰年第13 个月大小,在此不用MOV B,#32DIV ABMOV temp_Byte1,A ;春节月份MOV temp_Byte2,B ;春节日; 以下计算当前日期距元旦天数MOV temp_Byte3,#0 ;设距元旦天数高位为0MOV A,CONvert_mONthCJNE A,#10,CON_08CON_08: JC CON_09 ;9月以前日子数小于256 天,高字节为0(9 月份过去的整月为8 个月) MOV temp_Byte3,#1CON_09: MOV A,CONvert_yeArANL A,#03h ;ACC 为除4 的余数JNZ CON_10 ;转常年处理; 年除4 余数为0 是闰年MOV A,CONvert_mONth- 5 -LCALL get_ruN_dAys_lOw ;取得闰年过去月的天数的低字节SJMP CON_12CON_10: MOV A,CONvert_mONthLCALL get_dAys_lOw ;取得常年过去月的天数的低字节CON_12: MOV B,CONvert_dAteDEC B ;因为日期从1 日起,而不是0 日起ADD A,B ;过去的整月天数加当月天数MOV temp_Byte4,AJNC CON_14INC temp_Byte3 ;temp_Byte3,temp_Byte4 分别为公历年过去的天数的高低字节; 以下求春节距元旦天数,因肯定小于256 天所以只用一字节表示CON_14: MOV A,temp_Byte1LCALL get_dAys_lOw ;春节不会在3 月份,不用考虑闰年DEC A ;因为日期从1 日起ADD A,temp_Byte2MOV temp_Byte5,A ;temp_Byte5,为春节距元旦天数MOV A,CONvert_mONthCJNE A,temp_Byte1,CON_20 ;转换月与春节月比较MOV A,CONvert_dAteCJNE A,temp_Byte2,CON_20 ;转换日与春节日比较CON_20: JC CON_22LJMP CON_60 ;当前日大于等于春节日期,公历年与农历年同年份CON_22: MOV A,CONvert_yeAr ;不到春节,农历年比公历年低一年JNZ CON_24MOV A,#100 ;年有效数0-99CON_24: DEC AMOV CONvert_yeAr,AMOV A,dplCLR CSUBB A,#3MOV dpl,AJNC CON_26DEC dph ;表格指针指向上一年CON_26: MOV A,temp_Byte5CLR CSUBB A,temp_Byte4MOV temp_Byte3,A ;temp_Byte3 中为当前日离春节的天数MOV CONvert_mONth,#12 ;农历月为12 月CLR f0 ;1901-2099 年没有闰12 月,清闰月标志CLR AMOVC A,@A+dptrANL A,#0f0hSWAP A;MOV temp_Byte4,A ;temp_Byte4 中为闰月JZ CON_30 ;没有闰月转移MOV A,#2 ;有闰月,取第13 个月天数MOVC A,@A+dptrMOV C,ACC.7MOV A,#1MOVC A,@A+dptrRLC A ;ACC 中为最后6 个月的大小值SJMP CON_34CON_30: MOV A,#1MOVC A,@A+dptr ;ACC 中为最后6 个月的大小值CON_34: MOV temp_Byte5,ACON_40: MOV A,temp_Byte5RRC AMOV temp_Byte5,AJC CON_42MOV B,#29 ;小月29 天SJMP CON_44CON_42: MOV B,#30 ;大月30 天CON_44: MOV A,temp_Byte3CLR CSUBB A,BJZ CON_46 ;正好够减,就是农历日1 日JNC CON_50;不够减一月天数,结束农历月调整CPL A ;求补取绝对值INC ACON_46: INC A ;加1 即为农历日MOV B,#10 ;转换并保存农历日,月,年DIV ABSWAP AORL A,BMOV CONvert_dAte,AMOV A,CONvert_mONthMOV B,#10DIV ABSWAP AORL A,BMOV C,f0MOV ACC.7,CMOV CONvert_mONth,AMOV A,CONvert_yeArMOV B,#10DIV ABSWAP AORL A,BMOV CONvert_yeAr,ARET ;结束转换CON_50: MOV temp_Byte3,A ;temp_Byte3 存减去一月后的天数JB f0,CON_52 ;是闰月,前推一月,月份不减DEC CONvert_mONth;CON_52: MOV A,CONvert_mONthCJNE A,temp_Byte4,CON_54CPL f0 ;当前月与闰月相同,更改闰月标志CON_54: SJMP CON_40CON_60: MOV A,temp_Byte4 ;春节日小于当前日,农历年同公历年CLR CSUBB A,temp_Byte5MOV temp_Byte4,AJNC CON_62DEC temp_Byte3 ;temp_Byte3 temp_Byte4 中为公历日离春节的天数CON_62: MOV CONvert_mONth,#1 ;农历月为1 月CLR AMOVC A,@A+dptrMOV temp_Byte5,AANL A,#0f0hSWAP A;XCH A,temp_Byte5 ;temp_Byte5 中为闰月,ACC 为当年农历表第一字节CLR f0 ;第一个月肯定不是闰月ANL A,#0fhMOV temp_Byte1,AMOV A,#1MOVC A,@A+dptrMOV temp_Byte2,AANL A,#0f0hORL A,temp_Byte1SWAP AMOV temp_Byte1,AMOV A,#2MOVC A,@A+dptrMOV C,ACC.7MOV A,temp_Byte2ANL A,#0fh- 8 -MOV ACC.3,C;MOV temp_Byte2,A ;以上temp_Byte1,temp_Byte2 各BIT 存农历年大小CON_70: MOV A,temp_Byte2RLC AMOV temp_Byte2,AMOV A,temp_Byte1RLC AMOV temp_Byte1,AJC CON_72MOV B,#29 ;小月29 天处理SJMP CON_74CON_72: MOV B,#30 ;大月30 天CON_74: MOV A,temp_Byte4CLR CSUBB A,BJNC CON_78 ;低字节够减跳转MOV B,A ;低字节不够减, B 暂存减后结果,MOV A,temp_Byte3JZ CON_76 ;高字节为0,不够减DEC temp_Byte3MOV temp_Byte4,BSJMP CON_80CON_76: MOV A,temp_Byte4 ;不够减结束月调整LJMP CON_46 ;转日期加1 后,处理并保存转换后农历年月日CON_78: MOV temp_Byte4,A ;temp_Byte3 temp_Byte4 天数为减去一月后天数CON_80: MOV A,CONvert_mONthCJNE A,temp_Byte5,CON_82CPL f0 ;当前月与闰月相同,更改闰月标志JNB f0,CON_82 ;更改标志后是非闰月,月份加1SJMP CON_70CON_82: INC CONvert_mONth;SJMP CON_70get_dAys_lOw:MOVC A,@A+PC ;取得常年过去月的天数的低字节RETDB 0,31,59,90,120,151,181,212,243,17,48,78get_ruN_dAys_lOw:MOVC A,@A+PC ;取得闰年过去月的天数的低字节RETDB 0,31,60,91,121,152,182,213,244,18,49,79mONth_dAtA:;公历年对应的农历数据,每年三字节,- 9 -;格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小;第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小;月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天).;第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期DB 004h,0Aeh,053h; 1901;DB 00Ah,057h,048h; 1902DB 055h,026h,0Bdh; 1903DB 00dh,026h,050h; 1904DB 00dh,095h,044h; 1905DB 046h,0AAh,0B9h; 1906DB 005h,06Ah,04dh; 1907DB 009h,0Adh,042h; 1908DB 024h,0Aeh,0B6h; 1909DB 004h,0Aeh,04Ah; 1910DB 06Ah,04dh,0Beh; 1911DB 00Ah,04dh,052h; 1912DB 00dh,025h,046h; 1913DB 05dh,052h,0BAh; 1914DB 00Bh,054h,04eh; 1915DB 00dh,06Ah,043h; 1916DB 029h,06dh,037h; 1917DB 009h,05Bh,04Bh; 1918DB 074h,09Bh,0C1h; 1919DB 004h,097h,054h; 1920DB 00Ah,04Bh,048h; 1921DB 05Bh,025h,0BCh; 1922DB 006h,0A5h,050h; 1923DB 006h,0d4h,045h; 1924DB 04Ah,0dAh,0B8h; 1925DB 002h,0B6h,04dh; 1926DB 009h,057h,042h; 1927DB 024h,097h,0B7h; 1928DB 004h,097h,04Ah; 1929DB 066h,04Bh,03eh; 1930DB 00dh,04Ah,051h; 1931DB 00eh,0A5h,046h; 1932DB 056h,0d4h,0BAh; 1933DB 005h,0Adh,04eh; 1934DB 002h,0B6h,044h; 1935DB 039h,037h,038h; 1936DB 009h,02eh,04Bh; 1937DB 07Ch,096h,0Bfh; 1938DB 00Ch,095h,053h; 1939DB 00dh,04Ah,048h; 1940- 10 -DB 06dh,0A5h,03Bh; 1941 DB 00Bh,055h,04fh; 1942 DB 005h,06Ah,045h; 1943 DB 04Ah,0Adh,0B9h; 1944 DB 002h,05dh,04dh; 1945 DB 009h,02dh,042h; 1946 DB 02Ch,095h,0B6h; 1947 DB 00Ah,095h,04Ah; 1948 DB 07Bh,04Ah,0Bdh; 1949 DB 006h,0CAh,051h; 1950 DB 00Bh,055h,046h; 1951 DB 055h,05Ah,0BBh; 1952 DB 004h,0dAh,04eh; 1953 DB 00Ah,05Bh,043h; 1954 DB 035h,02Bh,0B8h; 1955 DB 005h,02Bh,04Ch; 1956 DB 08Ah,095h,03fh; 1957 DB 00eh,095h,052h; 1958 DB 006h,0AAh,048h; 1959 DB 07Ah,0d5h,03Ch; 1960 DB 00Ah,0B5h,04fh; 1961 DB 004h,0B6h,045h; 1962 DB 04Ah,057h,039h; 1963 DB 00Ah,057h,04dh; 1964 DB 005h,026h,042h; 1965 DB 03eh,093h,035h; 1966 DB 00dh,095h,049h; 1967 DB 075h,0AAh,0Beh; 1968 DB 005h,06Ah,051h; 1969 DB 009h,06dh,046h; 1970 DB 054h,0Aeh,0BBh; 1971 DB 004h,0Adh,04fh; 1972 DB 00Ah,04dh,043h; 1973 DB 04dh,026h,0B7h; 1974 DB 00dh,025h,04Bh; 1975 DB 08dh,052h,0Bfh; 1976 DB 00Bh,054h,052h; 1977 DB 00Bh,06Ah,047h; 1978 DB 069h,06dh,03Ch; 1979 DB 009h,05Bh,050h; 1980 DB 004h,09Bh,045h; 1981 DB 04Ah,04Bh,0B9h; 1982 DB 00Ah,04Bh,04dh; 1983- 11 -DB 006h,0A5h,054h; 1985 DB 006h,0d4h,049h; 1986 DB 06Ah,0dAh,03dh; 1987 DB 00Ah,0B6h,051h; 1988 DB 009h,037h,046h; 1989 DB 054h,097h,0BBh; 1990 DB 004h,097h,04fh; 1991 DB 006h,04Bh,044h; 1992 DB 036h,0A5h,037h; 1993 DB 00eh,0A5h,04Ah; 1994 DB 086h,0B2h,0Bfh; 1995 DB 005h,0ACh,053h; 1996 DB 00Ah,0B6h,047h; 1997 DB 059h,036h,0BCh; 1998 DB 009h,02eh,050h; 1999 DB 00Ch,096h,045h; 2000 DB 04dh,04Ah,0B8h; 2001 DB 00dh,04Ah,04Ch; 2002 DB 00dh,0A5h,041h; 2003 DB 025h,0AAh,0B6h; 2004 DB 005h,06Ah,049h; 2005 DB 07Ah,0Adh,0Bdh; 2006 DB 002h,05dh,052h; 2007 DB 009h,02dh,047h; 2008 DB 05Ch,095h,0BAh; 2009 DB 00Ah,095h,04eh; 2010 DB 00Bh,04Ah,043h; 2011 DB 04Bh,055h,037h; 2012 DB 00Ah,0d5h,04Ah; 2013 DB 095h,05Ah,0Bfh; 2014 DB 004h,0BAh,053h; 2015 DB 00Ah,05Bh,048h; 2016 DB 065h,02Bh,0BCh; 2017 DB 005h,02Bh,050h; 2018 DB 00Ah,093h,045h; 2019 DB 047h,04Ah,0B9h; 2020 DB 006h,0AAh,04Ch; 2021 DB 00Ah,0d5h,041h; 2022 DB 024h,0dAh,0B6h; 2023 DB 004h,0B6h,04Ah; 2024 DB 069h,057h,03dh; 2025 DB 00Ah,04eh,051h; 2026DB 05eh,093h,03Ah; 2028 - 12 -DB 00dh,053h,04dh; 2029 DB 005h,0AAh,043h; 2030 DB 036h,0B5h,037h; 2031 DB 009h,06dh,04Bh; 2032 DB 0B4h,0Aeh,0Bfh; 2033 DB 004h,0Adh,053h; 2034 DB 00Ah,04dh,048h; 2035 DB 06dh,025h,0BCh; 2036 DB 00dh,025h,04fh; 2037 DB 00dh,052h,044h; 2038 DB 05dh,0AAh,038h; 2039 DB 00Bh,05Ah,04Ch; 2040 DB 005h,06dh,041h; 2041 DB 024h,0Adh,0B6h; 2042 DB 004h,09Bh,04Ah; 2043 DB 07Ah,04Bh,0Beh; 2044 DB 00Ah,04Bh,051h; 2045 DB 00Ah,0A5h,046h; 2046 DB 05Bh,052h,0BAh; 2047 DB 006h,0d2h,04eh; 2048 DB 00Ah,0dAh,042h; 2049 DB 035h,05Bh,037h; 2050 DB 009h,037h,04Bh; 2051 DB 084h,097h,0C1h; 2052 DB 004h,097h,053h; 2053 DB 006h,04Bh,048h; 2054 DB 066h,0A5h,03Ch; 2055 DB 00eh,0A5h,04fh; 2056 DB 006h,0B2h,044h; 2057 DB 04Ah,0B6h,038h; 2058 DB 00Ah,0Aeh,04Ch; 2059 DB 009h,02eh,042h; 2060 DB 03Ch,097h,035h; 2061 DB 00Ch,096h,049h; 2062 DB 07dh,04Ah,0Bdh; 2063 DB 00dh,04Ah,051h; 2064 DB 00dh,0A5h,045h; 2065 DB 055h,0AAh,0BAh; 2066 DB 005h,06Ah,04eh; 2067 DB 00Ah,06dh,043h; 2068 DB 045h,02eh,0B7h; 2069DB 08Ah,095h,0Bfh; 2071DB 00Ah,095h,053h; 2072- 13 -DB 00Bh,04Ah,047h; 2073DB 06Bh,055h,03Bh; 2074DB 00Ah,0d5h,04fh; 2075DB 005h,05Ah,045h; 2076DB 04Ah,05dh,038h; 2077DB 00Ah,05Bh,04Ch; 2078DB 005h,02Bh,042h; 2079DB 03Ah,093h,0B6h; 2080DB 006h,093h,049h; 2081DB 077h,029h,0Bdh; 2082DB 006h,0AAh,051h; 2083DB 00Ah,0d5h,046h; 2084DB 054h,0dAh,0BAh; 2085DB 004h,0B6h,04eh; 2086DB 00Ah,057h,043h; 2087DB 045h,027h,038h; 2088DB 00dh,026h,04Ah; 2089DB 08eh,093h,03eh; 2090DB 00dh,052h,052h; 2091DB 00dh,0AAh,047h; 2092DB 066h,0B5h,03Bh; 2093DB 005h,06dh,04fh; 2094DB 004h,0Aeh,045h; 2095DB 04Ah,04eh,0B9h; 2096DB 00Ah,04dh,04Ch; 2097DB 00dh,015h,041h; 2098DB 02dh,092h,0B5h; 2099DB 00dh,053h,049h; 2100;以下子程序用于从当前公历日期,推算星期,;入口:time_yeAr,time_month ,time_date ,定义公历年月日,BCD 码,其中月的;BIT7 表示世纪,0 表示20 世纪,1 表示19 世纪,与PCF8563 一致;出口 time_week, 0-6 表示星期日-星期六,与PCF8563 一致,程序不改变入口数据;使用资源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3GetWeek: MOV A,time_yeArMOV B,#16DIV ABMOV temp_Byte1,BMOV B,#10MUL ABADD A,temp_Byte1MOV temp_Byte1,A ;temp_Byte1=年MOV A,time_monthJB ACC.7,getw02- 14 -MOV A,#100ADD A,temp_Byte1MOV temp_Byte1,A ;20世纪年+100MOV A,time_monthCLR ACC.7getw02: JNB ACC.4,getw04ADD A,#10CLR ACC.4getw04: MOV temp_Byte2,A ;temp_Byte2=月MOV A,time_dateMOV B,#16DIV ABMOV temp_Byte3,BMOV B,#10MUL ABADD A,temp_Byte3MOV temp_Byte3,A ;temp_Byte3=日MOV A,temp_Byte1;ANL A,#03hJNZ getw10 ;非闰年转移MOV A,temp_Byte2CJNE A,#3,getw06getw06: JNC getw10 ;月大于2 转移DEC temp_Byte3 ;份小于等于2,又是闰年,日减1getw10: MOV A,temp_Byte2;LCALL get_CorreCt ;取月校正表数据ADD A,temp_Byte1MOV B,#7DIV AB ;B放年加校正日数之和后除7 的余数不先做这一步;有可能数据溢出MOV A,temp_Byte1ANL A,#0fChRR ARR A ;以上年除4 即闰年数ADD A,BADD A,temp_Byte3MOV B,#7DIV ABMOV time_week,BRETget_COrreCt:MOVC A,@A+PCRETDB 0,3,3,6,1,4,6,2,5,0,3,5 __。
阳历-农历[1]
![阳历-农历[1]](https://img.taocdn.com/s3/m/2dc4832758fb770bf78a5588.png)
年小一年,农历大小月取前一年的信息,农历月从12 月向前推算。 2.5、程序流程图: 阳历-农历子程序入口
读入标志字节之后?
Y
农历年=阳历年-1
农历年=阳历年
取上一年农历信息
取本年农历信息
逐月向前推算日期
逐月向后推算日期
标准化农历年月日
子程序出口
2.6、C51 程序源代码: 2.6.1、头文件<yltonl.h>定义: #define uchar unsigned char #define uint unsigned int //input: yy/mm/dd 阳历日期 uchar yangli_year; uchar yangli_month; uchar yangli_date; //output:yy/mm/dd 农历日期 uchar data nongli_year; uchar data nongli_month; uchar data nongli_date; //农历年信息标志字节
2、功能实现:
2.1、农历年信息表示: 2.1.1 农历大月 30 天,小月 29 天【用 1×12bit 表示大小月信息】 2.1.2 如有闰月一年 13 月,否则 12 月【用 4bit 表示闰月的月份,0 表示无闰月】 2.1.2 参照日:农历正月初一对应的阳历日期【日用 5bit 表示】 ; 【月用 2bit 表示】 农历一年信息共计 12+4+5+2=23bit 表示【可用 3 字节表示一农历年的信息】 2.2、农历年信息存放格式: 第一字节:bit7-bit4【闰月所在月份】bit3-bit0【农历 1-4 月的大小】 第二字节:bit7-bit0【农历 5-12 月的大小】1->30 天;0->29 天 第三字节:bit6-bit5【春节所在阳历月份】bit4-bit0【春节所在阳历日期】 2.3、下面统计(2001-2020)20年的农历年信息(共占用3×20=60字节) 0x4D,0x4A,0x0B8, //2001 0x0B,0x4A,0x43, //2011 0x0D,0x4A,0x4C, //2002 0x4B,0x55,0x37, //2012 0x0D,0x0A5,0x41, //2003 0x0A,0x0D5,0x4A, //2013 0x25,0x0AA,0x0B6, //2004 0x95,0x5A,0x0BF, //2014 0x05,0x6A,0x49, //2005 0x04,0x0BA,0x53, //2015 0x7A,0x0AD,0x0BD, //2006 0x0A,0x5B,0x48, //2016 0x02,0x5D,0x52, //2007 0x65,0x2B,0x0BC, //2017 0x09,0x2D,0x47, //2008 0x05,0x2B,0x50, //2018 0x5C,0x95,0x0BA, //2009 0x0A,0x93,0x45, //2019 0x0A,0x95,0x4E, //2010 0x47,0x4A,0x0B9 //2020 2.4、阳历-农历转换原理: 先计算出公历日离当年元旦的天数, 然后查表取得当年的春节日期, 计算出春节离元旦的天数, 二者相减即可算出公历日离春节的天数; 以后只要根据大小月和闰月信息减一月天数, 调整一 月农历月份,即可推算出公历日所对应的农历日期,如公历日不到春节日期,农历年要比公历
根据公历日期计算农历年生肖及公历转换农历的方法

日期农历月份[$-130000]格式验证1[$-130000]格式验证2TEXT(A2,"[$-130000]m-d")=1898+MATCH(要转换的公历日期,{0;31;416;770;1125;1508;1862;2217;2601;2955;3310;3694;4048;4432;4786;5140;5524;5878;6233;6617;6972;7356;7710;8064;8448;8802;9156;9541;9895;10250;10634;10988;11371;11725;12080;12464;12819;13173;13557;13911;14295;14649;15003;15387;15742;16096;16481;16835;17189;17573;17927;18311;18665;19020;19404;19758;20113;20497;20851;21234;21589;21943;22327;22682;23036;23420;23775;24128;21900-1-31鼠年春节1899FALSE13-16根据阳历生日1901-2-19牛年春节1901TRUE1-161902-2-8虎年春节1902TRUE1-171903-1-29兔年春节1902FALSE13-181904-2-16龙年春节1904TRUE1-171905-2-4蛇年春节1904FALSE13-171906-1-25马年春节1905FALSE12-161907-2-13羊年春节1907TRUE1-171908-2-2猴年春节1907FALSE13-161909-1-22鸡年春节1908FALSE12-171910-2-10狗年春节1910TRUE1-181911-1-30猪年春节1910FALSE13-181912-2-18鼠年春节1912TRUE1-181914-1-26虎年春节1913FALSE13-16 1915-2-14兔年春节1915TRUE1-17 1916-2-3龙年春节1915FALSE13-16 1917-1-23蛇年春节1916FALSE12-17 1918-2-11马年春节1918TRUE1-17 1919-2-1羊年春节1918FALSE13-18 1920-2-20猴年春节1920TRUE1-18 1921-2-8鸡年春节1921TRUE1-17 1922-1-28狗年春节1921FALSE13-16 1923-2-16猪年春节1923TRUE1-17 1924-2-5鼠年春节1923FALSE13-17 1925-1-24牛年春节1924FALSE12-16 1926-2-13虎年春节1926TRUE1-17 1927-2-2兔年春节1926FALSE13-17 1928-1-23龙年春节1927FALSE12-18 1929-2-10蛇年春节1929TRUE1-17 1930-1-30马年春节1929FALSE13-17 1931-2-17羊年春节1931TRUE1-17 1932-2-6猴年春节1932TRUE1-16 1933-1-26鸡年春节1932FALSE13-17 1934-2-14狗年春节1934TRUE1-17 1935-2-4猪年春节1934FALSE13-17 1936-1-24鼠年春节1935FALSE12-17 1937-2-11牛年春节1937TRUE1-16 1938-1-31虎年春节1937FALSE13-16 1939-2-19兔年春节1939TRUE1-17 1940-2-8龙年春节1940TRUE1-17 1941-1-27蛇年春节1940FALSE13-16 1942-2-15马年春节1942TRUE1-16 1943-2-5羊年春节1942FALSE13-17 1944-1-25猴年春节1943FALSE12-16 1945-2-13鸡年春节1945TRUE1-17 1946-2-2狗年春节1945FALSE13-17 1947-1-22猪年春节1946FALSE12-18 1948-2-10鼠年春节1948TRUE1-18 1949-1-29牛年春节1948FALSE13-17 1950-2-17虎年春节1950TRUE1-17 1951-2-6兔年春节1951TRUE1-16 1952-1-27龙年春节1951FALSE13-17 1953-2-14蛇年春节1953TRUE1-16 1954-2-3马年春节1953FALSE13-16 1955-1-24羊年春节1954FALSE12-18 1956-2-12猴年春节1956TRUE1-18 1957-1-31鸡年春节1956FALSE13-18 1958-2-18狗年春节1958TRUE1-17 1959-2-8猪年春节1959TRUE1-17 1960-1-28鼠年春节1960TRUE1-1 1961-2-15牛年春节1961TRUE1-1 1962-2-5虎年春节1962TRUE1-1 1963-1-25兔年春节1963TRUE1-1 1964-2-13龙年春节1964TRUE1-11966-1-21马年春节1965FALSE12-30 1967-2-9羊年春节1967TRUE1-1 1968-1-30猴年春节1968TRUE1-1 1969-2-17鸡年春节1969TRUE1-1 1970-2-6狗年春节1970TRUE1-1 1971-1-27猪年春节1971TRUE1-1 1972-2-15鼠年春节1972TRUE1-1 1973-2-3牛年春节1973TRUE1-1 1974-1-23虎年春节1974TRUE1-1 1975-2-11兔年春节1975TRUE1-1 1976-1-31龙年春节1976TRUE1-1 1977-2-18蛇年春节1977TRUE1-1 1978-2-7马年春节1978TRUE1-1 1979-1-28羊年春节1979TRUE1-1 1980-2-16猴年春节1980TRUE1-1 1981-2-5鸡年春节1981TRUE1-1 1982-1-25狗年春节1982TRUE1-1 1983-2-13猪年春节1983TRUE1-1 1984-2-2鼠年春节1984TRUE1-1 1985-2-20牛年春节1985TRUE1-1 1986-2-9虎年春节1986TRUE1-1 1987-1-29兔年春节1987TRUE1-1 1988-2-17龙年春节1987FALSE13-30 1989-2-6蛇年春节1989TRUE1-1 1990-1-27马年春节1990TRUE1-1 1991-2-15羊年春节1991TRUE1-1 1992-2-4猴年春节1992TRUE1-1 1993-1-23鸡年春节1993TRUE1-1 1994-2-10狗年春节1994TRUE1-1 1995-1-31猪年春节1995TRUE1-1 1996-2-19鼠年春节1996TRUE1-1 1997-2-7牛年春节1996FALSE12-30 1998-1-28虎年春节1998TRUE1-1 1999-2-16兔年春节1999TRUE1-1 2000-2-5龙年春节2000TRUE1-1 2001-1-24蛇年春节2001TRUE1-1 2002-2-12马年春节2002TRUE1-1 2003-2-1羊年春节2003TRUE1-1 2004-1-22猴年春节2004TRUE1-1 2005-2-9鸡年春节2005TRUE1-1 2006-1-29狗年春节2006TRUE1-1 2007-2-18猪年春节2007TRUE1-1 2008-2-7鼠年春节2008TRUE1-1 2009-1-26牛年春节2009TRUE1-1 2010-2-14虎年春节2010TRUE1-1 2011-2-3兔年春节2011TRUE1-1 2012-1-23龙年春节2012TRUE1-1 2013-2-10蛇年春节2013TRUE1-1 2014-1-31马年春节2014TRUE1-1 2015-2-19羊年春节2015TRUE1-1 2016-2-8猴年春节2016TRUE1-12018-2-16狗年春节2018TRUE1-1 2019-2-5猪年春节2019TRUE1-1 2020-1-25鼠年春节2020TRUE1-1 2021-2-12牛年春节2021TRUE1-1 2022-2-1虎年春节2022TRUE1-1 2023-1-22兔年春节2023TRUE1-1 2024-2-10龙年春节2024TRUE1-1 2025-1-29蛇年春节2025TRUE1-1 2026-2-17马年春节2026TRUE1-1 2027-2-6羊年春节2026FALSE12-30 2028-1-26猴年春节2027FALSE12-30 2029-2-13鸡年春节2029TRUE1-1 2030-2-3狗年春节2030TRUE1-1 2031-1-23猪年春节2031TRUE1-1 2032-2-11鼠年春节2032TRUE1-1 2033-1-31牛年春节2033TRUE1-1 2034-2-19虎年春节2034TRUE1-1 2035-2-8兔年春节2035TRUE1-1 2036-1-28龙年春节2036TRUE1-1 2037-2-15蛇年春节2037TRUE1-1 2038-2-4马年春节2038TRUE1-1 2039-1-24羊年春节2039TRUE1-1 2040-2-12猴年春节2040TRUE1-1 2041-2-1鸡年春节2041TRUE1-1 2042-1-22狗年春节2042TRUE1-1 2043-2-10猪年春节2043TRUE1-1 2044-1-30鼠年春节2044TRUE1-1 2045-2-17牛年春节2045TRUE1-1 2046-2-6虎年春节2046TRUE1-1 2047-1-26兔年春节2047TRUE1-1 2048-2-14龙年春节2048TRUE1-1 2049-2-2蛇年春节2049TRUE1-1 2050-1-23马年春节2050TRUE1-1 2051-2-11羊年春节2051TRUE1-15 2052-2-1猴年春节2051FALSE13-15 2053-2-19鸡年春节2053TRUE1-15 2054-2-8狗年春节2054TRUE1-15 2055-1-28猪年春节2054FALSE13-14 2056-2-15鼠年春节2056TRUE1-14 2057-2-4牛年春节2057TRUE1-14 2058-1-24虎年春节2057FALSE13-14 2059-2-12兔年春节2059TRUE1-14 2060-2-2龙年春节2059FALSE13-15 2061-1-21蛇年春节2060FALSE12-15 2062-2-9马年春节2062TRUE1-14 2063-1-29羊年春节2062FALSE13-14 2064-2-17猴年春节2064TRUE1-15 2065-2-5鸡年春节2065TRUE1-14 2066-1-26狗年春节2065FALSE13-15 2067-2-14猪年春节2067TRUE1-15 2068-2-3鼠年春节2067FALSE13-152070-2-11虎年春节2070TRUE1-15 2071-1-31兔年春节2070FALSE13-14 2072-2-19龙年春节2072TRUE1-15 2073-2-7蛇年春节2073TRUE1-14 2074-1-27马年春节2073FALSE13-14 2075-2-15羊年春节2075TRUE1-14 2076-2-5猴年春节2075FALSE13-15 2077-1-24鸡年春节2076FALSE12-16 2078-2-12狗年春节2078TRUE1-15 2079-2-2猪年春节2078FALSE13-15 2080-1-22鼠年春节2079FALSE12-14 2081-2-9牛年春节2081TRUE1-14 2082-1-29虎年春节2081FALSE13-14 2083-2-17兔年春节2083TRUE1-14 2084-2-6龙年春节2084TRUE1-15 2085-1-26蛇年春节2084FALSE13-16 2086-2-14马年春节2086TRUE1-15 2087-2-3羊年春节2086FALSE13-15 2088-1-24猴年春节2087FALSE12-15 2089-2-10鸡年春节2089TRUE1-14 2090-1-30狗年春节2089FALSE13-13 2091-2-18猪年春节2091TRUE1-14 2092-2-7鼠年春节2092TRUE1-15 2093-1-27牛年春节2092FALSE13-16 2094-2-15虎年春节2094TRUE1-15 2095-2-5兔年春节2095TRUE1-15 2096-1-25龙年春节2095FALSE13-15 2097-2-12蛇年春节2097TRUE1-15 2098-2-1马年春节2097FALSE13-14 2099-1-21羊年春节2098FALSE12-14 2100-2-9猴年春节2100TRUE1-15农历日期顺序初一初二初三初四初五初六初七初八初九初十十一十二十三十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十。
用51 单片机实现公历与农历星期的转换原理

用51单片机实现公历与农历星期的转换一.概述、、、公历是全世界通用的历法以地球绕太阳的一周为一年,一年365天,分为12个月: 1 3 5 7 8 10 12月为31天, 2月为28天,其余月份为30天。
事实上地球绕太阳一周共365天5小时48分46秒,比公历一年多出5小时48分46秒。
为使年误差不累积,公历年用闰年法来消除年误差,由于每年多出5小时48分46秒每4年累计多出23小时15分4秒接近1天,天文学家就规定每4年有一个闰年,把2月由28天改为29天,凡是公历年代能被4整除的那一年就是闰年,但是这样一来每4年又少了44分56秒,为了更准确地计时,天文学家又规定凡能被100整除的年份,只有能被400整除才是闰年,即每400年要减掉3个闰年经过这样处理后实际上每400年的误差只有2小时53分20秒已相当准确了。
、、农历与公历不同农历把月亮绕地球一周作为一月,因为月亮绕地球一周不是一整天,所以农历把月分为大月和小月,大月30天小月29天,通过设置大小月使农历日始终与月亮与地球的位置相对应,为了使农历的年份与公历年相对应,农历通过设置闰月的办法使它的平均年长度与公历年相等,农历是中国传统文化的代表之一并与农业生产联系密切,中国人民特别是广大农民十分熟悉并喜爱农历。
、、、公历与农历是我国目前并存的两种历法各有其固有的规律,农历与月球的运行相对应其影响因素多,它的大小月和闰月与天体运行有关,计算十分复杂且每年都不一致,因此要用单片机实现公历与农历的转换用查表法是最方便实用的办法。
、、、51系列单片机因其在功能上能满足大部份对速度要求不高的应用场合,且价格低廉开发工具普及程度高,是目前应用最多的单片机之一,本文介绍一种用51单片机实现从1901年到2099年,199年公历日到农历日及星期的转换方法,并向读者提供完整的51汇编程序。
二.基本原理、、、实现公历与农历的转换一般采用查表法,按日查表是速度最快的方法,但51单片机寻址能力有限不可能采用按日查表的方法,除按日查外我们可以通过按月查表和按年查表的方法,再通过适当的计算来确定公历日所对应的农历日期,本文采用的是按年查表法最大限度地减少表格所占的程序空间。
单片机公历农历转换程序

0x35,0x2B,0xB8,0x05,0x2B,0x4C,0x8A,0x95,0x3f,// 1955-1957
0x0e,0x95,0x52,0x06,0xAA,0x48,0x7A,0xd5,0x3C,// 1958-1960
0x0A,0xB5,0x4f,0x04,0xB6,0x45,0x4A,0x57,0x39,// 1961-1963
0x24,0x97,0xB7,0x04,0x97,0x4A,0x66,0x4B,0x3e,// 1928-1930
0x0d,0x4A,0x51,0x0e,0xA5,0x46,0x56,0xd4,0xBA,// 1931-1933
0x05,0xAd,0x4e,0x02,0xB6,0x44,0x39,0x37,0x38,// 1934-1936
/*第一字节BIT7-4 位表示闰月月份,值为0 为无闰月, */
/*BIT3-0 对应农历第1-4 月的大小*/
/*第二字节BIT7-0 对应农历第5-12月大小, */
/*第三字节BIT7 表示农历第13 个月大小月份对应的位*/
/*为1 表示本农历月大(3Байду номын сангаас 天),为0 表示小(29 天) */
0x04,0xAe,0x4A,0x6A,0x4d,0xBe,0x0A,0x4d,0x52,// 1910-1912
0x0d,0x25,0x46,0x5d,0x52,0xBA,0x0B,0x54,0x4e,// 1913-1915
0x0d,0x6A,0x43,0x29,0x6d,0x37,0x09,0x5B,0x4B,// 1916-1918
/*Tim[10]为周数据/Tim[7]/Tim[8]/Tim[9]为农历数据,根据需要自行更换*/
公历转农历、巧算星期、干支、节气 算法原理

1、公历转换农历的算法公历(Gregorian Calendar)与农历(Chinese Lunar Calendar)的转换关系不是一个简单的公式就可以完成,其中的转换比较复杂,原因是农历的制定相当复杂,是根据天文观测进行指定的。
比较常用并且比较简单的公历转换农历算法就是查表方法。
首先要保存公历农历的转换信息:以任何一年作为起点,把从这一年起若干年的农历信息保存起来。
回想一下,我们平时是怎样来转换公历农历的呢?是查阅历书,历书中有每一天的公历农历,直接一查就可以了。
那么我们可不可以也这样做呢?当然可以,但是这样做要收录每一天的信息,工作量就会很大,所以我们要简化这些信息。
如何简化呢?下面的三个表格是农历数据表LunarCalendarTable的结构。
总共使用了32位整数的0~23位。
6543210表示春节的公历月份表示春节的公历日期1918121731641551461371281191010911812713农历1-13月大小。
月份对应位为1,农历月大(30天),为0表示小(29天)23222120表示当年闰月月份,值为0为则表示当年无闰月。
计算公历日对应的农历日期的方法:先计算出公历日离当年元旦的天数n1,然后查表取得当年的春节日期,计算出春节离元旦的天数n2,二者相减即可算出公历日离春节的天数n3,以后再根据大小月和闰月信息就可以计算n3减去农历的每月天数,减的次数就是农历月份,最后剩余的天数就是农历日。
2、利于泰勒公式巧算星期在应用数学中有一个计算某一天是星期几的公式,这就是泰勒公式。
公式如下:w=[c÷4] - 2c + y + [y÷4] + [26(m+1)÷10] + d - 1,其中w就是所求日期的星期数。
如果求得的数大于(小于)7,就减去(加上)7的倍数,直到余数小于7为止。
式子中c是指公元年份的前两位数字,y是后两位数字,m是月数,d 是日数。
公历阳历转阴历农历C51程序键盘数码管成功

/****************************************************************************** ** 实验名: 动态显示数码管实验* 使用的IO : 数码管使用P0,P2.2,P2.3,P2.4* 实验效果: 数码管显示76543210。
* 注意:******************************************************************************* /#include<reg51.h>#include<stdio.h>#define GPIO_DIG P0//数码管显示#define GPIO_KEY P1//键盘sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit K3=P3^2;//外部中断unsigned char code DataTab[404]={//日期差//上大小月//下大小月//闰月月份及大小0x46,0x43,0x21,0x00,//19990x35,0x15,0x51,0x00,//20000x23,0x11,0x52,0x41,0x42,0x12,0x65,0x00,0x31,0x11,0x32,0x00,0x21,0x42,0x52,0x21,0x39,0x52,0x25,0x00,//20050x28,0x25,0x04,0x71,0x48,0x66,0x42,0x00,0x37,0x33,0x22,0x00,0x25,0x15,0x24,0x51,0x44,0x25,0x52,0x00,//20100x33,0x22,0x65,0x00,0x22,0x21,0x25,0x41,0x40,0x24,0x52,0x00,0x30,0x52,0x42,0x91,0x49,0x55,0x05,0x00, //20150x38,0x26,0x44,0x00,0x27,0x53,0x50,0x60,0x46,0x53,0x24,0x00,0x35,0x25,0x54,0x00,0x24,0x41,0x52,0x41, //20200x42,0x45,0x25,0x00,0x31,0x24,0x52,0x00,0x21,0x51,0x12,0x21,0x40,0x55,0x11,0x00,0x28,0x32,0x21,0x61, //2025 0x47,0x26,0x61,0x00,0x36,0x13,0x31,0x00,0x25,0x05,0x31,0x51,0x43,0x12,0x54,0x00,0x33,0x51,0x25,0x00, //2030 0x22,0x42,0x25,0x31,0x41,0x32,0x22,0x00,0x30,0x55,0x02,0x71,0x49,0x55,0x22,0x00,0x38,0x26,0x62,0x00, //2035 0x27,0x13,0x64,0x60,0x45,0x13,0x32,0x00,0x34,0x12,0x55,0x00,0x23,0x10,0x53,0x51,0x42,0x22,0x45,0x00, //2040 0x31,0x52,0x22,0x00,0x21,0x52,0x44,0x21,0x40,0x55,0x44,0x00,0x29,0x26,0x50,0x71,0x47,0x26,0x64,0x00, //2045 0x36,0x25,0x32,0x00,0x25,0x23,0x32,0x50,0x44,0x44,0x55,0x00,0x32,0x24,0x45,0x00,0x22,0x55,0x11,0x30, //2050 0x41,0x33,0x10,0x00,0x31,0x55,0x40,0x81,0x49,0x55,0x50,0x00,0x38,0x46,0x64,0x00,0x27,0x45,0x65,0x60, //2055 0x45,0x05,0x32,0x00,0x34,0x45,0x15,0x00,0x23,0x26,0x23,0x40,0x42,0x25,0x21,0x00,0x32,0x33,0x21,0x00, //2060 0x20,0x43,0x21,0x31,0x39,0x15,0x51,0x00,0x28,0x12,0x52,0x71,0x47,0x12,0x65,0x00,0x35,0x11,0x32,0x00, //2065 0x25,0x50,0x52,0x51,0x44,0x52,0x25,0x00,0x33,0x26,0x22,0x00,0x22,0x52,0x42,0x41,0x41,0x53,0x22,0x00, //20700x30,0x25,0x44,0x81,0x49,0x25,0x52,0x00,0x37,0x22,0x65,0x00,0x26,0x22,0x25,0x61,0x45,0x24,0x52,0x00, //20750x35,0x52,0x45,0x00,0x23,0x25,0x05,0x41,0x42,0x26,0x44,0x00,0x32,0x53,0x24,0x00,0x21,0x23,0x30,0x31, //20800x39,0x45,0x54,0x00,0x28,0x43,0x14,0x71,0x47,0x45,0x25,0x00,0x36,0x24,0x52,0x00,0x25,0x55,0x12,0x50, //20850x44,0x55,0x11,0x00,0x33,0x26,0x50,0x00,0x23,0x52,0x61,0x41,0x40,0x13,0x31,0x00,0x29,0x05,0x51,0x81, //20900x48,0x12,0x55,0x00,0x37,0x11,0x25,0x00,0x26,0x45,0x25,0x60,0x45,0x52,0x22,0x00,0x35,0x55,0x21,0x00, //20950x24,0x25,0x42,0x41,0x42,0x26,0x62,0x00,0x31,0x13,0x52,0x00,0x20,0x03,0x32,0x21 //2099};unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char code so_m_d[12]={31,28,31,30,31,30,31,31,30,31,30,31};//公历该月的天数unsigned char DisplayData[8];//用来存放要显示的8位数的值unsigned char TempData[8];unsigned char TurnData[4];//转换用于取出数据表的四个数据unsigned char KeyValue;//用来存放读取到的键值unsigned char KV;char year_soH;char year_so;//公历年月日char month_so;char day_so;int SumDar_so; //char型位数不够,出现瓶颈char year_lu;//农历年月日char month_lu;char day_lu;int SumDar_lu;int n,H;void DigDisplay(); //动态显示函数void Delay10ms(); //延时10msvoid KeyDown(); //检测按键函数void KeyShow(); //检测键值并显示void Turn(); //阳历转换阴历//int LMP(int LP);int month12_lu(int month_a ,unsigned char month_b,unsigned char month_c);/****************************************************************************** ** 函数名: main* 函数功能: 主函数* 输入: 无* 输出: 无******************************************************************************* /void main(){year_lu=0;//农历年月日month_lu=0;day_lu=0;KeyShow();//设置INT0IT0=1;//跳变沿出发方式(下降沿)EX0=1;//打开INT0的中断允许。
阴历阳历转换算法

阴历阳历转换算法一、阳历转农历算法阳历转农历的算法可以分为两种:数学计算法和查表法。
1.数学计算法阳历转农历的数学计算法基于一些数学公式和推算规则。
其中,公历年份、月份和日期的确定使用了基于蔡勒公式、游戏二法和公式等方式。
核心计算公式:(1)蔡勒公式:W=(C/4-2*C+y+y/4+13*(m+1)/5+d-1)%7其中,W为一周中的日期,C为世纪数,y为年份的后两位数,m为月份(1代表3月,2代表4月,依此类推),d为公历日期。
其中,jdy为公历日期的数值。
M=[N/1461]D = N mod 1461K=[D/365](4)数学计算方法计算公历日期对应的年份、月份和日期。
2.查表法阳历转农历的查表法使用一个双向映射表,将公历日期和农历日期进行映射。
这样,当需要进行阳历转农历时,只需要在该表中查找对应的日期。
该表通常包括每个公历年份的月份和日期,以及相应的农历月份和日期。
二、农历转阳历算法农历转阳历的算法也可以使用数学计算法和查表法。
1.数学计算法农历转阳历的数学计算法基于一定的规则和公式。
其中,农历年份、月份和日期的确定使用了一些数学公式。
核心计算公式:(1)计算春节对应的公历日期:N=y*365+[y/4]-[y/100]+[y/400]+[30.6*(m+0.5)]+d-1899.5其中,N为公历日期的数值。
(2)根据公历日期的数值,计算农历日期的年份、月份和日期。
2.查表法农历转阳历的查表法使用一个双向映射表,将农历日期和公历日期进行映射。
这样,当需要进行农历转阳历时,只需要在该表中查找对应的日期。
该表通常包括每个农历年份的月份和日期,以及相应的公历月份和日期。
三、应用阳历转农历和农历转阳历算法广泛应用于日历、生活工具、节日计算等方面。
在计算机程序和手机应用中,这些算法可以用来进行日期转换、节日提醒等功能。
此外,还有一些相对复杂的算法可以使用天文计算和历法知识,考虑到地球的自转、公转、地球轨道等因素来进行日期转换,提高转换的准确性。
c51单片机万年历的c程序

c51单片机万年历的c程序c51单片机万年历的c程序求一个单片机可以显示阳历的年、月、日、星期、小时.分.秒。
阴历也能显示,标明是否为闰年。
用LCD液晶显示,可以调整时间。
这有个数码管显示的程序以前做的,。
你可以在我这个程序上修改修改包括键盘扫描,还有动态显示。
【。
】#include <REG51.H>//常量参数#define TMODW 0x01;#define SCONW 0x00;#define xplay 0x04;//显示分频系数//显示位选unsigned char data stb;//键值缓存,0xFF无键命令unsigned char data keynum;//显示字型变量unsigned char data play[8];//工作参数unsigned char data l,m;//字型码unsigned char code BCDPC[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//字位码unsigned char code STBCODE[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };//400Hz xplay分频计数unsigned char data cttime;//时钟参数unsigned char data hr,min,sec,sec100;//调整时钟参数(时钟“走”)void ct1(){sec100++;if (sec100==100){sec100=0;sec++;if (sec==60){sec=0;min++;if (min==60){min=0;hr++;if (hr==24) hr=0;}}}}//时钟参数→LED 显示缓存7段参数转换函数;void xcplay(){play[0]=BCDPC[hr/10];play[1]=BCDPC[hr%10];play[2]=BCDPC[min/10];play[3]=BCDPC[min%10];play[4]=BCDPC[sec/10];play[5]=BCDPC[sec%10];play[6]=BCDPC[sec100/10]; play[7]=BCDPC[sec100%10];}//显示扫描void cplay(){T0=1;//T0-高电平消隐T1=0;//T1-低电平准备发脉冲前沿TI=0;//?P1=0;//?SBUF=STBCODE[stb];while (TI==0){};TI=0;SBUF=play[stb];while (TI==0){};T1=1;T0=0;stb=++stb&0x07;}extern void cthl0();//定时器0中断处理程序void ct0(void) interrupt 1 using 1 {cthl0();cttime--;if (cttime==0){cttime=xplay;ct1();//调用时钟“走”函数xcplay();//调用时钟参数→Led显示缓存转换函数};cplay();}void w20ms(){for (l=0;l<41;l++){for (m=0;m<81;m++){}}}void tkey(){P1=0xF0;keynum=0xFF;if (P1!=0xF0){w20ms();P1=0xF0;if (P1!=0xF0){P1=0xFE;switch (P1){case 0xEE:keynum=0;break;case 0xDE:keynum=1;break;case 0xBE:keynum=2;break;case 0x7E:keynum=3;break;}P1=0xFD;switch (P1){case 0xED:keynum=4;break;case 0xDD:keynum=5;break;case 0xBD:keynum=6;break; case 0x7B:keynum=7;break; }P1=0xFB;switch (P1){case 0xEB:keynum=8;break; }};};P1=0x00;}void command(){switch (keynum){case 0:{hr=hr+1;if (hr==24)hr=0;}break;case 1:{min=min+1;if (min==60)min=0;}break;case 2:{sec=sec+1;if (sec==60)sec=0;}break;case 3:{sec100=0; }break;case 4:{while(!(P1=0xED)) {hr=0;min=0;sec=0;}}break;case 5:{hr=hr-1;if (hr==00)hr=24;}break;case 6:{min=min-1; if (min==00)min=59;}break;case 7:{sec=sec-1; if (sec==00)sec=0;}break;case 0xFF:break; }keynum=0xFF; }main (){ hr=8;min=5;sec=8;sec100=0; TMOD=TMODW; SCON=SCONW; ET0=1;TR0=1;EA=1;cttime=xplay; while (1){w20ms();tkey(); command();};}。
公历至农历转换的单片机实现

二曩j㈡。
jjt≯';:冀爨越搠j{㈡公历至农历转换的单片机实现福建农林大学陈松岭摘要:本文从公历的角度分析了农历的特点,给出了公历至农历转换所需的数据结构,并利用MCS一51汇编语言编制了实现公历至农历转换的单片机子程序。
该子程序通过查表,可以实现1901年至2155年255年的公历至农历的转换,每年需使用3字节的表格,代码简洁(共79条指令),使用系统资源少。
关键词:公历;农历+转换MCS一5l;汇编语言+单片机X引言农历在日常生活中应用广泛。
农历属于阴阳历。
它把朔望月的时间作为历月的平均时间,又运用了设置闰月的和二十四节气的办法,使历年的平均长度等于回归年,这使农历具有阳历的成分m。
因此,农历既和月亮的运行规律有关,又和太阳的运行规律有关,编制的方法十分复杂,不能使用一个统一的公式进行推算。
笔者将公历每年与农历相关的重要信息制成表格(每年需占用3个字节),然后利用MCS一51汇编语言通过查表在单片机上实现了公历至农历的转换。
实现公历至农历转换的数据结构从公历的角度分析,每一个公历年对应的农历有以下特点;・每年经历的每个农历月的天数。
大月为30天,小月为29天。
每年最多经过13个农历月。
每月需要用1位二进制数表示,1表示大月,0表示小月。
共需要13位二进制数。
・每年元月一日对应的农历日期。
农历日期在1-30之间,需要用5位二进制数表示。
・每年元月一日对应的农历月份,为十一月或十二月。
需要用1位二进制数表示,0表示十一月,1表示十二月。
・每年农历的闰月月份,根据历法知识,农历不会出现闰正月、闰十一月和闰十二月。
农历的闰月月份在2-10之间,需要用4位二进制数表示。
震J说明Bit6Bit5Bit4Bit3Bit2BitlBitOByte农历第一至八月的M8M6M5M4M20每月天数(1=大月)农历第九至卜三月NLLea!曲lonthMllM10鹕Bytel每月天数(1=大月)Byte农历的其它信息NLI。
阴阳历转换算法

您好!
阴阳历快速转换,方法是确定阳历基准和阴历基准,按照公式计算相差天数,计算阴历日期。
确定阳历基准和阴历基准
快速的进行阴阳历转化,要确定阳历和阴历对应的是同一天,阳历基准是计算月输入阳历日期的相差天数,阴历基准是根据相差的天数来计算出对应的阴历日期。
计算相差天数
进行阴阳历的转换,阳历日期和阳历基准的相差天数是等于输出的阴历日期和阴历基准之间的相差天数。
先输入阳历日期与阳历基准之间相差天数,相差天数是固定的。
公式
公式是(输入的阳历日期−阳历基准+1)=(输出的阴历日期−阴历基准+1)=相差天数(输入的阳历日期- 阳历基准+ 1)= (输出的阴历日期- 阴历基准+ 1)= 相差天数(输入的阳历日期−阳历基准+1)=(输出的阴历日期−阴历基准+1)=相差天数。
计算阴历日期
阴历日期是根据已计算的相差天数与阴历基准来确定。
阴历日期的年份是相差天数依次减去阴历基准开始之后的每一年的阴历天数(包括阴历基准年的天数)相差的天数不断的减少,减少到<0 的时候,对应的阴历年就是阴历年份。
阴历日期的月份是利用相差天数减去上一阴历年总天数后所剩下的天数为多少,依次减去阴历每个月的天数,相差
天数<0的时候,对应的月份是阴历月份。
阴历日期的天是相差的天数减去已确定的天数,剩下的天数是阴历日期的天。
——容选自网络,仅供参考。
公历转换农历及节气算法

公历转换农历及节气算法
一、公历转换农历算法
公历转换农历是一个计算机程序常用的算法,在一些时间场合中需要
用到这种转换。
它的实现方法是通过观察公历时间轴来计算对应的农历时间。
农历与公历时间是不一致的,公历按照国际上的标准,每年的第一天
是1月1日,但是农历每年的第一天是春节,春节一般是在公历1月或者
2月,并且每年的月份及每月的天数完全不一样。
首先根据公历定义时间年月日,根据公历ini文件获取这一年每个月
的天数,计算此天为公历的第几天,设置春节为第一天,然后根据农历每
月的天数,除以每月的天数,取余数,余数为本月的第几天,除以每月的
天数为本月的月份,即可求出农历的月份与日期,从而实现公历转换农历。
二、公历转换节气算法
节气交替转换是指根据公历历法转换成节气历法,其中最关键的是根
据公历计算出节气的日期,为了实现这一转换,需要根据节气历法的计算
规则,设计一套算法实现节气的计算。
其中需要用到的主要参数有:
1、公历年份和月份;
2、节气历法的计算规则,这一规则是以春分点为计算基准点,向前
或者向后计算,每次计算90天或者120天,然后取月中规定的日期来确
定节气的日期。
根据上述要素。