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

📄 uart1_int1.c

📁 8051F_Modbus.rar是在C8051F020单片机上编写的CRC16校验的MODBUS协议.
💻 C
📖 第 1 页 / 共 3 页
字号:
                     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)      //到最后一个地址
			   {
			        cgqsend(addr);
				    addr=addl;
				    addend=1;               //addend=1,发送到最后一个地址
		            sendinterval=0;
		            TR0=1;
				}
				else                      //没到最后一个地址
				{
				    cgqsend(addr);
				    addr=addr+1;
				    addend=0;               //addend=1,发送到最后一个地址
		            sendinterval=0;
		            TR0=1;
				}
	       } 
	   }
	    
//---------------------------------------------------------------------------------------	  


      if(RX1_Ready == 1)
	  {
          unsigned char e;
          for (e=0;e<RECEIVENUM1;e++)
		  {   
		      if(RX1_Buf[e]!=0x0d)
			  {
		      
			       if(RX1_Buf[e]==0x05)
				   {
				        ardata[packge]=RX1_Buf[e]+RX1_Buf[e+1];
						packge=packge+1;
                        e=e+1;
				   }
				   else
				   {
				        ardata[packge]=RX1_Buf[e];
						packge=packge+1;
				   }
               }
			   else
			   {
			        ardata[packge]=RX1_Buf[e];
					packge=packge+1;
			   }
			   
		   }
           //ardata[packge]=0x0d;
         /* 
            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+1;
		    TI0 = 1;
            
			packge=0;    
            */
			//
			 if(RX1_Buf[1]==addh)//收到最后一个地址数据了吗
            {
                
			     if(RX1_Buf[4]>=0x80)  //需要发送确认命令吗
			     {
			         cgqqrsend(RX1_Buf[1],RX1_Buf[4]);
                     addrnd=0;
			     }
				 else
				 {			     
				     P4=0xff;
                     //status[9]=P4;
					 //unsigned char i;
                     //ReadStatus();
			        //for(i=0;i<12;i++)
			       //{
			          ardata[packge]=P4;
                      packge++;
			       // }
					addrnd=1;

                  }
            }
            else
            {
                addrnd=0;
            }                   //

	        RX1_BufClear();
	        RX1_Ready = 0;  
      } 
 


 //将打包的数据发往总控中心

       if((addend==1 || addrnd==1))
//       if(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 UART1_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;                             // 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
		   if(even[the_char]==0)
		   SCON1 &= ~0x08;
		   else
           SCON1|= 0x08;    
	       SBUF1 = the_char;               // transmit it
           
	   }
	   else
	   {    
	        TX1_Ready = 1;                 // indicate ready for next TX
            TX1_index=0;
			RE485=0;
	   }
   }
}


/*
//--------------------------------------------------------------------------------------------
//串口通过485向传感器发送命令子程序,addr为传感器地址
//--------------------------------------------------------------------------------------------
void cgqsend(unsigned char addr)
{
      unsigned char Cd[6];
      unsigned char SendCd[7];
      unsigned char r,s;
      Cd[0]=0X7E;
      Cd[1]=addr;
      Cd[2]=0xff-addr+1;
      Cd[3]=0x50;
      Cd[4]=(0XFF-(Cd[1]+Cd[2]+Cd[3]))+1; 
      Cd[5]=0X0D;
      
      r=0;
      for(s=0;s<6;s++)
      {  
           if(s!=5)
           {
               if((Cd[s]==0X0D)||(Cd[s]==0X05))  //如果Cd[s]=13或5,则拆分/
               {
              		SendCd[r]=0x05;
              		r=r+1;
              		SendCd[r]=Cd[s]-0x05;
              		r=r+1;
         	    }
         	    else
         	   {
              		SendCd[r]=Cd[s];
              		r=r+1;
         	   }
           }
           else
           {
                   SendCd[r]=0X0D;
           }
      }
	  
	  while (!TX1_Ready);                  // wait for TX ready
      TX1_Ready = 0;                       // claim transmitter
      TX1_ptr = SendCd;                    // set buffer pointer
	  SENDNUM1=r+1;
	  RE485=1;
      SCON1 |= 0x02;                      // TI1 = 1; start transmit
	
} */
   

//定时器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)     
          {
              TL0=0X00;        /*11.0592MHZ T0低8位初值:定时10ms*/
	          TH0=0XB8;        /*T0高8位初值*/
              TR0=0;           /*终止定时器T0*/
              sendinterval=1;

⌨️ 快捷键说明

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