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

📄 fhy.c

📁 单片机课程设计 电子钟
💻 C
字号:
#include<AT89X52.h>
#define uchar unsigned char
#define uint  unsigned int
char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};/*0~9的数码管段码*/
char DATA_P3[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar hour=0,min=0,sec=0;			/*时、分、秒单元清零*/
uint deda=0;               		    /*2.5mS计数单元清零*/ 
uchar t_hour=0,t_min=0,t_sec=0;  	/*闹时时、分、秒单元清零*/
uchar d_hour=0,d_min=0,d_sec=0;		/*倒计时时、分、秒单元清零*/
bit o_f=0;               			/*闹时启/停标志*/
uchar set=0;
uint t=0;             			/*模式设定标志*/
uchar m=0,a=0;
uint time_counter1 = 0;
uint time_counter2 = 0;
uint time_counter3 = 0;
void delay(uint k);                 //延时子函数
void conv();             			/*走时单元转换*/
void d_conv();
void p_out();            			/*判别闹时到否子函数*/
void dirve();            			/*走时时间输出驱动子函数*/
void t_dirve();          			/*闹时时间输出驱动子函数*/
void d_dirve();						/*倒计时时间输出驱动子函数*/
uint almflag1=0;					/*闹铃1提示标志*/
uint almflag2=0;				    /*闹铃2提示标志*/
uchar dflag=0;
unsigned char dis_buff1[6];	        /* 走时显示缓冲区,存放要显示的6个字符的段码值*/
unsigned char dis_buff2[4];	        /* 闹钟显示缓冲区,存放要显示的6个字符的段码值*/
unsigned char dis_buff3[6];	        /* 倒计时显示缓冲区,存放要显示的6个字符的段码值*/
unsigned char	posit1=0;          
unsigned char	posit2=0;
unsigned char	posit3=0;



/*闹时启/停子函数*/


void time1_of()
{   if(P2_1==0) 
	{ delay(1);
	 o_f=1;
	 }

	if(P2_2==0)	
	 {delay(1);
	  o_f=0;
	  }
	 if(o_f==1)
	   {
	    P1=0xc0;
	    P3=0xdf;
		}
	  if(o_f==0)
	    {
		 P1=0x8e;
		 P3=0xdf;
		 }
	   
}
	   

/*走时函数*/


void time()

	  
{dirve();
 p_out();
 if(almflag2==1)
	   { if(time_counter3==1)
	   	    {P2_4=~P2_4;
			  time_counter3=0;
			  a++;
			  if(a==60)
			  {
			    a=0;
			    almflag2=0;
			   }
			}
		 }
	if(almflag2==0)
	P2_4=1;	 	
 }


/*定时器T0  2.5mS初始化*/


void timer_init(void)
											   
{
    TMOD=0x01;//定时器1模式
	TH0=0xf7;//计数初值
    TL0=0x00;
	TR0=1;//开始计数
	ET0=1;//中断使能
}



/*2.5mS定时中断服务子函数*/
											 

timer() interrupt 1


{
 TH0=0xf7;
 TL0=0x00;
 if(++deda>=400)
     {  deda=0;
	    time_counter1=1;	 //1秒到
		time_counter2=1;
	  	time_counter3=1;
	  }
 }



/*延时子函数*/



void delay(uint k)


{

uint i,j;

for(i=0;i<k;i++)

for(j=0;j<121;j++)

{;}

}


/*扫描按键子函数*/


void scan_key()

{    delay(1);
	 if(P2_3==0) set++;
	 if(set>=5) set=0;
 F0:if(P2_3==0) goto F0; 

}



 /*时、分、秒单元及走时单元转换*/


void conv()
{ 
  if(time_counter1==1)
	{sec++;time_counter1=0;}
  if(sec==60)
	{min++;sec=0;}
  if(min==60)
	{hour++;min=0;}
  if(hour==24)
	{hour=0;}  
   
}




/*倒计时单元及走时单元转换*/


void d_conv()

{ t=3600*d_hour+60*d_min+d_sec; 	 	
  	   	if(time_counter2==1) 
		{
		 t--;
	   	 time_counter2=0;
		}
		d_hour=t/3600;
		d_min=t%3600/60;
		d_sec=t%60;
	    
  if(d_hour==0&&d_min==15&&d_sec==0)
	{almflag1=1;}
	
   if(d_hour==0&&d_min==0&&d_sec==0)
	{
	 almflag1=1;
	 dflag=0;
	}  
}



/*调整走时时间*/



void time_adj()
{	if(P2_2==0) delay(1); 	//按键消抖
	if(P2_2==0)  hour++;
	if(hour==24) hour=0;
	
	if(P2_1==0)	 delay(1); 
	if(P2_1==0)	 min++;
    if(min==60)  min=0;  
	 
	if(P2_0==0)  delay(1);
	if(P2_0==0)	 sec=0;
	for(m=0;m<30;m++)
	{dirve();
	}
   
}


/*调整闹时时间*/


void time1_adj()
{
	if(P2_2==0) delay(1);
	if(P2_2==0) t_hour++;
	if(t_hour==24) t_hour=0;  	
	  

	for(m=0;m<30;m++)
		{t_dirve();
		}
	
	if(P2_1==0) delay(1);
	if(P2_1==0) t_min++;
	if(t_min==60) t_min=0;  
	  
	
  	for(m=0;m<30;m++)
		{t_dirve();
		}
}

/*调整倒计时时间*/


void time2_adj()


{	if(P2_2==0) delay(1);
	if(P2_2==0)	d_hour++;
	if(d_hour==12) d_hour=0;
	 
	
	if(P2_1==0)  delay(1);
	if(P2_1==0)	 d_min++;
	if(d_min==60) d_min=0;

	
	if(P2_0==0)  delay(1);
	if(P2_0==0)  dflag=1;
		 
		for(m=0;m<30;m++)
		d_dirve();
}




/*走时时间输出驱动子函数*/



void dirve()


{  	for(posit1=0;posit1<6;posit1++)
    { 
	  P1=DATA_7SEG[dis_buff1[posit1]];
	  P3=DATA_P3[posit1];
	  delay(1);
	  P1=0xff;
	 }
	 
} 
			  

/*闹时时间输出驱动子函数*/



void t_dirve()


{ 
   for(posit2=0;posit2<6;posit2++)
    {P1=DATA_7SEG[dis_buff2[posit2]];
	 P3=DATA_P3[posit2];
	 delay(1);
	  P1=0xff;
     }
}


/*倒计时时间输出驱动子函数*/



void d_dirve()



{ 
  for(posit3=0;posit3<6;posit3++)
    {
	  P1=DATA_7SEG[dis_buff3[posit3]];
	  P3=DATA_P3[posit3];
	  delay(1);
	  P1=0xff;
	  }
}



/*判别闹钟是否到时子函数*/


void p_out()


{	if(o_f==1)
	{if(hour==t_hour&&min==t_min&&sec==t_sec)
	   {almflag2=1;}
	 if(P2_0==0)
	   	almflag2=0;	  
	 }
}


/*走时计数值送显示缓冲区函数*/


void data_to_disbuffer1(void)

{dis_buff1[0]=hour/10;
 dis_buff1[1]=hour%10;
 dis_buff1[2]= min/10;
 dis_buff1[3]= min%10;
 dis_buff1[4]= sec/10;
 dis_buff1[5]= sec%10;
}


/*闹钟计数值送显示缓冲区函数*/

void data_to_disbuffer2(void)


{
 dis_buff2[0]=t_hour/10;
 dis_buff2[1]=t_hour%10;
 dis_buff2[2]= t_min/10;
 dis_buff2[3]= t_min%10;
 dis_buff2[4]= t_sec/10;
 dis_buff2[5]= t_sec/10;
}


/*倒计时计数值送显示缓冲区函数*/


void data_to_disbuffer3(void)


{
 dis_buff3[0]=d_hour/10;
 dis_buff3[1]=d_hour%10;
 dis_buff3[2]= d_min/10;
 dis_buff3[3]= d_min%10;
 dis_buff3[4]= d_sec/10;
 dis_buff3[5]= d_sec%10;
}


/*主函数*/


void main()



{  timer_init();
	EA=1;
   while(1)
	{ conv();
	   if(dflag==1)
	   d_conv();
	   
	   if(almflag1==1)
	 	{ P2_4=0;
		   delay(100);
		   P2_4=1;
		   almflag1=0;
	       }	   
	 if(P2_3==0) 
	    scan_key();
		 switch(set)
			{
			 case 0 : time();       break;
			 case 1 : time1_adj();  break;
			 case 2 : time1_of();   break;	
			 case 3 : time2_adj();  break;
			 case 4 : time_adj();   break;
			 default : 	            break;
			}		  
		    data_to_disbuffer1();
			data_to_disbuffer2();
			data_to_disbuffer3();
	  
	}
}

⌨️ 快捷键说明

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