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

📄 sszjqz.plm

📁 ms51单片机电子秤原理图、板图、plm源码
💻 PLM
📖 第 1 页 / 共 2 页
字号:
/*砂石电子秤程序 snwjgp.plm*/
ST0: DO; /*主程序开始*/
$INCLUDE(UTIL51.H)
$INCLUDE(REG51.DCL)
	DECLARE
	KKDD WORD IDATA,
	KKDD3 WORD IDATA,
	KKDD1 WORD IDATA,
	KKDD2 WORD IDATA,
	YSYS WORD IDATA,
	QLL WORD IDATA,
	KBF WORD IDATA,
	KBF1 WORD IDATA,
	KBF2 WORD IDATA,
	MM1 WORD IDATA,
	MM2 WORD IDATA,
	TQLL WORD IDATA,
	TQLL1 WORD IDATA,
	TQLL2 WORD IDATA,
	ERR1 BYTE,
	ZTZW BYTE,/*状态转换位置*/
	WWYY BYTE,/*状态转换位置*/
	WYX(8) BYTE,/*显示8位数据*/
	XS BYTE,/*控制PPB口记忆*/
	XX BYTE,/*控制PPB口记忆*/
	XY BYTE,/*控制PPB口记忆*/
	DQ BYTE IDATA,
	CZD BYTE,/*AD低位*/
	CZG BYTE,/*AD高位*/
	KZ BYTE,/*控制口*/
	JJSS WORD IDATA,/*串行口*/
	JJS1 WORD IDATA,/*串行口*/
	JJS3 WORD IDATA,/*串行口*/
	JJS2 BYTE IDATA,/*串行口*/
	DDXX WORD IDATA,/*串行口*/
	DDXX1 WORD IDATA,/*串行口*/
	JSJS WORD IDATA,/*串行口*/
	DDX1(7) BYTE IDATA,/*串行口*/
	JP BYTE;/*键值*/
	DECLARE 
	YZZL WORD,/*预置重量*/
	SJZL WORD,/*实际重量*/
	SL(4) WORD,/*每一种物料秤量前的重量*/
	YZDDY(4) WORD,/*当前物料预置重量*/
	SJL(4) WORD,
	X BYTE,/*物料号循环变量*/
	J WORD,/*预置数据存储地址*/
	L WORD,/*记忆配方号的地址*/
	D WORD,/*秤数*/
	M WORD,/*计算地址变量*/
	I WORD,/*实际数据存储地址*/
	LYS(4) WORD;/*实际数据存储地址*/
	DECLARE
	LL WORD AT(204CH) AUXILIARY, /*当前测量值在48Z08地址*/
	LLL WORD AT(204AH) AUXILIARY, /*当前测量值在48Z08地址*/
	LLLL WORD AT(2048H) AUXILIARY, /*当前秤数*/
	KKD WORD AT(2046H) AUXILIARY, /*当前测量值在48Z08地址*/
	KD WORD AT(2044H) AUXILIARY, /*当前秤数*/
	LLYS(3) WORD AT(203CH) AUXILIARY, /*各物料的提前量*/
	IO8255 BYTE AT(4003H) AUXILIARY, /*8255地址.命令*/
	PPA BYTE AT(4000H) AUXILIARY, /*PA口地址*/
	PPB BYTE AT(4001H) AUXILIARY, /*PB口地址*/
	PPC BYTE AT(4002H) AUXILIARY, /*PC口地址*/
	D7218 BYTE AT(6000H) AUXILIARY, /*7218地址*/
	AD7109 BYTE AT(8000H) AUXILIARY, /*7109地址*/
	D244 BYTE AT(0A000H) AUXILIARY; /*74244地址*/
DLDL:	PROCEDURE;/*7.5毫秒*/
	DECLARE 
	DD1 BYTE,
	DD2 BYTE;
	DO DD1=1 TO 5;
	DO DD2=1 TO 64;
	P13=NOT P13;
	END;
	END;
	END DLDL;
DLD1:	PROCEDURE;/*240毫秒*/
	DECLARE 
	DD3 BYTE,
	DD4 BYTE;
	DO DD3=1 TO 160;
	DO DD4=1 TO 64;
	P13=NOT P13;
	END;
	END;
	END DLD1;
/*CXKK:	PROCEDURE;
	IF RI=1 THEN
	DO;
	JSJS=0;
	RI=0;
	DDX1(1)=SBUF;
	CALL DLDL;
	SBUF=DDX1(3);
WAI1:	IF TI=0 THEN 
	DO;
	JSJS=JSJS+1;
	IF JSJS>=10000 THEN
	DO;
	JSJS=0;
	RETURN;
	END;
	P13=NOT P13;
	GOTO WAI1;
	END;
	TI=0;
	JSJS=0;
WAI2:	IF RI=0 THEN
	DO;
	JSJS=JSJS+1;
	IF JSJS>=10000 THEN
	DO;
	JSJS=0;
	RETURN;
	END;
	P13=NOT P13;
	GOTO WAI2;
	END;
	RI=0;
	JSJS=0;
	DDX1(2)=SBUF;
	CALL DLDL;
	SBUF=DDX1(4);
WAI3:	IF TI=0 THEN 
	DO;
	JSJS=JSJS+1;
	IF JSJS>=10000 THEN
	DO;
	JSJS=0;
	RETURN;
	END;
	P13=NOT P13;
	GOTO WAI3;
	END;
	TI=0;
	JSJS=0;
	END;
	JSJS=0;
	END CXKK;*/
CXKK:	PROCEDURE;
	;
	END CXKK;
DJP:	PROCEDURE BYTE;/*读键盘*/
	P1=0FFH;
	P13=NOT P13;
	P10=0;
	IF P14=0 THEN RETURN 11;/*状态转换*/
	IF P15=0 THEN RETURN 12;/*配方*/
	IF P16=0 THEN RETURN 13;/*物料*/
	IF P17=0 THEN RETURN 21;/*个位*/
	P10=1;
	P11=0;
	IF P14=0 THEN RETURN 14;/*十位*/
	IF P15=0 THEN RETURN 15;/*百位*/
	IF P16=0 THEN RETURN 16;/*千位*/
	IF P17=0 THEN RETURN 17;/*启动*/
	P11=1;
	P12=0;
	IF P14=0 THEN RETURN 18;/*打印*/
	IF P15=0 THEN RETURN 19;/*卸料*/
	IF P16=0 THEN RETURN 20;/*暂停*/
	P12=1;
	RETURN 0FFH;
	END DJP; /*一次读键盘结束*/
KKZ:	PROCEDURE BYTE;/*控制口*/
	CALL DLDL;/*TIME(35)*/
	IF (PPC AND 0F0H)=0E0H THEN CALL DLDL;/*TIME(75)*/
	IF (PPC AND 0F0H)=0E0H THEN RETURN 1;
	IF (PPC AND 0F0H)=0D0H THEN CALL DLDL;/*TIME(75)*/
	IF (PPC AND 0F0H)=0D0H THEN GOTO Z2;
	IF (PPC AND 0F0H)=0B0H THEN CALL DLDL;/*TIME(75)*/
	IF (PPC AND 0F0H)=0B0H THEN GOTO Z3;
	IF (PPC AND 0F0H)=70H THEN CALL DLDL;/*TIME(75)*/
	IF (PPC AND 0F0H)=70H THEN GOTO Z4;
	RETURN 0FFH;
/*Z1:	CALL DLDL;
	IF (PPC AND 0F0H)<>0E0H  THEN RETURN 1;
	GOTO Z1;*/
Z2:	CALL DLDL;/*TIME(75)*/
	IF (PPC AND 0F0H)<>0D0H  THEN RETURN 2;/*PC5负脉冲启动*/
	GOTO Z2;
Z3:	CALL DLDL;/*TIME(75)*/
	IF (PPC AND 0F0H)<>0B0H  THEN RETURN 3;/*PC6负脉冲配方*/
	GOTO Z3;
Z4:	CALL DLDL;/*TIME(75)*/
	IF (PPC AND 0F0H)<>70H  THEN RETURN 4;/*PC7负脉冲状态*/
	GOTO Z4;
	END KKZ;/*结束*/
SZXS:	PROCEDURE;/*数字显示*/
	P13=NOT P13;
	PPB=PPB OR 80H;
	D7218=90H;
	PPB=PPB AND 7FH; /*置7218MODE低电平输入数据*/
	D7218=WYX(6)+0F0H;/*配方*/
	D7218=WYX(5)+0F0H;/*物料*/
	D7218=WYX(4)+0F0H;/*千*/
	D7218=WYX(3)+0F0H;/*百*/
	D7218=WYX(2)+0F0H;/*十*/
	D7218=WYX(1)+0F0H;/*个*/
	D7218=WYX(8)+0F0H;
	D7218=WYX(7)+0F0H;
	XX=PPA AND 80H;
	IF XX=80H THEN
	DO;
	IO8255=98H;
	;
	;
	PPB=XS;
	PPC=XY;
	END;
	END SZXS; /*数字显示结束*/
ADYX:	PROCEDURE;/*AD运行*/
	DECLARE
	CZZ BYTE;
DD:	P13=NOT P13;
	IF INT0=1 THEN GOTO DD;
	T0=0;/*读低位*/
	T1=1;
	CZD=AD7109;
	T0=1;/*读高位*/
	T1=0;
	CZZ=AD7109 AND 3FH;
	CZG=CZZ AND 0FH;
	CZZ=SHR(CZZ,4);
	SJZL=CZG*256+CZD;
	KKDD=KKD;
	CALL DLDL;
	KKDD3=2070H;
	CALL MOVXD0(KKDD3,.KKDD1,2);
	;
	CALL DLDL;
	IF KKDD<>KKDD1 THEN
	DO;
	KKDD3=2076H;
	CALL MOVXD0(KKDD3,.KKDD2,2);
	;
	CALL DLDL;
	IF KKDD1=KKDD2 THEN
	DO;
	KKDD=KKDD1;
	KKD=KKDD1;
	END;
	ELSE
	DO;
	KKDD=100;
	KKD=100;
	CALL DLDL;
	ERR1=14;
	END;
	END;
/*	YSYS=SJZL MOD 100;
	SJZL=SJZL/100;
	YSYS=YSYS*KKDD/100;
	SJZL=SJZL*KKDD+YSYS;
	SJZL=SJZL;*/
	IF KD=0 OR KD>5 THEN KD=1;
	IF (SJZL MOD KD)>KD/2 THEN SJZL=SJZL+KD; 
	SJZL=SJZL/KD*KD;
	IF SJZL>4000 THEN CZZ=3;
	DO CASE CZZ;
	DO;
	IF SJZL>999 THEN
	DO;
	WYX(1)=13;
	WYX(2)=13;
	WYX(3)=13;
	WYX(4)=13;
	END;
	ELSE
	DO;
	WYX(1)=SJZL MOD 10;
	WYX(2)=SJZL/10 MOD 10;
	WYX(3)=SJZL/100 MOD 10;
	WYX(4)=10;
	END;
	END;
	DO;
	WYX(1)=13;
	WYX(2)=13;
	WYX(3)=13;
	WYX(4)=13;
	END;
	DO;
	WYX(1)=SJZL MOD 10;
	WYX(2)=SJZL/10 MOD 10;
	WYX(3)=SJZL/100 MOD 10;
	WYX(4)=SJZL/1000;
	END;
	DO;
	WYX(1)=12;
	WYX(2)=12;
	WYX(3)=12;
	WYX(4)=12;
	END;
	END;
	RETURN;
	END ADYX; /*AD运行结束*/
CYSJ:	PROCEDURE;/*存预置数据*/
	P13=NOT P13;
	M=WYX(6)*6+(WYX(5)-1)*2+J;
	YZZL=WYX(1)+WYX(2)*10+WYX(3)*100+WYX(4)*1000;
	CALL MOVDX0(.YZZL,M,2);/*存数据*/
	CALL DLDL;
	CALL DLDL;
	RETURN;
	END CYSJ; /*存预置数据结束*/
DYSJ:	PROCEDURE;/*调用预置数据*/
	P13=NOT P13;
	M=WYX(6)*6+(WYX(5)-1)*2+J;
	CALL MOVXD0(M,.YZZL,2);/*调数据*/
	CALL DLDL;
	CALL DLDL;
	WYX(1)=YZZL MOD 10;
	WYX(2)=YZZL/10 MOD 10;
	WYX(3)=YZZL/100 MOD 10;
	WYX(4)=YZZL/1000;
	RETURN;
	END DYSJ; /*调用预置数据结束*/
YZ1:	PROCEDURE (WYX) BYTE;/*预置一位*/
	DECLARE WYX BYTE;
	WYX=WYX+1;
	P13=NOT P13;
	RETURN WYX;
	END YZ1; /*预置一位结束*/
YZ:	PROCEDURE;/*预置*/
	P13=NOT P13;
	PPC=0FEH;/*预置灯亮,其它灯不亮;*/
	CALL DLDL;/*TIME(75)*/
	M=WYX(6)*6+(WYX(5)-1)*2+J;
	CALL MOVXD0(M,.YZZL,2);/*存配方预置数*/
	CALL DLDL;/*TIME(75)*/
	CALL DYSJ;
	CALL SZXS;
YZYZ:	JP=DJP;
	P13=NOT P13;
	IF JP =21 THEN DO;/*个*/
	P13=NOT P13;
	WYX(1)=YZ1(WYX(1));
	IF WYX(1)>9 THEN WYX(1)=0;
	CALL CYSJ;
	CALL SZXS;
	CALL DLD1;
	END;
	IF JP =14 THEN DO;/*十*/
	P13=NOT P13;
	WYX(2)=YZ1(WYX(2));
	IF WYX(2)>9 THEN WYX(2)=0;
	CALL CYSJ;
	CALL SZXS;
	CALL DLD1;
	END;
	IF JP =15 THEN DO;/*百*/
	P13=NOT P13;
	WYX(3)=YZ1(WYX(3));
	IF WYX(3)>9 THEN WYX(3)=0;
	CALL CYSJ;
	CALL SZXS;
	CALL DLD1;
	END;
	IF JP =16 THEN DO;/*千*/
	P13=NOT P13;
	WYX(4)=YZ1(WYX(4));
	IF WYX(4)>9 THEN WYX(4)=0;
	CALL CYSJ;
	CALL SZXS;
	CALL DLD1;
	END;
	IF JP =13 THEN DO;/*物料*/
	P13=NOT P13;
	WYX(5)=YZ1(WYX(5));
	IF WYX(5)=0 THEN WYX(5)=1;
	IF WYX(5)>3 THEN WYX(5)=1;
	CALL DYSJ;
	CALL SZXS;
	CALL DLD1;
	END;
	IF JP =12 THEN DO;/*配方*/
	P13=NOT P13;
	WYX(6)=YZ1(WYX(6));
	IF WYX(6)>12 THEN WYX(6)=0;
	CALL DYSJ;
	CALL SZXS;
	CALL DLD1;
	END;
	CALL SZXS;
	IF JP =11 THEN GOTO YYZZ;/*状态*/
	KZ=KKZ;
	IF KZ=4 THEN GOTO YYZZ;
	GOTO YZYZ;
YYZZ:	P13=NOT P13;
	CALL MOVDX0(.WYX(6),L,1);/*存配方预置数*/
	ZTZW=ZTZW+1;
	DO WWYY =1 TO 3;
	WYX(5)=WWYY;
	M=WYX(6)*6+(WYX(5)-1)*2+J;
	CALL MOVXD0(M,.YZZL,2);
	;
	CALL DLDL;
	CALL DLDL;
	MM1=10*6+(WYX(5)-1)*2+J;
	CALL MOVXD0(MM1,.TQLL,2);
	;
	CALL DLDL;
	KBF=(WYX(5)-1)*2+2050H;
	CALL MOVDX0(.YZZL,KBF,2);
	;
	CALL DLDL;
	CALL DLDL;
	MM2=(WYX(5)-1)*2+2058H;
	CALL MOVDX0(.TQLL,MM2,2);
	;
	CALL DLDL;
	CALL DLDL;
	KBF=(WYX(5)-1)*2+2060H;
	CALL MOVDX0(.YZZL,KBF,2);
	;
	CALL DLDL;
	CALL DLDL;
	MM2=(WYX(5)-1)*2+2068H;
	CALL MOVDX0(.TQLL,MM2,2);
	;
	CALL DLDL;
	CALL DLDL;
	END;
	KKDD3=2046H;
	CALL MOVXD0(KKDD3,.KKDD,2);
	;
	CALL DLDL;
	KKDD3=2070H;
	CALL MOVDX0(.KKDD,KKDD3,2);
	;
	CALL DLDL;
	CALL DLDL;
	KKDD3=2076H;
	CALL MOVDX0(.KKDD,KKDD3,2);
	;
	CALL DLDL;
	CALL DLDL;
	WYX(5)=1;
	CALL DLD1;
	ERR1=0;
	RETURN;
	END YZ; /*预置结束*/
ZT:	PROCEDURE;/*暂停*/
	P13=NOT P13;
	JP=DJP;
	IF JP<>20 THEN GOTO ZT2;
	PPB=0FFH;
	CALL DLD1;
	CALL DLD1;
ZT1:	JP=DJP;
	P13=NOT P13;
	IF JP<>20 THEN GOTO ZT1;
	CALL DLD1;
	CALL DLD1;
	PPB=XS;
ZT2:	RETURN;
	END ZT; /*暂停结束*/
QD2:	PROCEDURE;/*秤量一种物料*/
	DECLARE
	DLW WORD;
	PPC=0FBH;/*运行灯亮,其它灯不亮;*/
	;
	XY=0FBH;
	XS=7FH;
	CALL ZT;/*延时5秒*/
	M=WYX(6)*6+(WYX(5)-1)*2+J;
	CALL MOVXD0(M,.YZDDY(X),2);
	;
	CALL DLDL;
	KBF=(WYX(5)-1)*2+2050H;
	CALL MOVXD0(KBF,.KBF1,2);
	;
	CALL DLDL;
	MM2=(WYX(5)-1)*2+2058H;
	CALL MOVXD0(MM2,.TQLL1,2);
	;
	CALL DLDL;
	IF YZDDY(X)<>KBF1 THEN
	DO;
	KBF=(WYX(5)-1)*2+2060H;
	CALL MOVXD0(KBF,.KBF2,2);
	CALL DLDL;
	IF KBF1=KBF2 THEN
	DO;
	YZDDY(X)=KBF1;
	CALL MOVDX0(.YZDDY(X),M,2);
	;
	CALL DLDL;
	END;
	ELSE
	DO;

⌨️ 快捷键说明

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