基于51单片机的多功能时钟设计 源代码

/***********************************/

/*  时间2019.12.20,地点:dq218    转载请说明出处  */

/***********************************/


#include
#define uChar unsigned char
#define uInt unsigned int
#define d 60
#define q 20
sbit Key1 = P3^0;  //规定四个按键‖第五个按键K5为常开触点,按下后不弹起
sbit Key2 = P3^1; 
sbit Key3 = P3^2; 
sbit Key4 = P3^3; 
sbit Buzzer=P1^1;
 
uChar a[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; 
uChar b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
uChar second=50,minute=30,hour=21,year=19,month=12,day=10,flag=0,flag1=0,count;


/***************延时函数***************/

void Delay(uInt t)
  {
   while(t)
    {
      t--;
    }
  }
/***************显示时间函数***************/
	
void Dispaly1(uChar second,uChar minute,uChar hour)
  {
    P2=b[0];
    P0=a[hour/10];
    Delay(d);
    
    P2=b[1];
    P0=a[hour%10];
    Delay(d);
    
    P2=b[2]; 
    P0=0x40; 
    Delay(d);
    
    P2=b[3]; 
    P0=a[minute/10]; 
    Delay(d);
    
    P2=b[4];
    P0=a[minute%10]; 
    Delay(d);
    
    P2=b[5]; 
    P0=0x40; 
    Delay(d);
    
    P2=b[6]; 
    P0=a[second/10]; 
    Delay(d);
    
    P2=b[7];; 
    P0=a[second%10]; 
    Delay(d);
  }
/***************显示日期函数***************/
void Dispaly2(uChar day,uChar month,uChar year)
 { 
   P2=b[0];             //第一位
   P0=a[2];        
   Delay(d);
   
   P2=b[1];             //第二位
   P0=a[0];
   Delay(d);
   
   P2=b[2];              //第三位
   P0=a[year/10]; 
   Delay(d);
   
   P2=b[3];             //第四位
   P0=a[year % 10]; 
   Delay(d);
   
   P2=b[4]; 
   P0=a[month/10];             //第五位
   Delay(d);
   
   P2=b[5]; 
   P0=a[month%10];             //第六位
   Delay(d);
   
   P2=b[6];              //第七位
   P0=a[day/10]; 
   Delay(d);
   
   P2=b[7];             //第八位
   P0=a[day%10]; 
   Delay(d);
 }
/****************按键函数1****************/
 /***************功能:修改时间**********/
void Keyscan1()
{
  static uChar i=0,j=0; 
  if(Key1==0) 
   {
    Delay(q); 
    if(Key1==0) 
    while(!Key1); 
    i++;
   }
  
  if(i%2==1)  //关闭定时器
   {
    TR0=0;
   }
  if(i%2==0)  //打开定时器
   {
    TR0=1;
   }
  
  if(Key2==0) 
   {
    Delay(q); 
    if(Key2==0)
    while(!Key2);
    j++; 
   }
  if(j%3==0&&i%2==1)  //修改时分秒
  {
    if(Key3==0)
     {
      Delay(q); 
      if(Key3==0)
      while(!Key3);
      second++;
      if(second==60)
      second=0;
     }
  }
	
  if(j%3==1&&i%2==1)         //当k1按下后才能修改时间
   {
    if(Key3==0)
    {
    Delay(q); 
    if(Key3==0)
    while(!Key3);
    minute++;
    if(minute==60)
    minute=0; 
   }
  }
	 
  if(j%3==2&&i%2==1)
   {
    if(Key3==0)
     { 
       Delay(q); 
       if(Key3==0)
       while(!Key3);
       hour++;
       if(hour==24)
       hour=0; 
     }
   }
}
/****************按键函数2****************/
/****************功能:修改日期***********/
void Keyscan2()
 {
  static uChar m=0,n=0; 
  if(Key1==0)           //K1按下后才能修改日期或时间
   {
    Delay(d); 
    if(Key1==0)
    while(!Key3);
    m++;
   }
	 
  if(m%2==1) 
   {
    TR0=0;                //定时器关
   }
  
  if(m%2==0)
   {
    TR0=1;                //定时器开
   }
	 
  if(Key2==0)       //K2功能:选择修改 “时分秒“ 或者 ”年月日”
   {
     Delay(10); 
     if(Key2==0)
     while(!Key2);
     n++; 
   }
  
  if(n%3==0)             //选择修改天数
   {
  if(Key3==0)       
  {
    Delay(d); 
    if(Key3==0)
    while(!Key3);
    day++;
    if(day==30)
    day=0;
  }
   }
	 
  if(n%3==1)            //选择修改月份
   {
  if(Key3==0)
    { 
      Delay(10); 
      if(Key3==0)
      while(!Key3);
      month++;
      if(month==12)
      month=0; 
    }
   }
	 
  if(n%3==2)                 //选择修改年份
   {
   if(Key3==0)
    { 
     Delay(d); 
     if(Key3==0)
     while(!Key3);
     year++;
     if(year==99)
     year=0; 
    }
   }
 }


/***************主函数***************/

void main()
{						
TMOD=0x01; 	 
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;  /*10ms*/
EA=1;
ET0=1;
TR0=1;
	
	
 while(1)
 {
    static uChar h=0;
    
    if(Key4==0)                 //K4功能:12小时/24小时/日期切换
      {
       Delay(10); 
       if(Key4==0)
		 	  {
           while(!Key4);
           h++;
			  }
      }
		if(h%3==0)
      {
       Dispaly1(second,minute,hour);      //显示24小时制
       Keyscan1(); 
      }  
    if(h%3==1)
      {
       Dispaly1(second,minute,hour-12);   //显示12小时制
       Keyscan1(); 
      }  
    if(h%3==2)
      {
       Dispaly2(year,month,day);          //显示日期
       Keyscan2();
      }
     if(Key3==0)
      { 
       Delay(d); 
       if(Key3==0)
       while(!Key3);
		   flag++;
      }			
    	
	   if(flag%2==0)  //记录K3按下后flag加一
		 {
			 flag1=0;     
	   }
	   if(flag%2==1)
	   {
	   	flag1=1;		
	   }
			
/***********闹钟设定时间21:31开始响,无人应答30s后关闭*/
		 
		if(minute==31&&(second>0&&second<30)&&hour==21&&flag1==0)
			Buzzer=0;//蜂鸣器响
		else
			Buzzer=1;//蜂鸣器关
  }
}


/**************中断函数***************/
void time0_int(void) interrupt 1
{
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 count++;
if(count==100) //10ms*100=1s
    {
     count=0;
     second++;
    if(second==60)      //秒归零
       {
        second=0;
        minute++;
       if(minute==60)   //分钟归零
         {
          minute=0;
          hour++;
         if(hour==24)   //小时归零
           {
            hour=0;
            day++;
           if(day==30)   //天数归零
             {
              day=0;
              month++;
             if(month==12)  //月份归零
               {
                month=0;
                year++;
               if(year==99)  //年份归零
                 {
                  year=0;
                 }
               }
             }
           }
         }
       }
    }
		


}

你可能感兴趣的:(单片机)