新手开发----电子钟/万年历  练练手的。。。
神之觉醒2011/10/02电子技术 IP:广西
那天没事。。。随便翻翻    正好翻见上次捡来的两片51~~好像是抢答器的~~~还带了电路板  于是就想让它干活吧。。。。。 904_c5181313248258dae7467ccf4b097.gif
电子钟/万年历  8位数码管  可以切换   时钟部份的排列是:星期   时   分   秒    万年历部份的排列是: 年  月  日  。。。。   数码管显示占了P0   和  P1   IO口。。。

按键J3是切换 电子钟/万年历 的~~  

J2是位选择  每按一次 右移一位 是调时间用的。。。  

当J2启动位选择时  J1的作用为被选位加加~~~   J3的作用切换为被选位减减~~~

J4是计时开始/暂停

这个是89C51RC~~89C52RC也行~~硬件电路随便接一下IO口就OK了    主要是程序部份 边想边写  弄了几天[s:273]

还有那个定时器的装入初值。。。要细调。。。现在调到了一天只误差几秒。。。调得差不多了。。。 等下再把程序发上来。。。。  

程序下载要串口电平转换。。。 我是用网上流传的3极管代MAX232的电路下载的。。。波特率弄到顶也很稳定。。。下载没失败过一次。。。

这里说下功耗。。。 本人测得是5v  100MA   0.5瓦。。。  另外说下。。晶振一定要24.000M  电容22P 不然要重新调过精确秒。。。 本人调了几天呢。。。 现在一天没什么误差了。。。

1064_de9f131757265797a30ac78aabe5a.jpg

1064_99b51317541347a8c4829168cff55.jpg 1064_5514131754131213c8d8d7724c594.png

1064_4c971317541778122311871ff4c30.jpg 1064_1cd1131754173165961c59c7d5a03.jpg 1064_288a1317541719c7b3b4d3765997b.jpg 1064_530613175417103eeb9f94c0fffd2.jpg 1064_49a5131754169118ef38dbf73a6a1.jpg 1064_1d52131754168690557cba02865b6.jpg 1064_97c91317541657e4648ae99aa66db.jpg
1064_ccb21317541767d3b1b4d5a169dda.jpg 1064_231213175417510150e425a899dcc.jpg 1064_b8dc1317541739237f52e5f81bade.jpg 1064_7a9e131754173480825e2a20d1ecd.jpg 1064_5aa313175416474c3334dcda002b2.jpg
+10  科创币    ry7740kptv    2011/10/04 其实用1602液晶很好的。。。
+15  科创币    十九    2011/12/12 这年头神马都捡得到啊
+5  科创币    hefanghua    2011/12/13 最好加上时钟芯片
来自:电子信息 / 电子技术
6
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
litianyue
13年5个月前 IP:未同步
325798
这也能捡到。。。不过这样烧录不是很麻烦。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
神之觉醒作者
13年5个月前 IP:未同步
326063

attachment icon 程序文件.rar 132.92KB RAR 20次下载

菜鸟写的程序。。。 没什么高级。。。至少没有BUG   高手勿喷。。。 904_c5181313248258dae7467ccf4b097.gif



#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
code uint8 x[] = {0x80,0xf2,0x48,0x60,0x32,0x24,0x04,0xf0,0x00,0x20,0xff};  
code uint8 y[] = {0xf2,0x48,0x60,0x32,0x24,0x04,0x00};                    //星期专用。。。

uint8 ss1,ss2,ss3,ss4,ss5,ss6,ss7,ss8,        
      
      k,k1,k2,k3,k4,k5,k6,k7,k8 = 1,k9 = 10,k10 = 1,k11 = 10,k12 = 1,k13 = 1,k14,k15 = 2,    
    
   t,t1 = 1,q;


void shizhongjinwei()  //时钟进位函数  中断调过去刷一下。。。。。~
{
  if(t == 4)  //秒 十分位
  {
  t = 0;k++;
  }
  
  if(k == 10)  //秒 个位
  {
  k = 0;k1++;
  }
  
  if(k1 == 10)  //秒 十位
  {
  k1 = 0;k2++;
  }
  
  if(k2 == 6)  //分 个位
  {
  k2 = 0;k3++;
  }
  
  if(k3 == 10)  //分 十位
  {
  k3 = 0;k4++;
  }
  
  if(k4 == 6)  //时 个位
  {
  k4 = 0;k5++;      
  }
  
  if(k5 == 10)  //时 十位
  {
  k5 = 0;
    if(k6 == 10)
  {
   k6 = 0;
  }
  k6++;
  }

if(k6 == 2)
   {
   if(k5 == 4)
   {
   k6 = 0;k5 = 0;k7++;k8++;  //k8++日期进位
   }
   }
   if(k6 == 0)    //零点跳到一点时灭掉第7位数码管 亮着那个零 浪费电啊???- -
   {
   if(k5 == 1)
   {
   k6 = 10;
   }
   }

   if(k7 == 7)    //星期。。。
   {
   k7 = 0;
   }  
}

void rilijinwei()    //日历进位函数  中断调过去刷一下~~。。。。。
{
static uint8 n;  //这里定uint8  不会影响程序。。。 不用uint16有原因的。。。会影响时钟的精确
n = k15 * 1000 + k14 * 100 + k13 * 10 + k12;   //不要把这个代到下面if里面的n 。。。原因同上
    if(k8 == 10)   //日
{
k8 = 0;
    if(k9 == 10)
    {
    k9 = 0;
    }
k9++;
}    

   if(t1 == 1 || t1 == 3 || t1 == 5 || t1 == 7 || t1 == 8 || t1 == 10 || t1 == 12)   //大月31天++进位
   {
     if(k9 == 3)
     {
        if(k8 == 2)
        {
        k9 = 10;k8 = 1;k10++;t1++;
        }
     }
   }
   if(t1 == 4 || t1 == 6 || t1 == 9 || t1 == 11)   //小月30天++进位
   {
     if(k9 == 3)
     {
        if(k8 == 1)
        {
        k9 = 10;k8 = 1;k10++;t1++;
        }
     }
   }

   if(n % (n % 100 ? 4 : 400)  == 0) //判断闰年 是就2月29天++进位~~~
   {
         if(t1 == 2)
         {
            if(k9 == 3)
            {
              if(k8 >= 0)
              {
               k9 = 10;k8 = 1;k10++;t1++;
              }
            }
         }
    }
    else                       //不是闰年就28天++进位  ~~~
    {
         if(t1 == 2)
         {
            if(k9 == 2)
            {
               if(k8 == 9)
               {
               k9 = 10;k8 = 1;k10++;t1++;
               }
            }
      if(k9 == 3)
            {
               if(k8 >= 0)
               {
               k9 = 10;k8 = 1;k10++;t1++;
               }
            }
         }
    }
if(k10 == 10)     //月
{
k10 = 0;
    if(k11 == 10)
    {
    k11 = 0;
    }
k11++;
}
if(k11 == 1)
{
    if(k10 == 3)
    {
    k11 = 10;k10 = 1;t1 = 1;k12++;
    }
}

if(k12 == 10)  //年
{
k12 = 0;k13++;
}
if(k13 == 10)
{
k13 = 0;k14++;
}
if(k14 == 10)
{
k14 = 0;k15++;
}
if(k15 == 10)
{
k15 = 0;
}

}

main()
{
uint8 ss9 = 1;
uint16 j;

TMOD  = 0x11;  
TH0   = 0x3c;   //定时器0(0.025秒的发生器 专用的)  做了调校。。。不然会有误差  = =~!
TL0   = 0xbc;
TR0   = 1;    
TH1   = 0xf2;   //定时器1(数码管动态扫描和进位函数刷新)。。。。。。
TL1   = 0x0c;
TR1   = 1;    
ET0   = 1;    
ET1   = 1;    
EA    = 1;    

  while(1)     //按键控制部份。。。~~~~
  {
    
  if(ss9 == 1)
  {
    if(P2 == 0xf7)        //按键1 显示切换   P2.3 IO口。。。
    {
    for(j = 0;j < 7000;j++);  
   if(P2 == 0xf7)
   {
  
   q++;
     if(q == 2)
     {
     q = 0;
     }
   }
  
  while(P2 == 0xf7);
    }
  }

  if(ss9 == 0)
  {
    if(P2 == 0xf7)        //按键1 当数码管为位选择时 切换为 被选位减减   P2.3 IO口。。。
    {
    for(j = 0;j < 7000;j++);  
   if(P2 == 0xf7)
   {
     if(q == 0)
    {
        if(ss1 == 1)
     {
       if(k7 >= 1)
       {
       k7--;
       }
     }
     if(ss2 == 1)
     {
       if(k6 == 1 || k6 == 2)
       {
       if(k5 == 0)
       {
          k6--;k5 = 10;
         if(k6 == 0)
      {
      k6 = 10;
      }
       }      
       }
       if(k5 >= 1)
       {
       k5--;
          if(k5 == 0)
       {
           if(k6 == 10)
           {
           k6 = 0;
           }
       }
       }  
     }
     if(ss4 == 1)
     {
       if(k4 >= 1)
       {
       k4--;
       }
     }
     if(ss5 == 1)
     {
       if(k3 >= 1)
       {
       k3--;
       }
     }
     if(ss6 == 1)
     {
       if(k2 >= 1)
       {
       k2--;
       }
     }
     if(ss7 == 1)
     {
       if(k1 >= 1)
       {
       k1--;
       }
     }
     if(ss8 == 1)
     {
       if(k >= 1)
       {
       k--;
       }
     }
    }
    if(q == 1)
    {
     if(ss1 == 1)
     {
       if(k15 >= 1)
         {
         k15--;
         }
     }
     if(ss2 == 1)
     {
       if(k14 >= 1)
       {
       k14--;
       }
     }
     if(ss3 == 1)
     {
       if(k13 >= 1)
       {
       k13--;
       }
     }
     if(ss4 == 1)
     {
       if(k12 >= 1)
       {
       k12--;
       }
     }
     if(ss5 == 1)
     {
       if(k11 == 1)
       {
       if(k10 == 0)
       {
          k11--;k10 = 10;
         if(k11 == 0)
      {
      k11 = 10;
      }
       }      
       }
       if(k11 == 1)
       {
           if(k10 >= 1)
           {
           k10--;  
           }
       }
       if(k11 == 10)
       {
        if(k10 >= 2)
           {
           k10--;  
           }
       }
       if(t1 >= 2)
       {
       t1--;  
       }    
     }
     if(ss7 == 1)
     {
       if(k9 == 1 || k9 == 2 || k9 == 3)
       {
       if(k8 == 0)
       {
          k9--;k8 = 10;
         if(k9 == 0)
      {
      k9 = 10;
      }
       }      
       }
       if(k9 == 1 || k9 == 2 || k9 == 3)
       {
           if(k8 >= 1)
           {
           k8--;  
           }
       }
       if(k9 == 10)
       {
        if(k8 >= 2)
           {
           k8--;  
           }
       }  
     }
    }
   }
  
  while(P2 == 0xf7);
    }
  }

    if(P2 == 0xfb)       //按键2 数码管位的选择(调时间用)   P2.2 IO口。。。
    {
    for(j = 0;j < 7000;j++);    
   if(P2 == 0xfb)
   {
  
   ss1++;ss2++;ss3++;ss4++;ss5++;ss6++;ss7++;ss8++;ss9++;
       if(ss1 == 1)
       {
    ss2 = 0;ss3 = 0;ss4 = 0;ss5 = 0;ss6 = 0;ss7 = 0;ss8 = 0;ss9 = 0;
       }
    if(ss2 == 1)
    {
      if(q == 1)
     {
     ss3 = 0;
     }
    ss4 = 0;ss5 = 0;ss6 = 0;ss7 = 0;ss8 = 0;ss9 = 0;
    }
    if(ss3 == 1)
    {
    ss4 = 0;ss5 = 0;ss6 = 0;ss7 = 0;ss8 = 0;ss9 = 0;
    }
    if(ss4 == 1)
    {
    ss5 = 0;ss6 = 0;ss7 = 0;ss8 = 0;ss9 = 0;
    }
    if(ss5 == 1)
    {
     if(q == 0)
     {
     ss6 = 0;
     }
    ss7 = 0;ss8 = 0;ss9 = 0;
    }
    if(ss6 == 1)
    {
    ss7 = 0;ss8 = 0;ss9 = 0;
    }
    if(ss7 == 1)
    {
     if(q == 0)
     {
     ss8 = 0;
     }
    ss9 = 0;
    }
    if(ss8 == 1)
    {
    ss9 = 0;
    }
    if(ss9 == 1)
    {
    ss1 = 0;
    }
   }
    while(P2 == 0xfb);
    }

    if(P2 == 0xfd)      //每按一次数码管的被选位加加   P2.1 IO口。。。
    {
    for(j = 0;j < 7000;j++);  
   if(P2 == 0xfd)
   {
       if(q == 0)
    {
        if(ss1 == 1)
     {
     k7++;
     }
     if(ss2 == 1)
     {
     k5++;
     }
     if(ss4 == 1)
     {
     k4++;
     }
     if(ss5 == 1)
     {
     k3++;
     }
     if(ss6 == 1)
     {
     k2++;
     }
     if(ss7 == 1)
     {
     k1++;
     }
     if(ss8 == 1)
     {
     k++;
     }
    }
    if(q == 1)
    {
     if(ss1 == 1)
     {
     k15++;
     }
     if(ss2 == 1)
     {
     k14++;
     }
     if(ss3 == 1)
     {
     k13++;
     }
     if(ss4 == 1)
     {
     k12++;
     }
     if(ss5 == 1)
     {
     k10++;t1++;
     }
     if(ss7 == 1)
     {
     k8++;
     }
    }
   }
    while(P2 == 0xfd);
    }

    if(P2 == 0xfe)       //时间计时 开始/暂停 P2.0 IO口。。。
    {
    for(j = 0;j < 7000;j++);  
   if(P2 == 0xfe)
   {
   TR0 = ~TR0;
   }
  while(P2 == 0xfe);
    }
  
  }

}


void zhongduan1() interrupt 1    //定时器0中断函数  0.025秒时钟计时~~~~
{
TH0 = 0x3c;
TL0 = 0xbc;

t++;
  
}

void zhongduan2() interrupt 3      //定时器1中断函数  动态扫描和显示切换~~~~~
{
static uint8 s1,tt,r;
   TH1 = 0xf2;     //定时刷新560hz  每个数玛管刷70hz就OK了。。不要太高。。否则。。。
      TL1 = 0x0c;
   tt++;
   s1++;
  
      
   if(tt == 50)
   {
   tt = 0;r++;
     if(r == 2)
  {
  r = 0;
  }
   }
  
  shizhongjinwei();    //刷新时钟进位函数     刷560hz是够的。。。
  rilijinwei();     //刷新日历进位函数

       if(s1 == 1)     //刷第1位数码管
       {
   if(ss8 == 0,2)
   {
       if(q == 0)
       {
       P0 = 0xfe[s:9]1 = x[k];
       }
       if(q == 1)
       {
       P0 = 0xfe[s:9]1 = x[k8];
       }
   }          
              
   if(ss8 == 1)        
      {  
     if(r == 1)
     {
     P0 = 0xfe[s:9]1 = x[10];
     }
     if(r == 0)
     {
       if(q == 0)
       {
       P0 = 0xfe[s:9]1 = x[k];
       }
       if(q == 1)
       {
       P0 = 0xfe[s:9]1 = x[k8];
       }
       }
   }
       }  
  
      
       if(s1 == 2)     //刷第2位数码管
       {
    
     if(ss7 == 0,2)
   {
       if(q == 0)
       {
       P0 = 0xfd[s:9]1 = x[k1];
       }
       if(q == 1)
       {
       P0 = 0xfd[s:9]1 = x[k9];
       }
   }
    
   if(ss7 == 1)
   {
     if(r == 1)
     {
     P0 = 0xfd[s:9]1 = x[10];
     }
     if(r == 0)  
     {
    if(q == 0)
       {
       P0 = 0xfd[s:9]1 = x[k1];
       }
       if(q == 1)
       {
       P0 = 0xfd[s:9]1 = x[k9];
       }
          }
   }
       }    

    if(s1 == 3)    //刷第3位数码管
    {
  
   if(ss6 == 0,2)
   {
    if(q == 0)
       {
       P0 = 0xfb[s:9]1 = x[k2];
       }
       if(q == 1)
       {
       P0 = 0xfb[s:9]1 = x[k10];
       }
   }
   if(ss6 == 1)
   {
     if(r == 1)
     {
     P0 = 0xfb[s:9]1 = x[10];
     }
     if(r == 0)
     {
       if(q == 0)
       {
       P0 = 0xfb[s:9]1 = x[k2];
       }
       if(q == 1)
       {
       P0 = 0xfb[s:9]1 = x[k10];
       }
     }
   }
    
    }
    
    if(s1 == 4)     //刷第4位数码管
    {
   if(ss5 == 0,2)
   {
       if(q == 0)
       {
       P0 = 0xf7[s:9]1 = x[k3];
       }
       if(q == 1)
       {
       P0 = 0xf7[s:9]1 = x[k11];
       }
   }
   if(ss5 == 1)
   {
     if(r == 1)
     {
     P0 = 0xf7[s:9]1 = x[10];
     }
     if(r == 0)
     {
       if(q == 0)
       {
       P0 = 0xf7[s:9]1 = x[k3];
       }
       if(q == 1)
       {
       P0 = 0xf7[s:9]1 = x[k11];
       }
     }
   }
    
    }

    if(s1 == 5)      //刷第5位数码管
    {
   if(ss4 == 0,2)
   {
    if(q == 0)
       {
       P0 = 0xef[s:9]1 = x[k4];
       }
       if(q == 1)
       {
       P0 = 0xef[s:9]1 = x[k12];
       }
   }
   if(ss4 == 1)
   {
     if(r == 1)
     {
     P0 = 0xef[s:9]1 = x[10];
     }
     if(r == 0)
     {
       if(q == 0)
       {
       P0 = 0xef[s:9]1 = x[k4];
       }
       if(q == 1)
       {
       P0 = 0xef[s:9]1 = x[k12];
       }
     }
   }
    
    }

    if(s1 == 6)      //刷第6位数码管
    {
   if(ss3 == 0,2)
   {
      if(q == 0)
       {
       P0 = 0xdf[s:9]1 = x[k5];
       }
       if(q == 1)
       {
       P0 = 0xdf[s:9]1 = x[k13];
       }
   }
   if(ss3 == 1)
   {
     if(r == 1)
     {
     P0 = 0xdf[s:9]1 = x[10];
     }
      
     if(r == 0)
     {
       if(q == 0)
       {
       P0 = 0xdf[s:9]1 = x[k5];
       }
       if(q == 1)
       {
       P0 = 0xdf[s:9]1 = x[k13];
       }
        }
     }
    }

    if(s1 == 7)    //刷第7位数码管
    {
   if(ss2 == 0,2)
   {
       if(q == 0)
       {
       P0 = 0xbf[s:9]1 = x[k6];
       }
       if(q == 1)
       {
       P0 = 0xbf[s:9]1 = x[k14];
       }
   }
   if(ss2 == 1)
   {
     if(r == 1)
     {
     P0 = 0xbf[s:9]1 = x[10];
     }
     if(r == 0)
     {
       if(q == 0)
       {
       P0 = 0xbf[s:9]1 = x[k6];
       }
       if(q == 1)
       {
       P0 = 0xbf[s:9]1 = x[k14];
       }
     }
      }
    
    }

    if(s1 == 8)      //刷第8位数码管
    {
   if(ss1 == 0,2)
   {
       if(q == 0)
       {
       P0 = 0x7f[s:9]1 = y[k7];
       }
       if(q == 1)
       {
       P0 = 0x7f[s:9]1 = x[k15];
       }
   }
   if(ss1 == 1)
   {
     if(r == 1)
     {
     P0 = 0x7f[s:9]1 = x[10];
     }
     if(r == 0)
     {
       if(q == 0)
       {
       P0 = 0x7f[s:9]1 = y[k7];
       }
       if(q == 1)
       {
       P0 = 0x7f[s:9]1 = x[k15];
       }
     }
     }
    s1 = 0;
    }
}
+20
科创币
ry7740kptv
2011-10-04
表示我也在做。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
神之觉醒作者
13年5个月前 IP:未同步
326365
实测运行了一天~~~ 和电脑时间校对误差为正零点几秒/天。。。
下面是演示视频。。。

点击此处查看视频
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
heikeji06
13年2个月前 IP:未同步
343815
学习一下  感谢楼主
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
神之觉醒作者
13年2个月前 IP:未同步
343954
回 4楼(heikeji06) 的帖子
额~~~  那个码有个BUG  懒得改了~ [s:275]      不不不~[s:108]    应该是2100年会进BUG~[s:108]   诶~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
神之觉醒
学者 机友 笔友
文章
71
回复
1163
学术分
4
2011/08/12注册,2年0个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}