用51 单片机实现公历与农历星期的转换程序.docx

上传人:b****6 文档编号:4275079 上传时间:2022-11-28 格式:DOCX 页数:13 大小:20.43KB
下载 相关 举报
用51 单片机实现公历与农历星期的转换程序.docx_第1页
第1页 / 共13页
用51 单片机实现公历与农历星期的转换程序.docx_第2页
第2页 / 共13页
用51 单片机实现公历与农历星期的转换程序.docx_第3页
第3页 / 共13页
用51 单片机实现公历与农历星期的转换程序.docx_第4页
第4页 / 共13页
用51 单片机实现公历与农历星期的转换程序.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

用51 单片机实现公历与农历星期的转换程序.docx

《用51 单片机实现公历与农历星期的转换程序.docx》由会员分享,可在线阅读,更多相关《用51 单片机实现公历与农历星期的转换程序.docx(13页珍藏版)》请在冰豆网上搜索。

用51 单片机实现公历与农历星期的转换程序.docx

用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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1