单片机多机通信 主从机程序

//***************************************************
//函数名称:void ssio() interrupt 4
//函数功能:串口中断函数,将电流电压发送给主机,以及接收主机的设置参数
//***************************************************
void ssio() interrupt 4 using 1
{
uchar a;
SM2=1;
RI=0;
P3_4=~P3_4;
if(SBUF!=addr_num) //判断接收的是否为本机地址,若否则复位
{
ES=1; //重开串口中断
goto reti; //恢复现场
} //是复位信号,回复监听


//*******地址与本机相符,应答
SM2=0; //**************************调试程序/
SBUF=addr_num; //将从机地址发送至主机确认
while(!TI); //发送等待
TI=0; //发送结束
Delay_Count=3000;
//********应答主机后,等待接收主机的命令
while(!RI)
{
Delay_Count--;
if(Delay_Count==0)
{

SM2=1;
ES=1;
RI=0;
goto reti;
}
}
RI=0;
if(RB8==1) //判断数据是否传送结束
{
SM2=1; //已发送完成
ES=1; //重开串口中断
goto reti;
} //是复位信号,恢复监听
a=SBUF; //读数据

//********接收到命令后,判断命令是读主机,还是发送主机

if(a==0x01) //主机命令从机接收数据
{
P2=0xaa;
if(rready==1) //接收准备好发送状态
{
SBUF=0X01;
}
else
{
SBUF=0X00;
}
while(!TI); //发送等待
TI=0; //发送等待
sre(); //接收数据
}
else
{
if(a==0x02) //主机命令从机发送数据
{

if(tready==1)
{ //发送准备好发状态
SBUF=0X02;
}
else
{
SBUF=0X00;
}
while(!TI);
TI=0;
str();
}
else
{
SBUF=0X80;
while(!TI);
TI=0;
SM2=1;
ES=1;
}
}
reti:;
}
//***************************************************
//函数名称:void str(void)
//函数功能:发送函数,用于发送电流电压值
//***************************************************
void str(void)
{
uchar p,i;
tready=0;

do
{
p=0;
for(i=0;i<4;i++)
{
SBUF=Value[i];
p+=Value[i];
while(!TI);
TI=0;

}
P3_5=~P3_5;
SBUF=p;
while(!TI);
TI=0;
Delay_Count=3000;
while(!RI)
{
Delay_Count--;
if(Delay_Count==0)
{

SM2=1;
ES=1;
RI=0;
goto reti;
}
}
RI=0;
}while(SBUF!=0);
SM2=1;
ES=1;
reti:;
}
//***************************************************
//函数名称:void sre(void)
//函数功能:接收函数,接收主机发送下来的设置参数值
//***************************************************
void sre(void)
{
uchar p;

rready=0;
while(1)
{
p=0;
Delay_Count=3000;
while(!RI)
{
Delay_Count--;
if(Delay_Count==0)
{
RI=1;
}
}
RI=0;

if(RB8==1) //接收完成
{
SM2=1; //SM2置1,重新进行监听
ES=1; //重开串口中断
break; ///***********************************有待于调试验证
}
PWM_SET=SBUF;
Delay_Count=3000;
while(!RI)
{
Delay_Count--;
if(Delay_Count==0)
{
RI=1;
}
}
RI=0;
if(SBUF==PWM_SET)
{
SBUF=0X00;
while(!TI);
TI=0;
break;
}
else
{
SBUF=0xff;
while(TI==0);
TI=0;
}
SM2=1;
ES=1;
}

}

相关文档
最新文档