×
单片机 > 单片机程序设计 > 详情

基于AT89C51的电子时钟

发布时间:2020-05-29 发布时间:
|
最近闲着没时的时候又写了个基于AT89C51单片机的电子时钟,采用6位12小时制显示,运用了6个共阳数码管。具体功能如下:上午第一个数码管显示A,下午显示P,第四个数码管显示分隔符“-”,并且一秒闪烁一次。按键SW0调节分钟,SW1调节小时。下面是C程序和硬件电路图:
#include
#include
#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();
  }
 }[page]
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;
  }



关键字:AT89C51  电子时钟 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项