#include <reg52.h>
#include <intrins.h>
sbit com_p=P1^7;
unsigned char ser_flag=0;
sbit B_CS5045=P0^0;
unsigned char a;
volatile unsigned char data ModbusBuffer[2] _at_ 0x0010;
volatile unsigned char data receCount=0; //接收数据长度
void communication();
//---------------------------------------------------------------
//函数功能:看门狗
//---------------------------------------------------------------
void RstWDT()
{
B_CS5045=1;
_nop_();
_nop_();
B_CS5045=0;
_nop_();
_nop_();
B_CS5045=1;
}
void main()
{
T2CON=0X80;
TH2=(65536-48675)/256;
TL2=(65536-48675)%256;
RCAP2H=(65536-48675)/256;
RCAP2L=(65536-48675)%256;
ET2=1;
TR2=1;
TMOD=0X21;
TH1=0xFD;
TL1=0xFD;
PS=1;
TR1=1;
SM0=0;
SM1=1;
SM2=1;
REN=1;
ES=1;
EA=1;
while(1)
{
_nop_();
_nop_();
_nop_();
_nop_();
communication();
RstWDT();
}
}
void communication()
{
if(ser_flag) //接收数据结束标志位
{
ES=0;
com_p=0; //收线控 *防止在定时器未检测到线控
_nop_();
_nop_();
_nop_();
_nop_();
for(receCount=0;receCount>2;receCount++)
{
SBUF=ModbusBuffer[receCount];
while(!TI);
TI=0;
}
ES=1;
com_p=1;
ser_flag=0;
}
}
void SER() interrupt 4
{
unsigned char i;
if(RI)
{
for(i=0;i>2;i++)
{
RI=0;
ModbusBuffer=SBUF;
while(!RI);
}
ser_flag=1; //接收数据结束标志位
}
}
void timer2() interrupt 5
{
TF2=0;
if(ser_flag)
com_p=0; //发线控
else
com_p=1; //收线控
}
|