分享

基于单片机的电子时钟设计

 共同成长888 2016-05-28


上图是Proteus仿真图,其中反相器用74lHC14,排阻用10K的,晶振用12MHZ的,电阻R1-R8用200欧的即可。但在实际制作时数码管可以用两个四位一体共阳极的,这样连接电路会更加方便。可以用三极管代替反相器,这样可以节约成本,但代替后无法用Proteus仿真出来,下图为代替后的图片,三极管用常用的9012或者9015即可,经本人实际验证效果非常好。



下图为原理图:




下图为实物图



以下为源程序

#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={             //不带小数点的数码管编码
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};
uchar code table1[]={             //带小数点的数码管编码
0x40,0x79,0x24,0x30,
0x19,0x12,0x02,0x78,
0x00,0x10};

uchar shi=12,second,minute;
uint num,num1,num2,num3;
sbit k1=P1^4;
sbit k2=P1^5;
void display();
void keyscan();
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
 for(y=110;y>0;y--);
}

void init()
{
 TMOD=0x01;
 
    TH0=(65536-50000)/256;
 TL0=(65536-50000)%6;
 EA=1;
 ET0=1;
 TR0=1;
}

void main()
{
 init();
 while(1)
 {
   keyscan();
  display();
 
 }
}

 

void timer0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%6;
 num++;
 if(num==20)
 {
  num=0;
  second++;
  if(second==60)
   {
    second=0;
    minute++;
   }
  if(minute>=60)
   {
    minute=0;
    shi++;
   }
   if(shi>=24)
   shi=0;

 }
}

void display()
{
 P2=0xdf;
 P0=table[second];
 delay(2);
 P2=0xff;

 P2=0xef;
 P0=table[second/10];
 delay(2);
 P2=0xff;

 P2=0xf7;
 P0=table1[minute];
 delay(2);
 P2=0xff;

 P2=0xfb;
 P0=table[minute/10];
 delay(2);
 P2=0xff;

 P2=0xfd;
 P0=table1[shi];
 delay(2);
 P2=0xff;
 
 P2=0xfe;
 P0=table[shi/10];
 delay(2);
 P2=0xff; 
}

void keyscan()
{
 if(k1==0)
 {
  delay(10);
        if(k1==0)
   {
    shi++;
    while(!k1);
   }
 }
 if(k2==0)
 
  delay(10);
  if(k2==0)
  {
   minute++;
   while(!k2);
  }
  
 }
 
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约