📄 ssx-m02.c
字号:
/*===调节模块===2002.6.5最后版本,02.11.23最后修改if语句错误=================================*/
#include <LW5X.H>
#include <MATH.H>
/*==========================================================================================*/
unsigned char xdata rd_dat[9]={0,0,0,0,0,0,0,0,0}; /*接受缓存,正常为8个,多1个额外缓冲区*/
unsigned char xdata td_dat[19]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /*发送缓冲,最多19个*/
unsigned char xdata rd_cont; /*接受数据计数器*/
unsigned char xdata shrjzh; /*主机输入校准标志,1有效*/
unsigned char xdata shchjzh; /*主机输出校准标志,1有效*/
unsigned char xdata bjzh; /*存储本机站号标志,1有效*/
unsigned char xdata tx_bzh; /*存储通信波特率标志,1有效*/
unsigned char xdata zhhao; /*本机站号*/
unsigned char xdata com_bzh; /*波特率设置标志*/
unsigned char xdata mingling; /*校验两路输出时--命令号*/
float xdata s1[4],s2[4],s3[4],s4[4];
unsigned int xdata tx_js; /*通讯波特率计算单元*/
unsigned int xdata fshc[7]={0,0,0,0,0,0,0};
/*fshc[0]--0000H为测量值1,0-5V对应0-4095。*/
/*fshc[1]--0001H为外给定1,0-5V对应0-4095。*/
/*fshc[2]--0002H为测量值2,0-5V对应0-4095。*/
/*fshc[3]--0003H为外给定2,0-5V对应0-4095。*/
/*fshc[4]--0004H为输出1,范围0-1000(对应0-100.0%)。*/
/*fshc[5]--0005H为输出2,范围0-1000(对应0-100.0%)。*/
/*fshc[6]--0006H为故障输出*/
/*fshc[6]=00000000B--无故障*/
/*fshc[6]=00000001B--测量1大于5.2V(20.8MA)*/
/*fshc[6]=00000010B--测量1小于0.8V(3.2MA)*/
/*fshc[6]=00000100B--外给1大于5.2V(20.8MA)*/
/*fshc[6]=00001000B--外给1大于0.8V(3.2MA)*/
/*fshc[6]=00010000B--测量2大于5.2V(20.8MA)*/
/*fshc[6]=00100000B--测量2小于0.8V(3.2MA)*/
/*fshc[6]=01000000B--外给2大于5.2V(20.8MA)*/
/*fshc[6]=10000000B--外给2大于0.8V(3.2MA)*/
unsigned int xdata jshhc[19]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/*jshhc[0]--0000H为工作方式,0为1号单回路,1为2号单回路,2为双单回路,3为串级。*/
/*jshhc[1]--0001H为内给定1,范围0--1000(下位机对应0--100.0%)。*/
/*jshhc[2]--0002H为内给定2,范围0--1000(下位机对应0--100.0%)。*/
/*jshhc[3]--0003H为比例度1,范围1--9999(下位机对应0.1%--999.9%)。*/
/*jshhc[4]--0004H为比例度2,范围1--9999(下位机对应0.1%--999.9%)。*/
/*jshhc[5]--0005H为积分时间1,范围1--9999(下位机对应0.1S--999.9S)。*/
/*jshhc[6]--0006H为积分时间2,范围1--9999(下位机对应0.1S--999.9S)。*/
/*jshhc[7]--0007H为微分时间1,范围0--9999(下位机对应0S--999.9S)。*/
/*jshhc[8]--0008H为微分时间2,范围0--9999(下位机对应0S--999.9S)。*/
/*jshhc[9]--0009H为采样时间1,范围1--10(下位机对应100MS--1000MS)。*/
/*jshhc[10]--000AH为采样时间2,范围1--10(下位机对应100MS--1000MS)。*/
/*jshhc[11]--000BH为手动1输入范围为0--1000(下位机对应0%--100.0%)。*/
/*jshhc[12]--000CH为手动2输入范围为0--1000(下位机对应0%--100.0%)。*/
/*jshhc[13]--000DH为输出1手自动方式,0为自动,1为手动。*/
/*jshhc[14]--000EH为输出2手自动方式,0为自动,1为手动。*/
/*jshhc[15]--000FH为输出1正反作用方式,0为正,1为反。*/
/*jshhc[16]--0010H为输出2正反作用方式,0为正,1为反。*/
/*jshhc[17]--0011H为输出1内外给定标志,0为内,1为外。*/
/*jshhc[18]--0012H为输出2内外给定标志,0为内,1为外。*/
/*控制寄存器3个,地址号为0000H-0002H,使用广播呼叫(0号方式)。*/
/*寄存器0000H命令把命令作为从机站号存储。*/
/*寄存器0001H命令从机把4个模拟量按照5V满度校准,前提是首先接好5V基准,命令具体内容无关,默认0,无应答.*/
/*寄存器0002H命令从机校验两路D/A输出:*/
/*命令0:要求1路D/A的输出为理论1V值。*/
/*命令1:要求1路D/A的1V输出加1。*/
/*命令2:要求1路D/A的1V输出减1。*/
/*命令3:要求存储1路D/A的1V校准值。*/
/*命令4:要求1路D/A的输出为理论5V值。*/
/*命令5:要求1路D/A的5V输出加1。*/
/*命令6:要求1路D/A的5V输出减1。*/
/*命令7:要求存储1路D/A的5V校准值。*/
/*命令8:要求2路D/A的输出为理论1V值。*/
/*命令9:要求2路D/A的1V输出加1。*/
/*命令A:要求2路D/A的1V输出减1。*/
/*命令B:要求存储2路D/A的1V校准值。*/
/*命令C:要求2路D/A的输出为理论5V值。*/
/*命令D:要求2路D/A的5V输出加1。*/
/*命令E:要求2路D/A的5V输出减1。*/
/*命令F:要求存储2路D/A的5V校准值。*/
/*read(0)--测量值1对应5V校准值*/
/*read(2)--外给定1对应5V校准值*/
/*read(4)--测量值2对应5V校准值*/
/*read(6)--外给定2对应5V校准值*/
/*read(8)--输出1对应1V校准值*/
/*read(10)--输出1对应5V校准值*/
/*read(12)--输出2对应1V校准值*/
/*read(14)--输出2对应5V校准值*/
/*read(16)--本机站号*/
int xdata cel1,cel2,dde,de1,de2,df1; /*单回路1,PID运算所用变量*/
int xdata tel1,tel2,tde,te1,te2,tf1; /*单回路2,PID运算所用变量*/
float xdata shchf1,shchf2; /*输出*/
int xdata jsh;/*定时器2定时为10MS,每次进中断,jsh+1,加十次,置位dshbit,jsh=0,使采样时间为100MS*/
int xdata qsh1,qsh2; /*第一次运行时,将cel1、tel1赋初值标志*/
unsigned char bdata zh,zl,v; /*zh,zl-A/D输出值,zh-高位字节,zl-低位字节;v-A/D地址控制字*/
unsigned char bdata r,da; /*r-x25045控制字,da-TLC5618控制字*/
unsigned int xdata jz[4]={0,0,0,0}; /*输入校准时,存校准值*/
unsigned char xdata dshbit; /*采样时间到dshbit=1,pid运算结束dshbit=0*/
unsigned int xdata haz1,haz2; /*存储上一次的手动值*/
unsigned char xdata bz1,bz2; /*判断是否刚从自动打到手动*/
sbit zh_3=zh^3;
sbit zh_2=zh^2;
sbit zh_1=zh^1;
sbit zh_0=zh^0;
sbit zl_7=zl^7;
sbit zl_6=zl^6;
sbit zl_5=zl^5;
sbit zl_4=zl^4;
sbit zl_3=zl^3;
sbit zl_2=zl^2;
sbit zl_1=zl^1;
sbit zl_0=zl^0;
sbit v_7=v^7;
sbit v_6=v^6;
sbit v_5=v^5;
sbit v_4=v^4;
sbit v_3=v^3;
sbit v_2=v^2;
sbit v_1=v^1;
sbit v_0=v^0;
sbit r_7=r^7;
sbit r_0=r^0;
sbit da_7=da^7;
sbit xseoc=P1^0; /*转换标志:1-转换结束*/ AD
sbit xscs=P1^1;
sbit xsclk=P1^2;
sbit xsdin=P1^3;
sbit xsdou=P1^4;
\*sbit ep_sck=P1^2; /*x25045*/
sbit ep_si=P1^3;
sbit ep_so=P1^4;
sbit ep_cs=P1^5;
sbit ep_wip=P1^6;
*\
sbit d_acs=P1^7; /*TLC5618*/
sbit sclk=P1^2;
sbit din=P1^3;
sbit gzh1=P3^3; /*故障继电器1*/
sbit gzh2=P3^4; /*故障继电器2*/
sbit gzhd=P3^5; /*故障灯*/
sbit DE=P3^2; /*发送功能,RE=0,DE=1;接受功能,RE=0,DE=0;RE已由硬件置零.*/
/*==========================================================================================*/
void xinput()
{
char data i;
for(i=0;i<=7;i++)
{
ep_sck=0;
ep_si=r_7;
ep_sck=1;
r=r<<1;
}
}
/*==========================================================================================*/
void xout()
{
char data i;
ep_sck=0;
r=0;
for(i=0;i<=7;i++)
{
ep_sck=1;
r=r<<1;
r_0=ep_so;
ep_sck=0;
}
}
/*==========================================================================================*/
void wren()
{
ep_cs=1;
r=0x06;
ep_cs=0;
xinput();
ep_cs=1;
}
/*==========================================================================================*/
void wrsr()
{
ep_cs=1;
ep_cs=0;
r=0x01;
xinput();
r=0x00;
xinput();
ep_cs=1;
}
/*==========================================================================================*/
void write(x1,x2)
unsigned char data x2;
int data x1;
{
wren();
ep_cs=1;
ep_cs=0;
r=0x02;
xinput();
r=x2;
xinput();
r=x1/256;
xinput();
r=x1&0x00ff;
xinput();
ep_cs=1;
}
/*==========================================================================================*/
int read(unsigned char idata z2)
{
int data w;
ep_cs=1;
w=0;
ep_cs=0;
r=0x03;
xinput();
r=z2;
xinput();
xout();
w=256*r;
xout();
w=w+r;
ep_cs=1;
return(w);
}
/*==========================================================================================*/
void rdsr()
{
ksh: ep_cs=1;
ep_cs=0;
r=0x05;
xinput();
xout();
ep_cs=1;
r=r&0x01;
if(r==1){goto ksh;}
}
/*==========================================================================================*/
void ysh()
{
char data i;
i=2;
while(i!=0){i--;}
}
/*==========================================================================================*/
void ysh1()
{
int data i;
i=95;
while(i!=0){i--;}
}
/*==========================================================================================*/
/*CRC接受校验,函数返回0,表示校验成功,否则失败.*/
unsigned char rd_crc()
{
unsigned int xdata b=65535,c=40961,l;
unsigned char idata i,j,k;
for(i=0;i<6;i++)
{
l=b;
l=l>>8;
l=l<<8;
k=b;
k=k^rd_dat[i];
b=l+k;
for(j=0;j<8;j++)
{
k=b;
k=k<<7;
k=k>>7;
b=b>>1;
if(k==1){b=b^c;}
}
}
c=rd_dat[6]+256*rd_dat[7];
l=b^c;
k=l;
return(k);
}
/*==========================================================================================*/
/*CRC发送校验,函数返回校验结果,整形*/
unsigned int td_crc(unsigned char td_cont)
{
unsigned int xdata b=65535,c=40961,l;/*b--移位寄存器,c--生成多项式*/
unsigned char idata i,j,k,m;
for(i=0;i<td_cont;i++)
{
l=b;
l=l>>8;
l=l<<8;
k=b;
m=0;
m=td_dat[i];
k=k^m;
b=l+k;
for(j=0;j<8;j++)
{
k=b;
k=k<<7;
k=k>>7;
b=b>>1;
if(k==1){b=b^c;}
}
}
return(b);
}
/*==========================================================================================*/
/*T0通讯超时中断(1MS)*/
time0() interrupt 1
{
unsigned char data i;
unsigned int idata j;
TR0=0;
ET0=0;
if((rd_cont==8)&&(((rd_dat[0]==0)&&(rd_dat[1]==9))||((rd_dat[0]==zhhao)&&((rd_dat[1]==3)||(rd_dat[1]==6)))))
{
i=rd_crc();
if(i==0)
{
ysh1();
if(rd_dat[0]!=0)
{
if(rd_dat[1]==3)
{
td_dat[0]=rd_dat[0]; /*地址,即本机号*/
td_dat[1]=rd_dat[1]; /*功能号*/
td_dat[2]=2*rd_dat[5]; /*字节数*/
for(i=0;i<rd_dat[5];i++)
{
td_dat[i*2+3]=fshc[rd_dat[3]+i]/256;
td_dat[i*2+4]=fshc[rd_dat[3]+i];
}
j=td_crc(3+2*rd_dat[5]);
td_dat[3+2*rd_dat[5]]=j; /*CRC,地位在前*/
td_dat[4+2*rd_dat[5]]=j/256;
for(i=0;i<5+2*rd_dat[5];i++)
{
DE=1;
TI=0;
SBUF=td_dat[i];
while(TI==0){}
}
}
if(rd_dat[1]==6)
{
jshhc[rd_dat[3]]=rd_dat[4]*256+rd_dat[5];
write(jshhc[rd_dat[3]],(40+rd_dat[3]*2));
rdsr();
for(i=0;i<8;i++) /*原样发回*/
{
td_dat[i]=rd_dat[i];
}
for(i=0;i<8;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -