void main()
{
delayms(100);
init(); //初始化系统
delayms(100);
init_wdt(); //初始化看门狗
while(1)
{
while(!RI_0) //是否收到数据
{
clr_wdt();
}
RI_0=0; //清除接收中断标志
buffer=S0BUF;
if(buffer==0x5a) //检测祯头 0
start0=1;
if(buffer==0x54) //检测祯头 1
start1=1;
if(buffer==0x5a) //检测祯尾 0
end0=1;
if(buffer==0xfe) //检测祯尾 1
end1=1;
if((start0==1)&(start1==1))
{
buff[i]=buffer;
//从祯头 1 开始存储数据
i++;
}
if((end0==1)&(end1==1)) //是否已经接收祯尾
{
count=i; //数据长度为 count 个
i=1;
if((buff[2]==0x03)&(count==107)) //是否 422 指令
{
buff[0]=0x5a;
buff[count-4]=0;
for(k=2;k<(count-4);k++)
{
//计算校验和
//重填祯头 0
//校验和清零
buff[count-4]+=buff[k];
}
for(k=0;k
//等待发送完成
//清除发送中断标志
S0BUF=buff[k];
while(!TI_0);
TI_0=0;
}
reset();
}
else if((buff[2]==0x05)&(count==7)) //是否 AD 测试指令
{
sendad();
reset();
}
else if((buff[2]==0x18)&(count==7)) //是否发送时序信号指令
{
sendpaulse();
reset();
}
else //如果接收错误,则恢复各标志位为初始状态以便下次接收
{
reset();
}
}
}
}
void reset()
{
start0=0; //祯头祯尾标志位清零
start1=0;
end0=0;
end1=0;
for(k=0;k