📄 485.c
字号:
void slave_rs485(void) interrupt 4 using 3
{
unsigned char idata s; //
bit flag = 0; // 两次数据符合标志
if(TI) //发送中断
{
TI = 0;
}
if(RI) //接收上位机命令、地址或数据
{
s = SBUF;
RI = 0;
if(((local_bz == 1) || (local_bz == 2)) && (s > 0xbf))
{
rnum++;
if(rnum == 1) s1 = s;
if(rnum == 2)
{
if(s == s1) flag = 1; // 标志置1
s1 = 0;
rnum = 0;
}
}
if(task_list == 0xff) //上次命令处理完毕则接收,否则不接收
{ // 判断数据类型
if(((s & 0xf0) == 0xa0) || ((s & 0xf0) == 0xb0)) // 收到的是呼叫地址类信号(设备号)
{
if(s == slave) // 呼叫本机
{
local_bz = 1; // 置标记
RE_DE = 1; // 485发送状态
SBUF = slave; // 返回本机地址
while(TI == 0);
TI = 0;
RE_DE = 0; // 485接收状态
}
else {if(s == 0xa0) local_bz = 2; // 通用设备号,置标记
else local_bz = 0;} // 非本机
}
else // 收命令类信号,数据以后再收
{
if(flag == 1) //
{
flag = 0;
if((local_bz == 1) && (s > 0xbf))
{
if((s == 0xc1) || (s == 0xc2) || (s == 0xc3))
{
if((s == 0xc1) && ((test_bz == 0) || (tick1_bz == 1)))// 停机状态或单次测量状态时响应c1命令
{
test_bz = 1;
RE_DE = 1;
SBUF = s; // 返回接受的命令
while(TI == 0);
TI = 0;
RE_DE = 0;
task_list = s; // 接收命令,设置任务
}
if((s == 0xc2) && ((test_bz == 1) || (tick1_bz == 1)))// 连续测量状态或单次测量状态时响应c2命令
{
test_bz = 0;
RE_DE = 1;
SBUF = s; // 返回接受的命令
while(TI == 0);
TI = 0;
RE_DE = 0;
task_list = s; // 接收命令,设置任务
}
if(s == 0xc3)
{
RE_DE = 1;
SBUF = s; // 返回接受的命令
while(TI == 0);
TI = 0;
RE_DE = 0;
task_list = s; // 接收命令,设置任务
}
}
else
{
if(cons_bz == 1) // 连续测量中,其它命令非法
{
// RE_DE = 1;
// SBUF = 0xee; // 返回错误标志
// while(TI == 0);
// TI = 0;
// RE_DE = 0;
}
else
{
if(s == 0xc0)
{
RE_DE = 1;
SBUF = s; // 返回接受的命令
while(TI == 0);
TI = 0;
RE_DE = 0;
task_list = s; // 接收命令,设置任务
}
if(s == 0xc6)
{
RE_DE = 1;
SBUF = s; // 返回接受的命令
while(TI == 0);
TI = 0;
RE_DE = 0;
task_list = s; // 接收命令,设置任务
}
}
}
}
if((local_bz == 2) && ((s == 0xc1) || (s == 0xc2) || (s == 0xc4) || (s == 0xc5))) // 设备号是A0时不可向主机返回信号
{
if((s == 0xc1) && ((test_bz == 0) || (tick1_bz == 1)))// 停机状态或单次测量状态时响应c1命令
{task_list = s; test_bz =1;}// 接收命令,设置任务
if((s == 0xc2) && ((test_bz == 1) || (tick1_bz == 1)))// 连续测量状态或单次测量状态时响应c2命令
{task_list = s; test_bz =0;}// 接收命令,设置任务
if((s == 0xc4) || (s == 0xc5)) task_list = s;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -