📄 改猛.txt
字号:
MAIN_1:DO;
/*专用寄存器*/
DECLARE P0 BYTE AT(80H) REGISTER;
DECLARE P00 BIT AT(80H) REGISTER;
DECLARE P01 BIT AT(81H) REGISTER;
DECLARE P02 BIT AT(82H) REGISTER;
DECLARE P03 BIT AT(83H) REGISTER;
DECLARE P04 BIT AT(84H) REGISTER;
DECLARE P05 BIT AT(85H) REGISTER;
DECLARE P06 BIT AT(86H) REGISTER;
DECLARE P07 BIT AT(87H) REGISTER;
DECLARE P1 BYTE AT(90H) REGISTER;
DECLARE T2 BIT AT(90H) REGISTER;
DECLARE AA BIT AT(92H) REGISTER;
DECLARE BB BIT AT(93H) REGISTER;
DECLARE CC BIT AT(94H) REGISTER;
DECLARE QIN BIT AT(96H) REGISTER;
DECLARE PIN BIT AT(95H) REGISTER;
DECLARE DD BIT AT(97H) REGISTER;
DECLARE P2 BYTE AT(0A0H) REGISTER;
DECLARE A14 BIT AT(0A6H) REGISTER;
DECLARE A15 BIT AT(0A7H) REGISTER;
DECLARE P3 BYTE AT(0B0H) REGISTER;
DECLARE WR BIT AT(0B6H) REGISTER;
DECLARE RD BIT AT(0B7H) REGISTER;
DECLARE PSW BYTE AT(0D0H) REGISTER;
DECLARE ACC BYTE AT(0E0H) REGISTER;
DECLARE B BYTE AT(0F0H) REGISTER;
DECLARE DPL BYTE AT(82H) REGISTER;
DECLARE DPH BYTE AT(83H) REGISTER;
DECLARE PCON BYTE AT(87H) REGISTER;
DECLARE TCON BYTE AT(88H) REGISTER;
DECLARE TF1 BIT AT(8FH) REGISTER;
DECLARE TR1 BIT AT(8EH) REGISTER;
DECLARE TF0 BIT AT(8DH) REGISTER;
DECLARE TR0 BIT AT(8CH) REGISTER;
DECLARE TMOD BYTE AT(89H) REGISTER;
DECLARE TL0 BYTE AT(8AH) REGISTER;
DECLARE TL1 BYTE AT(8BH) REGISTER;
DECLARE TH0 BYTE AT(8CH) REGISTER;
DECLARE TH1 BYTE AT(8DH) REGISTER;
DECLARE IE BYTE AT(0A8H) REGISTER;
DECLARE IP BYTE AT(0B8H) REGISTER;
DECLARE SCON BYTE AT(98H) REGISTER;
DECLARE SBUF BYTE AT(99H) REGISTER;
DECLARE T2CON BYTE AT(0C8H) REGISTER;
DECLARE TF2 BIT AT(0CFH) REGISTER;
DECLARE EXF2 BIT AT(0CEH) REGISTER;
DECLARE TR2 BIT AT(0CAH) REGISTER;
DECLARE T2MOD BYTE AT(0C9H) REGISTER;
DECLARE RCAP2L BYTE AT(0CAH) REGISTER;
DECLARE RCAP2H BYTE AT(0CBH) REGISTER;
DECLARE TL2 BYTE AT(0CCH) REGISTER;
DECLARE TH2 BYTE AT(0CDH) REGISTER;
/********************************/
/*******************************/
DECLARE PL(4) BYTE ;
DECLARE S_ADC BYTE ; /*A/D转化切换控制参数*/
DECLARE VV BYTE ;
DECLARE SS BYTE ;
DECLARE PP BYTE ;
DECLARE TT BYTE ;
DECLARE PWM_V BYTE ; /*VSS的最大值*/
DECLARE T_V BYTE ; /*采样时间*/
DECLARE PWM_START BYTE ; /*启动脉宽 */
DECLARE PWM_STOP BYTE ; /*停车脉宽*/
DECLARE SPD_D BYTE ; /*停车脉宽*/
DECLARE ADC0 BYTE AT (0000H) AUXILIARY;
DECLARE ADC1 BYTE AT (0001H) AUXILIARY;
DECLARE ADC2 BYTE AT (0002H) AUXILIARY;
DECLARE ADC3 BYTE AT (0003H) AUXILIARY;
DECLARE ADC4 BYTE AT (0004H) AUXILIARY;
DECLARE R0 BYTE ;
DECLARE S_T0 BYTE ; /*定时器0切换控制*/
DECLARE S_T1 BYTE ; /*定时器1切换控制*/
DECLARE KEY_TL BYTE ; /*键盘延时控制参数*/
DECLARE SPD_JS BYTE ; /*测速累计控制*/
DECLARE S_SPD BYTE ;
DECLARE MM BYTE ;
DECLARE TEM_S BYTE ;
DECLARE TEM_I BYTE ;
DECLARE TI BYTE ;
DECLARE SPD_STEP BYTE ;
DECLARE DISP_STATUS BYTE ;
DECLARE SPD1 WORD AT (50H) MAIN ;
DECLARE ZXS BYTE ;
DECLARE SPD3 BYTE ;
DECLARE SPD4 BYTE ;
DECLARE SPD5 WORD ;
DECLARE (DIRECT) BIT ;
DECLARE (START_SIGN,BID ) BIT ;
DECLARE ORDER BYTE ;
DECLARE KEY_STATUS BYTE AT (2C01H) AUXILIARY;
DECLARE DISP(4) BYTE AT (2C02H) AUXILIARY;
DECLARE ADC0809_0 BYTE AT ( 87FFH) AUXILIARY;
DECLARE ADC0809_1 BYTE AT ( 8FFFH) AUXILIARY;
DECLARE ADC0809_2 BYTE AT ( 97FFH) AUXILIARY;
DECLARE ADC0809_3 BYTE AT ( 9FFFH) AUXILIARY;
DECLARE ADC0809_4 BYTE AT (0A7FFH) AUXILIARY;
DECLARE DAC0832 BYTE AT (37FFH) AUXILIARY;
DECLARE T8253_0 BYTE AT (0C7FFH) AUXILIARY;
DECLARE T8253_1 BYTE AT (0CFFFH) AUXILIARY;
DECLARE T8253_2 BYTE AT (0D7FFH) AUXILIARY;
DECLARE CON_8253 BYTE AT (0DFFFH) AUXILIARY;
DECLARE TEM(1000) WORD AT (000FH) AUXILIARY;
DECLARE AIM_SPD WORD AT (54H) MAIN;
DECLARE RUN_SPD WORD AT (52H) MAIN ;
DECLARE SIG_VSS BIT ;
DECLARE SIG_VSS1 BIT ;
DECLARE VSS_SPD(2) WORD ;
DECLARE PWM_WIDTH BYTE AT (45H) MAIN;
DECLARE (E0,E1,EC) BYTE;
DECLARE FUZZY(225) BYTE
CONSTANT(0,0,0,1,1,2,3,3,4,5,5,6,7,7,7,
1,1,2,2,3,3,4,4,5,5,6,7,7,7,8,
2,2,3,3,3,4,4,5,5,6,6,7,7,7,8,
3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,
4,4,4,5,5,6,6,6,6,7,7,7,7,8,8,
4,5,5,6,6,6,6,6,7,7,7,7,7,8,8,
5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,
6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,
6,6,6,7,7,7,7,7,8,8,8,8,8,9,9,
6,6,7,7,7,7,7,8,8,8,8,8,9,9,10,
6,6,7,7,7,7,8,8,8,8,9,9,10,10,10,
6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,
6,7,7,7,8,8,9,9,10,10,11,11,11,12,12,
6,7,7,7,8,9,9,10,10,11,11,12,12,13,13,
7,7,7,8,9,9,10,11,11,12,13,13,14,14,14);
/*********速度转换子程序**************/
CONVERSION:PROCEDURE ;
IF ((SPD4=3 AND SPD3>=0E8H)OR(SPD4>3)) THEN
DO;
PL(0)=1;
PL(1)=( SPD4*256+SPD3-1000 )/64H;
PL(2)=( SPD4*256+SPD3-1000-PL(1)*100 )/0AH;
PL(3)=(SPD4*256+SPD3-1000-PL(1)*100 -PL(2)*10 ) MOD
0AH;
END;
ELSE
DO;
PL(0)=0;
PL(1)=((SPD4)*256 + SPD3)/64H;
PL(2)=( SPD4*256+SPD3-PL(1)*100)/0AH;
PL(3)=(SPD4*256+SPD3-PL(1)*100-PL(2)*10) MOD 0AH;
END;
END CONVERSION;
/*********显示子程序******************/
DISPLAY:PROCEDURE;
DO CASE DISP_STATUS;
DISP_0:DO; /*显示速度*/
IF S_SPD=0 THEN
DO;
SPD3=LOW(RUN_SPD);
SPD4=HIGH (RUN_SPD);
END;
ELSE IF S_SPD=1 THEN
DO;
SPD3=LOW(AIM_SPD);
SPD4=HIGH (AIM_SPD);
END;
ELSE IF S_SPD=2 THEN
DO;
SPD3=LOW(SPD_STEP);
SPD4=HIGH (SPD_STEP);
END;
ELSE IF S_SPD=3 THEN
DO;
SPD3=LOW(PWM_WIDTH );
SPD4=HIGH (PWM_WIDTH );
END;
CALL CONVERSION;
IF (PL(0)=1 AND BID=0) THEN
DO;
WR=0;
P0=02H;
P2=57H;
WR=1;
END;
ELSE IF (PL(0)=1 AND BID=1) THEN
DO;
WR=0;
P0=03H;
P2=57H;
WR=1;
END;
ELSE IF (PL(0)=0 AND BID=0) THEN
DO;
WR=0;
P0=00H;
P2=57H;
WR=1;
END;
ELSE IF (PL(0)=0 AND BID=1) THEN
DO;
WR=0;
P0=01H;
P2=57H;
WR=1;
END;
WR=0;
P2=67H;
P0=PL(2);
R0=0;
R0=0;
P2=6FH;
P0=PL(3);
R0=0;
R0=0;
P2=5FH;
P0=PL(1);
R0=0;
R0=0;
WR=1;
END;
END;
END DISPLAY;
/***************PWM_OUT*********************/
PWM_OUT:PROCEDURE;
DISABLE;
DO;
CON_8253=72H;
T8253_1=PWM_WIDTH ;
T8253_1=00H;
END;
ENABLE;
END PWM_OUT;
/**********************PID子程序***********/
PID:PROCEDURE;
DECLARE Q1 BYTE ;
DECLARE SS1 BYTE ;
DECLARE S1 WORD ;
DECLARE S2 WORD ;
DECLARE S_4 BIT ;
DECLARE S3 BYTE ;
DECLARE S_1 BIT ;
DECLARE S_2 BIT ;
DECLARE S_3 BIT ;
IF AIM_SPD>=RUN_SPD THEN DO;
S_3=0;
S1=AIM_SPD-RUN_SPD;
S3=S1;
IF S3>160 THEN S3=160;
END;
ELSE IF AIM_SPD<RUN_SPD THEN DO;
S_3=1;
S1=RUN_SPD-AIM_SPD;
S3=S1;
IF S3>160 THEN S3=160;
END;
IF S_4=0 AND S_3=0 THEN DO;
IF S1>=S2 THEN DO;
S_1=0;
SS1=S1-S2;
END;
IF S1<S2 THEN DO;
S_1=1;
SS1=S2-S1;
END;
IF SS1>40 THEN SS1=40;
END;
ELSE IF S_4=1 AND S_3=1 THEN DO;
IF S1>=S2 THEN DO;
S_1=1;
SS1=S1-S2;
END;
IF S1<S2 THEN DO;
S_1=0;
SS1=S2-S1;
END;
IF SS1>40 THEN SS1=40;
END;
ELSE IF S_4=1 AND S_3=0 THEN DO;
IF S1>=S2 THEN DO;
S_1=0;
SS1=S1+S2;
END;
IF SS1>40 THEN SS1=40;
END;
ELSE IF S_4=0 AND S_3=1 THEN DO;
IF S1>=S2 THEN DO;
S_1=1;
SS1=S1+S2;
END;
IF SS1>40 THEN SS1=40;
END;
IF (S_3=0)AND(S_1=0) THEN
PWM_WIDTH = PWM_WIDTH + SS1/20 + S3/40;
IF (S_3=0)AND(S_1=1) THEN
PWM_WIDTH = PWM_WIDTH- SS1/20 + S3/40;
IF (S_3=1)AND(S_1=0) THEN
PWM_WIDTH = PWM_WIDTH + SS1/20 - S3/40;
IF (S_3=1)AND(S_1=1) THEN
PWM_WIDTH = PWM_WIDTH - SS1/20- S3/40;
IF (PWM_WIDTH>62 AND PWM_WIDTH<200) THEN PWM_WIDTH=62;
IF PWM_WIDTH<2 THEN PWM_WIDTH=2;
IF PWM_WIDTH=0FFH THEN PWM_WIDTH=2;
CALL PWM_OUT;
S2=S1;
S_4=S_3 ;
END PID;
PWM:PROCEDURE; /*模糊控制*/
DECLARE(GE,GEC) BYTE;
DECLARE EE1 BYTE;
DECLARE SING1_SPD BYTE;
DECLARE SING2_SPD BYTE;
DECLARE SING3_SPD BYTE;
DO;/*E0 前次误差 E1 本次误差 EC 本次误差的变化率*/
IF AIM_SPD>=RUN_SPD THEN DO;
SING1_SPD=0;
E1= (AIM_SPD-RUN_SPD)/2 ;
IF E1>42 THEN E1=42 ;
EE1=E1;
GE= EE1/6 +7 ;
END;
ELSE DO;
SING1_SPD=1;
E1= (RUN_SPD-AIM_SPD)/2 ;
IF E1>42 THEN E1=42 ;
EE1=E1;
GE= 7-EE1/6 ;
END;
IF SING3_SPD=0 AND SING1_SPD=0 THEN DO;
IF E1>=E0 THEN DO;
SING2_SPD=0;
EC=(E1-E0)/2 ;
IF EC>7 THEN EC=7;
END;
ELSE DO;
SING2_SPD=1;
EC=(E0-E1)/2 ;
IF EC>7 THEN EC=7;
END;
END;
IF SING3_SPD=1 AND SING1_SPD=0 THEN DO;
SING2_SPD=0;
EC=(E1+E0) ;
IF EC>7 THEN
EC=7;
END;
IF SING3_SPD=0 AND SING1_SPD=1 THEN DO;
SING2_SPD=1;
EC=(E1+E0) ;
IF EC>7 THEN
EC=7;
END;
IF SING3_SPD=1 AND SING1_SPD=1 THEN DO;
IF E1>=E0 THEN DO;
SING2_SPD=1;
EC=(E1-E0) ;
IF EC>7 THEN EC=7;
END;
ELSE DO;
SING2_SPD=0;
EC=(E0-E1) ;
IF EC>7 THEN EC=7;
END;
END;
IF SING2_SPD=1 THEN
GEC= 7-EC ;
ELSE GEC= 7+EC;
PWM_WIDTH=PWM_WIDTH+FUZZY(GE*15+GEC);
IF PWM_WIDTH>=9 THEN
PWM_WIDTH=PWM_WIDTH-7;
ELSE PWM_WIDTH=2;
IF (PWM_WIDTH>124 AND PWM_WIDTH<255) THEN PWM_WIDTH=124;
IF PWM_WIDTH<2 THEN PWM_WIDTH=2;
E0=E1;
SING3_SPD=SING1_SPD;
END;
CALL PWM_OUT;
END PWM;
/**********************VSS********************/
VSS:PROCEDURE;
DECLARE DIF_SPD WORD ;
IF START_SIGN=1 THEN
DO;
VSS_SPD(0)=RUN_SPD;
IF VSS_SPD(0)>=VSS_SPD(1) THEN DO;
DIF_SPD=(VSS_SPD(0)-VSS_SPD(1))/5;
VSS_SPD(1)=VSS_SPD(0)+ DIF_SPD;
END;
ELSE DO;
DIF_SPD=(VSS_SPD(1)-VSS_SPD(0))/5;
VSS_SPD(1)=VSS_SPD(0)- DIF_SPD;
END;
IF ( VSS_SPD(1)>=AIM_SPD) AND (SIG_VSS1=1) THEN
DO;
SIG_VSS1=0;
SIG_VSS=0;
CON_8253=72H;
T8253_1=02H;
T8253_1=00H;
END;
ELSE IF ( VSS_SPD(1)<AIM_SPD) AND (SIG_VSS1=0)
THEN
DO;
SIG_VSS1=1;
SIG_VSS=1;
CON_8253=72H;
T8253_1=PWM_V;
T8253_1=00H;
END;
VSS_SPD(1)= VSS_SPD(0) ;
END;
END VSS;
/*************启动子程*******************/
START:PROCEDURE;
DISABLE;
CON_8253=72H;
T8253_1=2;
T8253_1=00H;
START_SIGN=1;
IF DIRECT=0 THEN DO;
IF (PIN=1 AND QIN=1) THEN DO;
AA=0;
R0=0;
R0=0;
BB=1;
R0=0;
R0=0;
CC=1;
R0=0;
R0=0;
DD=0;
R0=0;
R0=0;
END;
ELSE IF (PIN=1 AND QIN=0) THEN DO;
DD=1;
R0=0;
R0=0;
AA=0;
R0=0;
R0=0;
BB=0;
R0=0;
R0=0;
CC=1;
R0=0;
R0=0;
END;
ELSE IF (PIN=0 AND QIN=0) THEN DO;
CC=0;
R0=0;
R0=0;
DD=1;
R0=0;
R0=0;
AA=1;
R0=0;
R0=0;
BB=0;
R0=0;
R0=0;
END;
ELSE IF (PIN=0 AND QIN=1) THEN DO;
BB=1;
R0=0;
R0=0;
CC=0;
R0=0;
R0=0;
AA=1;
R0=0;
R0=0;
DD=0;
R0=0;
R0=0;
END;
END;
ELSE DO;
IF (PIN=0 AND QIN=0) THEN DO;
AA=0;
R0=0;
R0=0;
BB=1;
R0=0;
R0=0;
CC=1;
R0=0;
R0=0;
DD=0;
R0=0;
R0=0;
END;
ELSE IF (PIN=1 AND QIN=0) THEN DO;
BB=1;
R0=0;
R0=0;
CC=0;
R0=0;
R0=0;
AA=1;
R0=0;
R0=0;
DD=0;
R0=0;
R0=0;
END;
ELSE IF (PIN=0 AND QIN=1) THEN DO;
AA=0;
R0=0;
R0=0;
DD=1;
R0=0;
R0=0;
BB=0;
R0=0;
R0=0;
CC=1;
R0=0;
R0=0;
END;
ELSE DO;
CC=0;
R0=0;
R0=0;
DD=1;
R0=0;
R0=0;
AA=1;
R0=0;
R0=0;
BB=0;
R0=0;
R0=0;
END;
END;
ENABLE;
END START;
/************停车子程序******************/
STOP:PROCEDURE;
IF DIRECT=0 THEN /*正向停车*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -