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

📄 电源老化测试定时器.c

📁 电源老化房老化测试定时器 望大家有用
💻 C
字号:

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int 

sbit RSPIN = P2^7;
sbit RWPIN = P2^6;
sbit EPIN = P2^5;
sbit out= P1^0;
 /* 增特殊功能寄存器定义        */
sfr	 ISP_DATA	=   0xe2;
sfr  ISP_ADDRH	=   0xe3;  
sfr  ISP_ADDRL	=   0xe4;
sfr  ISP_CMD	=   0xe5; 
sfr  ISP_TRIG	=   0xe6;   
sfr  ISP_CONTR  =   0xe7;


/* 定义常量 */
#define ERROR   0
#define OK      1

bit km;                      	//按键已去抖动标志
bit kp;                       //按键已处理标志

bit ON_OFF; 
bit start; 
bit rest; 
bit sheding; 
uchar show_status;     	//LED 显示状态标志
uchar XPOS,YPOS;
uint  ON,OFF,TIMER;
uint  ON_R ,OFF_R,TIMER_R; 
uchar ON_0,ON_1,ON_2,OFF_0,OFF_1,OFF_2,TIMER_0,TIMER_1,TIMER_2 ;
uint  count_down;      //1秒钟计时用
uchar miao;

void delay(unsigned int t)
{  unsigned int i,j;
   for(i=0;i<t;i++)
      for(j=0;j<10;j++)
         ;
}


    /* 打开 ISP,IAP 功能 */
void ISP_IAP_enable(void)
{
	EA	=	0;	/* 关中断 */
	ISP_CONTR	=	ISP_CONTR & 0x18;       /* 0001,1000 */
	ISP_CONTR	=	ISP_CONTR | 0x02;
	ISP_CONTR	=	ISP_CONTR | 0x80;       /* 1000,0000 */
}

/* 关闭 ISP,IAP 功能 */
void ISP_IAP_disable(void)
{
	ISP_CONTR	=	ISP_CONTR & 0x7f;	/* 0111,1111 */
	ISP_TRIG	=	0x00;
	EA			=   1;                	/* 开中断 */
}

/* 字节读 */
uchar byte_read(uint byte_addr)
{
	ISP_ADDRH	=	(uchar)(byte_addr >> 8);
	ISP_ADDRL	=	(uchar)(byte_addr & 0x00ff);

	ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
	ISP_CMD		=	ISP_CMD	|	0x01;        /* 0000,0001 */

	ISP_IAP_enable();

	ISP_TRIG	=	0x46;
	ISP_TRIG	=	0xb9;
	_nop_();

	ISP_IAP_disable();
	return (ISP_DATA);
}

/* 扇区擦除 */
uchar sector_erase(uint sector_addr)
{
	uint get_sector_addr	=	0;
	get_sector_addr			=	(sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
	ISP_ADDRH        		=	(uchar)(get_sector_addr >> 8);
	ISP_ADDRL		        =	0x00;

	ISP_CMD	=	ISP_CMD	&	0xf8;	/* 1111,1000 */
	ISP_CMD	=	ISP_CMD	|	0x03;	/* 0000,0011 */

	ISP_IAP_enable();
	ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
	ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
	 _nop_();

	ISP_IAP_disable();
	return OK;
}

/* 字节编程 */
uchar byte_program(uint byte_addr, uchar original_data)
{
	ISP_ADDRH	=	(uchar)(byte_addr >> 8);
	ISP_ADDRL	=	(uchar)(byte_addr & 0x00ff);

	ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
	ISP_CMD		=	ISP_CMD	|	0x02;		/* 0000,0010 */
	ISP_DATA	=	original_data;

	ISP_IAP_enable();
	ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
	ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
	_nop_();

	ISP_IAP_disable();
	return	OK;
}























void lcdwaitidle(void)
{  P0=0xff;
   RSPIN=0;
   RWPIN=1;
   EPIN=1;
   while((P0&0x80)==0x80);
   EPIN=0;
}

void lcdwcn(unsigned char c)
{  RSPIN=0;
   RWPIN=0;
   P0=c;
   EPIN=1;
   _nop_();
   EPIN=0;
}

void lcdwc(unsigned char c)
{  lcdwaitidle();
   lcdwcn(c);
}

void lcdwd(unsigned char d)
{  lcdwaitidle();
   RSPIN=1;
   RWPIN=0;
   P0=d;
   EPIN=1;
   _nop_();
   EPIN=0;
}

void lcdpos(void)
{  XPOS&=0x0f;
   YPOS&=0x03;
   if(YPOS==0x00)
      lcdwc(XPOS|0x80);
   else if(YPOS==0x01)
      lcdwc((XPOS+0x40)|0x80);
}

void lcdreset()
{  delay(150); lcdwcn(0x38);
   delay(50); lcdwcn(0x38);
   delay(50); lcdwcn(0x38);
   lcdwc(0x38);
   lcdwc(0x08);
   lcdwc(0x01);
   lcdwc(0x06);
   lcdwc(0x0c);
}

void lcdwone(unsigned char x,unsigned char y,unsigned char s)
{  YPOS=y;
   XPOS=x;
   {  lcdpos();
      lcdwd(s);


   }
}


void lcdwda(unsigned char x,unsigned char y,unsigned char *s)
{  YPOS=y;
   for(XPOS=x;XPOS<16;XPOS++)
   {  lcdpos();
      lcdwd(*s);
      s++;
    
   }
}



void show_1602()
{

 

  ON_R=ON;
  OFF_R=OFF;
  TIMER_R=TIMER;


  ON_2=ON_R/100;
  ON_1= (ON_R-=ON_2*100)/10;
  ON_0= ON_R-=ON_1*10;

  OFF_2=OFF_R/100;
  OFF_1= (OFF_R-=OFF_2*100)/10;
  OFF_0= OFF_R-=OFF_1*10;



  TIMER_2=TIMER_R/100;
  TIMER_1= (TIMER_R-=TIMER_2*100)/10;
  TIMER_0= TIMER_R-=TIMER_1*10;

 lcdwone(4,0,0X30+ON_2);
 lcdwone(5,0,0X30+ON_1);
 lcdwone(6,0,0X30+ON_0);

 lcdwone(4,1,0X30+OFF_2);
 lcdwone(5,1,0X30+OFF_1);
 lcdwone(6,1,0X30+OFF_0);

 lcdwone(11,1,0X30+TIMER_2);
 lcdwone(12,1,0X30+TIMER_1);
 lcdwone(13,1,0X30+TIMER_0);

 delay(5000);
 		    switch(show_status	 )
		     { case 1:  
 				
			      lcdwone(4,0,0X20);
                              lcdwone(5,0,0X20);
                              lcdwone(6,0,0X20);
			     break;

		       case 2:  
			      lcdwone(4,1,0X20);
                              lcdwone(5,1,0X20);
                              lcdwone(6,1,0X20);
			     break;

		       case 3:  
			      lcdwone(11,1,0X20);
                              lcdwone(12,1,0X20);
                              lcdwone(13,1,0X20);
			     break;
		       
			case 4: 
                         sector_erase(0x2000);
                         byte_program( 0x2000,  ON_2);
                         byte_program( 0x2001,  ON_1);
                         byte_program( 0x2002,  ON_0);

                         byte_program( 0x2003,  OFF_2);
                         byte_program( 0x2004,  OFF_1);
                         byte_program( 0x2005,  OFF_0);

                         byte_program( 0x2006,  TIMER_2);
                         byte_program( 0x2007,  TIMER_1);
                         byte_program( 0x2008,  TIMER_0);
		         show_status=0;

			  break;

		       default:
                             break;


			   }
    delay(5000);



 }

 void read_ISP_IAP()
{
      byte_read( 0x2000);
    ON_2=ISP_DATA;
    byte_read( 0x2001);
    ON_1=ISP_DATA;
    byte_read( 0x2002);
    ON_0=ISP_DATA;

    byte_read( 0x2003);
    OFF_2=ISP_DATA;
    byte_read( 0x2004);
    OFF_1=ISP_DATA;
    byte_read( 0x2005);
    OFF_0=ISP_DATA;

    byte_read( 0x2006);
    TIMER_2=ISP_DATA;
    byte_read( 0x2007);
    TIMER_1=ISP_DATA;
    byte_read( 0x2008);
    TIMER_0=ISP_DATA;

    ON=ON_2*100+ON_1*10+ON_0;
    OFF=OFF_2*100+OFF_1*10+OFF_0;
    TIMER=TIMER_2*100+TIMER_1*10+TIMER_0;

 }










void Timer0ISR(void) interrupt 1 using 3	//定时器0中断程序,用于走时,1/8000秒一次
{
    if(TIMER==0)
    {
    TR0=0;
    out= 1; 
    start=0;
   } 
 count_down--;
 if(count_down==0)  				//过了一秒钟
 {count_down=8000;
  miao++; 
  if(miao==60)  
  {miao=0;
   TIMER--;

   }



  if(ON_OFF==0)  
  { 
   
   out= 1; 
   if(OFF==0) ON_OFF=1;
   else     OFF--;
  }   
  else 
  {
  out= 0;
  if(ON==0) ON_OFF=0;
  else     ON--;
  }
 }
}








 void Timer1ISR(void) interrupt 3 using 2		//定时器2中断,用于按键扫描
{uchar keytmp;

TH1=0x3c; TL1=0xb0;      // 每30ms中断一次

         //***  按键扫描及处理  ***/
  keytmp=P3;
  if(keytmp==0xff)  { km=0;  kp=0;  }   
  else 
   { if(km==0)   km=1;   
	 else
     { if(kp==0)
        { kp=1;  
                
		  if(keytmp==0xfe &&TR0==0)   	 //第一个按钮

	   	   {show_status++;

                    if(show_status==1)sheding=1;

		    if(show_status>4)			
	            show_status=0;
  
	            }
		  if(keytmp==0xfd &&TR0==0 )    //第二个按钮
                 
		   { switch(show_status	 )
		     { case 1:  
 				
			     if(ON>998)  	 ON=999;
			     else	   ON++;
			     break;

		       case 2:  
 				
			     if(OFF>998)  	 OFF=999;
			     else	   OFF++;
			     break;

		       case 3:  
 				
			     if(TIMER>998)  	 TIMER=999;
			     else	   TIMER++;
			     break;



		       default:
                             break;


			   }
	             
		     } 
		  if(keytmp==0xfb &&TR0==0)    //第二个按钮
                  
		   { switch(show_status	 )
		     { 
		       case 1:  
 				
			     if(ON==0){ON=0; }
			     else {ON--; }
			     break;
		       case 2:  
 				
			     if(OFF==0){OFF=0; }
			     else {OFF--; }
			     break;
		       case 3:  
 				
			     if(TIMER==0){TIMER=0; }
			     else {TIMER--; }
			     break;



		       default:
                             break;


			   }
	             
		     }  
                     
		  if(keytmp==0xf7  && start==0 )    //第二个按钮
                  
		   { 
                     
                      rest=1;
                      show_status=0;

	            



		     }                      
 		  if(keytmp==0xef &&show_status==0)    //第二个按钮
                  
		   { 
                     start=!start;
                     if(start==1)
                      {

	             TR0=1; 
	             }
                     else   
                     {
                      TR0=0;
                     out= 1;
                     }
		     }                                        				 
	}
     }
   }
  }		 
			 
			 
			 
			 
			 


     





















main()
{  out= 1;
   EPIN=0;
   lcdreset();
  
   lcdwda(0,0," ON=    s  Timer");
   lcdwda(0,1,"OFF=    s      m");
    delay(50);
   read_ISP_IAP();
    start=0;
    ON_OFF=0;
    miao=0;
     sheding=0;
    IE=0;  IP=0;             //disable all interrupt and lower priority
  TMOD=0x12;             //timer 0 is set to mode 2,auto_reloading,timer1,mode 1
  TH0=0x2F;    TL0=0x2F;        //timer0 parameters for 0.125ms
  TH1=0x3c; TL1=0xb0;      //timer1 parameters for 30ms
  TR0=0;    TR1=1;        //timer0 interrupt most important
  ET0=1;    ET1=1;    EA=1;     //enable interrupt function
    count_down=8000;
    show_status=0;
   while(1)
   {  
 
   show_1602();

   if(sheding==1)
   {sheding=0;
    read_ISP_IAP();
    }
   if(rest==1)
   {
    rest=0;
    read_ISP_IAP();
	
    }
  if( TR0==1)
   {
    if(ON==0 && ON_OFF==0)
    {

    byte_read( 0x2000);
    ON_2=ISP_DATA;
    byte_read( 0x2001);
    ON_1=ISP_DATA;
    byte_read( 0x2002);
    ON_0=ISP_DATA;


    ON=ON_2*100+ON_1*10+ON_0;

	
    }
   if(OFF==0&& ON_OFF==1)
   {

    byte_read( 0x2003);
    OFF_2=ISP_DATA;
    byte_read( 0x2004);
    OFF_1=ISP_DATA;
    byte_read( 0x2005);
    OFF_0=ISP_DATA;


    OFF=OFF_2*100+OFF_1*10+OFF_0;

	
    }

  }

   }
}
	  

⌨️ 快捷键说明

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