找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2734|回复: 0
收起左侧

基于51单片机的万年历程序 一晚上误差差不多十二秒

[复制链接]
ID:319688 发表于 2019-3-16 13:52 | 显示全部楼层 |阅读模式
基于51单片机的万年历,电路很简单,程序三百多行。。可调时,走了一晚上误差差不多十二秒。有兴趣的可以下载来做做,闹钟的那部分代码懒得写了有兴趣的小伙伴可以加上去哦

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
原理图.png 0.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit RS=P2^7;
  5. sbit RW=P2^6;
  6. sbit EN=P2^5;
  7. sbit buzzer=P2^4;
  8. sbit DU=P2^0;
  9. sbit WE=P2^1;
  10. //*************************按键*************************
  11. sbit key1=P1^0;                                                   //设置键*************
  12. sbit key2=P1^4;                                                   //按键加***********
  13. sbit key3=P3^0;                                                   //按键减*************

  14. uchar code table[]="2019_03_07 THR";
  15. uchar code table1[]="13:14:20";
  16. uchar code table2[]="SUNMONTUSWENTHRFRISAT";
  17. uchar code table3[]=">_<[]=_=";
  18. uchar shi=15,fen=52,miao=0,time=0,week=4,ri=7,yue=3,nian=19,shiji=20;
  19. uchar keyln;
  20. //***********************延时函数***********************
  21. void delay(uchar z)
  22. {
  23.         uchar x;
  24.         while(z--)
  25.         {
  26.                 for(x=110;x>0;x--);
  27.         }
  28. }
  29. //*********************写指令函数************************
  30. void write_com(uchar com)
  31. {
  32.         RS=0;
  33.         RW=0;
  34.         P0=com;
  35.         delay(5);
  36.         EN=1;
  37.         delay(5);
  38.         EN=0;
  39. }
  40. //**********************写数据函数**********************  
  41. void write_date(uchar date)
  42. {
  43.         RS=1;
  44.         RW=0;
  45.         P0=date;        
  46.         delay(5);
  47.         EN=1;
  48.         delay(5);
  49.         EN=0;
  50. }
  51. //*********************初始化函数************************
  52. void init()
  53. {
  54.         uchar num;
  55.         EN=0;
  56.         RS=0;
  57.         RW=0;
  58.         write_com(0x38);        //液晶工作模式
  59.         write_com(0x0c);         //开显示不显示光标
  60.         write_com(0x06);        //屏幕不移动,光标自右移动
  61.         write_com(0x01);        //清屏
  62.         write_com(0x80+1);        //从第二个开始
  63.         for(num=0;num<14;num++)
  64.         {
  65.                 write_date(table[num]);
  66.                 delay(5);
  67.         }
  68.         write_com(0x80+0x40+4);
  69.         for(num=0;num<8;num++)
  70.         {
  71.                 write_date(table1[num]);
  72.                 delay(5);
  73.         }
  74.         write_com(0x80+0x40);
  75.         for(num=0;num<4;num++)
  76.         {
  77.                 write_date(table3[num]);
  78.                 delay(5);
  79.         }
  80.         write_com(0x80+0x40+0x0c);
  81.         for(num=4;num<8;num++)
  82.         {
  83.                 write_date(table3[num]);
  84.                 delay(5);
  85.         }
  86.         TMOD=0x01;
  87.         TH0=(65536-18451)/256;
  88.         TL0=(65536-18451)%256;
  89.         EA=1;
  90.         ET0=1;
  91.         TR0=1;
  92. }
  93. //*******************时分秒处理及显示函数*****************
  94. void jishi(uchar add,uchar haha)
  95. {
  96.         uchar i,j;
  97.         i=haha/10;
  98.         j=haha%10;
  99.         write_com(0x80+0x40+add);
  100.         write_date(0x30+j);
  101.         write_com(0x80+0x40+add-1);
  102.         write_date(0x30+i);
  103. }
  104. //*****************日,月,年,世纪处理及显示函数*********
  105. void qingchun(uchar add,uchar haha)
  106. {
  107.         uchar i,j;
  108.         i=haha/10;
  109.         j=haha%10;
  110.         write_com(0x80+add);
  111.         write_date(0x30+j);
  112.         write_com(0x80+add-1);
  113.         write_date(0x30+i);
  114. }
  115. //*********************星期显示函数***********************
  116. void xingqi(uchar z)
  117. {
  118.         write_com(0x80+0x0c);
  119.         write_date(table2[3*z]);
  120.         write_com(0x80+0x0d);
  121.         write_date(table2[3*z+1]);
  122.         write_com(0x80+0x0e);
  123.         write_date(table2[3*z+2]);
  124. }
  125. //**********************闰年判断函数*************
  126. uchar nianer(uchar b,uchar c)
  127. {
  128.         uchar d;
  129.         if(((c*100+b)%4==0&&(c*100+b!=0)||(c*100+b)%4==0))
  130.                 d=1;
  131.         else
  132.                 d=0;
  133.         return d;
  134. }
  135. //************************调时函数***************
  136. void keyscan()
  137. {
  138.         
  139.         if(key1==0)
  140.         {        
  141.                 delay(1);
  142.                 if(key1==0)
  143.                 {
  144.                         buzzer=0;
  145.                         delay(5);
  146.                         buzzer=1;                           
  147.                         while(!key1);
  148.                         keyln++;
  149.                         if(keyln==9)
  150.                                 keyln=1;    // 设置按键八个功能,秒,分,时,星期,日,月,年,返回;
  151.                         switch(keyln)
  152.                         {
  153.                                 case 1:write_com(0x80+0x40+0x0b);write_com(0x0f);TR0=0;         break; //miao                                                               
  154.                                 case 2:write_com(0x80+0x40+8);                                                   break; //fen
  155.                                 case 3:write_com(0x80+0x40+5);                                                      break; //shi
  156.                                 case 4:write_com(0x80+0x0e);                                                     break; //week
  157.                                 case 5:write_com(0x80+0x0a);                                                           break; //ri
  158.                                 case 6:write_com(0x80+0x07);                                                          break; //yue
  159.                                 case 7:write_com(0x80+0x04);                                                          break; //nian
  160.                                 case 8:write_com(0x0c);        TR0=1;                                                         break;        //fanhui
  161.                                                                                        
  162.                         }
  163.                 }
  164.         }
  165.         if(keyln!=0)
  166.                 {
  167.                         if(key3==0)                 //下调键
  168.                         {
  169.                                 delay(1);
  170.                                 if(key3==0)
  171.                                 {
  172.                                         buzzer=0;
  173.                                         delay(5);
  174.                                         buzzer=1;
  175.                                         while(!key3);
  176.                                         switch(keyln)
  177.                                         {
  178.                                                 case 1:miao--;
  179.                                                                 if(miao==60) miao=0;
  180.                                                                 jishi(11,miao);break;
  181.                                                 case 2:fen--;
  182.                                                                 if(fen==60) fen=0;
  183.                                                                 jishi(8,fen);break;
  184.                                                 case 3:shi--;
  185.                                                                 if(shi==24) shi=0;
  186.                                                                 jishi(5,shi);break;
  187.                                                 case 4:week--;
  188.                                                                 if(week==8) week=1;
  189.                                                                 xingqi(week);break;
  190.                                                 case 5:ri--;
  191.                                                                 if(ri==32) ri=1;
  192.                                                                 qingchun(10,ri);break;
  193.                                                 case 6:yue--;
  194.                                                                 if(yue==13) yue=1;
  195.                                                                 qingchun(7,yue);break;
  196.                                                 case 7:nian--;
  197.                                                                 if(nian==100) nian=0;
  198.                                                                 qingchun(4,nian);break;
  199.                                         }
  200.                                 }
  201.                         }
  202.                 }
  203.         if(keyln!=0)
  204.                 {
  205.                         if(key2==0)                 //上调键
  206.                         {
  207.                                 delay(1);
  208.                                 if(key2==0)
  209.                                 {
  210.                                         buzzer=0;
  211.                                         delay(5);
  212.                                         buzzer=1;
  213.                                         while(!key2);
  214.                                         switch(keyln)
  215.                                         {
  216.                                                 case 1:miao++;
  217.                                                                 if(miao==60) miao=0;
  218.                                                                 jishi(11,miao);break;
  219.                                                 case 2:fen++;
  220.                                                                 if(fen==60) fen=0;
  221.                                                                 jishi(8,fen);break;
  222.                                                 case 3:shi++;
  223.                                                                 if(shi==24) shi=0;
  224.                                                                 jishi(5,shi);break;
  225.                                                 case 4:week++;
  226.                                                                 if(week==8) week=1;
  227.                                                                 xingqi(week);break;
  228.                                                 case 5:ri++;
  229.                                                                 if(ri==32) ri=1;
  230.                                                                 qingchun(10,ri);break;
  231.                                                 case 6:yue++;
  232.                                                                 if(yue==13) yue=1;
  233.                                                                 qingchun(7,yue);break;
  234.                                                 case 7:nian++;
  235.                                                                 if(nian==100) nian=0;
  236.                                                                 qingchun(4,nian);break;
  237.                                         }
  238.                                 }
  239.                         }
  240.                 }
  241. }
  242.                                                                                    
  243. //*******************每月天数=_=****************
  244. uchar yueer(uchar e)
  245. {
  246.         uchar f;
  247.         switch(e)
  248.         {
  249.                 case 1:f=31;break;
  250.                 case 2:f=28;break;
  251.                 case 3:f=31;break;
  252.                 case 4:f=30;break;
  253.                 case 5:f=31;break;
  254.                 case 6:f=30;break;
  255.                 case 7:f=31;break;
  256.                 case 8:f=31;break;
  257.                 case 9:f=30;break;
  258.                 case 10:f=31;break;
  259.                 case 11:f=30;break;
  260.                 case 12:f=31;break;
  261.                 default: f=0;break;
  262.         }
  263.         return f;
  264. }
  265. //******************闹钟************************
  266. //*********************大哥大*******************
  267. void main()
  268. {
  269.         DU=0;
  270.         WE=0;
  271.         init();
  272.         while(1)
  273.         {
  274.                 keyscan();
  275.                 if(time==50)
  276.                 {
  277.                         time=0;
  278.                         miao++;
  279.                         if(miao>=60)
  280.                         {
  281.                                 miao=0;
  282.                                 fen++;
  283.                         }
  284.                         jishi(11,miao);
  285.                         if(fen>=60)
  286.                         {
  287.                                 fen=0;
  288.                                 shi++;
  289.                         }
  290.                         jishi(8,fen);
  291.                         if(shi>=24)
  292.                         {
  293.                                 shi=0;
  294.                                 week++;
  295.                                 ri++;
  296.                         }
  297. ……………………

  298. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
项目训练.zip (66.74 KB, 下载次数: 22)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表