用51单片机设计一个电子钟

1 24小时走时
2 6位数码管显示时分秒
3 3个按键,2个分别用于时分的调整,1个用于是否允许调整
4 写出设计方案,画出电路原理图,编写程序

巧了,国亲无聊做了一个玩玩,给你看看把,其实电子钟挺简单的,下面是程序:

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit ch=P3^2;

sbit key=P3^5;

sbit key1=P3^4;

uchar t0,numn,numy,numr,nums,numf,numm,sw,w,q,b,s,g,sw1,w1,q1,b1,s1,g1,rq,temp,x;

uint u;

void init();

void display(uchar,uchar,uchar,uchar,uchar,uchar);

void delay(uint z)

{

 uint x,y; 

 for(x=z;x>0;x--)

  for(y=70;y>0;y--);

}

void main()

{

 init();

 while(1)

 {

  if(rq==1)

  {

   if(rq==1)

      display(sw,w,q,b,s,g);

  }

  else if(rq==2)

  {

   if(rq==2)

   display(sw1,w1,q1,b1,s1,g1);

  }

  else if(rq==3)

   {

    if(rq==3)

     display(w,w,w,w,w,w);

   }

  else if(rq==4)

  {

   uchar i;

   temp=0x01;

   for(i=0;i<8;i++)  

    {

    P1=~temp; 

    delay(100);   

    temp<<=1; 

    }

   temp=0x80;

   for(i=0;i<8;i++)   

    {

    P1=~temp; 

    delay(100);    

    temp>>=1;

    }

   temp=0x01;

   for(i=0;i<8;i++)  

    {

    P1=temp;

    delay(100);    

    temp<<=1;

    }

   temp=0x7F;

   for(i=0;i<8;i++)  

    {

    P1=temp;

    delay(100); 

    temp>>=1;

   }

  }

  else

   rq=1;

 }

}

void init()

{

 rq=1;

 x=1;

 nums=22;

 numf=0;

 numm=0;

 numn=9;

 numy=10;

 numr=15;

 TMOD=0x11;

 TH0=(65536-50000)/256;

 TL0=(65536-50000)%256;

 IT0=1;

 IT0=2;

 EA=1;

 EX0=1;

 EX1=1;

 ET0=1; 

  TR0=1;

 ET1=1;//IE=0x82 //CPU开中断,CT0开中断 

}

void timer0() interrupt 1

{

 TH0=(65536-50000)/256;

 TL0=(65536-50000)%256;

 t0++;

 if(key==0)

 {

  delay(50);

  if(key==0)

  { 

   x++;

   while(key==0);

  }

 }

  if(x==2&rq==1)

  {

   //P0=0xf3;

   if(key1==0)

    {

     numf++;

     while(key1==0);

    }

  }

  else if(x==3&rq==1)

  {

  // P0=0xfc;

   if(key1==0)

    {

     nums++;

     while(key1==0);

    }

  }

  else if(x==2&rq==2)

  {

  // P0=0xcf;

   if(key1==0)

    {

     numr++;

     while(key1==0);

    }

  }

  else if(x==3&rq==2)

  {

  // P0=0xf3;

   if(key1==0)

    {

     numy++;

     while(key1==0);

    }

  }

  else if(x==4&rq==2)

  {

  // P0=0xfc;

   if(key1==0)

    {

     numn++;

     while(key1==0);

    }

  }

  else

  {

   x=1;

  }

 if(t0==20)

  {

   t0=0;

   numm++;

  }

  if(numm==60)

  {

   numm=0;

   numf++;

  }

  if(numf==60)

  {

   for(u=500;u>0;u--)

   {

    bell=0;

    delay(1);

    bell=1;

    delay(1);

   }

   numf=0;

   nums++;

  }

  if(nums==24)

  {

   nums=0;

   numr++;

  }

  if(numr==30)

  {

   numr=0;

   numy++;

  }

  if(numy==12)

  {

   numy=0;

   numn++;

  }

  if(numn==100)

  {

   numn=0;

  }

   g=numm%10;

   s=numm/10;

   b=numf%10;

   q=numf/10;

   w=nums%10;

   sw=nums/10;

   g1=numr%10;

   s1=numr/10;

   b1=numy%10;

   q1=numy/10;

   w1=numn%10;

   sw1=numn/10;

}

void exert0() interrupt 0

{

 delay(50);

 rq++;

 while(ch==0);

}

void t0int() interrupt 3

{

 TR1=0;

 bell=!bell;

 TH1=timer0h;

 TL1=timer0l;

 TR1=1;

}

void exert1() interrupt 2

{

 rq=100;

}

void display(uchar sw,uchar w,uchar q,uchar b,uchar s,uchar g)

{

 P2=tabdu[sw];

 P0=tabwe[0];

 delay(5);

 P0=0xff;

 

 P2=tabdu[w];

 P0=tabwe[1];

 delay(5);

 P0=0xff;

 P2=tabdu[q];

 P0=tabwe[2];

 delay(5);

 P0=0xff;

 P2=tabdu[b];

 P0=tabwe[3];

 delay(5);

 P0=0xff;

 P2=tabdu[s];

 P0=tabwe[4];

 delay(5);

 P0=0xff;

 P2=tabdu[g];

 P0=tabwe[5];

 delay(5);

 P0=0xff;

}

下面这个是电路图,图我没有画啊,不过我用仿真去做,应该跟电路图差不多了,你可以参考下,可以实现流水灯,闹铃,日期,时间,等功能,上面给你的是按照你的要求,另外我懒得改了所以多了个功能就是可以看日期,你看上面的程序,第一个按钮ch,按一下查看日期,再按一下查看温度(被删了,随机现在是随机显示一个数字),再按一下是流水灯,再按一下又回到时间,另外两个键key/key1;按key是选择锁定分还是时,如果你当前显示的是日期的话就是顺序锁定日,月,年,按key1调整,图上显示的是22点00分09秒,就这样了

设计方案的话..........呵呵,AT89S52+6个数码管+11.0592晶振+2个30P电容+3个按钮+1个10UF电容如图连接,你自己去写方案把,分数给那么少,就只帮你那么多了

温馨提示:答案为网友推荐,仅供参考