用51 单片机实现公历与农历星期的转换程序.docx
- 文档编号:4275079
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:13
- 大小:20.43KB
用51 单片机实现公历与农历星期的转换程序.docx
《用51 单片机实现公历与农历星期的转换程序.docx》由会员分享,可在线阅读,更多相关《用51 单片机实现公历与农历星期的转换程序.docx(13页珍藏版)》请在冰豆网上搜索。
用51单片机实现公历与农历星期的转换程序
用51单片机实现公历与农历星期的转换程序
一.程序流程
由于星期的计算很简单这里只提供公历日转农历日的程序流程图
否
是
否
是否
子程序入口
转换数据到HEX格式方便运算
根据公历年定位数据表的地址
从数据表中取得春节的公历日期,并通过
计算公历日和春节离元旦的天数算出公历
日离春节的天数记为X
农历年=公历年减
1数据表地址减
3定位到前一年
取农历月信息
农历月12闰月标
志F00非闰月
XY
否公历日在春节以后码?
取农历月天
数Y
是
XXY
F01
是
否
是
农历月减1
农历月闰月
F0取反
是否
农历日YX1
农历年=公历年取
农历月信息
农历月1闰月标
志F00非闰月
取农历月
天数Y
XYXXY
农历月闰月
农历月加1
F01
F0取反
是
农历日X1
否
农历年月日数
据标准化
子程序出口
-3-
二.程序使用说明
本文提供的子程序在设计时应用了PCF8563作时钟芯片所以其入口格式与PCF8563芯片的时钟信号存储格式完
全一致年月日均为BCD码其中月的BIT7表示世纪为1表示19世纪为0表示20世纪采用PCF8563时
钟芯片只要把它的年月日寄存器内容读出到time_yeArtime_month和time_date三个单元内即可直接调用本
程序转换采用其它时钟芯片调用前要把时钟格式稍作调整或修改一下程序公历日转农历日程序在12M晶振下
执行时间最长约0.48毫秒实际使用时只需在复位和日期变化时才需要调用一次对于公历日转星期天的子程序则
只在设置时钟时才有用在设置时钟年月日后调用子程序得到对应的星期天直接写入时钟即可
子程序附带了1901-2100年的农历数据表全部编译要占600字节空间如不需这么多可把不需要的数据删除然
后修改stArt_yeAr值即可stArt_yeAr定义了查询表的起始年份
三.子程序清单
start_yearEQU01;定义查询表起始年份,01--199表示1901-2099年
;以下三单元为需转换的公历日期是子程序的入口数据
time_yearDATA30h
time_monthDATA31h;BIT7表示世纪,为1表示19世纪,为0表示20世纪
time_dateDATA32h
;以下三单元存转换后农历日期与入口单元重叠,如要保留入口信息,请重定义出口地址
CONvert_yeArDATA30h
CONvert_mONthDATA31h;BIT7为1表示闰月
CONvert_dAteDATA32h
temp_Byte1DATA37h
temp_Byte2DATA38h
temp_Byte3DATA39h
temp_Byte4DATA3Ah
temp_Byte5DATA3Bh
time_weekDATA40h;星期天出口
;以下为公历转农历子程序
CONvert:
MOVA,time_year;将年月日转化为HEX格式
MOVB,#16
DIVAB
MOVCONvert_yeAr,B
MOVB,#10
MULAB
ADDA,CONvert_yeAr
MOVCONvert_yeAr,A
MOVA,time_month
MOVC,ACC.7
MOVf0,C;f0暂存世纪标志,仅用于数据表定位
CLRACC.7
JNBACC.4,CON_02
-4-
CLRACC.4;ACC.4为1表示大于10月
ADDA,#10
CON_02:
MOVCONvert_mONth,A
MOVA,time_date
MOVB,#16
DIVAB
MOVCONvert_dAte,B
MOVB,#10
MULAB
ADDA,CONvert_dAte
MOVCONvert_dAte,A
MOVdptr,#mONth_dAtA;以下定位本年数据在表格中的位置
MOVA,CONvert_yeAr
JBf0,CON_06;当前为19世纪年跳转
ADDA,#100;从19世纪起定义表格起始年,20世纪要加100年
CON_06:
CLRC
SUBBA,#stArt_yeAr
MOVB,#3;表格每年3字节
MULAB
ADDA,dpl
MOVdpl,A
MOVA,B
ADDCA,dph
MOVdph,A
MOVA,#2
MOVCA,@A+dptr;读本年表格最后一字节(春节日期)
CLRACC.7;ACC.7是闰年第13个月大小,在此不用
MOVB,#32
DIVAB
MOVtemp_Byte1,A;春节月份
MOVtemp_Byte2,B;春节日
;以下计算当前日期距元旦天数
MOVtemp_Byte3,#0;设距元旦天数高位为0
MOVA,CONvert_mONth
CJNEA,#10,CON_08
CON_08:
JCCON_09;9月以前日子数小于256天,高字节为0(9月份过去的整月为8个月)
MOVtemp_Byte3,#1
CON_09:
MOVA,CONvert_yeAr
ANLA,#03h;ACC为除4的余数
JNZCON_10;转常年处理
;年除4余数为0是闰年
MOVA,CONvert_mONth
-5-
LCALLget_ruN_dAys_lOw;取得闰年过去月的天数的低字节
SJMPCON_12
CON_10:
MOVA,CONvert_mONth
LCALLget_dAys_lOw;取得常年过去月的天数的低字节
CON_12:
MOVB,CONvert_dAte
DECB;因为日期从1日起,而不是0日起
ADDA,B;过去的整月天数加当月天数
MOVtemp_Byte4,A
JNCCON_14
INCtemp_Byte3;temp_Byte3,temp_Byte4分别为公历年过去的天数的高低字节
;以下求春节距元旦天数,因肯定小于256天所以只用一字节表示
CON_14:
MOVA,temp_Byte1
LCALLget_dAys_lOw;春节不会在3月份,不用考虑闰年
DECA;因为日期从1日起
ADDA,temp_Byte2
MOVtemp_Byte5,A;temp_Byte5,为春节距元旦天数
MOVA,CONvert_mONth
CJNEA,temp_Byte1,CON_20;转换月与春节月比较
MOVA,CONvert_dAte
CJNEA,temp_Byte2,CON_20;转换日与春节日比较
CON_20:
JCCON_22
LJMPCON_60;当前日大于等于春节日期,公历年与农历年同年份
CON_22:
MOVA,CONvert_yeAr;不到春节,农历年比公历年低一年
JNZCON_24
MOVA,#100;年有效数0-99
CON_24:
DECA
MOVCONvert_yeAr,A
MOVA,dpl
CLRC
SUBBA,#3
MOVdpl,A
JNCCON_26
DECdph;表格指针指向上一年
CON_26:
MOVA,temp_Byte5
CLRC
SUBBA,temp_Byte4
MOVtemp_Byte3,A;temp_Byte3中为当前日离春节的天数
MOVCONvert_mONth,#12;农历月为12月
CLRf0;1901-2099年没有闰12月,清闰月标志
CLRA
MOVCA,@A+dptr
-6-
ANLA,#0f0h
SWAPA;
MOVtemp_Byte4,A;temp_Byte4中为闰月
JZCON_30;没有闰月转移
MOVA,#2;有闰月,取第13个月天数
MOVCA,@A+dptr
MOVC,ACC.7
MOVA,#1
MOVCA,@A+dptr
RLCA;ACC中为最后6个月的大小值
SJMPCON_34
CON_30:
MOVA,#1
MOVCA,@A+dptr;ACC中为最后6个月的大小值
CON_34:
MOVtemp_Byte5,A
CON_40:
MOVA,temp_Byte5
RRCA
MOVtemp_Byte5,A
JCCON_42
MOVB,#29;小月29天
SJMPCON_44
CON_42:
MOVB,#30;大月30天
CON_44:
MOVA,temp_Byte3
CLRC
SUBBA,B
JZCON_46;正好够减,就是农历日1日
JNCCON_50
;不够减一月天数,结束农历月调整
CPLA;求补取绝对值
INCA
CON_46:
INCA;加1即为农历日
MOVB,#10;转换并保存农历日,月,年
DIVAB
SWAPA
ORLA,B
MOVCONvert_dAte,A
MOVA,CONvert_mONth
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVC,f0
MOVACC.7,C
MOVCONvert_mONth,A
-7-
MOVA,CONvert_yeAr
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVCONvert_yeAr,A
RET;结束转换
CON_50:
MOVtemp_Byte3,A;temp_Byte3存减去一月后的天数
JBf0,CON_52;是闰月,前推一月,月份不减
DECCONvert_mONth;
CON_52:
MOVA,CONvert_mONth
CJNEA,temp_Byte4,CON_54
CPLf0;当前月与闰月相同,更改闰月标志
CON_54:
SJMPCON_40
CON_60:
MOVA,temp_Byte4;春节日小于当前日,农历年同公历年
CLRC
SUBBA,temp_Byte5
MOVtemp_Byte4,A
JNCCON_62
DECtemp_Byte3;temp_Byte3temp_Byte4中为公历日离春节的天数
CON_62:
MOVCONvert_mONth,#1;农历月为1月
CLRA
MOVCA,@A+dptr
MOVtemp_Byte5,A
ANLA,#0f0h
SWAPA;
XCHA,temp_Byte5;temp_Byte5中为闰月,ACC为当年农历表第一字节
CLRf0;第一个月肯定不是闰月
ANLA,#0fh
MOVtemp_Byte1,A
MOVA,#1
MOVCA,@A+dptr
MOVtemp_Byte2,A
ANLA,#0f0h
ORLA,temp_Byte1
SWAPA
MOVtemp_Byte1,A
MOVA,#2
MOVCA,@A+dptr
MOVC,ACC.7
MOVA,temp_Byte2
ANLA,#0fh
-8-
SWAPA
MOVACC.3,C;
MOVtemp_Byte2,A;以上temp_Byte1,temp_Byte2各BIT存农历年大小
CON_70:
MOVA,temp_Byte2
RLCA
MOVtemp_Byte2,A
MOVA,temp_Byte1
RLCA
MOVtemp_Byte1,A
JCCON_72
MOVB,#29;小月29天处理
SJMPCON_74
CON_72:
MOVB,#30;大月30天
CON_74:
MOVA,temp_Byte4
CLRC
SUBBA,B
JNCCON_78;低字节够减跳转
MOVB,A;低字节不够减,B暂存减后结果,
MOVA,temp_Byte3
JZCON_76;高字节为0,不够减
DECtemp_Byte3
MOVtemp_Byte4,B
SJMPCON_80
CON_76:
MOVA,temp_Byte4;不够减结束月调整
LJMPCON_46;转日期加1后,处理并保存转换后农历年月日
CON_78:
MOVtemp_Byte4,A;temp_Byte3temp_Byte4天数为减去一月后天数
CON_80:
MOVA,CONvert_mONth
CJNEA,temp_Byte5,CON_82
CPLf0;当前月与闰月相同,更改闰月标志
JNBf0,CON_82;更改标志后是非闰月,月份加1
SJMPCON_70
CON_82:
INCCONvert_mONth;
SJMPCON_70
get_dAys_lOw:
MOVCA,@A+PC;取得常年过去月的天数的低字节
RET
DB0,31,59,90,120,151,181,212,243,17,48,78
get_ruN_dAys_lOw:
MOVCA,@A+PC;取得闰年过去月的天数的低字节
RET
DB0,31,60,91,121,152,182,213,244,18,49,79
mONth_dAtA:
;公历年对应的农历数据,每年三字节,
;格式第一字节BIT7-4位表示闰月月份,值为0为无闰月,BIT3-0对应农历第1-4月的大小
;第二字节BIT7-0对应农历第5-12月大小,第三字节BIT7表示农历第13个月大小
;月份对应的位为1表示本农历月大(30天),为0表示小(29天).
;第三字节BIT6-5表示春节的公历月份,BIT4-0表示春节的公历日期
DB004h,0Aeh,053h;1901;
DB00Ah,057h,048h;1902
DB055h,026h,0Bdh;1903
DB00dh,026h,050h;1904
DB00dh,095h,044h;1905
DB046h,0AAh,0B9h;1906
DB005h,06Ah,04dh;1907
DB009h,0Adh,042h;1908
DB024h,0Aeh,0B6h;1909
DB004h,0Aeh,04Ah;1910
DB06Ah,04dh,0Beh;1911
DB00Ah,04dh,052h;1912
DB00dh,025h,046h;1913
DB05dh,052h,0BAh;1914
DB00Bh,054h,04eh;1915
DB00dh,06Ah,043h;1916
DB029h,06dh,037h;1917
DB009h,05Bh,04Bh;1918
DB074h,09Bh,0C1h;1919
DB004h,097h,054h;1920
DB00Ah,04Bh,048h;1921
DB05Bh,025h,0BCh;1922
DB006h,0A5h,050h;1923
DB006h,0d4h,045h;1924
DB04Ah,0dAh,0B8h;1925
DB002h,0B6h,04dh;1926
DB009h,057h,042h;1927
DB024h,097h,0B7h;1928
DB004h,097h,04Ah;1929
DB066h,04Bh,03eh;1930
DB00dh,04Ah,051h;1931
DB00eh,0A5h,046h;1932
DB056h,0d4h,0BAh;1933
DB005h,0Adh,04eh;1934
DB002h,0B6h,044h;1935
DB039h,037h,038h;1936
DB009h,02eh,04Bh;1937
DB07Ch,096h,0Bfh;1938
DB00Ch,095h,053h;1939
DB00dh,04Ah,048h;1940
-10-
DB06dh,0A5h,03Bh;1941
DB00Bh,055h,04fh;1942
DB005h,06Ah,045h;1943
DB04Ah,0Adh,0B9h;1944
DB002h,05dh,04dh;1945
DB009h,02dh,042h;1946
DB02Ch,095h,0B6h;1947
DB00Ah,095h,04Ah;1948
DB07Bh,04Ah,0Bdh;1949
DB006h,0CAh,051h;1950
DB00Bh,055h,046h;1951
DB055h,05Ah,0BBh;1952
DB004h,0dAh,04eh;1953
DB00Ah,05Bh,043h;1954
DB035h,02Bh,0B8h;1955
DB005h,02Bh,04Ch;1956
DB08Ah,095h,03fh;1957
DB00eh,095h,052h;1958
DB006h,0AAh,048h;1959
DB07Ah,0d5h,03Ch;1960
DB00Ah,0B5h,04fh;1961
DB004h,0B6h,045h;1962
DB04Ah,057h,039h;1963
DB00Ah,057h,04dh;1964
DB005h,026h,042h;1965
DB03eh,093h,035h;1966
DB00dh,095h,049h;1967
DB075h,0AAh,0Beh;1968
DB005h,06Ah,051h;1969
DB009h,06dh,046h;1970
DB054h,0Aeh,0BBh;1971
DB004h,0Adh,04fh;1972
DB00Ah,04dh,043h;1973
DB04dh,026h,0B7h;1974
DB00dh,025h,04Bh;1975
DB08dh,052h,0Bfh;1976
DB00Bh,054h,052h;1977
DB00Bh,06Ah,047h;1978
DB069h,06dh,03Ch;1979
DB009h,05Bh,050h;1980
DB004h,09Bh,045h;1981
DB04Ah,04Bh,0B9h;1982
DB00Ah,04Bh,04dh;1983
DB0ABh,025h,0C2h;1984
-11-
DB006h,0A5h,054h;1985
DB006h,0d4h,049h;1986
DB06Ah,0dAh,03dh;1987
DB00Ah,0B6h,051h;1988
DB009h,037h,046h;1989
DB054h,097h,0BBh;1990
DB004h,097h,04fh;1991
DB006h,04Bh,044h;1992
DB036h,0A5h,037h;1993
DB00eh,0A5h,04Ah;1994
DB086h,0B2h,0Bfh;1995
DB005h,0ACh,053h;1996
DB00Ah,0B6h,047h;1997
DB059h,036h,0BCh;1998
DB009h,02eh,050h;1999
DB00Ch,096h,045h;2000
DB04dh,04Ah,0B8h;2001
DB00dh,04Ah,04Ch;2002
DB00dh,0A5h,041h;2003
DB025h,0AAh,0B6h;2004
DB005h,06Ah,049h;2005
DB07Ah,0Adh,0Bdh;2006
DB002h,05dh,052h;2007
DB009h,02dh,047h;2008
DB05Ch,095h,0BAh;2009
DB00Ah,095h,04eh;2010
DB00Bh,04Ah,043h;2011
DB04Bh,055h,037h;2012
DB00Ah,0d5h,04Ah;2013
DB095h,05Ah,0Bfh;2014
DB004h,0BAh,053h;2015
DB00Ah,05Bh,048h;2016
DB065h,02Bh,0BCh;2017
DB005h,02Bh,050h;2018
DB00Ah,093h,045h;2019
DB047h,04Ah,0B9h;2020
DB006h,0AAh,04Ch;2021
DB00Ah,0d5h,041h;2022
DB024h,0dAh,0B6h;2023
DB004h,0B6h,04Ah;2024
DB069h,057h,03dh;2025
DB00Ah,04eh,051h;2026
DB00dh,026h,046h;2027
DB05eh,093h,03Ah;2028
-12-
DB00dh,053h,04dh;2029
DB005h,0AAh,043h;2030
DB036h,0B5h,037h;2031
DB009h,06dh,04Bh;2032
DB0B4h,0Aeh,0Bfh;2033
DB004h,0Adh,053h;2034
DB00Ah,04dh,048h;2035
DB06dh,025h,0BCh;2036
DB00dh,025h,04fh;2037
DB00dh,052h,044h;2038
DB05dh,0AAh,038h;2039
DB00Bh,05Ah,04Ch;2040
DB005h,06dh,041h;2041
DB024h,0Adh,0B6h;2042
DB004h,09Bh,04Ah;2043
DB07Ah,04Bh,0Beh;2044
DB00Ah,04Bh,051h;2045
DB00Ah,0A5h,046h;2046
DB05Bh,052h,0BAh;2047
DB006h,0d2h,04eh;2048
DB00Ah,0dAh,042h;2049
DB035h,05Bh,037h;2050
DB009h,037h,04Bh;2051
DB084h,097h,0C1h;2052
DB004h,097h,053h;2053
DB006h,04Bh,048h;2054
DB066h,0A5h,03Ch;20
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用51 单片机实现公历与农历星期的转换程序 51 单片机 实现 公历 农历 星期 转换 程序