基于51单片机的万年历(算法实现)

基于51单片机的万年历,用到了单片机独立键盘、数码管、LED灯模块实现。

想要简单还是DS1302好用。

  1 /**************************************************  2   3 作者:纟彖氵戋   博客:http://www.cnblogs.com/yllinux/  4     5 时间:2017年6月7日  6       7 目标:利用单片机独立键盘、数码管、LED灯模块实现万年历(算法实现)  8         9 ***************************************************/ 10 #include <reg52.h> 11 #define uchar unsigned char 12 #define uint unsigned int 13  14 uchar a[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80 };  //字形码表0~9和. 15 uchar b[] = { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff };  //数码管位码表1~8和0 16 uchar c[] = { 0x3f,0xf3,0xcf }; 17 uint year = 2100; 18 uchar month = 2, day = 14; 19 uchar hour = 8, minute = 40, second = 0; 20 uchar count;  //时钟计数 21 uchar n = 1;  //年月日调位指示 22 uchar j = 1;  //时分秒调位指示 23  24 sbit Key1 = P3 ^ 0; //计时停止 25 sbit Key2 = P3 ^ 1;    //调位 26 sbit Key3 = P3 ^ 2;    //加一     27 sbit Key4 = P3 ^ 3; //切换 28 sbit LED1 = P1 ^ 0;  //可删此灯,有冲突 29 sbit we   = P2 ^ 7; 30 sbit du   = P2 ^ 6; 31  32 void Delayms(uint z) 33 { 34     uint x, y; 35     for (x = 0; x < z; x++) 36         for (y = 0; y < 114; y++); 37 } 38  39 //时分秒显示函数 40 void Dispaly1(uchar hour, uchar minute, uchar second) 41 { 42     //数码管1 43     P0 = b[8]; 44     we = 1; 45     we = 0; 46     P0 = a[hour / 10]; 47     du = 1; 48     du = 0; 49     P0 = b[0]; 50     we = 1; 51     we = 0; 52     Delayms(1); 53     //数码管2     54     P0 = b[8]; 55     we = 1; 56     we = 0; 57     P0 = a[hour % 10]; 58     du = 1; 59     du = 0; 60     P0 = b[1]; 61     we = 1; 62     we = 0; 63     Delayms(1); 64     //数码管2小数点 65     P0 = b[8]; 66     we = 1; 67     we = 0; 68     P0 = a[10]; 69     du = 1; 70     du = 0; 71     P0 = b[1]; 72     we = 1; 73     we = 0; 74     Delayms(1); 75     //数码管3 76     P0 = b[8]; 77     we = 1; 78     we = 0; 79     P0 = a[minute / 10]; 80     du = 1; 81     du = 0; 82     P0 = b[2]; 83     we = 1; 84     we = 0; 85     Delayms(1); 86     //数码管4     87     P0 = b[8]; 88     we = 1; 89     we = 0; 90     P0 = a[minute % 10]; 91     du = 1; 92     du = 0; 93     P0 = b[3]; 94     we = 1; 95     we = 0; 96     Delayms(1); 97     //数码管4小数点 98     P0 = b[8]; 99     we = 1;100     we = 0;101     P0 = a[10];102     du = 1;103     du = 0;104     P0 = b[3];105     we = 1;106     we = 0;107     Delayms(1);108     //数码管5    109     P0 = b[8];110     we = 1;111     we = 0;112     P0 = a[second / 10];113     du = 1;114     du = 0;115     P0 = b[4];116     we = 1;117     we = 0;118     Delayms(1);119     //数码管6120     P0 = b[8];121     we = 1;122     we = 0;123     P0 = a[second % 10];124     du = 1;125     du = 0;126     P0 = b[5];127     we = 1;128     we = 0;129     Delayms(1);130 }131 132 133 //年月日显示函数134 void Dispaly2(uint year, uchar month, uchar day)135 {136     //数码管1137     P0 = b[8];138     we = 1;139     we = 0;140     P0 = a[year / 1000];141     du = 1;142     du = 0;143     P0 = b[0];144     we = 1;145     we = 0;146     Delayms(1);147     148     //数码管2    149     P0 = b[8];150     we = 1;151     we = 0;152     P0 = a[(year % 1000) / 100];153     du = 1;154     du = 0;155     P0 = b[1];156     we = 1;157     we = 0;158     Delayms(1);159     160     //数码管3161     P0 = b[8];162     we = 1;163     we = 0;164     P0 = a[(year % 100) / 10];165     du = 1;166     du = 0;167     P0 = b[2];168     we = 1;169     we = 0;170     Delayms(1);171     172     //数码管4173     P0 = b[8];174     we = 1;175     we = 0;176     P0 = a[year % 10];177     du = 1;178     du = 0;179     P0 = b[3];180     we = 1;181     we = 0;182     Delayms(1);183     184     //数码管4小数点185     P0 = b[8];186     we = 1;187     we = 0;188     P0 = a[10];189     du = 1;190     du = 0;191     P0 = b[3];192     we = 1;193     we = 0;194     Delayms(1);195     196     //数码管5197     P0 = b[8];198     we = 1;199     we = 0;200     P0 = a[month / 10];201     du = 1;202     du = 0;203     P0 = b[4];204     we = 1;205     we = 0;206     Delayms(1);207     208     //数码管6    209     P0 = b[8];210     we = 1;211     we = 0;212     P0 = a[month % 10];213     du = 1;214     du = 0;215     P0 = b[5];216     we = 1;217     we = 0;218     Delayms(1);219     //数码管6小数点220     P0 = b[8];221     we = 1;222     we = 0;223     P0 = a[10];224     du = 1;225     du = 0;226     P0 = b[5];227     we = 1;228     we = 0;229     Delayms(1);230     //数码管7231     P0 = b[8];232     we = 1;233     we = 0;234     P0 = a[day / 10];235     du = 1;236     du = 0;237     P0 = b[6];238     we = 1;239     we = 0;240     Delayms(1);241     //数码管8242     P0 = b[8];243     we = 1;244     we = 0;245     P0 = a[day % 10];246     du = 1;247     du = 0;248     P0 = b[7];249     we = 1;250     we = 0;251     Delayms(1);252 }253 254 void Keyscan1()255 {256     static    uchar i = 0;257     if (Key1 == 0)258     {259         Delayms(5); //消抖    260         if (Key1 == 0)261             while (!Key1); //等待按键弹起262             i++;263     }264     if (i % 2 == 1)265     {266         LED1 = 0;267         TR0 = 0;268     }269     if (i % 2 == 0)270     {271         LED1 = 1;272         TR0 = 1;273     }274     if (Key2 == 0)275     {276         Delayms(5);277         if (Key2 == 0)278             while (!Key2);279             j++;280             if (j == 3)281                 j = 0;282     }283     if (j % 3 == 1)284     {285         if (Key3 == 0)286         {287             Delayms(5);288             if (Key3 == 0)289                 while (!Key3);290                 second++;291                 if (second == 60)292                     second = 0;293         }294     }295     if (j % 3 == 2)296     {297         if (Key3 == 0)298         {299             Delayms(5);300             if (Key3 == 0)301                 while (!Key3);302                 minute++;303                 if (minute == 60)304                     minute = 0;305         }306     }307     if (j % 3 == 0)308     {309         if (Key3 == 0)310         {311             Delayms(5);312             if (Key3 == 0)313                 while (!Key3);314                 hour++;315                 if (hour == 24)316                     hour = 0;317         }318     }319 }320 321 void Keyscan2()322 {323     static    uchar m = 0;324     if (Key1 == 0)325     {326         Delayms(5);327         if (Key1 == 0)328             while (!Key3);329             m++;330             if (m == 3)331                 m = 0;332     }333     if (m % 2 == 1)334     {335         LED1 = 0;336         TR0 = 0;337     }338     if (m % 2 == 0)339     {340         LED1 = 1;341         TR0 = 1;342     }343     if (Key2 == 0)344     {345         Delayms(5);346         if (Key2 == 0)347             while (!Key2);348             n++;349     }350     if (n % 3 == 1)351     {352         if (Key3 == 0)353         {354             Delayms(5);355             if (Key3 == 0)356                 while (!Key3);357                 day++;358                 if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))  //是闰年359                 {360                     if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)361                     {362                         if (day == 32)363                         {364                             day = 0;365                         }366                     }367                     if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )368                     {369                         if (day == 31)370                         {371                             day = 0;372                         }373                     }374                     if (month == 2)375                     {376                         if (day == 29)377                         {378                             day = 0;379                         }380                     }381                 }                382                 else    //不是闰年383                 {384                     if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)385                     {386                         if (day == 32)387                         {388                             day = 0;389                         }390                     }391                     if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )392                     {393                         if (day == 31)394                         {395                             day = 0;396                         }397                     }398                     if (month == 2)399                     {400                         if (day == 30)401                         {402                             day = 0;403                         }404                     }405                 }406                 407         }408     }409     if (n % 3 == 2)410     {411         if (Key3 == 0)412         {413             Delayms(5);414             if (Key3 == 0)415                 while (!Key3);416                 month++;417                 if (month == 12)418                     month = 0;419         }420     }421     if (n % 3 == 0)422     {423         if (Key3 == 0)424         {425             Delayms(5);426             if (Key3 == 0)427                 while (!Key3);428                 year++;429                 if (year == 99)430                     year = 0;431         }432     }433     434 }435 436 void main()437 {438     TMOD = 0x01;439     TH0  = 0x4c;440     //TH0 = (65536 - 10000) / 256;441     TL0  = 0x00;442     //TL0 = (65536 - 10000) % 256;443     EA = 1;444     ET0 = 1;445     TR0 = 1;446     while (1)447     {448         static    uchar h = 0;449         if (Key4 == 0)450         {451             Delayms(5);452             if (Key4 == 0)453                 while (!Key4);454                 h++;455         }456         if (h % 2 == 1)  //按Key4奇次数显示年月日457         {458             P1 = c[n % 3];  //年月日调位判断灯459             Dispaly2(year, month, day);460             Keyscan2();461         }462         if (h % 2 == 0)  //按Key4偶次数显示时分秒463         {464             P1 = c[j % 3];  //时分秒调位判断灯465             Dispaly1(hour, minute, second);466             Keyscan1();467         }468     }469 }470 471 void time0_int(void) interrupt 1472 {473     //TH0 = (65536 - 10000) / 256;474     //TL0 = (65536 - 10000) % 256;475     TH0  = 0x4c;    //公式:定时时间t = (2^16 - T0初值) * 振荡周期 * 12         (振荡周期 * 12 即机器周期)476     TL0  = 0x00;    //T0 = 2^16 - t * 11059200 / 12         (此定时时间为 50ms, T1 = 19456 = 0x4c00)477     count++;478     if (count == 20)479     {480         count = 0;481         second++;482         if (second == 60)483         {484             second = 0;485             minute++;486             if (minute == 60)487             {488                 minute = 0;489                 hour++;490                 if (hour == 24)491                 {492                     hour = 0;493                     day++;494                     if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))    //是闰年495                     {496                         if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)497                         {498                             if (day == 31)499                             {500                                 day = 0;501                                 month++;502                                 if (month == 12)503                                 {504                                     month = 1;505                                     year++;506                                     if (year == 99)507                                     {508                                         year = 0;509                                     }510                                 }511                             }512                         }513                         if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )514                         {515                             if (day == 30)516                             {517                                 day = 0;518                                 month++;519                             }520                         }521                         if (month == 2)522                         {523                             if (day == 28)524                             {525                                 day = 0;526                                 month++;527                             }528                         }529                     }530                     else    //不是闰年531                     {532                         if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)533                         {534                             if (day == 31)535                             {536                                 day = 0;537                                 month++;538                                 if (month == 12)539                                 {540                                     month = 1;541                                     year++;542                                     if (year == 99)543                                     {544                                         year = 0;545                                     }546                                 }547                             }548                         }549                         if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )550                         {551                             if (day == 30)552                             {553                                 day = 0;554                                 month++;555                             }556                         }557                         if (month == 2)558                         {559                             if (day == 29)560                             {561                                 day = 0;562                                 month++;563                             }564                         }565                         566                     }567                 }568             }569         }570     }571 }

判断闰年算法:百度百科_闰年

非整百年:能被4整除的为闰年。(如2004年就是闰年,2100年不是闰年);整百年:能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)

((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) 或year % 4 == 0 && year % 100 != 0 || year % 400 == 0

******************************************************************************

第一次更新,上面的没写星期显示,在此加上,部分算法有问题,已改

  1 /**************************************************  2   3 作者:纟彖氵戋    博客:http://www.cnblogs.com/yllinux/  4     5 时间:2017年6月9日  6       7 目标:利用单片机独立键盘、数码管、LED灯模块实现万年历(算法实现)  8   9 结果:默认显示 “ 星期 - 小时. 分钟. 秒 ” ;按Key4切换年月日显示 “ 年份. 月份. 日期 ” 10 按Key1停止计时,再按继续计时;按Key2切换要调的位同时LED灯给出位提示;按Key3调整的位加一;按Key4切换年月日显示和时分秒显示 11  12 缺点:延时运用了运算和松手检测运用了死等;代码有些烂。(有待改进) 13 ***************************************************/ 14 #include <reg52.h> 15 #define uchar unsigned char 16 #define uint unsigned int 17  18 uchar code a[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x40 };  //字形码表0~9和.和- 19 uchar code b[] = { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff };  //数码管位码表1~8和0 20 uchar code c[] = { 0x3f,0xf3,0xcf };  //调位指示灯位表 21 uchar const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5};//星期查找表 22  23 uint year = 2017; 24 uchar month = 6, day = 14; 25 uchar hour = 8, minute = 35, second = 0, ms_500 = 0; 26 uchar count;  //时钟计数 27 uchar n = 1;  //年月日调位指示 28 uchar j = 1;  //时分秒调位指示 29  30 sbit Key1 = P3 ^ 0; //计时停止 31 sbit Key2 = P3 ^ 1;    //调位 32 sbit Key3 = P3 ^ 2;    //加一     33 sbit Key4 = P3 ^ 3; //切换 34 sbit LED1 = P1 ^ 0;  35 sbit we   = P2 ^ 7; 36 sbit du   = P2 ^ 6; 37  38 //延时函数 39 void Delayms(uint z) 40 { 41     uint x, y; 42     for (x = 0; x < z; x++) 43         for (y = 0; y < 114; y++); 44 } 45  46 //计算星期函数 47 uchar get_week(uint year,uchar month,uchar day) 48 { 49 uchar temp; 50 uchar yearH, yearL; 51 yearH = year/100; 52 yearL = year%100; 53 if (yearH > 19) yearL+=100; 54 temp = yearL + yearL / 4; 55 temp = temp % 7; 56 temp = temp + day + table_week[ month - 1 ]; 57 if (yearL % 4 == 0 && month < 3) temp--; 58 return(temp % 7); 59 } 60  61  62 //时分秒显示函数 63 void Dispaly1(uchar hour, uchar minute, uchar second) 64 { 65     P0 = b[8]; we = 1; we = 0; P0 = a[get_week(year, month, day)];      du = 1; du = 0; P0 = b[0]; we = 1; we = 0; Delayms(1);    //数码管1 66      67     P0 = b[8]; we = 1; we = 0; P0 = a[11];          du = 1; du = 0; P0 = b[1]; we = 1; we = 0; Delayms(1);    //数码管2 68      69     P0 = b[8]; we = 1; we = 0; P0 = a[hour / 10];   du = 1; du = 0; P0 = b[2]; we = 1; we = 0; Delayms(1);    //数码管3 70      71   P0 = b[8]; we = 1; we = 0; P0 = a[hour % 10];   du = 1; du = 0; P0 = b[3]; we = 1; we = 0; Delayms(1);    //数码管4 72      73     P0 = b[8]; we = 1; we = 0; P0 = a[10];          du = 1; du = 0; P0 = b[3]; we = 1; we = 0; Delayms(1);    //数码管4小数点 74      75     P0 = b[8]; we = 1; we = 0; P0 = a[minute / 10]; du = 1; du = 0; P0 = b[4]; we = 1; we = 0; Delayms(1);    //数码管5 76      77     P0 = b[8]; we = 1; we = 0; P0 = a[minute % 10]; du = 1; du = 0; P0 = b[5]; we = 1; we = 0; Delayms(1);    //数码管6 78      79     P0 = b[8]; we = 1; we = 0; P0 = a[10];          du = 1; du = 0; P0 = b[5]; we = 1; we = 0; Delayms(1);    //数码管6小数点 80      81     P0 = b[8]; we = 1; we = 0; P0 = a[second / 10]; du = 1; du = 0; P0 = b[6]; we = 1; we = 0; Delayms(1);    //数码管7     82      83     P0 = b[8]; we = 1; we = 0; P0 = a[second % 10]; du = 1; du = 0; P0 = b[7]; we = 1; we = 0; Delayms(1);    //数码管8 84 } 85  86 //年月日显示函数 87 void Dispaly2(uint year, uchar month, uchar day) 88 { 89     P0 = b[8]; we = 1; we = 0; P0 = a[year / 1000];         du = 1; du = 0; P0 = b[0]; we = 1; we = 0; Delayms(1);//数码管1 90      91   P0 = b[8]; we = 1; we = 0; P0 = a[(year % 1000) / 100]; du = 1; du = 0; P0 = b[1]; we = 1; we = 0; Delayms(1);//数码管2     92      93     P0 = b[8]; we = 1; we = 0; P0 = a[(year % 100) / 10];   du = 1; du = 0; P0 = b[2]; we = 1; we = 0; Delayms(1);//数码管3 94      95     P0 = b[8]; we = 1; we = 0; P0 = a[year % 10];           du = 1; du = 0;    P0 = b[3]; we = 1; we = 0; Delayms(1);//数码管4 96      97     P0 = b[8]; we = 1; we = 0; P0 = a[10];                  du = 1; du = 0; P0 = b[3]; we = 1; we = 0; Delayms(1);//数码管4小数点 98      99     P0 = b[8]; we = 1; we = 0; P0 = a[month / 10];          du = 1; du = 0; P0 = b[4]; we = 1; we = 0; Delayms(1);//数码管5100     101     P0 = b[8]; we = 1; we = 0; P0 = a[month % 10];          du = 1; du = 0; P0 = b[5]; we = 1; we = 0; Delayms(1);//数码管6    102     103     P0 = b[8]; we = 1; we = 0; P0 = a[10];                  du = 1; du = 0; P0 = b[5]; we = 1; we = 0; Delayms(1);//数码管6小数点104     105     P0 = b[8]; we = 1; we = 0; P0 = a[day / 10];            du = 1; du = 0; P0 = b[6]; we = 1; we = 0; Delayms(1);//数码管7106     107     P0 = b[8]; we = 1; we = 0; P0 = a[day % 10];            du = 1; du = 0; P0 = b[7]; we = 1; we = 0; Delayms(1);//数码管8108 }109 110 void Keyscan1()111 {112     static    uchar i = 0;113     if (Key1 == 0)114     {115         Delayms(5); //消抖    116         if (Key1 == 0)117             while (!Key1); //等待按键弹起118             i++;119     }120     if (i % 2 == 1)121     {122         //LED1 = 0;123         TR0 = 0;124     }125     if (i % 2 == 0)126     {127         //LED1 = 1;128         TR0 = 1;129     }130     if (Key2 == 0)131     {132         Delayms(5);133         if (Key2 == 0)134             while (!Key2);135             j++;136             if (j == 3)137                 j = 0;138     }139     if (j % 3 == 1)140     {141         if (Key3 == 0)142         {143             Delayms(5);144             if (Key3 == 0)145                 while (!Key3);146                 second++;147                 if (second == 60)148                     second = 0;149         }150     }151     if (j % 3 == 2)152     {153         if (Key3 == 0)154         {155             Delayms(5);156             if (Key3 == 0)157                 while (!Key3);158                 minute++;159                 if (minute == 60)160                     minute = 0;161         }162     }163     if (j % 3 == 0)164     {165         if (Key3 == 0)166         {167             Delayms(5);168             if (Key3 == 0)169                 while (!Key3);170                 hour++;171                 if (hour == 24)172                     hour = 0;173         }174     }175 }176 177 void Keyscan2()178 {179     static    uchar m = 0;180     if (Key1 == 0)181     {182         Delayms(5);183         if (Key1 == 0)184             while (!Key3);185             m++;186             if (m == 3)187                 m = 0;188     }189     if (m % 2 == 1)190     {191         //LED1 = 0;192         TR0 = 0;193     }194     if (m % 2 == 0)195     {196         //LED1 = 1;197         TR0 = 1;198     }199     if (Key2 == 0)200     {201         Delayms(5);202         if (Key2 == 0)203             while (!Key2);204             n++;205     }206     if (n % 3 == 1)207     {208         if (Key3 == 0)209         {210             Delayms(5);211             if (Key3 == 0)212                 while (!Key3);213                 day++;214                 if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))  //是闰年215                 {216                     if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)217                     {218                         if (day == 32)219                         {220                             day = 0;221                         }222                     }223                     if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )224                     {225                         if (day == 31)226                         {227                             day = 0;228                         }229                     }230                     if (month == 2)231                     {232                         if (day == 30)233                         {234                             day = 0;235                         }236                     }237                 }                238                 else    //不是闰年239                 {240                     if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)241                     {242                         if (day == 32)243                         {244                             day = 0;245                         }246                     }247                     if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )248                     {249                         if (day == 31)250                         {251                             day = 0;252                         }253                     }254                     if (month == 2)255                     {256                         if (day == 29)257                         {258                             day = 0;259                         }260                     }261                 }262                 263         }264     }265     if (n % 3 == 2)266     {267         if (Key3 == 0)268         {269             Delayms(5);270             if (Key3 == 0)271                 while (!Key3);272                 month++;273                 if (month == 12)274                     month = 0;275         }276     }277     if (n % 3 == 0)278     {279         if (Key3 == 0)280         {281             Delayms(5);282             if (Key3 == 0)283                 while (!Key3);284                 year++;285                 if (year == 2101)286                     year = 2000;287         }288     }289     290 }291 292 void main()293 {294     TMOD = 0x01;295     TH0  = 0x4c;296     TL0  = 0x00;297     EA = 1;298     ET0 = 1;299     TR0 = 1;300     while (1)301     {302         static    uchar h = 0;303         if (Key4 == 0)304         {305             Delayms(5);306             if (Key4 == 0)307                 while (!Key4);308                 h++;309         }310         if (h % 2 == 1)  //按Key4奇次数显示年月日311         {312             P1 = c[n % 3];  //年月日调位判断灯313             Dispaly2(year, month, day);314             Keyscan2();315         }316         if (h % 2 == 0)  //按Key4偶次数显示时分秒317         {318             P1 = c[j % 3];  //时分秒调位判断灯319             Dispaly1(hour, minute, second);320             Keyscan1();321             get_week( year, month, day);322         }323     }324 }325 326 void time0_int(void) interrupt 1327 {328     TH0  = 0x4c;    //公式:定时时间t = (2^16 - T0初值) * 振荡周期 * 12         (振荡周期 * 12 即机器周期)329     TL0  = 0x00;    //T0 = 2^16 - t * 11059200 / 12         (此定时时间为 50ms, T1 = 19456 = 0x4c00)330     count++;331     if (count == 10)332     {333         count = 0;334         ms_500++;335         if (ms_500 == 2)336         {337             ms_500 = 0;338           second++;339         if (second == 60)340         {341             second = 0;342             minute++;343             if (minute == 60)344             {345                 minute = 0;346                 hour++;347                 if (hour == 24)348                 {349                     hour = 0;350                     day++;351                     if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))    //是闰年352                     {353                         if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)354                         {355                             if (day == 31)356                             {357                                 day = 0;358                                 month++;359                                 if (month == 12)360                                 {361                                     month = 1;362                                     year++;363                                     if (year == 2101)364                                     {365                                         year = 2000;366                                     }367                                 }368                             }369                         }370                         if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )371                         {372                             if (day == 30)373                             {374                                 day = 0;375                                 month++;376                             }377                         }378                         if (month == 2)379                         {380                             if (day == 29)381                             {382                                 day = 0;383                                 month++;384                             }385                         }386                     }387                     else    //不是闰年388                     {389                         if (month == 12 || month == 1 ||  month == 3 ||  month == 5 ||  month == 7 ||  month == 8 ||  month == 10)390                         {391                             if (day == 31)392                             {393                                 day = 0;394                                 month++;395                                 if (month == 12)396                                 {397                                     month = 1;398                                     year++;399                                     if (year == 2101)400                                     {401                                         year = 2000;402                                     }403                                 }404                             }405                         }406                         if ( month == 4 ||  month == 6 ||  month == 9 || month == 11 )407                         {408                             if (day == 30)409                             {410                                 day = 0;411                                 month++;412                             }413                         }414                         if (month == 2)415                         {416                             if (day == 28)417                             {418                                 day = 0;419                                 month++;420                             }421                         }422                         423                     }424                 }425             }426         }427     }428     }429 }

View Code

星期算法:

(1)

https://zhidao.baidu.com/question/583599630029584485.html?fr=ala&word=%E6%98%9F%E6%9C%9F%E7%9A%84%E7%AE%97%E6%B3%95&device=mobile&ssid=0&from=1019023i&uid=0&pu=usm@1,sz@320_1001,ta@iphone_2_6.0_3_537&bd_page_type=1&baiduid=4B6600AA4F62F7DC2B062BEF81794A25&tj=zhidao_2_0_10_l1

https://zhidao.baidu.com/question/159474320.html

 1 uchar const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5};//平年月表 2 uchar get_week(uint year,uchar month,uchar day) 3 { 4 uchar temp; 5 uchar yearH, yearL; 6 yearH = year / 100; 7 yearL = year % 100; 8 if (yearH > 19) 9     yearL += 100;10 temp = yearL + yearL / 4;11 temp = temp % 7;12 temp = temp + day + table_week[month - 1];13 if (yearL % 4 == 0 && month < 3)14     temp--;15 return(temp % 7);16 }

(2)

蔡勒公式法:百度百科_蔡勒公式

http://blog.csdn.net/minyuanxiani/article/details/22890447#

 1 /*  2 *********************************************************************************************************  3 *    函 数 名: bsp_CalcWeek  4 *    功能说明: 根据日期计算星期几  5 *    形    参: _year _mon _day  年月日  (年是2字节整数,月和日是字节整数)  6 *    返 回 值: 周几 (1-7) 7表示周日  7 *********************************************************************************************************  8 */   9 uint8_t bsp_CalcWeek(uint16_t _year, uint8_t _mon, uint8_t _day)  10 {  11     /*  12     蔡勒(Zeller)公式  13         历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和 14     一些分段计算公式),其中最著名的是蔡勒(Zeller)公式。 15         即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1  16          17         公式中的符号含义如下, 18          w:星期; 19          c:年的高2位,即世纪-1 20          y:年(两位数); 21          m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算, 22               比如2003年1月1日要看作2002年的13月1日来计算); 23          d:日; 24          [ ]代表取整,即只要整数部分。 25          26         算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。  27         如果结果是负数,负数求余数则需要特殊处理: 28             负数不能按习惯的余数的概念求余数,只能按数论中的余数的定义求余。为了方便  29         计算,我们可以给它加上一个7的整数倍,使它变为一个正数,然后再求余数     30          31         以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下:  32         蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1  33         =49+[49/4]+[20/4]-2×20+[26× (10+1)/10]+1-1  34         =49+[12.25]+5-40+[28.6]  35         =49+12+5-40+28  36         =54 (除以7余5)  37         即2049年10月1日(100周年国庆)是星期5。 38     */  39     uint8_t y, c, m, d;  40     int16_t w;  41   42     if (_mon >= 3)  43     {  44         m = _mon;          45         y = _year % 100;  46         c = _year / 100;  47         d = _day;  48     }  49     else    /* 某年的1、2月要看作上一年的13、14月来计算 */  50     {  51         m = _mon + 12;  52         y = (_year - 1) % 100;  53         c = (_year - 1) / 100;  54         d = _day;  55     }  56   57     w = y + y / 4 +  c / 4 - 2 * c + ((uint16_t)26*(m+1))/10 + d - 1;      58     if (w == 0)  59     {  60         w = 7;    /* 表示周日 */  61     }  62     else if (w < 0)    /* 如果w是负数,则计算余数方式不同 */  63     {  64         w = 7 - (-w) % 7;  65     }  66     else  67     {  68         w = w % 7;  69     }  70     return w;  71 }  

***********************************************************************

参考:

http://www.cnblogs.com/LXSYD-C/p/6364888.html

如有错误还请指出,如有侵权还请告知,如需转载请注明出处!

本人博客:http://www.cnblogs.com/yllinux/

学习会使你永远立于不败之地。

基于51单片机的万年历(算法实现)

相关文章:

你感兴趣的文章:

标签云: