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

📄 -

📁 实时时钟设计
💻
字号:
/***********************Copyright (c)
** File name: ShuZiZhong.c
** Last modified Date: 20101220
** Created by: 邹海春
** Descriptions: 单片机数字钟
**********************************/	
  #include<reg51.h>
  #define uchar unsigned char
  #define uint unsigned int
  #define  CYCLE 1000         /*定时1ms */
  unsigned char i,j,k,ID;     /*ID 为case 的次数  K为LED灯控制。*/       
  unsigned char temp;         	            
  unsigned char b,c;          	  
  uchar hour=0,min=0,sec=0;   /*定义秒时分初始值*/	    
  uchar a[6];     /*定数码管显示缓冲*/	 
  uint t=0; 
  uint flag=0;
  bit fla;                    	                       
  unsigned char count;	           
  sbit KEY1=P3^0;
  sbit KEY2=P3^1;
  sbit KEY3=P3^2;
  sbit KEY4=P3^3;
  sbit LED2=P1^0;
  sbit BEEP=P0^7;
  void Modifytime();   /*时间调整模块*/	       
  void Adjust();	
  void scan();      /*扫描数码模块*/	     
  void Time_BEEP();
  void delay10ms(void)/*软件10ms定时*/	     
 {      unsigned char i,j;
        for(i=20;i>0;i--)
        for(j=248;j>0;j--); /*2us*248*20=9920软件延时*/ 
}	      
  void dely250(void)	       
 {      unsigned char i,j;	      
        for(i=2;i>0;i--)      /* 248*2us*2=1ms  软件延时*/      
        for(j=248;j>0;j--);
  }
/* Mian函数*/
void main()
{  
   TCON=0x01;  /*TIMER0工作在方式1*/ 
   TMOD=0x01;
   TH0=(65536-CYCLE)/256; /*设定T0每隔1000us(1ms)中断一次*/ 
   TL0=(65536-CYCLE)%256;     
   TR0=1;
   IE=0x82;
   Modifytime();
   while(1)
   {  
   		if (flag==100)
		{                          
			{  
				temp=0xfe;
  				 P1=temp;
  				 delay10ms();
   				 for(k=0;k<8;k++)
 				{  
					b=temp<<k;
   					c=temp>>(8-k);
   					P1=b|c;
   					delay10ms();
 				} 
 				 for(k=0;k<8;k++)
				{  
					 b=temp>>k;
 					 c=temp<<(8-k);
 					 P1=b|c;
  					delay10ms();
				}
			}
		}
  		if(flag==1000)    /*判断1秒钟到否*/	   
		{  
			sec++;           /*秒加一*/      
 			 Modifytime();
	 		 flag=0;
	 		 while ((min==0)&(sec==0)) 
 			{  
				if (flag==100)
 				{              
  					 {  BEEP=0;
  						 BEEP=1;        
 					 } 
				}
				if (flag==600)  break;
  			}	     
		}
		while(KEY1== 0)
		{  	  
			while(1)
			{
				if(KEY1==0)
				{
					delay10ms();
					if(KEY1==0)
					{  
						ID++;
 						if(ID==2)
						{		
							ID=0;
						}
						while(KEY1==0);
					}
				} 
				switch(ID)
				{ 
					case 0:      Adjust();
             					 break;
					case 1:
 							 LED2=0;
	  						if(flag==1000)    /*判断1秒钟到否*/	 
							{ 
								sec++;                /*秒加一*/	    
	    						 Modifytime();
	    						flag=0;   	      
								while ((min==0)&(sec==0)) 	    
								{  if (flag==100)
									{                     	          
										{    BEEP=0;
    										 BEEP=1;
  										}
	  								}
 									if (flag==600)  break;
  								}
							} 
							break;
  				}
  			}
 		}
	}
 }
/*时间调整模块*/
void Modifytime()  	
 {   
 	 uchar temp;
    temp=sec;                       /*uchar temp=sec;*/	   
    sec%=60;
    min+=temp/60;        /*求余*/	      
    temp=min;
    min%=60;
    hour=(hour+temp/60)%24;
    a[0]=(sec%10);                  /*调整过的时间送到显示缓冲中*/		      
   a[1]=(sec/10);       /*对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。 */
   a[2]=(min%10);       /*对于分计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。 */
   a[3]=(min/10);
   a[4]=(hour%10);   /*对于时计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。 */
   a[5]=(hour/10);
  }
/*扫描数码模块*/
void scan( )   /*扫描6个数码管子程序*/	           
{   static uchar x;
   x++;
   if(x>5) x=0;      /*6个数码管都扫描过了则重新开始*/       
   P0=x|(a[x]<<3);   /*选中需要扫描的数码管并送数据*/   
 }
/*中断模块*/
void Timer0Int() interrupt 1 using 2  	
{   t++;                  
  	if(t==100)
  	{ 
  		flag=100;          
   	}
  	else if(t==200)  
	{ 
		flag=200;         
   	}
  	else if(t==600)
	{ 
		flag=600;         
   	} 
 	 else if (t==1000)
	{ 
		flag=1000;        
 		 t=0;     
   	}
	else	       
 		 flag=0;	                                                                                          
  	scan();
  	TH0=(65536-CYCLE)/256;
  	TL0=(65536-CYCLE)%256;
}
/*键盘控制模块*/
 void Adjust()
{  
	while(1)
  	{  
		if(KEY2==0)
  		{
			for(i=40;i>0;i--)         /*248*2us*5=2480=2.5ms   软件延时*/	 
     			for(j=248;j>0;j--);
     		if(KEY2==0)
  			{
    			sec++;
    			for(count=200;count>0;count--)
 				{
    				BEEP=~BEEP;
    				dely250();
   				}
    			if(sec==60)
				{   
					sec=0;
    			}
    			a[0]=(sec%10);
    			a[1]=(sec/10);
    			while(KEY2==0); 
    		}
    	}
    	if(KEY3==0)
		{
			for(i=16;i>0;i--)
 								/*248*2us*40=20ms  软件延时*/	 
    			for(j=248;j>0;j--);
    			if(KEY3==0)
   				{
   					min++;
     				for(count=200;count>0;count--)
   					{
    		 			BEEP=~ BEEP;
     					dely250();
     				}
    		 		for(count=200;count>0;count--)
 	 				{
     					BEEP =~ BEEP;
     					dely250();
     					dely250();
  	 				}

   					if(min==60)
 					{
    				 	min=0;
   					}
   					a[2]=(min%10);
   					a[3]=(min/10);
   					while(KEY3==0);
    			}
    	}

   		if(KEY4==0)
		{		
			for(i=40;i>0;i--)    /*(248*2us*40=1980ns=20ms) 软件延时*/
 				for(j=248;j>0;j--);
  			if(KEY4==0)
			{
   				hour++;
   				for(count=200;count>0;count--)
				{
					   BEEP =~BEEP;
					   dely250();
					   dely250();
  				}
   				if(hour==24)
				{
				   hour=0;
				}
				a[4]=(hour%10);
				a[5]=(hour/10);
				while(KEY4==0);
   			}
   		}
   }
}

⌨️ 快捷键说明

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