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

📄 pcckmodbus.bak

📁 lpc932芯片 用于modbus通讯的范例
💻 BAK
📖 第 1 页 / 共 2 页
字号:
								  lk=1;
								  T2buf[0]=(T2buf[0] & 0xfc) | lk;
								 }
								 else
								 {
								  lk=2;
								  T2buf[0]=(T2buf[0] & 0xfc) | lk;
								 }  
						}	
                      else
						{
								 lk=RXbuf[4];
								 if (lk==0xff)
								 {
								  T2buf[0]=T2buf[0] | 4;
								 }
								 else
								 {
								  T2buf[0]=T2buf[0] & 0xfb;
								 }
						}
					 I2cwr=0;
					 for (i=0;i<=rlend;i++)      //++控制ok
						{
						 TXbuf[i]=RXbuf[i];
						}
					 tfbok=1;
	 		    	 tsleng=rlend+1;
 				  }
			     break;
	   default:	TXbuf[1]=RXbuf[1] | 0x80;TXbuf[2]=1;
	            tfbok=1;
	  			tsleng=5;break;
	  }  
    }
   if (tfbok==1)
    {
	 TXbuf[0]=modadder;
     puc=&TXbuf[0];
	 i=CRC16(puc,tsleng-2);
	 lm=i/0x100;
	 lk=i%0x100;
     TXbuf[tsleng-2]=lm;
	 TXbuf[tsleng-1]=lk;
	 tsbufr=1;
     rsbufr=0;
     sipm=1;
	 tsbbb=1;
	 ACC=TXbuf[0];
	 TB8=P;
	 SBUF=ACC;
	 modbjda=0;
	}
 }
}
//=============================================================================
void chushihua()
{
 //unsigned char presc;
 IEN0=0x0;
 IEN1=0x0;
 DIVM=0;
 SSTAT=0x44; // separate Rx/Tx
 BRGCON=0;		
//AUXR1=AUXR1 | 0x40;	//debug--------	; setb the EBRR
//SSTAT=SSTAT&0xfa;	//debug------------	//; clr the BR, it is SSTAT.2
 SCON=0xd0;	//	; setup UART mode 1, enables serial reception.
 BRGR1=0x01;	 //  串口波特率发生器0x2f0-->9600((7372800/n)-16)
 BRGR0=0x70;	 //170-->19200,2f0-->9600,5f0-->4800,bf0-->2400,17f0-->1200
 BRGCON=0x03;	//	; Baud Rate Generator Enable.
// EA=1;
 P0M1=0xff;
 P0M2=0;
 P1M1=0xfc;
 P1M2=0x0c;
 P2M1=0xff;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
 P2M2=0x00;
 P3M1=0x03;
 P3M2=0;
 if (led1==0)
 {
   chusua();
  }
 P2M1=0xff;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
 P2M2=0xc0;
 sipm=0;
 EA=0;
 //wdcon
 WDL=0xff;
 WDCON=0x11000101b;
 WFEED1=0xa5;
 WFEED2=0x5a;
 //I2SCLH=75;/*设置IIC波特率*/
// I2SCLL=75;  //75-->25k;50-->37k;25-->74k;19-->100k;5-->369k
// I2CON=0x44;//IIC使能使用内部SCL发生器
// EI2C =1;
 I2cwr=0;
 DIVM=0;
 ES=1;
 TMOD=1;
 TL0 = 0;
 TH0 = 0;
 TR0 = 1;
 ET0 = 1;
// EA = 1;
// iicerrror=0;
// iiccaozuo=0;
 tsleng=0;
 modbjda=0;
}
//-----------------------------------------
/*****************************
申请总线
功能:进行I2C总线的初始化包括
时钟速率,使能,发送起始信号等
******************************/
void GetBus()
{
I2CON=0x44;//01000100B
STA=1;
while(SI==0);
}
/**************************
发送数据
***************************/
void SendByte(uchar c)
{
I2DAT=c;
I2CON=0x44;
while(SI==0);
}
/*******************************************************************
向无子地址器件发送字节数据函数
函数原型: bit IRcvByte(uchar sla,ucahr *c);
功能:从启动总线到发送地址读数据结束总线的全过程,从器件地址sla 返
回值在c 如果返回1 表示操作成功否则操作有误
********************************************************************/
/*bit ISendByte(uchar sla,uchar c)
{
 GetBus();
 SendByte(sla); 
      if(I2STAT!=0x18)
          {
           I2CON=0x54;
           return(0);
           }
SendByte(c);
       if(I2STAT!=0x28)
          {
           I2CON=0x54;
           return(0);
           }
I2CON=0x54;
return(1);
} */
/**********************************************************************
向有子地址器件发送多字节数据函数
函数原型: bit ISendStr(uint sla,ucahr *s,uchar no);
功能:从启动总线到发送地址子地址,读数据结束总线的全过程,从器件地址sla
子地址suba 读出的内容放入s 指向的存储区读no 个字节如果返回1
表示操作成功否则操作有误
**********************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
GetBus();
SendByte(sla);
     if(I2STAT!=0x18)
          {
           I2CON=0x54;
           return(0);
           }
SendByte(suba);
       if(I2STAT!=0x28)
         {
          I2CON=0x54;
          return(0);
	         }
for(i=0;i<no;i++)
 {
  wdog=1;
  SendByte(*s);
         if(I2STAT!=0x28)
         {
          I2CON=0x54;
          return(0);
         }
    s++;
 }
I2CON=0x54;//结束总线
return(1);
}
/*******************************************************************
向无子地址器件读字节数据函数
函数原型: bit IRcvByte(uchar sla,ucahr *c);
功能:从启动总线到发送地址读数据结束总线的全过程,从器件地址sla 返
回值在c 如果返回1 表示操作成功否则操作有误
********************************************************************/
/*bit IRcvByte(uchar sla,uchar *c)
{
GetBus();
SendByte(sla+1);
     if(I2STAT!=0x40)
         {
          I2CON=0x54;
          return(0);
         }
    I2CON=0x41;//
    while(SI==0);
    if(I2STAT!=0x58)
         {
          I2CON=0x54;
          return(0);
         }
*c=I2DAT;
 I2CON=0x54;
return(1);
} */
/**********************************************************************
向有子地址器件读取多字节数据函数
函数原型: bit ISendStr(uint sla,ucahr *s,uchar no);
功能:从启动总线到发送地址子地址,读数据结束总线的全过程,从器件地址sla
子地址suba 读出的内容放入s 指向的存储区读no 个字节如果返回1
表示操作成功否则操作有误
**********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
GetBus();
SendByte(sla);
     if(I2STAT!=0x18)
          {
           I2CON=0x54;
           return(0);
           }
SendByte(suba);
       if(I2STAT!=0x28)
         {
          I2CON=0x54;
          return(0);
	  }
 I2CON=0x64;//重新启动总线
 while(SI==0);
 SendByte(sla+1);
     if(I2STAT!=0x40)
         {
          I2CON=0x54;
          return(0);
         }
 for(i=0;i<no-1;i++)
    {
     I2CON=0x44;
     while(SI==0);
	 wdog=1;//+++++++++++++++++++++
        if(I2STAT!=0x50)
         {
          I2CON=0x54;
          return(0);
         }
	*s=I2DAT;
	s++;
    }
    I2CON=0x40;//接收最后一字节数据并发送非应答位
    while(SI==0);
    *s=I2DAT;
    I2CON=0x54;//结束总线
    return(1);
 }
/*****************************
初始化
******************************/
void chushihua1()
{ 
scl=0;
 sda=1;
if(sda==0)
  {
    I2CON=0x54;//11010101B
//    return(0);
  }
 scl=1;
if(scl==0)
   {
    I2CON=0x54;
//    return(0);
   }    

 P1M1=0x0c;
 P1M2=0x0c;
// I2ADR= /////////////////
 I2SCLH=75;/*设置IIC波特率*/
 I2SCLL=75;
 I2CON=0x44;//IIC使能使用内部SCL发生器
//IEN1=1;
 EA=1;
}
/***************************/
void main()
{
// bit derror;
// unsigned int i;
 unsigned char lm,lk;
IEN0=0;
IEN1=0;
wdog=1;
chushihua();
chushihua1();
modadder=0xfe;  //debug++++++++++++++++++++++++++++++++++++=================
click3=0;
T2buf[0]=0x0;
T2buf[1]=0x0;
T2buf[2]=0x0;
T2buf[3]=0x0;
T2buf[4]=0x0;
T2buf[5]=0x0;
 led1=0;
/*while(click3<=0x01f)led1=1;
 click=0;
while(click3<=0x01f)led1=0;
 click=0;*/
I2cadder=&R2buf[0];
//derror=0;
if (IRcvStr(0x88,0,I2cadder,50))
  {
	lm=R2buf[5];//modbug
	lm=lm&0xf0;
	lk=R2buf[6];
    if ((R2buf[4]!=0) && (lm==0xe0) & (lk==0xb0))
	{									 //正确则更改波特率。。。
	   modadder=R2buf[4];
  	/*	   0xfe;	
 			 EA=0;
			 SSTAT=0x44; // separate Rx/Tx
			 BRGCON=0;		
			 SCON=0x50;	//	; setup UART mode 1, enables serial reception.
			 BRGR1=0x05;	 //  串口波特率发生器0x2f0-->9600((7372800/n)-16)
			 BRGR0=0xf0;	 //170-->19200,2f0-->9600, 5f0-->4800 ,bf0-->2400 ,17f0-->1200
			 BRGCON=0x03;	//	; Baud Rate Generator Enable.
			 EA=1; */
     }
/*	else
	 {
			 EA=0;
			 SSTAT=0x44; // separate Rx/Tx
			 BRGCON=0;		
			 SCON=0x50;	//	; setup UART mode 1, enables serial reception.
			 BRGR1=0x05;	 //  串口波特率发生器0x2f0-->9600((7372800/n)-16)
			 BRGR0=0xf0;	 //170-->19200,2f0-->9600, 5f0-->4800 ,bf0-->2400 ,17f0-->1200
			 BRGCON=0x03;	//	; Baud Rate Generator Enable.
			 EA=1;
	 } */
   }
/*if (derror==0)
 {
     led1=1;
	   while(click3<=0x01f);   //I2c通讯出错
	     led1=0;
		 click=0;
	   while(click3<=0x01f)
	     led1=1;
		 click=0;
   	   while(click3<=0x01f)
	     led1=0;
  		 click=0;
 }		  */
//================================debug===
for (lm=0;lm<50;lm++)
{
 R2buf[lm]=0;
}
//================================debug===
I2cwr=1;
while(1)
  {
	wdog=1;
    if ((click3>0x1f) || (I2cwr==0))	 
	 {
//	   I2cwr ^=1;
	   click3=0;
	   if (I2cwr==0)
	   {
		 I2cadder=&T2buf[0]; 
	     if (ISendStr(0x88,0,I2cadder,30))
		  {
		   led1^=1;
		   I2cwr=1;
		   }
	    }
	   else
	    {
		  I2cadder=&R2buf[0];
		  if (IRcvStr(0x88,0,I2cadder,50))
		   {
				lm=R2buf[5];//modbug
				lm=lm&0xf0;
				lk=R2buf[6];
			    if ((R2buf[4]!=0) && (lm==0xe0) & (lk==0xb0))
				{									 //正确则更改波特率。。。
					modadder=R2buf[4];
				}
		    led1^=1;
			I2cwr=1;
		   }
		 }
	  }
	  //===========================================debug====

	  //-------------------------------------------debug----
	  modbu001();
    }
}

⌨️ 快捷键说明

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