⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssx-m02.c

📁 此程序是自抗扰控制器设计的原程序,不过是调节模块驱动的程序,就缺少液晶显示和键盘扫描,以用过,没问题
💻 C
📖 第 1 页 / 共 4 页
字号:
/*===调节模块===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 + -