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

📄 cplc.c

📁 与DY-2N配套的从机程序
💻 C
字号:
    #include <AT89X52.h>
    #include <intrins.h>
    #define xin P1
    #define yout P0

    #define uchar unsigned char
    #define uint unsigned int
    #define ulong unsigned long
    uchar bdata buf45,cmd45,xbuf,ybuf;
    uchar data ssbuf[12],tempbuf,phbuf,tempseth,tempsetl,phseth,phsetl,comm,timer;
    uchar data t_y4,t_u1,t_d1,td3,t_u6;
    uint data tu3;
    uchar bdata xbuf1,mode0;
    uchar data fu,fv,fw,fx,fy,fz;//临时变量
    uchar data sdelay;
    sbit mclk=P2^0;
    sbit sdao=P2^1;
    sbit dcs=P2^2;
    sbit sdai=P2^3;
    sbit rbuf=buf45^0;
    sbit wbuf=buf45^7;
    sbit cmd0=cmd45^0;
    sbit cmd=cmd45^7;
    sbit load=P2^7;
    sbit ldac=P2^6;
    sbit temp=P2^4;
    sbit php=P2^5;

    sbit x0=xbuf^0;
    sbit x1=xbuf^1;
    sbit x2=xbuf^2;
    sbit x3=xbuf^3;
    sbit x4=xbuf^4;
    sbit x5=xbuf^5;
    sbit x6=xbuf^6;
    sbit x7=xbuf^7;
    sbit xin8=P3^2;

    sbit y0=ybuf^0;
    sbit y1=ybuf^1;
    sbit y2=ybuf^2;
    sbit y3=ybuf^3;
    sbit y4=ybuf^4;
    sbit y5=ybuf^5;
    sbit y6=ybuf^6;
    sbit y7=ybuf^7;

    sbit bs=xbuf1^0;
    sbit bt=xbuf1^1;
    sbit bu=xbuf1^2;
    sbit bv=xbuf1^3;
    sbit bw=xbuf1^4;
    sbit tclk=xbuf1^5;
    sbit fcom=xbuf1^6;
    sbit x8=xbuf1^7;

    sbit jjsta=mode0^0;
    sbit ttsta=mode0^1;
    sbit tdsta=mode0^2;
    sbit m3=mode0^3;
    sbit m4=mode0^4;
    sbit m5=mode0^5;
    sbit m6=mode0^6;
    sbit m7=mode0^7;

    void delay (uint day)
    {
        while (--day!=0);
    }
    void trans (void)
    {
        uchar data ii;
        mclk=0;
        for (ii=8;ii>0;ii--)
        {
            sdao=wbuf;
            mclk=1;
            _nop_();
            buf45<<=1;
            mclk=0;
            _nop_();
        }
        sdao=0;
    }
    void rdsr (void)
    {
        uchar i;
        dcs=1;
        mclk=0;
        dcs=0;
        cmd45=0x05;
        for (i=8;i>0;i--)
        {
            sdao=cmd;
            mclk=1;
            cmd45<<=1;
            mclk=0;
        }
        sdao=0;
        sdai=1;
        for (i=8;i>0;i--)
        {
            cmd0=sdai;
            mclk=1;
            cmd45=_crol_(cmd45,1);
            mclk=0;
        }
        cmd45=_cror_(cmd45,1);
        dcs=1;
    }
    void wwip (void)
    {
        uchar l;
        l=0;
        cmd0=1;
        while (cmd0 && (++l<=200))
        {
            rdsr ();
        }
    }
    void wren (void)
    {
        mclk=0;
        dcs=0;
        buf45=0x06;
        trans ();
        wwip ();
        dcs=1;
    }
    void wrsr (uchar srmd)
    {
        wren ();
        dcs=1;
        mclk=0;
        dcs=0;
        buf45=0x01;
        trans ();
        buf45=srmd;
        trans ();
        wwip ();
        dcs=1;
    }
    void wrmem (uchar dd,uchar aa)
    {
        wren ();
        dcs=1;
        mclk=0;
        buf45=0x02;
        dcs=0;
        trans ();
        buf45=dd;
        trans ();
        buf45=aa;
        trans ();
        cmd45=0;
        wwip ();
        dcs=1;
        mclk=1;
    }
    uchar rdmem (uchar dd)
    {
        uchar i;
        dcs=1;
        mclk=0;
        buf45=0x03;
        dcs=0;
        trans ();
        buf45=dd;
        trans ();
        for (i=8;i>0;i--)
        {
            _nop_();
            rbuf=sdai;
            mclk=1;
            buf45=_crol_(buf45,1);
            mclk=0;
            _nop_();
        }
        buf45=_cror_(buf45,1);
        dcs=1;
        return (buf45);
    }
    void dac (uchar aa,uchar rag,uchar dd)
    {
        load=1;
        ldac=1;
        _nop_();
        buf45=aa;
        buf45<<=6;
        mclk=1;
        sdao=wbuf;
        mclk=0;
        buf45<<=1;
        mclk=1;
        sdao=wbuf;
        mclk=0;
        buf45=dd;
        mclk=1;
        if (rag==0)
        {
            sdao=0;
        }
        else sdao=1;
        mclk=0;
        _nop_();
        for (aa=8;aa>0;aa--)
        {
            mclk=1;
            sdao=wbuf;
            mclk=0;
            buf45<<=1;
        }
        load=0;
        _nop_();
        load=1;
        _nop_();
        ldac=0;
        _nop_();
        ldac=1;
        sdao=0;
        mclk=1;

    }
    void format (void)
    {
        dac(0,0,0);
        bs=1;
        tclk=0;
        fcom=0;
        mode0=0;
        timer=10;
        yout=0xff;
        ybuf=0xff;
        xbuf=0xff;
        xin=0xff;
        php=1;
        bv=php;
        TMOD = 0x20;
        TH1 =  0xfd;
        TL1 =  0xfd;
        SCON = 0x50;
        T2CON=0;
        RCAP2H=0x4c; //65136=fe70,62536=f448
        RCAP2L=0x00;
        TH2=0x4c;
        TL2=0x00;
        PS=1;
        TR1=1;
        TR2=1;
        RI=0;
        TI=0;
        EA=1;
        ET2=1;
        ES=1;
    }
    void dinput (void)
    {
//        xin=0xff;
//        xin8=1;
        php=1;
        temp=1;
        fu=128;
        ET2=0;
        dac(0,1,fu);
        ET2=1;
        for (fw=64;fw>0;fw/=2)
        {
            delay (50);
            bv=php;
            if (bv)
            {
                fu-=fw;
            }
            else
            {
                fu+=fw;
            }
            ET2=0;
            dac(0,1,fu);
            ET2=1;
        }
        phbuf=fu;
        fu=128;
        ET2=0;
        dac(1,0,fu);
        ET2=1;
        for (fw=64;fw>0;fw/=2)
        {
            delay (50);
            bv=temp;
            if (bv)
            {
                fu-=fw;
            }
            else
            {
                fu+=fw;
            }
            ET2=0;
            dac(1,0,fu);
            ET2=1;
        }
        tempbuf=fu;
        xbuf=xin;
        x8=xin8;

    }
    void deal (void)
    {
        //*************冷冻机*************
/*
 x0:    热保护正常
!x0:    热保护异常
 x1:    高压正常
!x1:    高压异常
 x2:    低压正常
!x2:    低压正常
 x3:    给水阀上限未到
!x3:    给水阀上限已到
 x4:    给水阀下限未到
!x4:    给水阀下限已到
 x5:    启动酒精泵
!x6:    启动回水泵
 x7:
 x8:
 x9:    温度输入
 x10:   PH输入

 y0:    报警
 y1:    酒精
 y2:    送水泵
 y3:    冷冻机
 y4:    回水泵
 y5:    H液泵
 y6:    给水阀
	    
*/
        dcs=0;
	        if (!y3)
	        {
	            if (td3>0)
	            {
	                td3--;
	            }
	            else
	            {
	                if (tempbuf<tempsetl)
	                {
	                    y3=1;
	                    tu3=360;
	                }
	            }
	        }
	        else
	        {
	            if (tu3>0)
	            {
	                tu3--;
	            }
	            else
	            {
			        if (!x1 && !x2)
			        {
				        y0=1;
		                if (tempbuf>tempseth)
		                {
		                    y3=0;
		                    td3=200;
		                }
					}
				}
	        }
        if (x1 ||x2) //*************报警*************
        {
            y3=1;
            tu3=360;
            if (y0)
            {
                y0=0;
            }
            else
            {
                y0=1;
            }
        }
        //*************回水泵*************
        if (!y4)
        {
            if (!x7)
            {
                y4=1;
                t_y4=20;
            }
        }
        else 
        { 
            if (t_y4>0)
            {
                t_y4--;
            }
            else
            {
                if (x7)
                {
                    y4=0;
                }
            }
        }
        //*************给水阀*************
        if (y6)
        {
            if (!x4 && x3)
            {
                y6=0;
            }
        }
        else
        {
            if (!x3 && x4)
            {
                y6=1;
            }
        }
        //*************酒精*************
        if (x6)
        {
            if (y1)
            {
                if (t_d1>0)
                {
                    t_d1--;
                }
                else
                {
                    y1=0;
                    t_u1=20;
                }
            }
            else
            {
                if (t_u1>0)
                {
                    t_u1--;
                }
                else
                {
                    y1=1;
                    t_d1=20;
                }
            }
        }
        else
        {
            y1=1;
            y1=1;
            t_u1=20;
            t_d1=20;
        }
        if (t_u1>20) t_u1=20;
        if (t_d1>20) t_d1=20;

        //*************H 液泵*************
        if (phbuf<phsetl)
        {
            y5=1;
        }
        if (phbuf>phseth)
        {
            y5=0;
        }
    //*************送水泵*************
        if (y2)
        {
            if (!x3 && x4)
            {
                y2=0;
            }
        }
        else
        {
            if (!x4 && x3)
            {
                y2=1;
            }
        }
        dcs=1;
    }
    void youtput (void)
    {
        yout=ybuf;
        ET2=0;
        ES=0;
        TI=0;
        SBUF=0xaa;
        while(!TI);
        TI=0;
        SBUF=tempbuf;
        while(!TI);
        TI=0;
        SBUF=tempsetl;
        while(!TI);
        TI=0;
        SBUF=xbuf;
        while(!TI);
        TI=0;
        SBUF=phbuf;
        while(!TI);
        TI=0;
        SBUF=ybuf;
        while(!TI);
        TI=0;
        RI=0;
        ET2=1;
        ES=1;
    }
    void main(void)
    {
        delay(1000);
        format();
        timer=10;
        wrsr (0x00);

        tempseth=rdmem(0);
        tempsetl=rdmem(1);
        phseth=rdmem(2);
        phsetl=rdmem(3);
        t_u1=20;
        t_d1=20;
        t_u6=20;
        t_y4=20;
        tu3=360;
        td3=200;
        while (1)
        {
			dcs=0;
            if (tclk)
            {
                tclk=0;
                dinput();
                deal();
                youtput();
            }
            if (fcom)
            {
                fcom=0;
                comm=ssbuf[0];
                tempseth=ssbuf[1];
                tempsetl=ssbuf[2];
                phseth=ssbuf[3];
                phsetl=ssbuf[4];
                ET2=0;
                wrmem(0,tempseth);
                wrmem(1,tempsetl);
                wrmem(2,phseth);
                wrmem(3,phsetl);
                ET2=1;
            }
            ET2=1;
            TR2=1;
			dcs=1;
        }
    }
    void cpu_int4(void) interrupt 4
    {
//    uchar data ssbuf[10],tempbuf,phbuf,tempseth,tempsetl,phseth,phsetl,comm;
        ES=0;
        RI=0;
        if (SBUF==0x55)
        {
            fv=SBUF;
            for (fv=0;fv<10;fv++)
            {
                sdelay=0;
                while (!RI)
                {
                    if (--sdelay==0)
                    {
                        fv=0;
                        goto ssbr;
                    }
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                }
                RI=0;
                ssbuf[fv]=SBUF;
            }
            fcom=1;
            TI=0;
        }
ssbr:   RI=0;
        ES=1;
    }
    void cpu_int5(void) interrupt 5
    {
        TF2=0;          //(50ms/每次)
        if (--timer==0)
        {
            timer=10;
            tclk=1;         //(500ms/每次)
        }
    }



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -