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

📄 clock_main.c

📁 基于单片机设计的数字钟的设计
💻 C
字号:
#include <AT89X51.H>
#include "CLOCK_MAIN.h"


void  delay_ms(int xms)
{   
	uchar j;
	int i;	
	for(i=xms;i>0;i--)
    for(j=250;j>0;j--);

}
void  delay(void)
{	
    uchar i,j;
	for(i=5;i>0;i--)
	for(j=248;j>0;j--);
}


void main(void)
{
TMOD=0x12; //设置工作方式 
TH0=0x06; // 设置定时初值 
TL0=0x06;
TH1=0XFF/50000;
TL1=0XFF%50000;
TR0=1;	    //  开启定时器0 
TR1=0;      //  关闭定时器1
ET0=1;	    // 充许定时中断 
ET1=1; 
EA=1;
flag2=0;


 while(1)
 { 	 
   
    KeyBord ( );
	keymenu( );	
	alarm_s( );
	ring();
	test=!test;


  }	//end while 1 
}//end main 

void Time0(void) interrupt 1 using 0
{
	EA=0;
	mstcnt++;
	if(mstcnt==8){
		mstcnt=0; 
		P2=dispbitcode_ca[dispbitcnt];
		P0=dispcode_cc[dispbuf[dispbitcnt]];	
		dispbitcnt++;
		if(dispbitcnt==6){
			dispbitcnt=0;
			}
		}
	
	tcnt++;
	if(tcnt==4000){
		tcnt=0;
		second++;
		if(second==60){
			second=0;
			minite++;
			if(minite==60){
				minite=0;
				hour++;
				if(hour==24)  {
					hour=0;
					p_month_day=p_month_day+1;
	        	 }  // end if (hour)
			} //end if (minite)
		}//end if(second )
	
		 if(flag1==1)
		{
		dispbuf[0]=second%10;
		dispbuf[1]=second/10;
		dispbuf[2]=minite%10;
		dispbuf[3]=minite/10;
		dispbuf[4]=hour%10;
		dispbuf[5]=hour/10;	
		} 
	}//end if (tcont) 
	EA=1;
}



void Time1(void) interrupt 3 using 0
{
  
     test=!test;

 	if((flag0==0x80)&&(tcnt<2000))
	{
	TH1=0xfe;	   // 重装定时器频率为1600hz 
    TL1=0xc7; 
	TR1=1;
	speak=!speak;
	}
//	else TR1=0;
	
	if((flag0==0x40)&&(tcnt<1000))

	{
	  TH1=0xfd;	   // 重装定时器频率为800hz
      TL1=0x8f; 
      TR1=1;
	  speak=!speak;	  
	  }
	 // else TR1=0;	 

  if (flag2)
  { 
     TH1=0XFF/50000;
	 TL1=0XFF%50000;
	 TR1=1;            // 重起定时器1 
	if (second%2)	   //
	{  if (flag0==1	){
	  flag0=0;
     undispbuf[0]=dispbuf[0] ;	// 进行数据保护
	 undispbuf[1]=dispbuf[1] ; 
	 undispbuf[2]=dispbuf[2] ; 
	 undispbuf[3]=dispbuf[3] ; 	 
	 undispbuf[4]=dispbuf[4] ; 	
	 undispbuf[5]=dispbuf[5] ;} 	

	if  (flag2==0x01)
	   
	  	 dispbuf[0]=16 ;  // 显示灭(查表的)
    if  ( flag2==0x02)
	     dispbuf[1]=16 ;
    if (flag2==0x04)
	     dispbuf[2]=16 ; 
	if (flag2==0x08)
	     dispbuf[3]=16 ; 
	if (flag2==0x10)
	     dispbuf[4]=16 ; 
	if (flag2==0x20)
	     dispbuf[5]=16 ; 
	 }
	else						 // 恢复显示
	{  
	  if(flag0==0){
     flag0=1;
	 dispbuf[0]=undispbuf[0] ; 
	 dispbuf[1]=undispbuf[1] ; 
	 dispbuf[2]=undispbuf[2] ; 
	 dispbuf[3]=undispbuf[3] ;
	 dispbuf[4]=undispbuf[4] ; 
	 dispbuf[5]=undispbuf[5] ; }

	}
  }

	

	 	

}
	
/*****************************************************************
//
//
*****************************************************************/



 uchar  KeyBord (void)
{

	uchar  key ;
	key =P1&0xf;
	if(key)        // 检测到按键
	{   delay();      // 去抖动延时
		P1=P1&0xf;
		key=P1;
       if (key==0x0f)
	   {
		   ligth=0;   // 输出指示
	       return 0;
	   }
	   else 
	   {  		   
		   ligth=1;  // 输出指示
		   return key;
	   }
	}
	return 0;

 }


 void  keymenu(void )
 {

    uchar state=0x01;
	 key=KeyBord();
	 // 主功能键 
	
	 if (key==KEY1)
	 {	 
		 flag1=0;      //停止时间显示
		   /*
		 // 刷新数据区
		 	
		dispbuf[0]=0; 
		dispbuf[1]=0;	
	    dispbuf[2]=0;
	    dispbuf[3]=0; 
	    dispbuf[4]=0;
	    dispbuf[5]=0;
	    flag2=0x3f;   //计数时间显示闪烁等待开始
		TR1=1;  
		 key=KeyBord();
		 while (key!=KEY1)
		 {
		     key=KeyBord();
			 if (key==KEY2)
			 {
				 flag2=0; // 停止闪烁
				 flag3=1 ; //开始时间计时标志 
			 }
			 if (key==KEY3){
			 if (flag3==1)
					 flag3=0; }
	         if (key==KEY4)
				 {
				 if (flag3==0)
				 {
				 // 刷新数据区  
					dispbuf[0]=0; 
					dispbuf[1]=0;	
	   				dispbuf[2]=0;
	    			dispbuf[3]=0; 
	                dispbuf[4]=0;
	                dispbuf[5]=0;
				 }
				 }
		    delay_ms(100) ;
		//	key=KeyBord();
		 } // enf while (key!=key1) 结束计时模块 
		 
		   */
         flag3=0;
		 flag2=0x01;
		 TR1=1;
		 dispbuf[0]=alarm[0][1]%10; // 刷新数据区  
		 dispbuf[1]=alarm[0][1]/10;
         dispbuf[2]=alarm[0][0]%10;
		 dispbuf[3]=alarm[0][0]/10;
		 //dispbuf[4]=al_state&&0x01;
		 dispbuf[5]=0;
		 if (al_state&&0x01)
					  dispbuf[4]=10;
					  else
					  dispbuf[4]=11;
		
		 key=KeyBord();
		 while( key==KEY1)
			key=KeyBord();         // 等待按间释放
		 while(key!=KEY1)
		 {
			  
			 key=KeyBord();
			 if (key==KEY2)
			 {
				 if (flag2==1){
					 alarm[num][1]=alarm[num][1]+1;
					 dispbuf[0]=dispbuf[0]+1;
				}
				 if (flag2==2){
				  alarm[num][1]=alarm[num][1]+10;
				dispbuf[1]=dispbuf[1]+1;
				  }
				 if (flag2==4){
				  alarm[num][0]=alarm[num][0]+1;
				  dispbuf[2]=dispbuf[2]+1;
				  }
				 if (flag2==8){
				  alarm[num][0]=alarm[num][0]+10;
				  dispbuf[3]=dispbuf[3]+1;
				  }
				 if (flag2==16){
				  al_state=al_state|state;
				  dispbuf[4]= al_state&&flag2+10;
				  }
				 if (flag2==32){
				  num=num+1;
				  state=state<<1;
				  dispbuf[0]=alarm[num][1]%10; // 刷新数据区  
		 	      dispbuf[1]=alarm[num][1]/10;
                  dispbuf[2]=alarm[num][0]%10;
		          dispbuf[3]=alarm[num][0]/10; }
	              //dispbuf[4]=al_state&&state+10;
		          dispbuf[5]=num;
				  if (al_state&state)
					  dispbuf[4]=10;
					  else
					  dispbuf[4]=11;
				  
			  } //end if (key==key2)  修改闹铃时间操作(+)
			 if (key==KEY3)
			 {
				 if (flag2==0x01){
					 alarm[num][1]=alarm[num][1]-1;
					 dispbuf[0]=dispbuf[0]-1;
					 }
				 if (flag2==0x02){
				  alarm[num][1]=alarm[num][1]-10;
				  dispbuf[1]=dispbuf[1]-1;
				  }
				 if (flag2==0x04){
				  alarm[num][0]=alarm[num][0]-1;
				 dispbuf[2]=dispbuf[2]-1;
				 }
				 if (flag2==0x08){
				  alarm[num][0]=alarm[num][0]-10;
				dispbuf[3]=dispbuf[3]-1;
				 }
				 if (flag2==0x10){
				 state=~state;
				  al_state=al_state&(state);
				  state=~state;
				  dispbuf[4]=al_state&&flag2+10;
				  }
				 if (flag2==32){
				  num=num-1; 
				  state=state>>1;				  
				  dispbuf[0]=alarm[num][1]%10; // 刷新数据区  
		 	      dispbuf[1]=alarm[num][1]/10;
                  dispbuf[2]=alarm[num][0]%10;
		          dispbuf[3]=alarm[num][0]/10;	}
	              //dispbuf[4]=al_state&&state+10;
		          dispbuf[5]=num;
				  if (al_state&state)
					  dispbuf[4]=10;
					  else
					  dispbuf[4]=11;
				   
			 } //end if (key==key3)  修改闹铃时间操作(-)
	         if (key==KEY4)
				 if(flag2<32)
				    flag2=flag2<<1;   // 进行移位操作 
				 else  
					 flag2=0x01;
		     delay_ms(200) ;
		}	// end (key!=key1) 完成闹钟设置

	
	   	 key=KeyBord();
		 while( key==KEY1)
			key=KeyBord();         // 等待按间释放
	    flag2=0;
		TR1=0;	  
		dispbuf[0]=second%10;   // 刷新数据区  
		dispbuf[1]=second/10;
		dispbuf[2]=minite%10;
		dispbuf[3]=minite/10;
		dispbuf[4]=hour%10;
		dispbuf[5]=hour/10;	
		
		flag2=1;               //开始时间设置 
    	TR1=1;
		flag1=0;
		/*
		key=KeyBord();
		while( key==KEY1)
			key=KeyBord();         // 等待按键释放	*/
		while (key!=KEY1)
		 {			 
			
		
			 if (key==KEY2)
			 {
				 if (flag2==1){					 
					second=second+1;
				    dispbuf[0]=second%10;
					}
				 if (flag2==2){
				  second=second+10;
				 dispbuf[1]=second/10;
				 }
				 if (flag2==4){
				  minite=minite+1;
			      dispbuf[2]=minite%10;
				}
				 if (flag2==8){
				  minite=minite+10;
				 dispbuf[3]=minite/10;
				 }
				 if (flag2==16){
				  hour=hour+1;
				  dispbuf[4]=hour%10;
				  }
				 if (flag2==32){
				  hour=hour+10;
				  dispbuf[5]=hour/10;
				   }
			 } //end if (key==key2)  修改时间操作(+)
			 if (key==KEY3)
			 {
				 if (flag2==0x01){					 
					second=second-1;
				   dispbuf[0]=second%10;
				   }
				 if (flag2==0x02){
				  second=second-10;
				 dispbuf[1]=second/10;
			}
				 if (flag2==0x04){
				  minite=minite-1;
				 dispbuf[2]=minite%10;
				}
				 if (flag2==0x08){
				  minite=minite-10;
				 dispbuf[3]=minite/10;
				 }
				 if (flag2==0x10){
				  hour=hour-1;
				  dispbuf[4]=hour%10;
				  }
				 if (flag2==0x20){
				  hour=hour-10;
				  dispbuf[5]=hour/10; 
				  }
			 } //end if (key==key2)  修改时间操作(-)
	         if (key==KEY4)
				 if(flag2<32)
				    flag2=flag2<<1;   // 进行移位操作 
				 else
					 flag2=0x01;  
		      delay_ms(300) ;
			  key=KeyBord();
		}// end (key!=key1) 完成时间设置	
          /*
		  key=KeyBord();
		 while( key==KEY1)		// 等待按间释放
			key=KeyBord();  */       		
		flag2=0;				//关闭闪烁控制 
		TR1=0;
		flag1=1;				//正常时间显示
		dispbuf[0]=second%10;   // 刷新数据区  
		dispbuf[1]=second/10;
		dispbuf[2]=minite%10;
		dispbuf[3]=minite/10;
		dispbuf[4]=hour%10;
		dispbuf[5]=hour/10;	
	}// end if (key==KEY1) 主功能键设置完 


	 key=KeyBord();
		 while( key==KEY1)		// 等待按间释放
			key=KeyBord();         		
	
     //次功能键
	 key=KeyBord();
	 if (key==KEY2)                //查看日期 
		 
		 while (key!=0x00)
	 { 
		 
		  flag1=0 ;				  // 暂停时间显示
		  dispbuf[0]=(uchar)(*p_month_day%32)%10;   // 刷新数据区  
		  dispbuf[1]=(uchar)(*p_month_day%32)/10;
		  dispbuf[2]=(uchar)(*p_month_day/32)%10;
		  dispbuf[3]=(uchar)(*p_month_day/32)/10;
		  dispbuf[4]=7;
		  dispbuf[5]=0;
		  key=KeyBord();	
	 }	   
	 
	flag1=1;					// 恢复时间显示 
	key=KeyBord();
	 if (key==KEY3)				// 省电控制 
	 {	 
	     flag1=0 ;				  // 暂停时间显示
		 delay_ms(10) ;				//如果KEY2常按则进入省电模式 
		 if (key==KEY3)
			 sleep=!sleep;	//  进入省电模式 
		 if(sleep==1)
			 flag1=0;           
	 }

	 key=KeyBord();				// 查看闹钟设置
	 flag2=0x00 ;
	            
	 if (key==KEY4)
	 { 
	  	uchar  disp=0x01;
	    num=0;
		flag1=0;	
		key=KeyBord() ;	   
		 while (key&KEY4)
		 {		 
		       
			 
			 if (key==(KEY5))	
			 {
				  num=num+1;
				  disp=disp<<1;
			 }
			 if (key==(KEY6) )	
			 {
				  num=num-1;
				 disp=disp>>1;
			 }
			dispbuf[0]=alarm[num][1]%10;
			dispbuf[1]=alarm[num][1]/10;
			dispbuf[2]=alarm[num][0]%10;
			dispbuf[3]=alarm[num][0]/10;		
			 
			dispbuf[5]=num;
		    delay_ms(200) ;
			key=KeyBord();
		 }
		 flag2=0x00 ;	
	  }
	  	  
	 delay_ms(200) ;	
}
void alarm_s(void)
{
  uchar i ,j=0x01;
  speak=0;
   for (i=0;i<8;i++,j=j>>1)
   if (hour==alarm[i][0])
	  if (minite==alarm[i][1])
	    if (al_state&j)
	        sound_al();
	    else
	       { speak=0; TR1=0 ;}
}
void sound_al(void)
{    speak=1;
     //delay_ms(1000);
	 }
 
void ring (  )     //整点报 
{	flag0=1;
   if((minite==0)&&(second>=55))   //前五声低音 
	     { TR1=1;  flag0=0x40;  }   // 启动定时器 发出滴滴声	// 设置定时标志 	
   if( (minite==1)&&(second==0))    //整点高音      
    	 {  TR1=1; flag0=0x80;  }   // 启动定时器 发出滴滴声  // 设置定时标志 		  
      
  
}

⌨️ 快捷键说明

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