基于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     //数码管6
120     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     //数码管1
137     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     //数码管3
161     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     //数码管4
173     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     //数码管5
197     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     //数码管7
231     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     //数码管8
242     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 1
472 {
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 }

--

--

--

参考:

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

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

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

时间: 2024-08-02 15:14:31

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

基于51单片机的12864驱动

/**************dis_12864.h***************/ #include <reg52.h> #ifndef __DIS_12864_H__ #define __DIS_12864_H__ #define uchar unsigned char #define uint  unsigned int /*12864端口定义*/ #define LCD_data  P0             //数据口 sbit LCD_RS  =  P1^0;          

[原创]基于51单片机的红外遥控课程设计

[注]: 一眨眼,大学接近尾声,具有找工作需要,所以把大学做的电子设计“劣作”放上来.希望考研失意,还能赶上“好工作”的春招班车.如果大伙有什么工作推荐也可以联系我哦,因为一年考研少接触了这方面,所以难免有些生疏.但请相信我!给我机会我会很认真学的! 邮箱:[email protected] 转载请注明出处呀! 基于51单片机的红外遥控课程设计 目录 第一章 设计简介... 3 第二章 系统方案... 3 一.设计方案对比... 3 二.方案设计... 4 第三章 硬件设计... 5 一.红外遥

基于51单片机的温度控制系统毕设

分享一下单片机毕设课程计参考资料33个,献给大四的朋友,毕业设计就不用愁了,如果有什么不懂的地方可以加群大家一起交流:813238832资料下载的地址:https://bbs.usoftchina.com/thread-208012-1-1.html 1.CDMA通信系统中的接入信道部分进行仿真与分析2.USB接口设计3.毕业设计(论文)OFDM通信系统基带数据4.电气工程系毕业设计开题报告5.电信运营商收入保障系统设计与实现6.基于51单片机的16×16点阵(滚动显示)7.基于51单片机的LE

基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目

一.前言 1.基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目包括用Keil软件编写单片机C语言程序和用Proteus软件仿真单片机外围电路 2.基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目构思 (1).声明程序变量思维导图 (2).程序子函数思维导图 (3).程序主函数思维导图 二.基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目的Keil软件编写的单片机C语言程序 1 #include<reg52.h>//声明51单片机

基于51单片机的无线测温系统

本51项目基于STC89C52MCU,温度传感器为DS18B20,显示模块用的是LCD1602,无线模块用的是Nodemcu. 项目用到的编程语言:C,C++,Lua. 实现思路是这样,DS18B20测温,然后数据串行传送给51单片机,然后51通过串口将数据传送给Nodemcu,Nodemcu通过其WIFI模块将数据发送给上位机,上位机上的程序是用Qt编写的GUI.(这里无线传输采用的是无连接的UDP协议) 1.DS18B20温度测量模块 DS18B20是单总线器件,所以时序要求非常严格,程序编

基于51单片机简易操作系统设计

前言 看了很久的操作系统原理,ucos源码也看了大半,但是感觉总是懵懵懂懂,用句流行的网络用语就是始终上不了车,后来在网上被人推荐了一篇文章<建立一个属于自己的操作系统>,这篇文章真的非常好,也附有源码,但不知道是不是我找的文章有差错还是啥,我根据文章提供的源码贴代码,根本无法编译,然后开始读代码修改代码最后成功编译但是在硬件平台运行根本不行.后来又断断续续看ucos源码,反正各种什么数据结构啊的通信什么的让人头痛,后来大学的单片机原理完课,学校安排课设,我选了时钟定时器(有点像闹钟),这种开

单片机课程设计——基于51单片机温湿度检测系统的设计与实现

1 #include <reg52.h> 2 #include "1602.h" 3 #include "dht.h" 4 #include "2402.h" 5 6 //定义三个LED灯 7 sbit Led_qushi=P1^6; //去湿灯 8 sbit Led_jiangwen=P1^5; //降温灯 9 sbit Led_shengwen=P1^4; //升温灯 10 sbit Key_TH1 = P3^2; 11 sbit

基于51单片机的独立按键和矩阵按键用法

------------恢复内容开始------------ 主要实现如图所示的功能 将主函数以外的函数全部放在qiyu.h文件中 1 //qiyu.h 2 #define KEY_PORT P1 3 #define led P2 4 #define unchar unsigned char 5 #define uint unsigned int 6 7 sbit Buz = P1^5; 8 sbit LED = P2^0; 9 sbit K1 = P3^0; 10 sbit K2 = P3^1

基于51单片机8位数码管(74HC595芯片)的使用方法

#include <AT89X51.H> #include <intrins.h> // 函数原形定义 #define uchar unsigned char #define uint unsigned int void main (void); // 主函数 void LED_OUT(uchar X); // LED单字节串行移位函数 void LED_print (uchar p, uchar x) ; unsigned char code LED_0F[]; // LED字模