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

📄 main.c

📁 基于51单片机开发的数字时钟
💻 C
字号:
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int

sbit P1_0 =P1^0;
sbit P1_1 =P1^1;
sbit P1_2 =P1^2;
sbit P1_3 =P1^3;
sbit P1_7 =P1^7;
sbit P1_6 =P1^6;

typedef struct	 
{ uchar hour;
  uchar minute;
  uchar second; 
}time;

time now={0,0,0};
time dingshi={0,0,0};  
  
uchar code num_tab1[]={0x80,0x40,0x20,0x10,0x08,0x04};			
uchar code num_tab2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //共阳极显示
uchar state=0;	  
uchar count=100;
uchar flag=0;		//调整时间/定时的标志
uchar recount=0;
uchar recount1=0;


void delay(uint time1)		  //延时子程序
{
	int i;
	int k;
	for(i=0;i<time1;i++)
	for(k=0;k<100;k++);
}


void display(time disnum)	  //显示子程序
{
	int hour_shi,hour_ge,min_shi,min_ge,sec_shi,sec_ge,i;
	int num[6]={0,0,0,0,0,0};
	hour_shi=disnum.hour/10;
        hour_ge=disnum.hour%10;
        min_shi=disnum.minute/10;
	min_ge=disnum.minute%10;
	sec_shi=disnum.second/10;
	sec_ge=disnum.second%10;
	num[0]=hour_shi;
        num[1]=hour_ge;
        num[2]=min_shi;
	num[3]=min_ge;
	num[4]=sec_shi;
	num[5]=sec_ge;
	for(i=0;i<6;i++)
	{
	  P2=num_tab1[i];
	  P0=num_tab2[num[i]];
	  delay(1);
	}				
    
}


void display_1(uchar wei,uchar k)     //显示子程序1
{
   uchar wei1,wei2;
   wei1=wei/10;
   wei2=wei%10;

   P2=num_tab1[k];
   P0=num_tab2[wei1];
   delay(1);
   P2=num_tab1[k+1];
   P0=num_tab2[wei2];
   delay(1);
}


void  interrupt_init(void)     
{
   EA=0;
   TMOD=0x01;
   TH0=0xd8;
   TL0=0xf0;
   IT0=1;
   ET0=1;
   EX0=1;
   EA=1;
   TR0=1;     
}

void interrup0(void) interrupt 0 using 3
{  
   uchar i=0;
   delay(1);
   if(P1_0==0)  //调时 
   {
     if(flag==1)	   //定时的调节
	 {
	    state++;
        if(state==9)
	    { state=0;}
	 }
	 else			
	 {
        TR0=0;
        state++;
        if(state==4)
        {
	      state=0;
	      TR0=1;
	    }
	 }
   }  
   if(P1_1==0)  //加
   {
     switch(state)
       {
         case 0: break;
         case 1: { 
                   now.hour++;
                   if(now.hour==24)
                   now.hour=0;
				   break;
                 }
         case 2: { 
                   now.minute++;
                   if(now.minute==60)
                   now.minute=0;
				   break;
                 }
         case 3: { 
                   now.second++;
                   if(now.second==60)
                   now.second=0;
				   break;
                 }
		 case 4: break;
		 case 5: { 
                   dingshi.hour++;
                   if(dingshi.hour==60)
                   dingshi.hour=0;
				   break;
                 }

		 case 6: { 
                   dingshi.minute++;
                   if(dingshi.minute==60)
                   now.minute=0;
				   break;
                 }
		 case 7: { 
                   dingshi.second++;
                   if(dingshi.second==60)
                   dingshi.second=0;
				   break;
                 }
		 case 8: break;
       }
   }
   if(P1_2==0)  //减
   {
      switch(state)
       {
         case 0: break;
         case 1: { 
                   if(now.hour==0)
                   now.hour=23;
				   else
				   now.hour--;
				   break;
                 }
         case 2: { 
                   if(now.minute==0)
                   now.minute=59;
				   else
				   now.minute--;
				   break;
                 }
         case 3: { 
                   if(now.second==0)
                   now.second=59;
				   else
				   now.second--;
				   break;
                 }
		 case 4: break;
		 case 5: { 
                   if(dingshi.hour==0)
                   dingshi.hour=23;				   
				   else
				   dingshi.hour--;
				   break;
                  }

		 case 6: { 
				   if(dingshi.minute==0)
                   now.minute=59;
				   else
				   dingshi.minute--;				  
				   break;
                 }
		 case 7: { 
				   if(dingshi.second==0)
                   dingshi.second=59;
				   else
				   dingshi.second--;
				   break;
                 }
		 case 8: break;
       }
   }
   if(P1_3==0)	 // 定时/取消定时
   {
      if(flag==0)	// 定时
	  {
	    flag=1;
		state=4;
	  }
	  else			 //取消定时
	  { 
	    flag=0;
		state=0;
		dingshi.hour=0;
		dingshi.minute=0;
		dingshi.second=0;
	  }
   }
}

void interrup1(void) interrupt 1 using 3
{
  TR0=0;
  TH0=0xd8;
  TL0=0xf0;
  TR0=1;
  if(count==0)
  {
    count=100;
    now.second++;
    if(now.second==60)
    {
      now.minute++;
      now.second=0;
      if(now.minute==60)
      {
	    recount=(now.hour+1)*2;   //整点提示
        now.hour++;
        now.minute=0;
        if(now.hour==24)
        {
          now.hour=0;     
        }  
      }  
	  	
    }
  if(flag==1 )
	  {
	     if(dingshi.hour==now.hour && dingshi.minute==now.minute && dingshi.second==now.second )
		 recount1=18;
	  }
  if(recount!=0)
  {
       P1_7=~P1_7;
	   recount--;
  }
  else
  { P1_7=0;}
  if(recount1!=0)
  {
       P1_6=~P1_6;
	   recount1--;
  }
  else
  { P1_6=0;}
  }
  else
  {
    count--;
  }

}


void main(void)             
 {  
    uchar j=0;
	flag=0;
    interrupt_init();	    //中断初始化   
	P1_6=0;
	P1_7=0;
    while(1)
    {
       switch(state)
       {
          case 0: display(now);break;
          case 1: display_1(now.hour,0);break;
          case 2: display_1(now.minute,2);break;            
          case 3: display_1(now.second,4);break;
		  case 4: display(dingshi);break;		  //显示定时初值00:00:00
		  case 5: display_1(dingshi.hour,0);break;
		  case 6: display_1(dingshi.minute,2);break; 
		  case 7: display_1(dingshi.second,4);break;  
	      case 8: display(dingshi);break;       //显示定时时间		      
       }
	
    }
 }

⌨️ 快捷键说明

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