文档介绍:用用5151 单片机实现公历与农历星期的转换
济南朱思荣
一概述
公历是全世界通用的历法以地球绕太阳的一周为一年一年 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 年以后的闰年数所以实际校正数据也和上述数据不同
- 1 -
三程序流程
由于星期的计算很简单这里只提供公历日转农历日的程序流程图
子程序入口
转换数据到 HEX 格式方便运算
根据公历年定位数据表的地址
从数据表中取得春节的公历日期,