51单片机控制数字时钟的显示及修改

数字时钟的显示及修改

实验目的

掌握定时器的使用、按键检测及数码管的动态显示。

实验内容

1、绘制如下proteus仿真图
51单片机控制数字时钟的显示及修改_第1张图片2、利用定时器的定时功能,用6位数码管实现时、分、秒的显示及更新;
3、三个按键实现时间的修改。

代码

#include

#define u8 unsigned char 
#define u16 unsigned int 

sbit SW1 =P3^0;
sbit SW2 =P3^1;
sbit SW3 =P3^2;

sbit LED    = P3^7;



u8 Data[]={
      0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d, 
			0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,
			0x39 , 0x5e , 0x79 , 0x71 , 0x00 } ;

enum fun
{
     
	confirm=0,set_sec,set_min,set_hour
};		   
enum fun SetTime;
//u8 SetTime;


bit SMG_SS_FLAG=0;
u8 key_hour=8;
u8 key_min =56;
u8 key_sec =0;

void delay_ms(u16 ms);
void Display(u8 Hour,u8 Min,u8 Sec);
void Key(void);


main()
{
     
	LED=1;

    TMOD=0x01;		 //定时器0 方式1
    TH0=0xfc;		 // 设置初始值1ms
    TL0=0x18;
	TR0=1;			 //启动定时器
	ET0=1;			 //允许中断
	EA=1;	 
	while(1)
	{
     
		Key();
	//	display();
    }
}

void Key(void)
{
     
	if(SW1==0)
	{
     
		delay_ms(10);	
		if(SW1==0)	  //
		{
     
		  SetTime++;
		  if(SetTime>set_hour)
		  {
     
			   SetTime=confirm;
		  }
		//  SetTime=fun_f;

		}
		while(!SW1){
     ;};	   // 
	}
	else if(SW2==0)
	{
     
		delay_ms(10);	
		if(SW2==0)	  //
		{
     
			switch(SetTime)
			{
     
			 case confirm:      			
			 	  break;
			 case set_sec:  key_sec++;   
			      break;
			 case set_min:  key_min++;    
			      break;
			 case set_hour: key_hour++;   
			      break;
			}
		}
		while(!SW2){
     ;};	   // 
	}
	else if(SW3==0)
	{
     
		delay_ms(10);	
		if(SW3==0)	  //
		{
     
			switch(SetTime)
			{
     
			 case confirm:      			
			 	  break;
			 case set_sec:  if(key_sec!=0)key_sec--;   
			      break;
			 case set_min:  if(key_min!=0)key_min--;    
			      break;
			 case set_hour: if(key_hour!=0)key_hour--;   
			      break;
			}
		}
		while(!SW3){
     ;};	   // 
	}
} 



void delay_ms(u16 ms)
{
     
	u8 k;
	u16 i;
	for(i=ms*2;i>0;i--)
	{
     
		for(k=250;k>0;k--)
		{
     }
	}
}



void Display(u8 Hour,u8 Min,u8 Sec)
{
     
	static u8 DpyScan=0;
	P2=0xff;
	switch(DpyScan)
	{
     
	   case 0:if(SMG_SS_FLAG==1||SetTime!=set_hour)
			  {
     
			  	P1=Data[Hour/10];
				
			  }
			  else 
			  {
     
			  	P1=0x00;
			  }	
			  break;
	
	   case 1:if(SMG_SS_FLAG==1||SetTime!=set_hour)
			  {
     
			  	P1=Data[Hour%10];
			  }
			  else
			  {
     
			  	P1=0x00;
			  }	
			  break;
	
	   case 2:if(SMG_SS_FLAG||SetTime!=set_min)
			  {
     
			  	P1=Data[Min/10];
			  }
			  else 
			  {
     
			  	P1=0x00;
			  }	
			  break;
	
	   case 3:if(SMG_SS_FLAG||SetTime!=set_min)
			  {
     
			  	P1=Data[Min%10];
			  }
			  else
			  {
     
			  	P1=0x00;
			  }	
			  break;
	
	   case 4:if(SMG_SS_FLAG||SetTime!=set_sec)
			  {
     
			  	P1=Data[Sec/10];
			  }
			  else 
			  {
     
			  	P1=0x00;
			  }	
			  break;
	
	   case 5:if(SMG_SS_FLAG||SetTime!=set_sec)
			  {
     
			  	P1=Data[Sec%10];
			  }
			  else 
			  {
     
			  	P1=0x00;
			  }	
			  break;
		   	
	}
	P2=~(0x01<<DpyScan);
	if(DpyScan<6)
	{
     
		DpyScan++ ;
	}
	else
	{
     
		DpyScan=0;
	}
}

	  
void timer0(void) interrupt 1  	//定时器0中断函数
{
     
	static u16 SMG_twinkle;
	static u16 TIME=0;

	


    SMG_twinkle++;
	if(SMG_twinkle>20)	 
	{
     
		SMG_twinkle=0;
		SMG_SS_FLAG=~SMG_SS_FLAG;
	}	


	TIME++ ;
	if(TIME>=200)
	{
     
	  TIME=0;
	  key_sec++;
	}
	if(key_sec>59)
	{
     
		key_sec=0;key_min++;
	} 
	if(key_min>59) 
	{
     
		key_min=0;
		key_hour++;
	}  
	if(key_hour>23) 
	{
     
		key_hour=0;
		key_min=0;
		key_sec=0;
	}

	Display(key_hour,key_min,key_sec);

    TH0=0xec;	  //1ms
    TL0=0x77;


} 
 

效果

51单片机控制数字时钟的显示及修改_第2张图片51单片机控制数字时钟的显示及修改_第3张图片

关注并私信可以给proteus和完整工程

你可能感兴趣的:(51单片机,#,数字时钟,单片机,c语言)