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

📄 01.c

📁 可实现时钟功能,倒计时,秒表,可以修改时间,蜂鸣器报警等
💻 C
字号:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define  NOP();  {_nop_(); _nop_(); _nop_(); _nop_();}      /* 定义空操作指令 */

sbit shuma1_cs = P2^0;
sbit shuma2_cs = P2^1;
sbit shuma3_cs = P2^2;
sbit shuma4_cs = P2^3;
sbit shumadp_cs = P2^4;
sbit BEEP = P1^4;
sbit stop = P1^3;
sbit inter = P3^3;


uint Data[4];

uchar data CLOCK[4] = {0,0,0,0};            /*存放时钟时间(依次为百分秒,秒,分,时)*/
uchar data SECOND[2] = {0,0};               /*存放秒表时间,(依次为百分秒,秒)*/
uchar data REVERSE[4] = {0,0,0,0};          /*存放倒计时时间(依次为百分秒,秒,分,时)*/
uchar data STATE = 0;

unsigned char code SEG_DATA[17] =
{
	0xbf,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, /* 0*-, 0,1,2,3,4,5,6,7 */
	0x80,0x90,0x88,0x83,0xa7,0xa1,0x86,0x8e,  /* 8* 8,9,A,B,C,D,E,F */
    
};

/**************************************延时程序***********************************/
void delay(unsigned long v)
{
  while(v!=0)v--;
}



/***************************************显示程序**********************************/
void LEDplay(a)
{
	uint i;
	for (i = 0;i < a;i++)
	{
//********数码1***********
	shuma1_cs = 0;
	P0 = SEG_DATA[Data[0]];
	delay (100);
	shuma1_cs = 1;
//********数码2***********
	shuma2_cs = 0;
	P0 = SEG_DATA[Data[1]];
	delay (100);
	shuma2_cs = 1;
//********数码3**********
	shuma3_cs = 0;
	P0 = SEG_DATA[Data[2]];
	delay (100);
	shuma3_cs = 1;
//********数码4**********
	shuma4_cs = 0;
	P0 = SEG_DATA[Data[3]];
	delay (100);
	shuma4_cs = 1;
//********************
   	}
}

/****************************用T0完成24小时时钟显示***********************/
void time0 (void) interrupt 1 using 1
{
  TH0=0xDC;                   // 单片机的晶振为11.0592M时,且选择了模式1,要定时10ms是
  TL0=0X00;
   /*时钟处理*/
   CLOCK[0] = CLOCK[0] + 1;
   if (CLOCK[0] == 100)
      {
		  CLOCK[0] = 0;
		  CLOCK[1] = CLOCK[1]+1;
		  if (CLOCK[1] == 60)
		     {
			    CLOCK[1] = 0;
				CLOCK[2] = CLOCK[2] + 1;
				if (CLOCK[2] == 60)
				   {
				      CLOCK[2] = 0;
					  CLOCK[3] = CLOCK[3] + 1;
					  if (CLOCK[3] == 24)
					     {
						     CLOCK[3] = 0;
						 }
				   }
			 }
	  }
}

/************************用T2完成秒表和倒计时***************************/
void time2 (void) interrupt 5 using 1
{
  TF2=0;
  TH2=0xDC;//重置定时常数	 单片机的晶振为11.0592M时,且选择了模式1,要定时10ms是,经计算得TH0=0xDC,TL0=0x00
  TL2=0X00;
	/*秒表处理*/
	if (STATE == 0)
	   {
	     SECOND[0] = SECOND[0] + 1;
		  if ( SECOND[0] == 100)
		    {
			    SECOND[0] = 0;
				SECOND[1] =  SECOND[1] + 1;
                if ( SECOND[1] == 100)
				   {
				      SECOND[1] = 0;
				   }
			}
	   }

	 /*秒倒计时处理*/
	 if (STATE == 3)
	    {
		   REVERSE[0] = REVERSE[0] + 1;
		  
		   if (REVERSE[0] == 100)
		      {  
                 REVERSE[0] = 0;
                 REVERSE[1] = REVERSE[1] -1;
			  }
		   if (REVERSE[1] == 0)
			  {
				if ((REVERSE[2] == 0)&&(REVERSE[1] == 0))
				{        
					     BEEP = 0;
						 TR2 = 0;
			    }
			   else 
                 {            
                REVERSE[2] = REVERSE[2] - 1;
			    REVERSE[1] =59;
            }
		  }			
	}
}


/*************************************时间挑调整:********************************/
void intsvr1 (void) interrupt 2 using 2
{

              if(STATE==5)                                      //时钟分调整
                {
                   CLOCK[2] = CLOCK[2]+1;
                   if(CLOCK[2] == 60) CLOCK[2] = 0;
                 }
              if(STATE == 6)                                    //时钟时调整
                {
                   CLOCK[3] = CLOCK[3]+1;
                   if(CLOCK[3] == 24) CLOCK[3] = 0;
                 }

	          if (STATE == 1)                                	//秒表定数:
                 {
                     REVERSE[1] = REVERSE[1]+1;
                     if(REVERSE[1] == 60)  REVERSE[1] = 0;
                  }
              if (STATE == 2)
                  {
                     REVERSE[2] = REVERSE[2]+1;
                     if (REVERSE[2] == 60)  REVERSE[2] = 0;
                   }
              if ((STATE == 0)&&(stop == 1))
                  {
	                 uint i;
                     SECOND[0] = 0;
                     SECOND[1] = 0;
                     for (i = 0;i < 4;i++)
                       switch (i)
	                     {
	                         case 0:Data[2] = SECOND[0]%10; break;
	                         case 1:Data[3] = SECOND[0]/10; break;
	                         case 2:Data[1] = SECOND[1]%10; break;
	                         default :Data[0] = SECOND[1]/10;
	                      }
                    }

}


/*****************************************主程序***************************************/
void main (void)
{
  uint i;
  TMOD = 0x01;
  T2CON = 0x00;
  TH0 = 0xDC;                //重置定时常数	 单片机的晶振为11.0592M时,且选择了模式1,要定时10ms
  TL0 = 0X00;
  TH2 = 0xDC;               //重置定时常数	 单片机的晶振为11.0592M时,且选择了模式1,定时10ms
  TL2 = 0X00;
for(i = 0;i < 4;i++)
  {   CLOCK[i] = 0;
      SECOND[i%2] = 0;
      REVERSE[i] = 0;}
      STATE = P1&0x07;
      EA = 1; ET0 = 1; IT1 = 1; EX1 = 1; TR0 = 1;

     shumadp_cs = 0;

     while (1)
       {
          
	      switch (STATE)
             {
                 case 0:
                    { 
					    BEEP = 1;
                        TR2 = 1;
                        EX1 = 0;
                        ET1 = 1;
						if(stop == 1)   TR2 = 0;
						else
                       for (i = 0;i < 4;i++)
                          switch (i)
	                         {
	                              case 0:Data[2] = SECOND[0]%10+1;break;
	                              case 1:Data[3] = SECOND[0]/10+1;break;
	                              case 2:Data[1] = SECOND[1]%10+1;break;
	                              default :Data[0] = SECOND[1]/10+1;
	                         }
					 }break;
                case 1:
	                {
					BEEP = 1;
	                      IE1 = 0;
                          EX1 = 1;
                          ET1 = 0;
                          ET2 = 1;
                          TR0 = 0;
				 for(i=0;i<4;i++)
                          switch(i)
	                        {
                                  case 0:Data[3]=REVERSE[1]%10+1;break;
	                              case 1:Data[2]=REVERSE[1]/10+1;break;
	                              case 2:Data[1]=REVERSE[2]%10+1;break;
	                              default :Data[0]=REVERSE[2]/10+1;
	                       }
	                   } break;
                case 2:
	                  {
					  BEEP=1;
	                     IE1 = 0;
                          EX1 = 1;
                          ET1 = 0;
                          ET2 = 1;
                          TR0 = 0;
						  for(i=0;i<4;i++)
                          switch(i)
	                        {
                                  case 0:Data[3]=REVERSE[1]%10+1;break;
	                              case 1:Data[2]=REVERSE[1]/10+1;break;
	                              case 2:Data[1]=REVERSE[2]%10+1;break;
	                              default :Data[0]=REVERSE[2]/10+1;
	                         }
	                 } break;
                  case 3:
                    {   
					   if ((REVERSE[2] == 0)&&(REVERSE[1] == 0)) TR2=0;
                       else  TR2=1;
                        EX1 = 0;
                        ET1 = 1;
                        ET2 = 1;
                       for(i=0;i<4;i++)
                          switch(i)
	                        {
                                  case 0:Data[3]=REVERSE[1]%10+1;break;
	                              case 1:Data[2]=REVERSE[1]/10+1;break;
	                              case 2:Data[1]=REVERSE[2]%10+1;break;
	                              default :Data[0]=REVERSE[2]/10+1;
	  
	                        }
					}break;
                 	 case 5:
	                     {
						 BEEP=1;
	                      IE1 = 0;
                          EX1 = 1;
                          ET1 = 0;
                          ET2 = 1;
                          TR0 = 0;
						  for(i=0;i<4;i++)
                          switch(i)
                         	{   
							BEEP=1;
                                 case 0:Data[3]=CLOCK[2]%10+1;break;
	                             case 1:Data[2]=CLOCK[2]/10+1;break;
	                             case 2:Data[1]=CLOCK[3]%10+1;break;
								  default :Data[0]=CLOCK[3]/10+1;
	                           }
	                      } break;
                	 case 6:
	                     {
						 BEEP=1;
	                      IE1 = 0;
                          EX1 = 1;
                          ET1 = 0;
                          ET2 = 1;
                          TR0 = 0;
						  for(i=0;i<4;i++)
                          switch(i)
                         	{
                                 case 0:Data[3]=CLOCK[2]%10+1;break;
	                             case 1:Data[2]=CLOCK[2]/10+1;break;
	                             case 2:Data[1]=CLOCK[3]%10+1;break;
								  default :Data[0]=CLOCK[3]/10+1;
	                           }
	                     } break;
                   default:
				   EA=1;ET0=1;IT1=1;EX1=1;TR0=1;BEEP=1;
                      for(i=0;i<4;i++)
                          switch(i)
                         	{
                                 case 0:Data[3]=CLOCK[2]%10+1;break;
	                             case 1:Data[2]=CLOCK[2]/10+1;break;
	                             case 2:Data[1]=CLOCK[3]%10+1;break;
	                             default :Data[0]=CLOCK[3]/10+1;
	                           }
	          }
     shumadp_cs = CLOCK[1]%2;
     LEDplay (5);
	 STATE = P1&0x07;
  }
}

⌨️ 快捷键说明

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