历史上的今天
返回首页

历史上的今天

今天是:2024年10月30日(星期三)

正在发生

2019年10月30日 | 51单片机阳历转农历(仅仅是阳历转阴历例程)

2019-10-30 来源:51hei

之前要做一个万年历,从论坛上辗转多处,最终发现以下这个阳历转换阴历的程序比较简单,数据带入可以直接使用,不过测试发现转换有问题,后面进行仿真调试找到问题所在,从而进而修改。不知道是我复制出错,还是自己不经意间修改才导致问题出现,已经修复,需要阳历转阴历的可以拿去。找不到具体来源,因此无法标志引用链接地址,如有侵权,联系删除。
问题所在:在SPDATE GetSpringDay(uchar GreYear,uchar GreMon,uchar GreDay)函数里面的参数定义,把Offset1定义为uchar类型,后面计算时Offset1数值溢出,将uchar改为uint后,数据不在溢出,进行上机测试,转换成功。

//公曆轉農曆(1901-2100)

//亦木明 2008.1.11

//2018.12.30清枫城主测试,发现存在问题,通过仿真一步步走找出问题所在,并作出修正

//原文在哪忘了,只知道作者有“亦木明”的标注,如有侵权联系删除

#include "12c5a60s2.h"//可修改为51的头文件   



#define TRUE  1

//公历年对应的农历数据,每年三字节,

//格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小

//第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小

//月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天).

//第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期

//每年的數據對應在數組中的位置庫 (200-(2100-year)-1)*3+Offset1  

//0x09,0x2d,0x47, //2008  0x47 01000111

//0x4d,0x4A,0xB8, //2001


typedef struct spdate

{

        char         cYear;

        char        cMon;

        char        cDay;

}SPDATE;



uchar code Data[]={


0x04,0xAe,0x53, //1901  0        (200-(2100-1901)-1)*3=0

0x0A,0x57,0x48, //1902        3   (200-(2100-1902)-1)*3=3

0x55,0x26,0xBd, //1903        6        (200-(2100-1903)-1)*3=3

0x0d,0x26,0x50, //1904        9   (200-(2100-year)-1)*3 

0x0d,0x95,0x44, //1905        12        

0x46,0xAA,0xB9, //1906        15

0x05,0x6A,0x4d, //1907

0x09,0xAd,0x42, //1908

0x24,0xAe,0xB6, //1909

0x04,0xAe,0x4A, //1910

0x6A,0x4d,0xBe, //1911

0x0A,0x4d,0x52, //1912

0x0d,0x25,0x46, //1913

0x5d,0x52,0xBA, //1914

0x0B,0x54,0x4e, //1915

0x0d,0x6A,0x43, //1916

0x29,0x6d,0x37, //1917

0x09,0x5B,0x4B, //1918

0x74,0x9B,0xC1, //1919

0x04,0x97,0x54, //1920

0x0A,0x4B,0x48, //1921

0x5B,0x25,0xBC, //1922

0x06,0xA5,0x50, //1923

0x06,0xd4,0x45, //1924

0x4A,0xdA,0xB8, //1925

0x02,0xB6,0x4d, //1926

0x09,0x57,0x42, //1927

0x24,0x97,0xB7, //1928

0x04,0x97,0x4A, //1929

0x66,0x4B,0x3e, //1930

0x0d,0x4A,0x51, //1931

0x0e,0xA5,0x46, //1932

0x56,0xd4,0xBA, //1933

0x05,0xAd,0x4e, //1934

0x02,0xB6,0x44, //1935

0x39,0x37,0x38, //1936

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

0x4A,0xAd,0xB9, //1944

0x02,0x5d,0x4d, //1945

0x09,0x2d,0x42, //1946

0x2C,0x95,0xB6, //1947

0x0A,0x95,0x4A, //1948

0x7B,0x4A,0xBd, //1949

0x06,0xCA,0x51, //1950

0x0B,0x55,0x46, //1951

0x55,0x5A,0xBB, //1952

0x04,0xdA,0x4e, //1953

0x0A,0x5B,0x43, //1954

0x35,0x2B,0xB8, //1955

0x05,0x2B,0x4C, //1956

0x8A,0x95,0x3f, //1957

0x0e,0x95,0x52, //1958

0x06,0xAA,0x48, //1959

0x7A,0xd5,0x3C, //1960

0x0A,0xB5,0x4f, //1961

0x04,0xB6,0x45, //1962

0x4A,0x57,0x39, //1963

0x0A,0x57,0x4d, //1964

0x05,0x26,0x42, //1965

0x3e,0x93,0x35, //1966

0x0d,0x95,0x49, //1967

0x75,0xAA,0xBe, //1968

0x05,0x6A,0x51, //1969

0x09,0x6d,0x46, //1970

0x54,0xAe,0xBB, //1971

0x04,0xAd,0x4f, //1972

0x0A,0x4d,0x43, //1973

0x4d,0x26,0xB7, //1974

0x0d,0x25,0x4B, //1975

0x8d,0x52,0xBf, //1976

0x0B,0x54,0x52, //1977

0x0B,0x6A,0x47, //1978

0x69,0x6d,0x3C, //1979

0x09,0x5B,0x50, //1980

0x04,0x9B,0x45, //1981

0x4A,0x4B,0xB9, //1982

0x0A,0x4B,0x4d, //1983

0xAB,0x25,0xC2, //1984

0x06,0xA5,0x54, //1985

0x06,0xd4,0x49, //1986

0x6A,0xdA,0x3d, //1987

0x0A,0xB6,0x51, //1988

0x09,0x37,0x46, //1989

0x54,0x97,0xBB, //1990

0x04,0x97,0x4f, //1991

0x06,0x4B,0x44, //1992

0x36,0xA5,0x37, //1993

0x0e,0xA5,0x4A, //1994

0x86,0xB2,0xBf, //1995

0x05,0xAC,0x53, //1996

0x0A,0xB6,0x47, //1997

0x59,0x36,0xBC, //1998

0x09,0x2e,0x50, //1999         

0x0C,0x96,0x45, //2000

0x4d,0x4A,0xB8, //2001

0x0d,0x4A,0x4C, //2002

0x0d,0xA5,0x41, //2003

0x25,0xAA,0xB6, //2004

0x05,0x6A,0x49, //2005

0x7A,0xAd,0xBd, //2006

0x02,0x5d,0x52, //2007

0x09,0x2d,0x47, //2008

0x5C,0x95,0xBA, //2009

0x0A,0x95,0x4e, //2010

0x0B,0x4A,0x43, //2011

0x4B,0x55,0x37, //2012

0x0A,0xd5,0x4A, //2013

0x95,0x5A,0xBf, //2014

0x04,0xBA,0x53, //2015

0x0A,0x5B,0x48, //2016

0x65,0x2B,0xBC, //2017

0x05,0x2B,0x50, //2018

0x0A,0x93,0x45, //2019

0x47,0x4A,0xB9, //2020

0x06,0xAA,0x4C, //2021

0x0A,0xd5,0x41, //2022

0x24,0xdA,0xB6, //2023

0x04,0xB6,0x4A, //2024

0x69,0x57,0x3d, //2025

0x0A,0x4e,0x51, //2026

0x0d,0x26,0x46, //2027

0x5e,0x93,0x3A, //2028

0x0d,0x53,0x4d, //2029

0x05,0xAA,0x43, //2030

0x36,0xB5,0x37, //2031

0x09,0x6d,0x4B, //2032

0xB4,0xAe,0xBf, //2033

0x04,0xAd,0x53, //2034

0x0A,0x4d,0x48, //2035

0x6d,0x25,0xBC, //2036

0x0d,0x25,0x4f, //2037

0x0d,0x52,0x44, //2038

0x5d,0xAA,0x38, //2039

0x0B,0x5A,0x4C, //2040

0x05,0x6d,0x41, //2041

0x24,0xAd,0xB6, //2042

0x04,0x9B,0x4A, //2043

0x7A,0x4B,0xBe, //2044

0x0A,0x4B,0x51, //2045

0x0A,0xA5,0x46, //2046

0x5B,0x52,0xBA, //2047

0x06,0xd2,0x4e, //2048

0x0A,0xdA,0x42, //2049

0x35,0x5B,0x37, //2050

0x09,0x37,0x4B, //2051

0x84,0x97,0xC1, //2052

0x04,0x97,0x53, //2053

0x06,0x4B,0x48, //2054

0x66,0xA5,0x3C, //2055

0x0e,0xA5,0x4f, //2056

0x06,0xB2,0x44, //2057

0x4A,0xB6,0x38, //2058

0x0A,0xAe,0x4C, //2059

0x09,0x2e,0x42, //2060

0x3C,0x97,0x35, //2061

0x0C,0x96,0x49, //2062

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

0x05,0x2d,0x4B, //2070

0x8A,0x95,0xBf, //2071

0x0A,0x95,0x53, //2072

0x0B,0x4A,0x47, //2073

0x6B,0x55,0x3B, //2074

0x0A,0xd5,0x4f, //2075

0x05,0x5A,0x45, //2076

0x4A,0x5d,0x38, //2077

0x0A,0x5B,0x4C, //2078

0x05,0x2B,0x42, //2079

0x3A,0x93,0xB6, //2080

0x06,0x93,0x49, //2081

0x77,0x29,0xBd, //2082

0x06,0xAA,0x51, //2083

0x0A,0xd5,0x46, //2084

0x54,0xdA,0xBA, //2085

0x04,0xB6,0x4e, //2086

0x0A,0x57,0x43, //2087

0x45,0x27,0x38, //2088

0x0d,0x26,0x4A, //2089

0x8e,0x93,0x3e, //2090

0x0d,0x52,0x52, //2091

0x0d,0xAA,0x47, //2092

0x66,0xB5,0x3B, //2093

0x05,0x6d,0x4f, //2094

0x04,0xAe,0x45, //2095

0x4A,0x4e,0xB9, //2096

0x0A,0x4d,0x4C, //2097

0x0d,0x15,0x41, //2098

0x2d,0x92,0xB5, //2099

0x0d,0x53,0x49, //2100

};


uchar code Mon1[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,

                                  0,31,29,31,30,31,30,31,31,30,31,30,31};


SPDATE Spdate;

//獲得當年春節的公曆日期

SPDATE GetSpringDay(uchar GreYear,uchar GreMon,uchar GreDay)

{

        //0x09,0x2d,0x47, //2008  0x47 01000111 

        int day;

    uchar i,Flag,F;

        uint Offset1;//出现问题在这里,原本定义为uchar类型,下面计算时超出范围导致错误,进行修改为uint类型后,验证正常

        unsigned char L=0x01,Flag1=1;

        unsigned int  Temp16,L1=0x0800;

        //第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期

        Spdate.cYear=GreYear ;

        Spdate.cMon=(Data[(200-(100-GreYear)-1)*3+2]&0x60)>>5; //计算春节公历月份

        Spdate.cDay=(Data[(200-(100-GreYear)-1)*3+2])&0x1f;    //计算春节公历日期


        //判断平年,闰年

        if( (!(GreYear%4) && (GreYear%100)) || !(GreYear%400) ) Flag=1; 

        else Flag=0;

        

        if(Spdate.cMon>GreMon)                                                                //春节离公历日期的天数

        {

           day=Mon1[Flag][GreMon]-GreDay;

           for(i=GreMon+1;i<=Spdate.cMon-1;i++)

                        day+=Mon1[Flag][i];

           day+=Spdate.cDay;

           F=1;

        }

        else if(Spdate.cMon        {

                day=Mon1[Flag][Spdate.cMon]-Spdate.cDay;  

                for(i=Spdate.cMon+1;i<=GreMon-1;i++)

                        day+=Mon1[Flag][i];

                day+=GreDay;                                //          000000000000000000000000000000000000000000000000000000000000000000

                F=0;

        }

        else

        {

                if(Spdate.cDay>GreDay)

                {

                        day=Spdate.cDay-GreDay;

                        F=1;

                }

                else if(Spdate.cDay                {

                        day=GreDay-Spdate.cDay;

                        F=0;

                }

                else day=0;

        }                 


        Spdate.cYear=Spdate.cYear;

        Spdate.cMon=1;

        Spdate.cDay=1;


        if(!day) return Spdate ;


        if(F)    //春节在公历日期后

        {

                Spdate.cYear--;

                Spdate.cMon=12;

                //这边Offset1计算会出现超范围,因此把uchar类型改为uint后正常

推荐阅读

史海拾趣

Hong Kong X'Tals Ltd公司的发展小趣事
在必要时,可以加入保护电路(如过流保护、过压保护等),以提高电路的可靠性和安全性。
Anderson Electronics Inc公司的发展小趣事

面对电子行业的快速变革和市场竞争的加剧,Anderson Electronics Inc公司积极进行产业升级和智能制造的转型。公司引进了先进的生产设备和技术,实现了生产过程的自动化和智能化。同时,公司还加大了对研发人员的培养和引进力度,建立了一支高素质的研发团队。通过产业升级和智能制造的转型,公司成功提升了生产效率和产品质量,进一步巩固了市场地位。

芯邦(Chipsbank)公司的发展小趣事

在全球半导体市场竞争日益激烈的背景下,芯邦科技面临着来自国际巨头的挑战。然而,公司凭借在半导体设计领域的深厚积累和不断创新的精神,逐步形成了自己的核心竞争力。同时,芯邦也积极寻求与国际合作伙伴的合作机会,共同推动半导体产业的发展。

以上五个故事简要概述了芯邦科技在电子行业中的发展起来的关键节点和里程碑事件。这些故事不仅展现了芯邦科技在技术创新、产品线拓展、资本运作、市场表现和国际竞争等方面的努力和成就,也预示着公司未来发展的广阔前景和无限可能。

汇科公司的发展小趣事

作为一家有社会责任感的企业,汇科公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,汇科公司还积极参与社会公益活动,为社区和环境贡献自己的力量。这些举措不仅体现了公司的社会责任担当,也为其赢得了更多客户和合作伙伴的信任和支持。

Elpaq公司的发展小趣事
Alcatel-Lucent公司的发展小趣事

问答坊 | AI 解惑

变压器的输出电压比需要的偏高,请教!

大虾们,我有一个输入220V,输出53V的变压器, 但是,我只需要上限不超过28~36伏的可调直流电源 下限当然是。。。。取可调范围大的 请各位多多指教…

查看全部问答>

M/B、N/B

哪位大虾能为我解答一下什么是M/B、N/B 设计?谢谢了…

查看全部问答>

我学习单片机时写的一些简单的程序

这是我刚学C语言时写的一些程序,比较简单,希望对刚接触单片机的同胞们有所帮助吧 我使用的主控是89c51,晶振频率是11.0592m的 [ 本帖最后由 open82977352 于 2010-2-3 14:44 编辑 ]…

查看全部问答>

问个FatFS的问题

读文件, 循环第一次读取 正常, 第二次,就退出循环了,我的文件大, 这个文件 就只读了一次 512个数组, 我看FatFS copy文件的例子,人家是一直读,知道读没了才退出的, 读第二次 那个提示是说  目录对象是无效的。      ...…

查看全部问答>

新成立Linux开发-4号群68906481,欢迎做嵌入式Linux方面的相关人员加入。共同交流与提高

新成立Linux开发-4号群68906481,欢迎做嵌入式Linux方面的相关人员加入。共同交流与提高…

查看全部问答>

Φ5光敏二极管的Φ5是什么意思?

Φ5光敏二极管的Φ5是什么意思?…

查看全部问答>

Intel Xscale WinCE 5.0操作系统基础及实验教程

我的资源下载分用完了,需要10分下载一个文件,请大家帮忙。 上传了“Intel Xscale WinCE 5.0操作系统基础及实验教程”基于PXA270的实验配套教程包括基础篇、实战篇、实验篇。 下载地址:http://download.eeworld.net/source/580934 好心的人帮 ...…

查看全部问答>

[求助]谁有Loadauth.lib文件以及相关的.h文件?

能上传上给我么?急需,收到后再追加分。…

查看全部问答>

交通灯程序加仿真图!

小弟刚学51不久!写的交通灯程序!好的话顶下!不好的话鼓励下哈!继续努力!…

查看全部问答>

2010年12月9日 TI有研讨会哦

hank you for registering for Texas Instruments’ eTech Day.Get ready for a day packed with problem solving and interactivity!Presented by: Texas InstrumentsLive show date: December 9, 2010Live show hours: 10:00 a.m. CT – 4:00 p.m ...…

查看全部问答>