STC89C52RC单片机实现数码管时钟(文章末尾附源码获取方法)

源文件包含:仿真,代码以及参考报告

仿真电路图: 

代码展示:(完整版代码请加球球领取(因为某种不可抗的因素某些地方展示出来是乱码,因此此处代码部分地方不全,给您带来不便还请谅解))

#define uint unsigned int		
#define uchar unsigned char
#define CF P0					   
uchar flag_set=0;		
uint hour=23;		 
uint min = 59;
uint sec=57;			  		

sbit K1=P3^2;   				
sbit K2=P3^1;		 			
sbit K3=P3^0;			 			  
sbit Key1=P3^3;					
sbit Key2=P3^4; 					   
sbit Key3=P3^5;					

sbit LED1=P2^0;				  
sbit LED2=P2^1;
sbit LED3=P2^2;		   		
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;			

uchar disbuff[]={0,0,0,0,0,0,0,0}; 		

uchar const num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 			
void Count();
void KEY();
void DigDisplay();
void delay(int s)		
{
	uint i,j;
	for(i=0;i<s;i++)				 
		for(j=114;j>0;j--);
}

void DigDisplay()					 
{									  
	LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=0;	   
	CF = disbuff[0];
	delay(5);
	CF=0x00;//ÏûÒþ

	LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=0;LED8=1;		   
	CF=disbuff[1];
	delay(5);
	CF=0x00;   //ÏûÒþ

	LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=0;LED7=1;LED8=1;			 
	CF=disbuff[2];
	delay(5);
	CF=0x00;	 //ÏûÒþ

	LED1=1;LED2=1;LED3=1;LED4=1;LED5=0;LED6=1;LED7=1;LED8=1;			  
	CF=disbuff[3];
	delay(5);
	CF=0x00;	 //ÏûÒþ

	LED1=1;LED2=1;LED3=1;LED4=0;LED5=1;LED6=1;LED7=1;LED8=1;			 
	CF=disbuff[4];
	delay(5);
	CF=0x00;	 //ÏûÒþ

	LED1=1;LED2=1;LED3=0;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;			 
	CF=disbuff[5];
	delay(5);
	CF=0x00;	 //ÏûÒþ

	LED1=1;LED2=0;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;			  
	CF=disbuff[6];
	delay(5);
	CF=0x00;	 //ÏûÒþ			LED5=1;LED6=1;LED7=1;LED8=1;

	LED1=0;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;			 
	CF=disbuff[7];
	delay(5);
	CF=0x00;	 //ÏûÒþ
}

void Count()							 
{
	disbuff[0]=num[sec%10];		  		  
	disbuff[1]=num[sec/10%10];	   		 
	disbuff[2]=0x40;		//0x40±íʾ-ºá¸Ü
	disbuff[3]=num[min%10];	  		 
	disbuff[4]=num[min/10%10];			
	disbuff[6]=num[hour%10];	  		 
	disbuff[7]=num[hour/10%10];		
}

void KEY()					 			
{
	if(Key1==0)						  
	{
		delay(10);	
		if(Key1==0)			
		{
			flag_set++;				 
			if(flag_set==4)			  
			{flag_set=0;	
				TR0=1;		
				}
			
		}
		while(!Key1)DigDisplay(); Count(); 	 	//°´¼üÊÍ·Å
	}
	if(flag_set==1)					
	{	
		//TR0=0;							 
		if(Key2==0)					 
		{
			delay(10);	
			if(Key2==0)						  
			{
				sec++;				 
				if(sec>59){
					sec=0;
				}
			
	        while(!Key2) DigDisplay(); Count(); }
		}
		if(Key3==0)					  
		{
		  	delay(10);	
			if(Key3==0)
			{	
				if(sec>0)		  
				sec--;				 
				else{
					sec=59;Count();
				}
				
			
			while(!Key3) DigDisplay(); Count(); }
		}
		
	}
	if(flag_set==2)			
	{						 
		if(Key2==0)					 
		{
			delay(10);	
			if(Key2==0)
			{
				min++;				  
				if(min>59){
					min=0;	
				}
			
			while(!Key2) DigDisplay(); Count();  }
		}
		if(Key3==0)					  
		{
		  delay(10);	
			if(Key3==0)
			{		
								   
				if(min>0)
					min--;
				else 
					min=59;Count();	
					
			
			while(!Key3) DigDisplay(); Count(); }
			}
		
	}
	if(flag_set==3)			
	{	
	
		if(Key3==0)					 
		{
		  delay(10);	
			if(Key3==0)
			{		
				
				if(hour>0)
					hour--;
				else
					hour=23;Count();	
						   
				while(!Key3) DigDisplay(); Count(); 	
			}
			}							 
		if(Key2==0)					
		{
			delay(10);	
			if(Key2==0)
			{
				hour++;				
				if(hour>23){
					hour=0;	
				}
			}
			while(!Key2) DigDisplay(); Count(); 
		}		
	}
	if(K1==0)
	{TR0=1;}
	while(!K1) DigDisplay();Count();		  
	if(K2==0)
	{
		delay(5);

		if(K2==0)
		{
			TR0=0;	    //¹Ø±Õ¶¨Ê±Æ÷
		}
	}	 while(!K2)DigDisplay();Count();

	if(K3==0)
	{
		delay(10);
		if(K3==0)
		{
			sec=0;hour=0;min=0;
			TH0=0x3c;//É趨T0³õʼֵ£¨¸ß°Ë룩
			TL0=0xb0;
		}
	}while(!K3) DigDisplay();Count();		   
	
}  

void main()
{
	TMOD=0x11;
	TH0=0x3c;
	TL0=0xb0;
	ET0=1;			 
	EA=1;	 
	TR0=1; 

	while(1)							

	{	
		KEY();
		Count();	
		DigDisplay();	
		

	}
}

void time1() interrupt 1
{
	uchar m;
	TH0=0x3c;
	TL0=0xb0;		
	m++;			  
	if(m==20)
	{			   
		m=0;
		if(flag_set==0)		 
		{
			sec++;			   
			if(sec>59)	  
	    	{				
				sec=0;
				min++;
				if(min>59)
				{	
					min=0;
					hour++;
					if(hour>23)
					{
						hour=0;
					}
				}
			}
		}
		
	}
}

感谢您对我分享的支持。为了进一步提供深入、精彩的代码,我考虑将源码设为付费订阅(0米即可!!!这不收费呦,如果你想支持我就请关注我的公众号!我会不定期发一些stm32和单片机工程的!希望您能用得上!)。您的支持对我来说非常非常非常重要!!如果您接受的话还请麻烦您移步微信公众号:CV工程师猫猫头1号    回复:最简单的数码管时钟

   

Ciallo~(∠・ω< )⌒☆

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值