专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于AT89C51的电子时钟

作者:佚名   来源:本站原创   点击数:  更新时间:2012年10月27日   【字体:
     最近闲着没时的时候又写了个基于AT89C51单片机的电子时钟,采用6位12小时制显示,运用了6个共阳数码管。具体功能如下:上午第一个数码管显示A,下午显示P,第四个数码管显示分隔符“-”,并且一秒闪烁一次。按键SW0调节分钟,SW1调节小时。下面是C程序和硬件电路图:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit MG=P1^0;
sbit MS=P1^1;
sbit MM=P1^2;
sbit HG=P1^3;
sbit HS=P1^4;
sbit SD=P1^5;
bit shan;
code uchar NUM[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar sec,min,hour;
uchar hour1;
void delay(uint a)
{
 while(a--);
 }
 void init0 ()
 {
  TMOD=0x01;
  TL0=0xb0;
  TH0=0x3c;
  TR0=1;
  EA=1;
  ET0=1;
  }
void display_time()
{
 P0=NUM[min%10];
 MG=1;
 delay(300);
 P1=0x00;
 P0=NUM[min/10];
 MS=1;
 delay(300);
 P1=0x00;
  P0=0xbf;
  MM=shan;
  delay(300);
  P1=0x00;
 
   if(hour>12)
   {
    hour1=hour-12;
 }
 else
 {
 hour1=hour;
  }
   P0=NUM[hour1%10];
   HG=1;
   delay(300);
   P1=0x00;
   P0=NUM[hour1/10];
   HS=1;
   delay(300);
   P1=0x00;
   if(hour>=12)
 {
  P0=0x8c;
     SD=1;
     delay(300) ;
     P1=0x00;
 }
    else
  {
   P0=0x88;
   SD=1;
   delay(300);
   P1=0x00;
   }
}
void FT()
{
 while(P3==0xfe)
   display_time();
   sec=0;
   min++;
   if(min==60)
   min=0;
}
void ST()
{
  while(P3==0xfd)
    display_time();
   hour++;
   if(hour==24)
   hour=0;
}
 main()
{
  init0();
  hour=1;
  while(1)
  {
   display_time();
   if(P3==0xfe) FT();
  if(P3==0xfd) ST();
  }
 }
void zhongduan() interrupt 1
{
 
  uchar a;
  TL0=0xb0;
  TH0=0x3c;
  a++;
  if(a==20)
  {
   a=0;
   shan=!shan;
   sec++;
  }
   if(sec==60)
  {
   sec=0;
   min++;
  }
 if(min==60)
 {
   min=0;
    hour++;
  }
 if(hour==24)
 {
  hour=0;
  }


 

  全部程序和硬件都是本人自己设计和实验通过,源码下载地址:http://www.51hei.com/f/dscdf.rar ,大家有兴趣可以自己按照这个图纸和程序做个,以后本人还会在这个基础上加入日期和闹钟功能!
关闭窗口

相关文章