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

📄 20051130152364.c

📁 C8051F020 东软电力载波集中器命令处理程序
💻 C
📖 第 1 页 / 共 2 页
字号:
   RCAP4H=0XFF;
   RCAP4L=0XB8;
   T4CON   |=0X04;                      //

   PCON  |= 0x10;                      // SMOD1 = 1
   EIE2  |= 0x40;                      // enable UART1 interrupts

   TX1_Ready = 1;                       // indicate TX ready for transmit
   RX1_Ready = 0;                       // indicate RX string not ready
   TX1_ptr = NULL;
  
}


//
void UART1_ISR (void) interrupt 20 using 3
{
   
   static unsigned char TX1_index = 0;    // send buffer index
   unsigned char the_char;

   if ((SCON1 & 0x01) == 0x01)
   {                                    // handle receive function
      SCON1 &= ~0x01;                   // RI1 = 0; clear RX complete 
      if (RX1_Ready == 0)                //可以接收
	  {   the_char = SBUF1;                             // check to see if message pending
          if(RX1_index >=RX1_LENGTH)
		  {
		     if (the_char == RX1_END)             //是结束符
			 {
			      	RX1_Buf[RX1_index] = the_char;   // NULL-terminate message
                    RX1_Ready = 1;              // post message ready
                    RX1_index = 0;              // reset RX message index
			 }
			 else                              //不是结束符
			 {      
			        RX1_Ready =0;              // post message ready
                    RX1_index = 0;              // reset RX message index
			        
			 }
		  }     
		  else
		  {
		    
			  if(RX1_index==0)
			  {
			        if (the_char == RX1_START)             //是起始符
			        {
			      	       RX1_Buf[RX1_index] = the_char;
		                   RX1_index++;
						   RECEIVENUM1=2;
			        }
			        else                              //不是起始符
			       {

        			        RX1_Ready =0;              
                            RX1_index = 0; 
							RECEIVENUM1=1;             
                    }   
			  }
			  else
			  {
			        if (the_char == RX1_END)             //是结束符
			        {
			      	       RX1_Buf[RX1_index] = the_char;   // NULL-terminate message
                           RX1_Ready = 1;              // post message ready
                           RX1_index = 0;              // reset RX message index
			        }
			        else                              //不是结束符
			       {

        			       RX1_Buf[RX1_index] = the_char;
		                   RX1_index++;
						   RECEIVENUM1++;
                    }
			    
			  }
		 }

      }
	  else 
	  {
         ; // ignore character -- previous message has not been processed
      }
   } 
   else if ((SCON1 & 0x02) == 0x02) 
   {// handle transmit function
      SCON1 &= ~0x02;                     // TI1 = 0; clear TX complete 
                                          // indicator
      the_char = *TX1_ptr;                 // read next character in string
       if(TX1_index<SENDNUM1)
	   {
	       TX1_ptr++;
		   TX1_index++;                     // get ready for next character
	       SBUF1 = the_char;               // transmit it
           
	   }
	   else
	   {    
	        TX1_Ready = 1;                 // indicate ready for next TX
            TX1_index=0;
		
	   }
   }
}


//定时器0初始化

void Timer0_Init (void)
{
   TMOD |=0X01;
   TH0=0XB8;
   TL0=0X00;
   ET0=1;
  
}


//---------------------------------------------------------------------------------------
/*定时器T0溢出中断处理子程序*/
void Timer0_ISR(void) interrupt 1      	
{
          //tend=temp;
          // if(time>=tend)   
		   if(time>=password_time)  
          {
              TL0=0X00;        /*11.0592MHZ T0低8位初值:定时10ms*/
	          TH0=0XB8;        /*T0高8位初值*/
              TR0=0;           /*终止定时器T0*/
              //sendinterval=1;
			  password_flag=0;
              time=0;
			  LED=1;
           }
           else

           {
              LED=0;
              TL0=0X00;        /*T0低8位初值:定时50ms*/
	          TH0=0XB8;        /*T0高8位初值*/
	          time=time+1;
	          //sendinterval=0;
	    }
}
//---------------------------------------------------------------------------------------



//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{  /*
   SCON0   = 0x50;                     // SCON0: mode 1, 8-bit UART, enable RX
   TMOD   |= 0x20;                     // TMOD: timer 1, mode 2, 8-bit reload
   TH1    = 0x6F;                      // set Timer1 reload value for baudrate
   CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
   PCON  |= 0x90;                      // SMOD0 = 1
   ES0    = 1;                         // enable UART0 interrupts
   TI0    = 1;                         // Indicate TX0 ready
   TR1    = 1;                         // start Timer1

   TX0_Ready = 1;                       // indicate TX ready for transmit
   
   RX0_Ready = 0;                       // indicate RX string not ready
   TX0_ptr = NULL;*/
   SCON0  = 0x50;                      // SCON0: mode 1, 8-bit UART, enable RX
   TMOD   = 0x20;                      // TMOD: timer 1, mode 2, 8-bit reload
   TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate
   TR1    = 1;                         // start Timer1
   CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
   PCON  |= 0x80;                      // SMOD00 = 1
   ES0    = 1;                         // enable UART0 interrupts

   TX0_Ready = 1;                       // indicate TX ready for transmit
   RX0_Ready = 0;                       // indicate RX string not ready
   TX0_ptr = NULL;
}


void UART0_ISR (void) interrupt 4 
{
   
   static unsigned char TX0_index = 0;    // send buffer index
   unsigned char the_char0;
   
   if (RI0 == 1) 
   {                    
      RI0 = 0; 
	  if (RX0_Ready == 0)                        //可以接收
	  {   the_char0 = SBUF0;                    
	      if(valid_cmd0[the_char0]==1)
		  {
		          switch(recv_state)
                 {
                         case fsa_init:
                            if(valid_cmd1[the_char0]==1)              //有效命令
                            {    
                                recv_state=fsa_data;          //下一个状态
                                 RX0_Buf[0]=the_char0;
						        j=0;
					        }
                            break;
                         case fsa_data:                        //数据      
                             if(j>=RX0_LENGTH-1)
  					         {   
					             RX0_BufClear();
							     RX0_Ready=0;
                                 recv_state=fsa_init;          //帧长超过rlength,非法,返回初始状态
					         }
					         else                              
					        {
					             j=j+1;
						         if(the_char0==RX0_END )                  //帧长不超过rlength,检测到帧尾,合法,返回初始状态              
						        {
						            RX0_Buf[j]=the_char0;
							        RX0_Ready=1;                //有合法命令,置需处理命令标志位为1
						            recv_state=fsa_init;     
						        }
						        else
						       {
						             RX0_Buf[j]=the_char0;
							         RX0_Ready=0;
						        }

					         }
					           break;
				        default:
				              recv_state=fsa_init;
					          break;
                     }
          
		  }
		  else
		  {
		      
		  }

      }
	  else 
	  {
         ; // ignore character -- previous message has not been processed
      }

   } 
   else if (TI0 == 1) 
   {              
      TI0 = 0;                         // clear TX complete indicator
	   the_char0 = *TX0_ptr;                 // read next character in string
       if(TX0_index<SENDNUM0)
	   {
	       TX0_ptr++;
		   TX0_index++;                     // get ready for next character
	       SBUF0 = the_char0;               // transmit it
           
	   }
	   else
	   {    
	        TX0_Ready = 1;                 // indicate ready for next TX
            TX0_index=0;
		
	   }
   }
}

//------------------------------------------------------------------------------------
//RX0_BufClear() 
//-----------------------------------------------------------------------------------
void RX0_BufClear(void)
{
        unsigned char m;
        for(m=0;m<RX0_LENGTH;m++)
        {
            RX0_Buf[m]=0x00;
        }
} 

//-----------------------------------------------------------------------------
//串口0发送一个字符串子程序
//入口函数 要发送的数组名称(指针),要发送的字符个数
//-----------------------------------------------------------------------------
void send_string_com(unsigned char *str,unsigned char strlen)
{
      while (!TX0_Ready) ;              // wait for transmitter to be available
      TX0_Ready = 0;                    // claim transmitter
      TX0_ptr = str;                    // set TX buffer pointer to point to 
                                        // received message
      SENDNUM0=strlen;
      TI0 = 1;
}

//-------------------------------------------------------------------------------------
//写FLASH
//-------------------------------------------------------------------------------------
void FlashWrite(unsigned char xdata *pwrite,unsigned char *BufFrom)
{
       unsigned char i;
	   
	   WDTCN = 0xde;                       // disable watchdog timer
       WDTCN = 0xad;
	   EA=0;
       
	   FLSCL |= 0x01;                      // Enable FLASH writes/erases

       PSCTL |= 0x03;                      // set PSWE = PSEE = 1
       PSCTL |= 0x04;                      // set SFLE = 1 (enable
                                           // access to scratchpad)
       *pwrite = 0x00;                     // erase SCRATCH PAGE     该页被擦除

       PSCTL &= ~0x07;                     // set PSWE = PSEE = SLFE = 0

       PSCTL |= 0x01;                      // set PSWE = 1 写FLASH允许
                                               

       for(i=0;i<2;i++)
	   {   
	       PSCTL |= 0x04;                   // set SFLE to enable FLASH writes
                                            // to Scratch Pad memory
	       *pwrite++=*BufFrom++;

		   PSCTL &= ~0x04;                      // set SFLE to enable FLASH writes
                                            // to Scratch Pad memory
	   }

       PSCTL &= ~0x07;                     // set PSWE = PSEE = SFLE = 0   
       FLSCL &= ~0x01;                     // clear FLWE to disable FLASH
                                          // write/erases
       EA=1;

       
}

//--------------------------------------------------------------------------------------
//读FLASH
//--------------------------------------------------------------------------------------
void FlashRead(unsigned char code *pread,unsigned char *BufTo)
{
    unsigned char i;
	for(i=0;i<2;i++)
	{  
	   PSCTL |= 0x04;                   // set SFLE to enable FLASH writes
                                        // to Scratch Pad memory
       BufTo[i]=*pread;
	   pread++;

	   PSCTL &= ~0x04;                     // clear SFLE to disable access
                                          // to Scratch Pad memory
	}

}


//--------------------------------------------------------------------------------------
//RX1_BufClear(void)
//--------------------------------------------------------------------------------------
void RX1_BufClear(void)
{
     unsigned char m;
     for(m=0;m<RX1_LENGTH;m++)
     {
          RX1_Buf[m]=0x00;
     }
}




//---------------------------------------------------------------------------------------
//定时器T2初始化子程序
//---------------------------------------------------------------------------------------
void Timer2_Init(void) 
{
   TH2=0XB8;
   TL2=0X00;
   T2CON |=0X00;  //T2定时器方式1,自动重装载
   ET2=1;            //定时器T2允许中断
   
}

//---------------------------------------------------------------------------------------
//定时器T2溢出中断处理子程序
//---------------------------------------------------------------------------------------
void Timer2_ISR(void) interrupt 5
{
   
   TF2=0; /*定时器T2溢出标志零*/
   
   tend2=temp2;
   if(time2>=tend2)     
   {
       TR2=0;           //终止定时器T0
       sendinterva2=1;
       time2=0;
   }
   else
   {
       time2=time2+1;
	   sendinterva2=0;
   } 
   
  
}

⌨️ 快捷键说明

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