⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c

📁 用C语言编写的对51单片机的非常准确的时钟程序可以显示年月日小时分钟秒
💻 C
📖 第 1 页 / 共 2 页
字号:
}
//========================================================================================================//

//=========================================================================================================//
void alarm_display(void)             //*显示子函数*//*动态扫描法*//
{ 
  P0=0x80;
   b=0;
   delay(2);
   b=1;
  P0=0x80;
   g=0;
   delay(2);
   g=1;
 if(AG)                        //AG为小时位闪烁标志位//
  {
   P0=shuma[alarm.hour/10];
   q=0;
   delay(2);
   q=1;
   P0=shuma[alarm.hour%10];
//   P0_7=1;
   b=0;
   delay(2);
   b=1;
  }    
 if(AZ)                        //AZ为分钟位闪烁标志位//
  {
   P0=shuma[alarm.minu/10];
   s=0;
   delay(2);
   s=1;
   P0=shuma[alarm.minu%10];
//   P0_7=1;
   g=0;
   delay(2);
   g=1;
  }     
 if(AD)                        //AD为秒位闪烁标志位//
  {
   P0=shuma[alarm.second/10];
   m=0;
   delay(2);
   m=1;
   P0=shuma[alarm.second%10];
   f=0;
   delay(2);
   f=1;
  }
 P0=shuma[10];
   z=0;
   delay(2);
   z=1;
 if(AW)
  {
   P0=shuma[alarm.length];
   w=0;
   delay(2);
   w=1;
  }
}
//=================================================================================================//
void alarm_key_flash(void)             //*闪烁子函数*//
{
 if(P1_3==0)
  {
   while(P1_3==0)
	 alarm_display();
   p++;                        //n表示某两位闪烁:n=0  ->  不闪烁,退出调时状态//
  }                            //                 n=1  ->  小时位闪烁,小时位处于可调时状态//
 if(p==5)                      //                 n=2  ->  分钟位闪烁,分钟位处于可调时状态//
  p=0;                         //                 n=3  ->  秒位闪烁,秒位处于可调时状态//
 if(p!=1)
  AG=1;
 if(p!=2)
  AZ=1;
 if(p!=3)                      //KT为可调时标志:KT=0  ->  不可调时//
  AD=1;                        //                KT=1  ->  可调时//
 if(p!=4)
  AW=1;
 switch(p)
  {
   case 0:AT=0;break;
   case 1:AG=flash;hml=alarm.hour;AT=1;break;        //hms为调时临时变量,需要调整某位时则先把其初始值放到hms中//
   case 2:AZ=flash;hml=alarm.minu;AT=1;break;
   case 3:AD=flash;hml=alarm.second;AT=1;break;
   case 4:AW=flash;hml=alarm.length;AT=1;break;
  }
}
//=================================================================================================//
void alarm_tiaoshi(void)           //*调时子函数*//
{
 if(P1_6==0)             //按P1_6键进行时间调整//
 {
  while(P1_6==0)
  alarm_display();
  if(AT==1)             //检验可调标志位KT//
  {
   hml++;
   switch(p)
    {
     case 1:alarm.hour=hml;break;          //根据n不同,返回给不同的位: n=1  ->  返回给小时位//
     case 2:alarm.minu=hml;break;          //                            n=2  ->  返回给分钟位//
     case 3:alarm.second=hml;break;        //                            n=3  ->  返回给秒位//
     case 4:alarm.length=hml;break;
	}
  }
 }
}
//===================================================================================================//
void alarm_tiaozheng(void)         //*时间修正子函数*//
{
 if(alarm.hour==24)
  alarm.hour=0;
 if(alarm.minu==60)
  alarm.minu=0;
 if(alarm.second==60)
  alarm.second=0;
 if(alarm.length==8)
  alarm.length=1;
}
//=====================================================================================================//
void alarm_qingling(void)            //*清零子函数*//
{
 if(P1_7==0)              //P1_0为清零键//
 {
  while(P1_7==0)
   alarm_display();
  switch(p)                                    
  {                                            
   case 0:alarm.hour=0;alarm.minu=0;alarm.second=0;alarm.length=1;break;        //根据n不同,清零位不同:n=0  ->  全部位清零//
   case 1:alarm.hour=0;break;                        //                       n=1  ->  小时位清零//
   case 2:alarm.minu=0;break;                        //                       n=2  ->  分钟位清零//
   case 3:alarm.second=0;break;                      //                       n=3  ->  秒位清零//
   case 4:alarm.length=1;break; 
  }
 }
}
//========================================================================================================//

//==============================================================================================//
void date_display(void)             //*显示子函数*//*动态扫描法*//
{
 
   P0=shuma[2];
   q=0;
   delay(2);
   q=1;
   P0=shuma[0];
   b=0;
   delay(2);
   b=1;
   P0=0x80;
   g=0;
   delay(2);
   g=1;
   P0=0x80;
   f=0;
   delay(2);
   f=1;

 if(DG)                        //AZ为分钟位闪烁标志位//
  {
   P0=shuma[date.year/10];
   s=0;
   delay(2);
   s=1;
   P0=shuma[date.year%10];
//   P0_7=1;
   g=0;
   delay(2);
   g=1;
  }      
 if(DZ)                        //AD为秒位闪烁标志位//
  {
   P0=shuma[date.month/10];
   m=0;
   delay(2);
   m=1;
   P0=shuma[date.month%10];
//  P0_7=1;
   f=0;
   delay(2);
   f=1;
  }        
 
 if(DD)
  {
   P0=shuma[date.day/10];
   z=0;
   delay(2);
   z=1;
   P0=shuma[date.day%10];
   w=0;
   delay(2);
   w=1;
  }
}
//=================================================================================================//
void date_key_flash(void)             //*闪烁子函数*//
{
 if(P1_3==0)
  {
   while(P1_3==0)
	 date_display();
   u++;                        //n表示某两位闪烁:n=0  ->  不闪烁,退出调时状态//
  }                            //                 n=1  ->  小时位闪烁,小时位处于可调时状态//
 if(u==4)                      //                 n=2  ->  分钟位闪烁,分钟位处于可调时状态//
  u=0;                         //                 n=3  ->  秒位闪烁,秒位处于可调时状态//
 if(u!=1)
  DG=1;
 if(u!=2)
  DZ=1;
 if(u!=3)                      //KT为可调时标志:KT=0  ->  不可调时//
  DD=1;                        //                KT=1  ->  可调时//
 switch(u)
  {
   case 0:DT=0;break;
   case 1:DG=flash;ymd=date.year;DT=1;break;        //hms为调时临时变量,需要调整某位时则先把其初始值放到hms中//
   case 2:DZ=flash;ymd=date.month;DT=1;break;
   case 3:DD=flash;ymd=date.day;DT=1;break;
  }
}
//=================================================================================================//
void date_tiaoshi(void)           //*调时子函数*//
{
 if(P1_6==0)             //按P1_6键进行时间调整//
 {
  while(P1_6==0)
  date_display();
  if(DT==1)             //检验可调标志位KT//
  {
   ymd++;
   switch(u)
    {
     case 1:date.year=ymd;break;          //根据n不同,返回给不同的位: n=1  ->  返回给小时位//
     case 2:date.month=ymd;break;          //                            n=2  ->  返回给分钟位//
     case 3:date.day=ymd;break;        //                            n=3  ->  返回给秒位//
	}
  }
 }
}
//===================================================================================================//
void date_tiaozheng(void)         //*时间修正子函数*//
{
 if(date.year==100)
  date.year=0;
 if(date.month==13)
  date.month=1;
 if(date.day==yuefen[date.month])
  date.day=1;
}
//=====================================================================================================//
void date_qingling(void)            //*清零子函数*//
{
 if(P1_7==0)              //P1_0为清零键//
 {
  while(P1_7==0)
   date_display();
  switch(u)                                    
  {                                            
   case 0:date.year=0;date.month=0;date.day=0;break;        //根据n不同,清零位不同:n=0  ->  全部位清零//
   case 1:date.year=0;break;                        //                       n=1  ->  小时位清零//
   case 2:date.month=0;break;                        //                       n=2  ->  分钟位清零//
   case 3:date.day=0;break;                      //                       n=3  ->  秒位清零//
  }
 }
}
//========================================================================================================//

//=========================================================================================================//
void key_zhuanhuan(void)
{
 if(P1_0==0)
  {
   while(P1_0==0);
   i++;
   if(i==3)
    i=0;
  }
}
//=========================================================================================================//
void naozhong(void)
{
 if(time.hour==alarm.hour)
  {
   if(time.minu==alarm.minu)
    {
	 NZ=1;
	}
  }
 if(NZ==1)
  {
   P3_7=0;
   if(time.minu==alarm.minu+alarm.length)
   {
    NZ=0;
   }
  }
 else
  {
   P3_7=1;
  }
}
//============================================================================================================//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -