找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5467|回复: 4
打印 上一主题 下一主题
收起左侧

可由按键调时和12/24小时切换的电子时钟单片机源程序和仿真

  [复制链接]
跳转到指定楼层
楼主
利用STC89C51单片机和LCD1602电子显示屏实现电子时钟,可由按键进行调时和12/24小时切换。
1.能实现年、月、日、星期、时、分、秒的显示;
2.能实现调时功能;
3.能实现12/24小时制切换;
4.能实现8002200整点报时功能。

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


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit lcdrs=P3^5;  
  5. sbit lcden=P3^4;
  6. sbit s1=P3^0;   
  7. sbit s2=P3^1;       
  8. sbit s3=P3^2;       
  9. sbit s4=P3^3;       
  10. sbit beep=P2^2;
  11. sbit led=P2^3;  
  12. uchar count,s1num,s4num;
  13. char year,month,day,week,miao,shi,fen,pshi;
  14. uchar code table[]=" 20  -  -   ";
  15. void delay(uint z)  
  16. {
  17.         uint x,y;
  18.         for(x=z;x>0;x--)
  19.                 for(y=110;y>0;y--);
  20. }
  21. void zhuanhuan()
  22. {
  23.         if(shi==0)
  24.             pshi=12;
  25.         if(shi<=12&&shi>=1)
  26.             pshi=shi;
  27.     if(shi>12)
  28.             pshi=shi-12;                                          
  29. }                                                                                     
  30. void di()
  31. {
  32.         beep=0;
  33.         delay(300);
  34.         beep=1;
  35.         delay(300);
  36. }
  37. void write_com(uchar com)
  38. {
  39.         lcdrs=0;
  40.         lcden=0;
  41.         P0=com;
  42.         delay(5);
  43.         lcden=1;
  44.         delay(5);
  45.         lcden=0;       
  46. }
  47. void write_date(uchar date)
  48. {
  49.         lcdrs=1;
  50.         lcden=0;
  51.         P0=date;
  52.         delay(5);
  53.         lcden=1;
  54.         delay(5);
  55.         lcden=0;       
  56. }
  57. void _shi()       
  58. {
  59.    if(shi>=12)
  60.    {
  61.          write_com(0x80+0x40+1);
  62.          write_date('P');
  63.          write_date('M');
  64.    }
  65.    else
  66.    {
  67.          write_com(0x80+0x40+1);
  68.          write_date('A');
  69.          write_date('M');
  70.    }
  71. }
  72. void write_ymd(uchar add1,uchar date1)
  73. {
  74.         uchar shi,ge;
  75.         shi=date1/10;
  76.         ge=date1%10;
  77.         write_com(0x80+add1);
  78.         write_date(0x30+shi);
  79.         write_date(0x30+ge);
  80. }
  81. void write_sfm(uchar add,uchar date)
  82. {
  83.         uchar shi,ge;
  84.         shi=date/10;
  85.         ge=date%10;
  86.         write_com(0x80+0x40+add);
  87.         write_date(0x30+shi);
  88.         write_date(0x30+ge);
  89. }
  90. void write_week(char week)          
  91. {
  92.         write_com(0x80+12);
  93.         switch(week)
  94.         {
  95.                 case 1:        write_date('M');delay(5);
  96.                                 write_date('O');delay(5);
  97.                                 write_date('N');
  98.                                 break;
  99.                 case 2:        write_date('T');delay(5);
  100.                                 write_date('U');delay(5);
  101.                                 write_date('E');
  102.                                 break;
  103.                 case 3:        write_date('W');delay(5);
  104.                                 write_date('E');delay(5);
  105.                                 write_date('D');
  106.                                 break;
  107.                 case 4:        write_date('T');delay(5);
  108.                                 write_date('H');delay(5);
  109.                                 write_date('U');
  110.                                 break;
  111.                 case 5:        write_date('F');delay(5);
  112.                                 write_date('R');delay(5);
  113.                                 write_date('I');
  114.                                 break;
  115.                 case 6:        write_date('S');delay(5);
  116.                                 write_date('A');delay(5);
  117.                                 write_date('T');
  118.                                 break;
  119.                 case 7:        write_date('S');delay(5);
  120.                                 write_date('U');delay(5);
  121.                                 write_date('N');
  122.                                 break;
  123.         }
  124. }
  125. void writeym()
  126. {
  127.    day=1;
  128.    month++;
  129.    if(month==13)
  130.    {
  131.          month=1;
  132.          year++;
  133.          if(year==100)
  134.             year=0;
  135.          write_ymd(3,year);
  136.         }
  137.         write_ymd(6,month);
  138. }
  139. void init()
  140. {
  141.     uchar num;
  142.         lcden=0;
  143.         year=13;
  144.         month=6;
  145.         day=21;
  146.         week=5;
  147.         shi=13;
  148.         fen=59;
  149.         miao=58;
  150.         count=0;
  151.         s1num=0;
  152.         s4num=0;
  153.         write_com(0x38);
  154.         write_com(0x0c);
  155.         write_com(0x06);
  156.         write_com(0x01);
  157.         write_com(0x80);
  158.         for(num=0;num<15;num++)
  159.         {
  160.                 write_date(table[num]);
  161.                 delay(5);
  162.         }
  163.                 delay(5);
  164.                 write_com(0x80+0x40+6);
  165.                 write_date(':');
  166.                 delay(5);
  167.                 write_com(0x80+0x40+9);
  168.                 write_date(':');
  169.                 delay(5);
  170.         write_week(week);
  171.         write_ymd(3,year);
  172.         write_ymd(6,month);
  173.         write_ymd(9,day);
  174.         write_sfm(10,miao);
  175.         write_sfm(7,fen);
  176.         write_sfm(4,shi);
  177.         TMOD=0x01;
  178.         TH0=(65536-50000)/256;
  179.         TL0=(65536-50000)%256;
  180.         EA=1;       
  181.         ET0=1;       
  182.         TR0=1;       
  183. }
  184. void keyscan()
  185. {
  186.         if(s1==0)       
  187.         {
  188.                 delay(5);
  189.                 if(s1==0)
  190.                 {       
  191.                     s1num++;
  192.                         while(!s1);       
  193.                         if(s1num==1)
  194.                         {
  195.                             TR0=0;  
  196.                                 write_com(0x80+3);
  197.                                 write_com(0x0f);
  198.                         }
  199.                         if(s1num==2)
  200.                         {
  201.                                 write_com(0x80+6);
  202.                         }
  203.                         if(s1num==3)
  204.                         {
  205.                                 write_com(0x80+9);
  206.                         }
  207.                         if(s1num==4)
  208.                         {
  209.                                 write_com(0x80+12);
  210.                         }
  211.                         if(s1num==7)
  212.                         {
  213.                                 write_com(0x80+0x40+10);
  214.                         }
  215.                         if(s1num==6)
  216.                         {
  217.                                 write_com(0x80+0x40+7);
  218.                         }
  219.                         if(s1num==5)
  220.                         {
  221.                                 write_com(0x80+0x40+4);
  222.                         }
  223.                         if(s1num==8)
  224.                         {
  225.                                 s1num=0;
  226.                                 write_com(0x0c);
  227.                                 TR0=1;       
  228.                         }               
  229.                 }
  230.         }
  231.         if(s1num!=0)
  232.         {
  233.                 if(s2==0)
  234.                 {
  235.                         delay(5);
  236.                         if(s2==0)
  237.                         {
  238.                                 while(!s2);
  239.                                 if(s1num==1)
  240.                                 {
  241.                                         year++;
  242.                                         if(year==100)
  243.                                                 year=0;
  244.                                         write_ymd(3,year);
  245.                                         write_com(0x80+3);
  246.                                 }
  247.                                 if(s1num==2)
  248.                                 {
  249.                                         month++;
  250.                                         if(month==13)
  251.                                                 month=1;
  252.                                         write_ymd(6,month);
  253.                                         write_com(0x80+6);
  254.                                 }
  255.                                 if(s1num==3)
  256.                                 {
  257.                                         day++;
  258.                                         if(year%4==0&&month==2)
  259.                                         {
  260.                                             if(day==30)
  261.                                                 day=1;
  262.                                          }
  263.                                          if(year%4!=0&&month==2)
  264.                                         {
  265.                                             if(day==29)
  266.                                                 day=1;
  267.                                          }
  268.                                          if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  269.                                          {
  270.                                             if(day==32)
  271.                                                 day=1;
  272.                                          }
  273.                                          if(month==4||month==6||month==9||month==11)
  274.                                          {         
  275.                                                 if(day==31)
  276.                                                 day=1;
  277.                                          }
  278.                                         write_ymd(9,day);
  279.                                         write_com(0x80+9);
  280.                                 }
  281.                                 if(s1num==4)
  282.                                 {
  283.                                         week++;
  284.                                         if(week==8)
  285.                                                 week=1;
  286.                                         write_week(week);
  287.                                         write_com(0x80+12);
  288.                                 }
  289.                                 if(s1num==7)
  290.                                 {
  291.                                         miao++;
  292.                                         if(miao==60)
  293.                                                 miao=0;
  294.                                         write_sfm(10,miao);
  295.                                         write_com(0x80+0x40+10);
  296.                                 }
  297.                                 if(s1num==6)
  298.                                 {
  299.                                         fen++;
  300.                                         if(fen==60)
  301.                                                 fen=0;
  302.                                         write_sfm(7,fen);
  303.                                         write_com(0x80+0x40+7);
  304.                                 }
  305.                                 if(s1num==5)
  306.                                 {                                       
  307.                                         shi++;
  308.                                         if(shi==24)
  309.                             {
  310.                                            shi=0;
  311.                                         }
  312.                                            if(s4num==0)
  313.                                            {                                                                                      
  314.                                               write_sfm(4,shi);
  315.                                               write_com(0x80+0x40+4);
  316.                                            }                                          
  317.                                            if(s4num==1)
  318.                                            {
  319.                                                      zhuanhuan();
  320.                                               _shi();
  321.                                               write_sfm(4,pshi);
  322.                                               write_com(0x80+0x40+4);
  323.                                        }                                       
  324.                               }
  325.                         }
  326.                 }
  327.         }
  328.                 if(s3==0)
  329.                 {
  330.                         delay(5);
  331.                         if(s3==0)
  332.                         {
  333.                                 while(!s3);
  334.                                 if(s1num==1)
  335.                                 {
  336.                                         year--;
  337.                                         if(year==-1)
  338.                                                 year=99;
  339.                                         write_ymd(3,year);
  340.                                         write_com(0x80+3);
  341.                                 }
  342.                                 if(s1num==2)
  343.                                 {
  344.                                         month--;
  345.                                         if(month==0)
  346.                                                 month=12;
  347.                                         write_ymd(6,month);
  348.                                         write_com(0x80+6);
  349.                                 }
  350.                                 if(s1num==3)
  351.                                 {
  352.                                         day--;
  353.                                         if(year%4==0&&month==2)
  354.                                         {
  355.                                             if(day==0)
  356.                                                 day=29;
  357.                                          }
  358.                                          if(year%4!=0&&month==2)
  359.                                         {
  360.                                             if(day==0)
  361.                                                 day=28;
  362.                                          }
  363.                                          if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  364.                                          {
  365.                                             if(day==0)
  366.                                                 day=31;
  367.                                          }
  368.                                          if(month==4||month==6||month==9||month==11)
  369.                                          {         
  370.                                                 if(day==0)
  371.                                                 day=30;
  372.                                          }
  373.                                         write_ymd(9,day);;
  374.                                         write_com(0x80+9);
  375.                                 }
  376.                                 if(s1num==4)
  377.                                 {
  378.                                         week--;
  379.                                         if(week==0)
  380.                                                 week=7;
  381.                                         write_week(week);
  382.                                         write_com(0x80+12);
  383.                                 }
  384.                                 if(s1num==7)
  385.                                 {
  386.                                         miao--;
  387.                                         if(miao==-1)
  388.                                                 miao=59;
  389.                                         write_sfm(10,miao);
  390.                                         write_com(0x80+0x40+10);
  391.                                 }
  392.                                 if(s1num==6)
  393.                                 {
  394.                                         fen--;
  395.                                         if(fen==-1)
  396.                                                 fen=59;
  397.                                         write_sfm(7,fen);
  398.                                         write_com(0x80+0x40+7);
  399.                                 }
  400.                                 if(s1num==5)
  401.                                 {
  402.                                         shi--;
  403.                                         if(shi==-1)
  404.                                            shi=23;
  405.                                            if(s4num==0)
  406.                                            {                                                                                   
  407.                                               write_sfm(4,shi);
  408.                                               write_com(0x80+0x40+4);   
  409.                                            }
  410.                                            if(s4num==1)
  411.                                            {                                          
  412.                               zhuanhuan();
  413.                                               _shi();
  414.                                               write_sfm(4,pshi);
  415.                                               write_com(0x80+0x40+4);
  416.                                        }                                       
  417.                              }
  418.                 }
  419.         }
  420.         if(s1num==0)
  421.         {
  422.           if(s4==0)       
  423.           {
  424.                 delay(5);
  425.                 if(s4==0)
  426.                 {       
  427.                     s4num++;
  428.                         while(!s4);
  429.                         if(s4num==1)
  430.                         {
  431.                             zhuanhuan();
  432.                                 _shi();
  433.                                 write_sfm(4,pshi);
  434.                         }                       
  435.                         if(s4num==2)
  436.                         {
  437.                                 s4num=0;
  438.                                 write_com(0x80+0x40+1);
  439.                                 write_date(' ');
  440.                                 write_date(' ');
  441.                                 write_sfm(4,shi);
  442.                         }               
  443.                 }
  444.       }
  445.         }   
  446. }
  447. void main()
  448. {
  449.         init();
  450.         while(1)
  451.         {
  452.                 keyscan();
  453.                 if(s1num!=0)
  454.                    led=0;
  455.                 else           
  456.                    led=miao%2;       
  457.                 if((shi>7&&shi<23)&&(fen==0)&&(miao==0))
  458.                 {
  459.                  di();                 
  460.                  }                               
  461.         }
  462. }
  463. void timer0() interrupt 1
  464. {
  465.         TH0=(65536-50000)/256;
  466.         TL0=(65536-50000)%256;
  467.         count++;               
  468.         if(count==20)
  469.         {
  470.                 count=0;
  471.                 miao++;
  472.                 if(miao==60)
  473.                 {
  474.                         miao=0;
  475.                         fen++;
  476.                         if(fen==60)
  477.                         {
  478.                                 fen=0;
  479.                                 shi++;                               
  480. ……………………

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

所有资料51hei提供下载:
数字时钟源程序.rar (40.71 KB, 下载次数: 101)
数字时钟仿真.rar (31.77 KB, 下载次数: 95)


评分

参与人数 1黑币 +5 收起 理由
Hey51c + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:456900 发表于 2018-12-28 08:46 | 只看该作者
very good
回复

使用道具 举报

板凳
ID:457851 发表于 2018-12-29 11:06 | 只看该作者
不知道能不能用。
回复

使用道具 举报

地板
ID:521533 发表于 2019-4-25 16:56 | 只看该作者
very good
回复

使用道具 举报

5#
ID:522526 发表于 2019-4-26 20:04 | 只看该作者
这个可以用吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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