專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

基于AT89C51的電子時鐘

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2012年10月27日   【字體:
     最近閑著沒時的時候又寫了個基于AT89C51單片機(jī)的電子時鐘,采用6位12小時制顯示,運用了6個共陽數(shù)碼管。具體功能如下:上午第一個數(shù)碼管顯示A,下午顯示P,第四個數(shù)碼管顯示分隔符“-”,并且一秒閃爍一次。按鍵SW0調(diào)節(jié)分鐘,SW1調(diào)節(jié)小時。下面是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;
  }


 

  全部程序和硬件都是本人自己設(shè)計和實驗通過,源碼下載地址:http://www.torrancerestoration.com/f/dscdf.rar ,大家有興趣可以自己按照這個圖紙和程序做個,以后本人還會在這個基礎(chǔ)上加入日期和鬧鐘功能!
關(guān)閉窗口

相關(guān)文章