📄 子机.c
字号:
/******************************************************************************************
******************************************20MS延时*****************************************
******************************************************************************************/
void delay20ms()
{
unsigned int data i=2500;
while(i!=0)
{
i--;
}
}
/**************************************************************************************
===================================计数器0中断函数============================================
**************************************************************************************/
void T0_srv () interrupt 1
{
TR0=0;
TH0=15549/256; //给初始值
TL0=15549;
TR0=1;
cnt4--;
if(cnt4==0)
{
cnt4=5;
cnt3--;
if(cnt3==0)
{
cnt3=2;
if(senflag==0) //秒表标志改变
{
senflag=1;
}
else
senflag=0;
}
cnt7--; //智能恢复标志发挥作用
if(cnt7==0)
{
cnt=0;
xhflag=0;
}
}
}
/******************************************************************************************
*****************************************串口中断服务程序*********************************
******************************************************************************************/
void server_chkou() interrupt 4
{
uchar data err,k;
uchar data i,mingl;
ES=0; //进中断就不再允许中断
RI=0;
err=0;
k=0;
if((SBUF==0xaa)&&(TI==0)) //判断地址头是否正确
{
for(i=0;i<8;i++) //接收其他的9位数据
{
k=0;
RI=0;
while((RI==0)&&(k<=200)) //判断是否超时
{
k++;
if(k>=200)
{
err=1;
}
}
RI=0;
if(err==0)
{
jshc[i]=SBUF;
}
else
break;
}
if(jshc[0]==0&&err==0) //主机发送来的广播命令地址位为00即:所有子机全部都接收
{
mingl=jshc[1];
switch(mingl)
{
case 1:
{
dealy(550);
write_word(2,jshc[2],1);
dizhi=jshc[2];
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
}
break;
default:
break;
}
}
if(jshc[0]==dizhi&&err==0) //主机发送来的广播命令地址位为00即:所有子机全部都接收
{
mingl=jshc[1];
switch(mingl)
{
case 1: //把上限写道1302中
{
dealy(550);
shangx.byte.hhi=jshc[2];
write_word(4,jshc[2],1);
shangx.byte.hi=jshc[3];
write_word(5,jshc[3],1);
shangx.byte.lo=jshc[4];
write_word(6,jshc[4],1);
shangx.byte.llo=jshc[5];
write_word(7,jshc[5],1); //1302的第4个到第7个RAM区存放上限
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
case 2: //把下限写道1302中
{
dealy(550);
xiax.byte.hhi=jshc[2];
write_word(8,jshc[2],1);
xiax.byte.hi=jshc[3];
write_word(9,jshc[3],1);
xiax.byte.lo=jshc[4];
write_word(10,jshc[4],1);
xiax.byte.llo=jshc[5];
write_word(11,jshc[5],1); //1302的第8个到第11个RAM区存放下限
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
case 3: //把1302中存的上限值读出来
{
dealy(550);
shangx.byte.hhi=read_word(4,1);
jshc[2]=shangx.byte.hhi;
shangx.byte.hi=read_word(5,1);
jshc[3]=shangx.byte.hi;
shangx.byte.lo=read_word(6,1);
jshc[4]=shangx.byte.lo;
shangx.byte.llo=read_word(7,1);
jshc[5]=shangx.byte.llo;
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
case 4: //把1302中存的下限值读出来
{
dealy(550);
xiax.byte.hhi=read_word(8,1);
jshc[2]=xiax.byte.hhi;
xiax.byte.hi=read_word(9,1);
jshc[3]=xiax.byte.hi;
xiax.byte.lo=read_word(10,1);
jshc[4]=xiax.byte.lo;
xiax.byte.llo=read_word(11,1);
jshc[5]=xiax.byte.llo;
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
case 5: //读取本子机温度
{
dealy(550);
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[2]=wendu.byte.hhi;
jshc[3]=wendu.byte.hi;
jshc[4]=wendu.byte.lo;
jshc[5]=wendu.byte.llo;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
case 7:
{
dealy(550);
range_zero.byte.hhi=jshc[2];
write_word(12,jshc[2],1);
range_zero.byte.hi=jshc[3];
write_word(13,jshc[3],1);
range_zero.byte.lo=jshc[4];
write_word(14,jshc[4],1);
range_zero.byte.llo=jshc[5];
write_word(15,jshc[5],1); //1302的第12个到第15个RAM区存放零点误差
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
case 6:
{
dealy(550);
range_full.byte.hhi=jshc[2];
write_word(16,jshc[2],1);
range_full.byte.hi=jshc[3];
write_word(17,jshc[3],1);
range_full.byte.lo=jshc[4];
write_word(18,jshc[4],1);
range_full.byte.llo=jshc[5];
write_word(19,jshc[5],1); //1302的第16个到第19个RAM区存放满度误差
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
case 9: //把1302中存的零点误差值读出来
{
dealy(550);
range_zero.byte.hhi=read_word(12,1);
jshc[2]=range_zero.byte.hhi;
range_zero.byte.hi=read_word(13,1);
jshc[3]=range_zero.byte.hi;
range_zero.byte.lo=read_word(14,1);
jshc[4]=range_zero.byte.lo;
range_zero.byte.llo=read_word(15,1);
jshc[5]=range_zero.byte.llo;
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
case 8: //把1302中存的满度误差值读出来
{
dealy(550);
range_full.byte.hhi=read_word(16,1);
jshc[2]=range_full.byte.hhi;
range_full.byte.hi=read_word(17,1);
jshc[3]=range_full.byte.hi;
range_full.byte.lo=read_word(18,1);
jshc[4]=range_full.byte.lo;
range_full.byte.llo=read_word(19,1);
jshc[5]=range_full.byte.llo;
jshc[0]=0x55;
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
case 10:
{
jsflag=1;
}
break;
case 11:
{
jsflag=2;
}
break;
case 12:
{
dealy(550);
xsz1302();
jshc[1]=dizhi;
jshc[7]=(jshc[1]+jshc[2]+jshc[3]+jshc[4]+jshc[5]+jshc[6]);
send();
ES=1;
}
break;
default:
break;
}
}
}
ES=1;
}
/***************************************************************************************
**********************************处理温度显示******************************************
***************************************************************************************/
void xianshiwd()
{
uchar data xx;
if(xhflag==0)
{
if(aa==0)
aa=(aa+range_zero.word*10);
else
aa=(aa-range_zero.word*10)*(1-(range_full.word-range_zero.word)/(400+(range_full.word-range_zero.word)));
}
zz=(int)aa;
if(zz>=0) //如果温度是正值
{
if((zz>shangx.word*10)) //如果超过上限
{
jdq1=0;
fmq=0;
LIGHT1=0;
}
if(zz<(shangx.word*10-5)) //继电器滞缓
{
jdq1=1;
fmq=1;
LIGHT1=1;
}
wenduzhihc[1]=zz%100;
wenduzhihc[2]=zz/100;
sd595hc1();
xx=sendhc[1];
xx=xx&0xfd; //加上点显示
sendhc[1]=xx;
}
if(zz<0) //如果温度是负值
{
if(zz<(xiax.word*10)) //如果下限超量程
{
jdq2=0;
fmq=0;
LIGHT2=0;
}
if(zz>(xiax.word*10+5)) //继电器滞缓
{
jdq2=1;
fmq=1;
LIGHT2=1;
}
zz=zz*(-1);
wenduzhihc[1]=zz%100;
wenduzhihc[2]=zz/100;
sd595hc1();
xx=sendhc[1];
xx=xx&0xfd; //加上点显示
sendhc[1]=xx;
xx=sendhc[3];
xx=xx&0xbf; //加上负号显示
sendhc[3]=xx;
if((zz*(-1))>(-1000))
sendhc[3]=0xbf;
}
sd595();
}
/***************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -