📄 pcckmodbus.bak
字号:
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 + -