单片机多机通信 主从机程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//***************************************************
//函数名称: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;
}
}