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

📄 k96.plm

📁 通过远程按电话键来控制被控处的继电器动作
💻 PLM
字号:
mp$start: do;
$nolist
$include (reg2051.dcl)
$list
DECLARE Sdata BIT AT(0B2H) REGISTER;
DECLARE Sclk  BIT AT(0B3H) REGISTER; 
DECLARE Ring  BIT AT(0B4H) REGISTER; 

DECLARE TOE BIT AT(094H) REGISTER;   /* P1$4 -- 16PIN */
DECLARE TAV BIT AT(095H) REGISTER;   /* P1$5 -- 17PIN */
DECLARE SUHK BIT AT(096H) REGISTER;  /* P1$6 -- 18PIN */
DECLARE LATCH BIT AT(097H) REGISTER; /* P1$7 -- 19PIN */

DECLARE POWER_DOWN_FLAG BIT;
DECLARE (ERROR,COUNT,BUF,VOL) BYTE;
DECLARE DTMF(3) BYTE;
DECLARE SW(3) BYTE;
DECLARE SB(4) BYTE;
DECLARE TRUE BIT;
DECLARE (I,fLAG,N,COT) BYTE IDATA;
DECLARE A BYTE;
DECLARE Z BYTE;
delay:procedure(i);
     declare (i,j) byte;
	 j=0;
     lp:  call time(200);
	  j=j+1;
	 if j<i then goto lp;
END DELAY;

ACSUHK:PROCEDURE;
	IF FLAG=0 THEN BUF=0C0H;
	ELSE BUF=80H;
END ACSUHK;
	
WRITEDATA:PROCEDURE(var);
  dcl var byte;
	CALL ACSUHK;
	P1= (VAR AND 0FH) OR BUF;
	LATCH=0; LATCH=1;       
 END WRITEDATA;

READDATA:PROCEDURE;
  DECLARE (LOOP,PP) BYTE;
	CALL WRITEDATA(00001110B);
	SCLK=1;SCLK=0;
	CALL WRITEDATA(00001111B);
	DO PP=0 TO 2;
	SW(PP)=0FFH;
	DO LOOP=0 TO 7;
	IF SDATA=0 THEN 
	SW(PP)=SW(PP) AND 0FEH;
	SW(PP)=ROL(SW(PP),1); 
	SCLK=1;SCLK=0;
	END;
    /*    SW(PP)=NOT(SW(PP));     */
	SW(PP)=ROR(SW(PP),1);
	END;            
	VOL=SW(2) AND 0FH;    /*NOT(SW(2) AND 0FH) AND 0FH*/
	SB(0)=SW(0) AND 0FH;
	SB(1)=ROR(SW(0),4) AND 0FH;
	SB(2)=SW(1) AND 0FH;
	SB(3)=ROR(SW(1),4) AND 0FH;
	DO PP=0 TO 3;
	IF SB(PP)=0 THEN SB(PP)=0AH;
	END;
 END READDATA;

SENDTOEN:PROCEDURE(number);
 dcl (number,TM,CON) byte;
	SUHK=0;
	TM=2;
	IF NUMBER=21 THEN DO;NUMBER=2;TM=3;END;
	IF NUMBER=3 THEN TM=3;
	IF NUMBER=10 THEN DO;TM=4;NUMBER=4; END;
	IF NUMBER=1 THEN DO;NUMBER=2;TM=4;END;
	DO WHILE (number>0);
		CON=0;
		DO CON=0 TO 150;
		  CALL WRITEDATA(00001101B);
		 CALL TIME(TM);
		 CALL WRITEDATA(00001100B);
		 CALL TIME(TM);
		END;
		CALL DELAY(TM);
	 NUMBER=NUMBER-1;
	END;
 END SENDTOEN;

CLEAN:PROCEDURE;
	DCL J BYTE;
	DO J=0 TO 2;
	DTMF(J)=0FFH;
	END;
	CALL SENDTOEN(4);
	TRUE=1;
END CLEAN;

DDT:PROCEDURE;
	DECLARE BEGIN BIT;
	BEGIN=0;FLAG=1;
	SUHK=0; COUNT=0;TR1=1;
LLP:    TRUE=1; 
	N=0;
	DO WHILE (TRUE);
	TAV=1;TOE=1;P1$0=1;P1$1=1;
	IF TAV=1 THEN DO;TOE=1;DTMF(N)=P1 AND 0FH;
	N=N+1;TOE=1;COT=0;
LP:     IF TAV=1 THEN GOTO LP;
		      END;
	IF N=3 AND BEGIN=1 THEN TRUE=0;
	IF N=4 AND BEGIN=0 THEN DO;
IF DTMF(0)=SB(0) AND DTMF(1)=SB(1) AND DTMF(2)=SB(2) AND DTMF(3)=SB(3)
	THEN DO;BEGIN=1;CALL CLEAN;N=0; END;
	ELSE DO; CALL SENDTOEN(2);ERROR=ERROR+1;TRUE=1;N=0; END;
		END;
	 IF FLAG=0 OR ERROR=3 THEN DO;CALL SENDTOEN(10);
		TRUE=0;SUHK=1;FLAG=0; END;
	END;

	IF BEGIN=1 THEN DO;
  IF (DTMF(0)=0BH AND DTMF(1)=01H AND DTMF(2)=0CH) THEN /* *1# */
		DO;CALL WRITEDATA(01H); CALL CLEAN; END;
  IF (DTMF(0)=0BH AND DTMF(1)=02H AND DTMF(2)=0CH) THEN /* *2# */
		DO;CALL WRITEDATA(03H); CALL CLEAN; END;
  IF (DTMF(0)=0BH AND DTMF(1)=03H AND DTMF(2)=0CH) THEN /* *3# */
		DO;CALL WRITEDATA(05H); CALL CLEAN; END;
  IF (DTMF(0)=0BH AND DTMF(1)=04H AND DTMF(2)=0CH) THEN /* *4# */
		DO;CALL WRITEDATA(07H); CALL CLEAN; END;


  IF (DTMF(0)=0CH AND DTMF(1)=01H AND DTMF(2)=0CH) THEN /* #1# */
		DO;CALL WRITEDATA(00H); CALL CLEAN; END;
  IF (DTMF(0)=0CH AND DTMF(1)=02H AND DTMF(2)=0CH) THEN /* #2# */
		DO;CALL WRITEDATA(02H); CALL CLEAN; END;
  IF (DTMF(0)=0CH AND DTMF(1)=03H AND DTMF(2)=0CH) THEN /* #3# */
		DO;CALL WRITEDATA(04H); CALL CLEAN; END;
  IF (DTMF(0)=0CH AND DTMF(1)=04H AND DTMF(2)=0CH) THEN /* #4# */
		DO;CALL WRITEDATA(06H); CALL CLEAN; END;

 IF (DTMF(0)=0CH AND DTMF(1)=0AH AND DTMF(2)=0CH) THEN /* #0# */
		DO;
		CALL WRITEDATA(00H);CALL WRITEDATA(02H);
		CALL WRITEDATA(04H);CALL WRITEDATA(06H);
		CALL CLEAN;
		END;

 IF (DTMF(0)=0BH AND DTMF(1)=0AH AND DTMF(2)=0CH) THEN /* *0# */
	DO;CALL SENDTOEN(4);CALL SENDTOEN(10);SUHK=1;TRUE=0;FLAG=0; END;

	 IF (TRUE=0 AND FLAG=1) THEN
	 DO;DTMF(0)=0FFH;DTMF(1)=0FFH;DTMF(2)=0FFH; /* BAD */
		CALL SENDTOEN(1);ERROR=ERROR+1;
		IF ERROR=3 THEN FLAG=0;END;
	END;    
	IF FLAG=1 THEN GOTO LLP;
END DDT;

INTIME0:PROCEDURE;
	TMOD=00010101B;COUNT=0;ET1=1;ET0=1;EA=1; SUHK=1; COT=0;
	LATCH=1;SCLK=0;TOE=1;TAV=1; TAV=0;ERROR=0;
	FLAG=0;TR1=0;
	SCON=00H;
	TL1=(65535-50000) MOD 256;
	TH1=(65535-50000) /256;

	TL0=(65535-5) MOD 256;         /* RING */
	TH0=(65535-5) /256;
	TR0=1;
	END;
INITIAL:PROCEDURE;
	CALL WRITEDATA(0); CALL WRITEDATA(2); 
	CALL WRITEDATA(4); CALL WRITEDATA(6);
	 CALL INTIME0;
END INITIAL;

INT0:PROCEDURE INTERRUPT 0 USING 1;
END INT0;
INT1:PROCEDURE INTERRUPT 2 USING 1;
END;

TIME0:PROCEDURE INTERRUPT 1 USING 2;
	disable;
	DO A=1 TO 100;
	CALL TIME(100);
	END;
	Z=Z+1;
	IF Z=VOL THEN DO;
	Z=0;
	SUHK=0;TR1=1;COUNT=0;FLAG=1; TR0=0;
	enable;
	END;
	return;
END TIME0;

TIME1:PROCEDURE INTERRUPT 3 USING 2;
	TL1=(65535-50000) MOD 256;
	TH1=(65535-50000) /256;
	COT=COT+1;
	COUNT=COUNT+1;
	TR1=1;
	IF (COUNT=255 OR COT=90) THEN DO;FLAG=0; TR1=0; END;
END TIME1;

MP0: DO;Z=0;
      POWER_DOWN_FLAG=0; 
      IF POWER_DOWN_FLAG=0 THEN DO;
		CALL READDATA;
		CALL INITIAL; END;
	SLEEP:  P3$7=1;
		CALL READDATA;
		CALL INTIME0;
		PCON=PCON OR 01H;
		DO WHILE (FLAG=1);
			P3$7=0;
			CALL SENDTOEN(4);
			CALL DDT;
		END;
		GOTO SLEEP;     
       END;
END;

⌨️ 快捷键说明

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