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

📄 modbus.c

📁 8051F_Modbus.rar是在C8051F020单片机上编写的CRC16校验的MODBUS协议.
💻 C
📖 第 1 页 / 共 3 页
字号:
					 break;
                case 0XD4:		   //1-16后关前开指令
					
					 p7pan=RX0_Buf[3]; 

					 firstoff1_8=p7pan;

					 p7pas=~((~p7pas)|p7pan);
                     P7=p7pas;

                     p6pan=RX0_Buf[2]; 

					 firstoff9_16=p6pan;

					 p6pas=~((~p6pas)|p6pan);
                     P6=p6pas;

					 hkqg1_16=1;
					 
					 TR2=1;
					 
					 RX0_Ready=0;
					 break;
                 case 0XD5:		   //16-20前关后开指令
				    
                   	 p5pan=RX0_Buf[3];

					 firstoff17_20=p5pan;
					  
					 p5pas=~((~p5pas)|p5pan);
                     P5=p5pas;

                     qkhg17_20=1;

                     TR2=1;
                     RX0_Ready=0;
					 break;
                case 0XD6:		   //16-20后关前开指令
								
                     p5pan=RX0_Buf[3];
					 firstoff17_20=p5pan;
					 p5pas=~((~p5pas)|p5pan);
                     P5=p5pas;


                     hkqg17_20=1;

                     TR2=1;
					 
					 
					 RX0_Ready=0;
					 break;
              default:          
                    RX0_Ready=0;
                           
          }
           
          RX0_BufClear(); 
      }
//---------------------------------------------------------------------------------------
	  if(sendinterva2)
	   {
          sendinterva2=0;
		  if(qkhg1_16)
		  {
		    p7pas=firstoff1_8;
            p6pas=firstoff9_16;

            p7pas=p7pas<<1;
            p6pas=p6pas<<1;

            P7=p7pas;
            P6=p6pas;

			qkhg1_16=0;
		  }
		 if(hkqg1_16)
		 {
            p7pas=firstoff1_8;
            p6pas=firstoff9_16;            

			p7pas=p7pas>>1;
            p6pas=p6pas>>1;

            P7=p7pas;
            P6=p6pas;
			
			hkqg1_16=0;
		 }

         if(qkhg17_20)
		 {
             p5pas=firstoff17_20;

			 p5pas=p5pas<<1;
             P5=p5pas;
		     qkhg17_20=0;
		 }
         if(hkqg17_20)
		 {
             p5pas=firstoff17_20;

			 p5pas=p5pas>>1;
             P5=p5pas;

		     hkqg17_20=0;
		 }

	   }       
//--------------------------------------------------------------------------------------
      if(cdma)                     //定时采集开
	  {
	       if(sendinterval)        //间隔采集定时时间到
	      {     
	            if(addr>=addh)      //到最后一个地址
			    {   
			                  RECEIVENUM1=0;
						      RX1_index=0;
							  address=addr;

							  modbuscgqsend(addr);
				              addr=addl;
				              addend=1;               //addend=1,发送到最后一个地址
		                      sendinterval=0;
		                      TR0=1;
				 }
				 else                      //没到最后一个地址
				 {
				               RECEIVENUM1=0;
						       RX1_index=0;
							   address=addr;

							   modbuscgqsend(addr);
				               addr=addr+1;
				               addend=0;               //addend=1,发送到最后一个地址
		                       sendinterval=0;
		                       TR0=1;
				 }
					 
	       } 
	   }
	   if(RX1_Ready)
       {   
	        unsigned char f,temp,temp1;
	        ////////////////////////////////////
             for(f=0;f<RX1_Buf[2];f=f+2)
			 {  
			   temp=RX1_Buf[3+f];
			   temp1=RX1_Buf[4+f];
			   RX1_Buf[3+f]=temp1; 
			   RX1_Buf[4+f]=temp;
			 }			
             ///////////////////////////////////
			 modbusRX1_Buf[0]=0x7e; 
			 modbusRX1_Buf[1]=RX1_Buf[0]; 
			 modbusRX1_Buf[2]=0xFF-RX1_Buf[0]+1; 
			 modbusRX1_Buf[3]=0x50;  
			 modbusRX1_Buf[4]=0x00;  
			 modbusRX1_Buf[5]=0x00; 
			 for(f=0;f<RX1_Buf[2];f++)
			 {  
			    modbusRX1_Buf[6+f]=RX1_Buf[3+f]; 
			 }
			 temp=0;
			 for(f=1;f<6+RX1_Buf[2];f++)
			 {
			     temp=temp+modbusRX1_Buf[f];
			 }
             f=6+RX1_Buf[2];
			 modbusRX1_Buf[f]=0xff-temp+1;
             modbusRX1_Buf[f+1]=0x0d;
             
			 temp=f+1;
/////////////////////////////////////////////////////////////////////
			 for(f=0;f<temp+1;f++)
			 {
			    ardata[packge]=modbusRX1_Buf[f];
				packge=packge+1;
			 }
			 
			 if(modbusRX1_Buf[1]==addh)//收到最后一个地址数据了吗
            {
     		     P4=0xff;
                 ardata[packge]=P4;
                 packge++;
			     addrnd=1;
            }
            else
            {
                addrnd=0;
            }                   //

	        RX1_BufClear();
	        RX1_Ready = 0;
        }
 ///////////////////////////////////////////////////////////////////////////////////////////////////          
		    
			
 //将打包的数据发往总控中心

       if((addend==1 || addrnd==1))
      {
	       
		   	while (!TX0_Ready) ;              // wait for transmitter to be available
            TX0_Ready = 0;                    // claim transmitter
            TX0_ptr = ardata;                // set TX buffer pointer to point to 
		    SENDNUM0=packge;
		    TI0 = 1;

            packge=0; 
            
			//设置相应标志位
            //下一次打包开始
           	addend=0;
			addrnd=0;

	   } 
			
  
  
}


}





//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use an 22.1184MHz crystal
// as its clock source.
//
void SYSCLK_Init (void)
{
   int i;                              // delay counter

   OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.1184MHz crystal

   for (i=0; i < 256; i++) ;           // wait for crystal osc. to start up

   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle

   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
}

//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
   
   XBR0    = 0x05;                     // Enable UART0
   XBR1    = 0x00;
   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
   P0MDOUT |= 0x11;                    // enable TX0 as a push-pull output
   P2MDOUT |= 0x03;                    // enable P2 as push-pull output
   
   P74OUT  |=0Xf4;
}

//-----------------------------------------------------------------------------
// UART1_Init
//-----------------------------------------------------------------------------
//
// Configure UART1 using Timer1, for <baudrate> and 8-N-1.
//
void modbusUART1_Init (void)
{
   SCON1   |= 0xd0;                     // SCON1: mode 1, 8-bit UART, enable RX
   T4CON   |=0X30;                       // Stop Timer; clear int flags; enable
   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; 
	       
		  if(RX1_index == 0)
		  {
		      if(the_char==address)
			  {
			      RX1_Buf[RX1_index] = the_char;
		          RX1_index++;
				  RECEIVENUM1=1;
			  }
			  else
			  {
			       RX1_index=0;
			  }
		  }
		  else if(RX1_index == 1)
		  {   if(the_char==0x03)
			  {
			       RX1_Buf[RX1_index] = the_char;
		           RX1_index++;
				   RECEIVENUM1=2;
			  }
			  else
			  {
			       RX1_index=0;
			  }
		  }
		  else if(RX1_index == 2)
		  {      
		         RX1_Buf[RX1_index] = the_char;
		         RX1_index++;
				 RECEIVENUM1=3;
		  }
		  else if(RX1_index > 2)
		  {
		         if(RX1_index==4+ RX1_Buf[2])
				 {
				    RX1_Buf[RX1_index] = the_char;
					RECEIVENUM1++;
				    RX1_index=0;
					RX1_Ready = 1;  
				 }
				 else
				 {
				   RX1_Buf[RX1_index] = the_char;
		           RX1_index++;
				   RECEIVENUM1++; 
				 }
		  }
		 
		 }

     
   } 
   else if ((SCON1 & 0x02) == 0x02) 
   {
      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
		   if(even[the_char]==0)
		     SCON1 &= ~0x08;
		   else
             SCON1|= 0x08;    

⌨️ 快捷键说明

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