找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自己制作的一个小型单片机万年历源程序

[复制链接]
跳转到指定楼层
楼主
ID:738413 发表于 2020-4-26 12:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己设计的一个万年历,可以调整时间并且设置闹钟。但是但是不是非常的完善,还需要大家多多指点一下。附件的文档包括源码以及设计思路,欢迎大家多多交流。

说明:利用定时器制作的万年历。打开单片机,利用动态显示显示当前年月日(2020.4.23),利用独立按键设置一个函数判断,进入时间模式。通过键盘扫描,按下s16进入调时模式,s6~s15依次为0~9的数字,为时间的每一位依次输入准确的时间,按下s17开始计时。若要设定闹钟,则按下s18进入闹钟的编辑模式,与调时模式相同,设定时间。接着按下s17确认,再次按下则开始继续计时。若到闹钟设定的时间,则蜂鸣器会发出响声持续一分钟。可以按下s19关闭蜂鸣器,此时时钟继续计时。这个万年历主要使用到计时器依次数码管的动态显示,秒与分满60则要向前进一位。闹钟则主要是与设定的时间进行判断,若相同则蜂鸣器发出响声。我的这个万年历还是属于比较简陋,有许多地方任然需要学习然后不断的去完善它。

单片机源程序如下:
  1. #include<reg51.h>

  2. #define uchar unsigned char

  3. sbit dula=P2^6;
  4. sbit wela=P2^7;
  5. sbit beep=P2^3;
  6. sbit keys2=P3^0;

  7. unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq,y1,y0,m1,m0,d1,d0,mode;
  8. uchar shi20,shi10,fen20,fen10,miao20,miao10,ok=1,wei,dingshi,change,yidingshi;
  9. uchar baoshi,baoshijieshu;
  10. unsigned int pp;
  11. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  12.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

  13. void delay(unsigned char i)
  14. {
  15.   for(j=i;j>0;j--)
  16.     for(k=125;k>0;k--);
  17. }
  18. void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)
  19. {
  20.    dula=0;
  21.    P0=table[shi2];
  22.    dula=1;
  23.    dula=0;
  24.    
  25.    wela=0;
  26.    P0=0xfe;
  27.    wela=1;
  28.    wela=0;
  29.    delay(5);
  30.    
  31.    P0=table[shi1]|0x80;
  32.    dula=1;
  33.    dula=0;
  34.    
  35.    P0=0xfd;
  36.    wela=1;
  37.    wela=0;
  38.    delay(5);

  39.    P0=table[fen2];
  40.    dula=1;
  41.    dula=0;
  42.    
  43.    P0=0xfb;
  44.    wela=1;
  45.    wela=0;
  46.    delay(5);
  47.    
  48.    P0=table[fen1]|0x80;
  49.    dula=1;
  50.    dula=0;
  51.    
  52.    P0=0xf7;
  53.    wela=1;
  54.    wela=0;
  55.    delay(5);
  56.    
  57.    P0=table[miao2];
  58.    dula=1;
  59.    dula=0;
  60.    
  61.    P0=0xef;
  62.    wela=1;
  63.    wela=0;
  64.    delay(5);
  65.    
  66.    P0=table[miao1];
  67.    dula=1;
  68.    dula=0;
  69.    
  70.    P0=0xdf;
  71.    wela=1;
  72.    wela=0;
  73.    delay(5);
  74. }

  75. void keyscan0()
  76. {
  77.     P3=0xfb;
  78.     temp=P3;
  79.     temp=temp&0xf0;
  80.     if(temp!=0xf0)
  81.     {
  82.       delay(10);
  83.       if(temp!=0xf0)
  84.       {
  85.         temp=P3;
  86.         switch(temp)
  87.         {
  88.           case 0xbb:
  89.                ok=0;
  90.                            change=1;
  91.                break;

  92.           case 0x7b:
  93.                ok=1;
  94.                            change=0;
  95.                            dingshi=0;
  96.                break;
  97.          }       

  98.       }
  99.       }
  100.           P3=0xf7;
  101.     temp=P3;
  102.     temp=temp&0xf0;
  103.     if(temp!=0xf0)
  104.     {
  105.       delay(10);
  106.       if(temp!=0xf0)
  107.       {
  108.         temp=P3;
  109.         switch(temp)
  110.         {
  111.           case 0xe7:
  112.                ok=0;
  113.                            dingshi=1;
  114.                break;
  115.                   case 0xd7:
  116.                yidingshi=0;         //取消定时
  117.                break;
  118.          }

  119.                  }
  120.                  }       
  121. }


  122. void keyscan()
  123. {
  124.   {       
  125.     P3=0xfe;
  126.     temp=P3;
  127.     temp=temp&0xf0;
  128.     if(temp!=0xf0)
  129.     {
  130.       delay(10);
  131.       if(temp!=0xf0)
  132.       {       
  133.         temp=P3;
  134.         switch(temp)
  135.         {
  136.           case 0xee:
  137.                key=0;
  138.                            wei++;
  139.                break;

  140.           case 0xde:
  141.                key=1;
  142.                            wei++;
  143.                break;

  144.           case 0xbe:
  145.                key=2;
  146.                            wei++;
  147.                break;

  148.           case 0x7e:
  149.                key=3;
  150.                            wei++;
  151.                break;
  152.          }
  153.          while(temp!=0xf0)
  154.         {
  155.            temp=P3;
  156.            temp=temp&0xf0;
  157.            beep=0;
  158.          }
  159.          beep=1;
  160.       }
  161.     }
  162.     P3=0xfd;
  163.     temp=P3;
  164.     temp=temp&0xf0;
  165.     if(temp!=0xf0)
  166.     {
  167.       delay(10);
  168.       if(temp!=0xf0)
  169.       {
  170.         temp=P3;
  171.         switch(temp)
  172.         {
  173.           case 0xed:
  174.                key=4;
  175.                            wei++;
  176.                break;

  177.           case 0xdd:
  178.                key=5;
  179.                            wei++;
  180.                break;

  181.           case 0xbd:
  182.                key=6;
  183.                            wei++;
  184.                break;

  185.           case 0x7d:
  186.                key=7;
  187.                            wei++;
  188.                break;
  189.          }
  190.          while(temp!=0xf0)
  191.          {
  192.            temp=P3;
  193.            temp=temp&0xf0;
  194.            beep=0;
  195.          }
  196.          beep=1;
  197.       }
  198.       }
  199.     P3=0xfb;
  200.     temp=P3;
  201.     temp=temp&0xf0;
  202.     if(temp!=0xf0)
  203.     {
  204.       delay(10);
  205.       if(temp!=0xf0)
  206.       {
  207.         temp=P3;
  208.         switch(temp)
  209.         {
  210.           case 0xeb:
  211.                key=8;
  212.                            wei++;
  213.                break;

  214.           case 0xdb:
  215.                key=9;
  216.                            wei++;
  217.                break;
  218.          }
  219.         while(temp!=0xf0)
  220.          {
  221.            temp=P3;
  222.            temp=temp&0xf0;
  223.            beep=0;
  224.          }
  225.          beep=1;
  226.       }
  227.       }
  228. }
  229. }
  230. //时间
  231. void timer()
  232. {
  233.         TMOD=0x01;

  234.         TH0=(65536-46080)/256;
  235.         TL0=(65536-46080)%256;
  236.         ET0=1;
  237.         EA=1;
  238.        
  239.         while(1)
  240.         {        keyscan0();
  241.                
  242.                 if(ok==1)
  243.                 {        TR0=1;
  244.                         wei=0;
  245.                
  246.                 if(pp==20)
  247.                 {        pp=0;
  248.                         m++;
  249.                         if(m==60)
  250.                         {
  251.                                 m=0;
  252.                                 f++;
  253.                                 if(f==60)
  254.                                 {
  255.                                         f=0;
  256.                                         s++;
  257.                                         if(s==24)  //为24h一个循环
  258.                                         {
  259.                                                 s=0;
  260.                                         }
  261.                                 }
  262.                         }
  263.                 }
  264.                
  265.                 a0=s%10;
  266.                 a1=s/10;
  267.                 b0=f%10;
  268.                 b1=f/10;
  269.                 c0=m%10;
  270.                 c1=m/10;
  271.                 display(a1,a0,b1,b0,c1,c0);
  272.         }
  273.         else
  274.         {
  275.         if(change==1)
  276.         {        TR0=0;
  277.                 keyscan();
  278.                 if(key!=10)
  279.                 {
  280.                
  281.                 switch(wei)
  282.                 {
  283.                         case 1: if(key<3)                //小时最高位为2
  284.                                         a1=key;
  285.                                         else
  286.                                         wei--;
  287.                                         break;
  288.                         case 2: if(a1==1|a1==0)
  289.                                         a0=key;
  290.                                         else
  291.                                         if(key<5)
  292.                                         a0=key;                   //当小时最高位为2时,低位最高为4
  293.                                         break;
  294.                         case 3: if(key<6)                //分钟最高位为5
  295.                                         b1=key;
  296.                                         else
  297.                                         wei--;
  298.                                         break;
  299.                         case 4: b0=key; break;
  300.                         case 5: if(key<6)                //秒最高位为5
  301.                                         c1=key;
  302.                                         else
  303.                                         wei--;
  304.                                         break;
  305.                         case 6: c0=key; break;
  306.                 }
  307.                 key=10;
  308.                 }
  309.                         m=c1*10+c0;
  310.                         f=b1*10+b0;
  311.                         s=a1*10+a0;
  312.                 display(a1,a0,b1,b0,c1,c0);
  313.         }
  314.         if(dingshi==1)
  315.         {
  316.                 TR0=0;
  317.                 display(shi20,shi10,fen20,fen10,miao20,miao10);       
  318.                 keyscan();
  319.                 if(key!=10)
  320.                 {
  321.                 switch(wei)
  322.                 {
  323.                         case 1: if(key<3)                //小时最高位为2
  324.                                         shi20=key;
  325.                                         else
  326.                                         wei--;
  327.                                         break;
  328.                         case 2: if(a1==1|a1==0)
  329.                                         shi10=key;
  330.                                         else
  331.                                         if(key<5)
  332.                                         a0=key;                   //当小时最高位为2时,低位最高为4
  333.                                         break;
  334.                         case 3: if(key<6)                //分钟最高位为5
  335.                                         fen20=key;
  336.                                         else
  337.                                         wei--;
  338.                                         break;
  339.                         case 4: fen10=key; break;
  340.                         case 5: if(key<6)                //秒最高位为5
  341.                                         miao20=key;
  342.                                         else
  343.                                         wei--;
  344.                                         break;
  345.                         case 6: miao10=key; break;
  346.                 }
  347.                 key=10;
  348.                 }
  349.                 yidingshi=1;
  350.                 display(shi20,shi10,fen20,fen10,miao20,miao10);       
  351.         }       
  352.         }
  353.         if(yidingshi==1)
  354.         {
  355.         if((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10)&&(c1==miao20)&&(c0==miao10))
  356.                 beep=0;
  357.         }
  358.         if(((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10+1)&&(c1==miao20)&&(c0==miao10))||(yidingshi==0))//一分钟报时提示
  359.                 beep=1;
  360.         }
  361.         }

  362. //模式切换
  363. void keypanduan()
  364. {
  365.    mode=1;
  366.    if(keys2==0)
  367.    { delay(10);
  368.    if(keys2==0)
  369.    mode++;
  370.    }
  371. }

  372. void main()
  373. {
  374.    while(1){
  375.       keypanduan();
  376.    switch (mode){
  377.    case 1:{
  378.            y1=2;
  379.         y0=0;
  380.         m1=0;
  381.         m0=4;
  382.         d1=2;
  383.         d0=3;
  384.         display(y1,y0,m1,m0,d1,d0);
  385.    } break;
  386.    case 2:{
  387.    timer();
  388.    } break;
  389.    }
  390.    }
  391. }

  392. void time0() interrupt 1
  393. {        TH0=(65536-46080)/256;
  394.         TL0=(65536-46080)%256;
  395.         pp++;
  396. }
复制代码


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

使用道具 举报

沙发
ID:793706 发表于 2020-7-7 12:06 | 只看该作者
大佬,有Proteus原理图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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