51单片机阳历转农历(仅仅是阳历转阴历例程)

发布者:导航灯最新更新时间:2019-10-30 来源: 51hei关键字:51单片机  阳历转农历 手机看文章 扫描二维码
随时随地手机看文章

之前要做一个万年历,从论坛上辗转多处,最终发现以下这个阳历转换阴历的程序比较简单,数据带入可以直接使用,不过测试发现转换有问题,后面进行仿真调试找到问题所在,从而进而修改。不知道是我复制出错,还是自己不经意间修改才导致问题出现,已经修复,需要阳历转阴历的可以拿去。找不到具体来源,因此无法标志引用链接地址,如有侵权,联系删除。
问题所在:在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后正常

[1] [2]
关键字:51单片机  阳历转农历 引用地址:51单片机阳历转农历(仅仅是阳历转阴历例程)

上一篇:51单片机温控风扇仿真原理图+C语言程序与实物制作
下一篇:STC15F2系列单片机UART1使用定时器1做波特率发生器

推荐阅读最新更新时间:2024-11-10 19:14

51单片机中的定时器和计数器
从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1 构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器 TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。TMOD主要是用于选定定时器的工作方式; TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。当定时器工作在计数方式时,外部事件通过引脚T0 (P3.4)和T1(P3.5)输入。 定时计数器的原理:
[单片机]
<font color='red'>51单片机</font>中的定时器和计数器
51单片机把4位16进制数转成10进制数的方法
2位16进制转10进制,用除以10求商跟余数的方法,即可。 4位16进制数呢?DIV指令只可以对2位16进制数进行除法运算啊,求高手解答。 例如把TH1 TL1的数值转成十进制, 分别存入R4 R3 R2 R1 R0。 ;------------------------------------------------------------------ 下面把这段转换程序,写成子程序的结构,便于网友移植。 ; 程序经过仿真调试通过,如下所示: ;------------------------------------------------------------------ ; MOV R0,
[单片机]
基于51单片机的温度报警器
本数字温度报警器是基于51单片机及温度传感器DS18B20来设计的,温度测量范围0到99.9摄氏度,精度为0.1摄氏度,可见测量温度的范围广,精度高的特点。可设置上下限报警温度,默认上限报警温度为38℃、默认下限报警温度为5℃(通过程序可以更改默认上下限值)。报警值可设置范围:最低上限报警值等于当前下限报警值,最高下限报警值等于当前上限报警值。将下限报警值调为0时为关闭下限报警功能。 程序 /*****定时器0中断服务程序*****/ void timer0(void) interrupt 1 { TH0=0x3c; TL0=0xb0; x++; } /*****外部中断0服务程序*****/ void int0(void)
[单片机]
基于<font color='red'>51单片机</font>的温度报警器
基于MCS-51单片机I2C总线接口电路的设计
I2C总线是由串行数据线SDA和串行时钟线SCL构成的,可发送和接收数据。它允许若干兼容器件共享总线。所有挂接在I2C总线上的器件和接口电路都应具有I2C总线接口,且所有的SDA/SCL同名端相连。总线上所有器件要依靠SDA发送的地址信号寻址,不需要片选线。 I2C总线最主要的优点是其简单性和有效性。占用的空间小,降低了互连成本。总线的长度可高达7.6m,并且能够以10kbps的最大传输速率支持40个组件。支持多主控器件,其中,任何能够进行发送和接收的设备都可以成为主器件。主控能够控制信号的传输和时钟频率。当然,在某时刻只能有一个主控器件。 在单片机控制系统中,广泛使用I2C器件。如果单片机自带I2C总线接口,则所有I2C
[单片机]
基于MCS-<font color='red'>51单片机</font>I2C总线接口电路的设计
51单片机实物与仿真差异
此仿真以protues8为例 首先我们不得不承认仿真的的优点,元件库庞大,仿真效果好,线路简单,操作简化用于小工程效果实现有很大的帮助。 实物,这是真正看得见摸得着的东西,但是工程量庞大,不适用于庞大的工程试验。 对于初学者而言,更多的还用实物,从焊接到调试,从故障到成功,是一个很好的学习过程,而电子仿真可以做为辅助作用的工具,不能用于主要学习的手段,有时候只有仿真效果出来了,做出实物才更加方便快捷,所以对于51单片机而言设计电路,我的步骤是先设计仿真电路,等到理想状态效果出来后在着手调试实际电路,这时候会发现仿真和实际的效果有很大的差异,这时候就是调试和学经验好时候。有些人会说步骤太过于繁琐直接仿真或者用实物不是更好吗?
[单片机]
51单片机T2定时器应用
定时器T2有三种工作模式,其中MODE 2为波特率发生器。 1、Mode 2:波特率发生器 串口方式1和3的波特率计算如下: 波特率bps=振荡器频率freq/ 则:RCAP2=65536-(freq/32/bps) 如果freq=11.0592MHZ,bps=9600,则:RCAP2 = 65500 RCAP2H = 255;RCAP2L = 220 此时的程序设置如下: uint a, bps = 96; // 9600 bps SCON |= 0x50; // 0101 0000串口方式1,允许接收 a=3456/bps; a=~a; RCAP2H = a/256; R
[单片机]
基于51单片机的温控电机proteus仿真及源程序
温控电机项目特别提醒: 用Proteus软件进行电路仿真时,TLC549和AT89C51的电源引脚均隐藏了,在制作电路板时一定要给TLC549的Pin8接+5V,Pin4接地;AT89C51的的Pin40接+5V,Pin20接地。 单片机温控电机源程序如下: //产生频率为100Hz的PWM #include reg51.h #define uchar unsigned char #define uint unsigned int sbit TLC549_SCLK=P1^5; //定义P1.5引脚位名称为TLC549_SCLK sbit TLC549_SDO=P1^3; //定义P1.3引脚位名称为TLC549_S
[单片机]
基于<font color='red'>51单片机</font>的温控电机proteus仿真及源程序
51单片机中断系统介绍
中断系统是为了使CPU具有对外界紧急事件的实时处理能力而设置的。 当中央处理器CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。 微型机的中断系统一般允许多个中断源,当几个中断同时向CPU请求中断,要求为他服务的时候,这就存在了CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每个中断源有一个优先级别。CPU总是先响应优先级别最高的终端请求。 当CPU正在处理一个中断源
[单片机]
<font color='red'>51单片机</font>中断系统介绍
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved