ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:20.43KB ,
资源ID:4275079      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4275079.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(用51 单片机实现公历与农历星期的转换程序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、用51 单片机实现公历与农历星期的转换程序用51 单片机实现公历与农历星期的转换程序一程序流程由于星期的计算很简单这里只提供公历日转农历日的程序流程图否是否是 否子程序入口转换数据到HEX 格式方便运算根据公历年定位数据表的地址从数据表中取得春节的公历日期,并通过计算公历日和春节离元旦的天数算出公历日离春节的天数记为X农历年=公历年减1 数据表地址减3 定位到前一年取农历月信息农历月12 闰月标志F0 0 非闰月X Y否 公历日在春节以后码?取农历月天数Y是X X YF0 1是否是农历月减1农历月闰月F0 取反是 否农历日Y X 1农历年=公历年取农历月信息农历月1 闰月标志F0 0 非闰月取

2、农历月天数YX Y X X Y农历月闰月农历月加1F0 1F0 取反是农历日X 1否农历年月日数据标准化子程序出口- 3 -二.程序使用说明本文提供的子程序在设计时应用了PCF8563 作时钟芯片所以其入口格式与PCF8563 芯片的时钟信号存储格式完全一致年月日均为BCD 码其中月的BIT7 表示世纪为1 表示19 世纪为0 表示20 世纪采用PCF8563 时钟芯片只要把它的年月日寄存器内容读出到time_yeAr time_month 和time_date 三个单元内即可直接调用本程序转换采用其它时钟芯片调用前要把时钟格式稍作调整或修改一下程序公历日转农历日程序在12M 晶振下执行时间最

3、长约0.48 毫秒实际使用时只需在复位和日期变化时才需要调用一次对于公历日转星期天的子程序则只在设置时钟时才有用在设置时钟年月日后调用子程序得到对应的星期天直接写入时钟即可子程序附带了1901-2100 年的农历数据表全部编译要占600 字节空间如不需这么多可把不需要的数据删除然后修改stArt_yeAr 值即可stArt_yeAr 定义了查询表的起始年份三.子程序清单start_year EQU 01; 定义查询表起始年份,01-199 表示1901-2099 年;以下三单元为需转换的公历日期是子程序的入口数据time_year DATA 30htime_month DATA 31h ;BI

4、T7 表示世纪,为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 ;星期天出口;以下为公历转农历子程序CONv

5、ert: 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

6、 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

7、+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,#0

8、3h ;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_By

9、te3,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 ;转换日与春节日比较C

10、ON_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 中为当前日离春节的天

11、数MOV CONvert_mONth,#12 ;农历月为12 月CLR f0 ;1901-2099 年没有闰12 月,清闰月标志CLR AMOVC A,A+dptr- 6 -ANL 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 个月

12、的大小值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 AOR

13、L A,BMOV CONvert_dAte,AMOV A,CONvert_mONthMOV B,#10DIV ABSWAP AORL A,BMOV C,f0MOV ACC.7,CMOV CONvert_mONth,A- 7 -MOV 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_m

14、ONthCJNE 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;XC

15、H 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 -SWAP AMOV ACC.3,C;MOV temp_Byte2,A ;以上temp_Byte1,temp_Byte2 各

16、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_Byt

17、e4,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

18、_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:;公历年对应的农历数据,每年三字节,;格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小;第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小;月份对应的位

19、为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; 1910D

20、B 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

21、 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

22、009h,02eh,04Bh; 1937DB 07Ch,096h,0Bfh; 1938DB 00Ch,095h,053h; 1939DB 00dh,04Ah,048h; 1940- 10 -DB 06dh,0A5h,03Bh; 1941DB 00Bh,055h,04fh; 1942DB 005h,06Ah,045h; 1943DB 04Ah,0Adh,0B9h; 1944DB 002h,05dh,04dh; 1945DB 009h,02dh,042h; 1946DB 02Ch,095h,0B6h; 1947DB 00Ah,095h,04Ah; 1948DB 07Bh,04Ah,0Bdh; 19

23、49DB 006h,0CAh,051h; 1950DB 00Bh,055h,046h; 1951DB 055h,05Ah,0BBh; 1952DB 004h,0dAh,04eh; 1953DB 00Ah,05Bh,043h; 1954DB 035h,02Bh,0B8h; 1955DB 005h,02Bh,04Ch; 1956DB 08Ah,095h,03fh; 1957DB 00eh,095h,052h; 1958DB 006h,0AAh,048h; 1959DB 07Ah,0d5h,03Ch; 1960DB 00Ah,0B5h,04fh; 1961DB 004h,0B6h,045h; 196

24、2DB 04Ah,057h,039h; 1963DB 00Ah,057h,04dh; 1964DB 005h,026h,042h; 1965DB 03eh,093h,035h; 1966DB 00dh,095h,049h; 1967DB 075h,0AAh,0Beh; 1968DB 005h,06Ah,051h; 1969DB 009h,06dh,046h; 1970DB 054h,0Aeh,0BBh; 1971DB 004h,0Adh,04fh; 1972DB 00Ah,04dh,043h; 1973DB 04dh,026h,0B7h; 1974DB 00dh,025h,04Bh; 1975

25、DB 08dh,052h,0Bfh; 1976DB 00Bh,054h,052h; 1977DB 00Bh,06Ah,047h; 1978DB 069h,06dh,03Ch; 1979DB 009h,05Bh,050h; 1980DB 004h,09Bh,045h; 1981DB 04Ah,04Bh,0B9h; 1982DB 00Ah,04Bh,04dh; 1983DB 0ABh,025h,0C2h; 1984- 11 -DB 006h,0A5h,054h; 1985DB 006h,0d4h,049h; 1986DB 06Ah,0dAh,03dh; 1987DB 00Ah,0B6h,051h;

26、 1988DB 009h,037h,046h; 1989DB 054h,097h,0BBh; 1990DB 004h,097h,04fh; 1991DB 006h,04Bh,044h; 1992DB 036h,0A5h,037h; 1993DB 00eh,0A5h,04Ah; 1994DB 086h,0B2h,0Bfh; 1995DB 005h,0ACh,053h; 1996DB 00Ah,0B6h,047h; 1997DB 059h,036h,0BCh; 1998DB 009h,02eh,050h; 1999DB 00Ch,096h,045h; 2000DB 04dh,04Ah,0B8h;

27、2001DB 00dh,04Ah,04Ch; 2002DB 00dh,0A5h,041h; 2003DB 025h,0AAh,0B6h; 2004DB 005h,06Ah,049h; 2005DB 07Ah,0Adh,0Bdh; 2006DB 002h,05dh,052h; 2007DB 009h,02dh,047h; 2008DB 05Ch,095h,0BAh; 2009DB 00Ah,095h,04eh; 2010DB 00Bh,04Ah,043h; 2011DB 04Bh,055h,037h; 2012DB 00Ah,0d5h,04Ah; 2013DB 095h,05Ah,0Bfh; 2

28、014DB 004h,0BAh,053h; 2015DB 00Ah,05Bh,048h; 2016DB 065h,02Bh,0BCh; 2017DB 005h,02Bh,050h; 2018DB 00Ah,093h,045h; 2019DB 047h,04Ah,0B9h; 2020DB 006h,0AAh,04Ch; 2021DB 00Ah,0d5h,041h; 2022DB 024h,0dAh,0B6h; 2023DB 004h,0B6h,04Ah; 2024DB 069h,057h,03dh; 2025DB 00Ah,04eh,051h; 2026DB 00dh,026h,046h; 20

29、27DB 05eh,093h,03Ah; 2028- 12 -DB 00dh,053h,04dh; 2029DB 005h,0AAh,043h; 2030DB 036h,0B5h,037h; 2031DB 009h,06dh,04Bh; 2032DB 0B4h,0Aeh,0Bfh; 2033DB 004h,0Adh,053h; 2034DB 00Ah,04dh,048h; 2035DB 06dh,025h,0BCh; 2036DB 00dh,025h,04fh; 2037DB 00dh,052h,044h; 2038DB 05dh,0AAh,038h; 2039DB 00Bh,05Ah,04C

30、h; 2040DB 005h,06dh,041h; 2041DB 024h,0Adh,0B6h; 2042DB 004h,09Bh,04Ah; 2043DB 07Ah,04Bh,0Beh; 2044DB 00Ah,04Bh,051h; 2045DB 00Ah,0A5h,046h; 2046DB 05Bh,052h,0BAh; 2047DB 006h,0d2h,04eh; 2048DB 00Ah,0dAh,042h; 2049DB 035h,05Bh,037h; 2050DB 009h,037h,04Bh; 2051DB 084h,097h,0C1h; 2052DB 004h,097h,053h; 2053DB 006h,04Bh,048h; 2054DB 066h,0A5h,03Ch; 20

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

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