📄 modbus.c
字号:
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 + -