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

📄 clock.c

📁 用C语言编写的对51单片机的非常准确的时钟程序可以显示年月日小时分钟秒
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <AT89X52.H>
sbit w=P2^7;              //星期显示控制位//
sbit z=P2^6;              //无显示控制位//
sbit f=P2^5;              //秒显示控制位//
sbit m=P2^4;              //十秒显示控制位//
sbit g=P2^3;              //分钟显示控制位//
sbit s=P2^2;              //十分显示控制位//
sbit b=P2^1;              //小时显示控制位//
sbit q=P2^0;              //十小时显示控制位//
unsigned char data sec_cou;
unsigned char data fla_cou;
unsigned char data hms;
unsigned char data hml;
unsigned char data ymd;
unsigned char code shuma[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};    //译码表//
unsigned char code yuefen[13]={00,32,29,32,31,32,31,32,32,31,32,31,32};
struct Time
 {
  unsigned char second;
  unsigned char minu;
  unsigned char hour;
  unsigned char week;
 }time;
struct Alarm
 {
  unsigned char second;
  unsigned char minu;
  unsigned char hour;
  unsigned char length;
 }alarm;
struct Date
 {
  unsigned char year;
  unsigned char month;
  unsigned char day;
 }date;
bit TG=1;
bit TZ=1;
bit TD=1;
bit TF=1;
bit TW=1;
bit TT=0;
bit AG=1;
bit AZ=1;
bit AD=1;
bit AF=1;
bit AW=1;
bit AT=0;
bit DG=1;
bit DZ=1;
bit DD=1;
bit DF=1;
bit DT=0;
bit NZ=0;
bit flash=0;
unsigned char n=0;     //**下列为子函数声明**//
unsigned char p=0;
unsigned char u=0;
unsigned char i=0;
void delay(unsigned char j);               //延迟子函数//
void tiaoshi(void);                        //调时子函数//
void tiaozheng(void);                      //时间修正子函数//
void key_flash(void);                      //按键闪烁判断子函数//
void display(void);                        //显示子函数//
void qingling(void);                       //清零子函数//
void alarm_tiaoshi(void);                        //调时子函数//
void alarm_tiaozheng(void);                      //时间修正子函数//
void alarm_key_flash(void);                      //按键闪烁判断子函数//
void alarm_display(void);                        //显示子函数//
void alarm_qingling(void);                       //清零子函数//
void date_tiaoshi(void);                        //调时子函数//
void date_tiaozheng(void);                      //时间修正子函数//
void date_key_flash(void);                      //按键闪烁判断子函数//
void date_display(void);                        //显示子函数//
void date_qingling(void);                       //清零子函数//
void key_zhuanhuan(void);
void naozhong(void);
//==================================================================================================//
main()            //**主函数**//
{
 sec_cou=0;            //记数标志与时间值初始化//
 fla_cou=0;
 time.second=0;
 time.minu=30;
 time.hour=12;
 time.week=1;
 alarm.second=0;
 alarm.minu=0;
 alarm.hour=0;
 alarm.length=1;
 date.year=0;
 date.month=0;
 date.day=0;
 TMOD=0x01;            //定时器T0,工作模式1//
 TH0=0x3c;             //50ms//
 TL0=0xb0;
 EA=1; 
 ET0=1;
 TR0=1;
 while(1)
 {
  switch(i) 
  {
   case 0:key_flash();display();tiaoshi();tiaozheng();qingling();break;
   case 1:alarm_key_flash();alarm_display();alarm_tiaoshi();alarm_tiaozheng();alarm_qingling();break;
   case 2:date_key_flash();date_display();date_tiaoshi();date_tiaozheng();date_qingling();break;
  }
  key_zhuanhuan();
  naozhong();
 }
}
//===========================================================================================//
void shizhong(void) interrupt 1 using 1          //**中断程序,产生时钟秒信号**//
{
 TR0=0;               
 sec_cou++;
 fla_cou++;
 if(fla_cou==5)             //闪烁间隔为50ms*5次=250ms//
  {
   flash=!flash;
	fla_cou=0;
  }
 if(sec_cou==19)            //产生秒信号:50ms*20次=1000ms=1s//
  {
   time.second++;
   sec_cou=0;
   if(time.second==60)           //分钟信号判断:1s*60次=60s=1m//
    {
     time.minu++;
     time.second=0;
     if(time.minu==60)           //小时信号判断:1m*60次=60m=1h//
      {
       time.hour++;
       time.minu=0;
       if(time.hour==24)
        {
         time.week++;
		 date.day++;
		 time.hour=0;
		 if(time.week==8)
		  {
		   time.week=1;
		  } 
		 if(date.day=yuefen[date.month])
		  {
		   date.month++;
           date.day=1;
		    if(date.month==13)
			 {
			  date.year++;
			  date.month=1;
			  if(date.year==100)
			   date.year=0;
			 }
		  }
        }
      }
    }
  }
 
 TH0=0x3c;           //恢复计数器初始值//
 TL0=0xb0;
 TR0=1;
}
//===========================================================================================//
void delay(unsigned char j)          //*延迟子函数*//
{
 unsigned char k,l;
 for(k=0;k<j;k++)
  for(l=0;l<255;l++)
   ;
}
//==============================================================================================//
void display(void)             //*显示子函数*//*动态扫描法*//
{
  P0=0x80;
   b=0;
   delay(2);
   b=1; 
  P0=0x80;
   g=0;
   delay(2);
   g=1;
 if(TG)                        //AG为小时位闪烁标志位//
  {
   P0=shuma[time.hour/10];
   q=0;
   delay(2);
   q=1;
   P0=shuma[time.hour%10];
//   P0_7=1;
   b=0;
   delay(2);
   b=1;
  }     
 if(TZ)                        //AZ为分钟位闪烁标志位//
  {
   P0=shuma[time.minu/10];
   s=0;
   delay(2);
   s=1;
   P0=shuma[time.minu%10];
//   P0_7=1;
   g=0;
   delay(2);
   g=1;
  }     
 if(TD)                        //AD为秒位闪烁标志位//
  {
   P0=shuma[time.second/10];
   m=0;
   delay(2);
   m=1;
   P0=shuma[time.second%10];
   f=0;
   delay(2);
   f=1;
  }
 P0=shuma[10];
   z=0;
   delay(2);
   z=1;
 if(TW)
  {
   P0=shuma[time.week];
   w=0;
   delay(2);
   w=1;
  }
}
//=================================================================================================//
void key_flash(void)             //*闪烁子函数*//
{
 if(P1_3==0)
  {
   while(P1_3==0)
	 display();
   n++;                        //n表示某两位闪烁:n=0  ->  不闪烁,退出调时状态//
  }                            //                 n=1  ->  小时位闪烁,小时位处于可调时状态//
 if(n==5)                      //                 n=2  ->  分钟位闪烁,分钟位处于可调时状态//
  n=0;                         //                 n=3  ->  秒位闪烁,秒位处于可调时状态//
 if(n!=1)
  TG=1;
 if(n!=2)
  TZ=1;
 if(n!=3)                      //KT为可调时标志:KT=0  ->  不可调时//
  TD=1;                        //                KT=1  ->  可调时//
 if(n!=4)
  TW=1;
 switch(n)
  {
   case 0:TT=0;break;
   case 1:TG=flash;hms=time.hour;TT=1;break;        //hms为调时临时变量,需要调整某位时则先把其初始值放到hms中//
   case 2:TZ=flash;hms=time.minu;TT=1;break;
   case 3:TD=flash;hms=time.second;TT=1;break;
   case 4:TW=flash;hms=time.week;TT=1;break;
  }
}
//=================================================================================================//
void tiaoshi(void)           //*调时子函数*//
{
 if(P1_6==0)             //按P1_6键进行时间调整//
 {
  while(P1_6==0)
  display();
  if(TT==1)             //检验可调标志位KT//
  {
   hms++;
   switch(n)
    {
     case 1:time.hour=hms;break;          //根据n不同,返回给不同的位: n=1  ->  返回给小时位//
     case 2:time.minu=hms;break;          //                            n=2  ->  返回给分钟位//
     case 3:time.second=hms;break;        //                            n=3  ->  返回给秒位//
     case 4:time.week=hms;break;
	}
  }
 }
}
//===================================================================================================//
void tiaozheng(void)         //*时间修正子函数*//
{
 if(time.hour==24)
  time.hour=0;
 if(time.minu==60)
  time.minu=0;
 if(time.second==60)
  time.second=0;
 if(time.week==8)
  time.week=1;
}
//=====================================================================================================//
void qingling(void)            //*清零子函数*//
{
 if(P1_7==0)              //P1_0为清零键//
 {
  while(P1_7==0)
   display();
  switch(n)                                    
  {                                            
   case 0:time.hour=0;time.minu=0;time.second=0;time.week=1;break;        //根据n不同,清零位不同:n=0  ->  全部位清零//
   case 1:time.hour=0;break;                        //                       n=1  ->  小时位清零//
   case 2:time.minu=0;break;                        //                       n=2  ->  分钟位清零//
   case 3:time.second=0;break;                      //                       n=3  ->  秒位清零//
   case 4:time.week=1;break; 
  }
 }

⌨️ 快捷键说明

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