📄 bak_nosoft.txt
字号:
MAIN:DO;
/***************************************************/
/*80C196KB CPU专用寄存器*/
/***************************************************/
DECLARE ZERO WORD AT (00H); /*R*/
DECLARE AD_COMMAND BYTE AT(02H); /*W*/
DECLARE HSI_MODE BYTE AT (03H); /*W*/
DECLARE HSI_TIME WORD AT (04H); /*R*/
DECLARE HSO_TIME WORD AT (04H); /*W*/
DECLARE HSI_STATUS BYTE AT (06H); /*R*/
DECLARE HSO_COMMAND BYTE AT (06H); /*W*/
DECLARE SBUF BYTE AT(07H); /* R/W */
DECLARE INT_MASK BYTE AT (08H); /*R W*/
DECLARE INT_PENDING BYTE AT (09H); /*R W*/
DECLARE WATCHDOG BYTE AT (0AH); /*W*/
DECLARE TIMER1 WORD AT (0AH); /*R*/
DECLARE TIMER2 WORD AT (0CH); /*R W*/
DECLARE IOC2 BYTE AT (0BH); /*W*/
DECLARE IOPORT0 BYTE AT (0EH); /*R*/
DECLARE IOPORT1 BYTE AT (0FH); /*R W*/
DECLARE IOPORT2 BYTE AT (10H); /*R W*/
DECLARE INT_PEND1 BYTE AT (12H); /*R W*/
DECLARE INT_MASK1 BYTE AT (13H); /*R W*/
DECLARE WSR BYTE AT (14H); /*R W*/
DECLARE IOS0 BYTE AT (15H); /*R*/
DECLARE IOC0 BYTE AT (15H); /*W*/
DECLARE IOS1 BYTE AT (16H); /*R*/
DECLARE IOC1 BYTE AT (16H); /*W*/
DECLARE IOS2 BYTE AT (17H); /*R*/
DECLARE SP WORD AT (18H); /*R W*/
/*****************************************************/
DECLARE (DIRECT,P,Q,ORDER) BYTE FAST;
DECLARE T1OVER WORD;
DECLARE PWM_WIDTH WORD;
DECLARE DISP_SPD(4) BYTE;
DECLARE DISP_BUFF(4) BYTE;
DECLARE (START_SIGN,BID) BYTE;
DECLARE R0 BYTE;
DECLARE (DISP_STATUS,SPD_STEP,FAULT) BYTE;
DECLARE (II,KK) WORD;
DECLARE COMM_8279 BYTE AT(0DFFFH);
DECLARE DATA_8279 BYTE AT(0DE00H);
DECLARE (AIM_SPD,CONV_SPD,RUN_SPD) WORD ;
DECLARE (TM1,TM2) WORD FAST;
DECLARE (TURNON,TURNOFF) WORD FAST;
DECLARE (E0,E1,EC) INTEGER;
DECLARE T_SPAN DWORD FAST;
DECLARE INT13 WORD AT(203AH) DATA(.KEY_PROCESS);
DECLARE DEFAULT_SPD WORD DATA(400);
DECLARE DIGI_CODE(10) BYTE DATA(3FH,30H,5BH,79H,74H,6DH,6FH,38H,7FH,7DH);
DECLARE FUZZY(225) BYTE DATA(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);
/*显示程序*/
DISPLAY:PROCEDURE;
DECLARE I BYTE;
DO CASE DISP_STATUS;
DISP0:DO; /*速度显示*/
II=II+1;
IF II>500 THEN DO;
II=0;
CONV_SPD=RUN_SPD;
END;
CALL CONVERSION;
DO I=0 TO 3;
DISP_BUFF(I)=DISP_SPD(I);
END;
END;
DISP1:DO; /*一般故障显示*/
IF BITTST(.FAULT,1) THEN DISP_BUFF(0)=00H;
ELSE DISP_BUFF(0)=40H;
IF BITTST(.FAULT,2) THEN DISP_BUFF(1)=00H;
ELSE DISP_BUFF(1)=40H;
IF BITTST(.FAULT,3) THEN DISP_BUFF(2)=80H;
ELSE DISP_BUFF(2)=0c0H;
IF BITTST(.FAULT,4) THEN DISP_BUFF(3)=00H;
ELSE DISP_BUFF(3)=40H;
END;
DISP2:DO; /*电源故障显示*/
DO I=0 TO 2;
IF BITTST(.FAULT,0) THEN DISP_BUFF(I)=00H;
ELSE DISP_BUFF(I)=40H;
END;
DISP_BUFF(3)=0DEH;
END;
DISP3:DO;
CONV_SPD=PWM_WIDTH;
CALL CONVERSION;
DO I=0 TO 3;
DISP_BUFF(I)=DISP_SPD(I);
END;
END;
DISP4:DO;
CONV_SPD=300;
CALL CONVERSION;
DO I=0 TO 3;
DISP_BUFF(I)=DISP_SPD(I);
END;
END;
DISP5:DO;
CONV_SPD=PWM_WIDTH;
CALL CONVERSION;
DO I=0 TO 3;
DISP_BUFF(I)=DISP_SPD(I);
END;
END;
DISP6:DO;
CONV_SPD=SPD_STEP;
CALL CONVERSION;
DO I=0 TO 3;
DISP_BUFF(I)=DISP_SPD(I);
END;
END;
DISP7:DO;
CONV_SPD=AIM_SPD;
CALL CONVERSION;
DO I=0 TO 3;
DISP_BUFF(I)=DISP_SPD(I);
END;
END;
END;
IF START_SIGN=1 THEN DISP_BUFF(0)=(DISP_BUFF(0) OR 80H);
IF DIRECT=1 THEN DISP_BUFF(1)=(DISP_BUFF(1) OR 80H);
IF FAULT<1FH THEN DISP_BUFF(3)=(DISP_BUFF(3) OR 80H);
CALL REFRESH;
END DISPLAY;
CONVERSION:PROCEDURE;
DECLARE K BYTE;
DECLARE NN BYTE;
DECLARE DIGI_N(4) BYTE;
DIGI_N(0)=CONV_SPD/1000;
DIGI_N(1)=(CONV_SPD MOD 1000)/100;
DIGI_N(2)=(CONV_SPD MOD 100)/10;
DIGI_N(3)=CONV_SPD MOD 10;
DO K=0 TO 3;
NN=DIGI_N(K);
DISP_SPD(K)=DIGI_CODE(NN);
END;
END CONVERSION;
REFRESH:PROCEDURE;
DECLARE J BYTE;
COMM_8279=90H;
DO J=0 TO 3;
DATA_8279=DISP_BUFF(J);
END;
END REFRESH;
/*键盘处理程序*/
KEY_PROCESS:PROCEDURE INTERRUPT 7 ;
DECLARE KEY BYTE;
DISABLE;
COMM_8279=40H;
KEY=DATA_8279;
COMM_8279=0C2H;
IF KEY>7 THEN KEY=KEY-8;
ENABLE;
DO CASE KEY;
K0:DO; /*启动键*/
DISP_STATUS=3; /*show pwm_width*/
IF START_SIGN=0 THEN CALL START;
END;
K1:DO; /*反向键*/
IF (START_SIGN=0 AND RUN_SPD=0) THEN DO;
IF DIRECT=1 THEN DIRECT=0;
ELSE DIRECT=1;
END;
ELSE DO;
START_SIGN=0;
AIM_SPD=0;
BID=1;
CALL STOP;
END;
END;
K2:DO; /*显示切换键*/
DISP_STATUS=DISP_STATUS+1;
IF DISP_STATUS=8 THEN DISP_STATUS=0;
END;
K3:DO; /*加速键*/
DISP_STATUS=7;
IF AIM_SPD<3500 THEN AIM_SPD=AIM_SPD+SPD_STEP;
IF AIM_SPD>3500 THEN AIM_SPD=3500;
END;
K4:DO; /*减速键*/
DISP_STATUS=7;
IF AIM_SPD>50 THEN AIM_SPD=AIM_SPD-SPD_STEP;
IF AIM_SPD<50 THEN AIM_SPD=50;
END;
K5:DO; /*停止键*/
START_SIGN=0;
AIM_SPD=0;
CALL STOP;
END;
K6:DO; /*步距调节键*/
DISP_STATUS=6;
IF SPD_STEP=100 THEN SPD_STEP=10;
ELSE IF SPD_STEP=10 THEN SPD_STEP=1;
ELSE SPD_STEP=100;
END;
K7:DO; /*缺省速度键*/
DISP_STATUS=7;
AIM_SPD=DEFAULT_SPD;
END;
END;
END KEY_PROCESS;
START:PROCEDURE;
DECLARE PORT BYTE;
DISABLE;
/* INT_MASK=2DH;*/
IOC2=80H;
PWM_WIDTH=2;
PORT=IOPORT1;
IF BITTST(.PORT,7) THEN P=1;
ELSE P=0;
IF BITTST(.PORT,5) THEN Q=1;
ELSE Q=0;
TM1=0;
T1OVER=0;
CALL PWMTIME;
START_SIGN=1;
IF DIRECT=1 THEN DO;
IF (P=1 AND Q=1) THEN DO;
HSO_COMMAND=26H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=07H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
END;
ELSE IF(P=1 AND Q=0) THEN DO;
HSO_COMMAND=23H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=20H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=01H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=02H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
END;
ELSE IF(P=0 AND Q=1) THEN DO;
HSO_COMMAND=21H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=22H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=00H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=03H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
END;
ELSE DO;
HSO_COMMAND=27H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=06H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
END;
END;
ELSE DO; /*顺时针转*/
IF (P=0 AND Q=0) THEN DO;
HSO_COMMAND=26H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=07H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
END;
ELSE IF(P=1 AND Q=0) THEN DO;
HSO_COMMAND=21H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=22H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=00H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=03H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
END;
ELSE IF(P=0 AND Q=1) THEN DO;
HSO_COMMAND=20H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=23H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=01H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=02H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
END;
ELSE DO;
HSO_COMMAND=27H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
HSO_COMMAND=06H;
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
END;
END;
ENABLE;
END START;
/*高速输入中断程序*/
HSI_INT:PROCEDURE INTERRUPT 2 ;
DECLARE STATUS BYTE;
DECLARE IOS BYTE;
DECLARE T1 BYTE;
declare (SUM,temp) word;
DISABLE;
IOS=IOS1;
IF BITTST(.IOS,7) THEN DO;
STATUS=HSI_STATUS;
TM2=HSI_TIME;
T1=T1OVER;
T1OVER=0;
IF BITTST(.STATUS,0) THEN DO;
IF BITTST(.STATUS,1) THEN ORDER=0;
ELSE ORDER=2;
END;
ELSE IF BITTST(.STATUS,2) THEN DO;
IF BITTST(.STATUS,3) THEN ORDER=1;
ELSE ORDER=3;
END;
IF T1<15 THEN DO;
T_SPAN=(T1*65536+TM2)-TM1;
temp=1875000/T_SPAN;
END;
ELSE TEMP=0;
TM1=TM2;
END;
sum=run_spd*23+temp;
run_spd=sum/24;
ENABLE;
IF START_SIGN=1 THEN CALL HSO_PROCESS;
ELSE CALL STOP;
END HSI_INT;
/*高速输出处理程序*/
HSO_PROCESS:PROCEDURE ;/*两相定角度开通角-7.5,关断角22.5*/
DISABLE;
IF DIRECT=1 THEN DO;/*逆时针*/
TURNON=T_SPAN/2;
TURNOFF=T_SPAN/2;
DO CASE ORDER;
T00:DO;/*P=1,Q=0*/
HSO_COMMAND=03H;
HSO_TIME=TIMER1+TURNOFF;
R0=0;
R0=0;
HSO_COMMAND=21H;
HSO_TIME=TIMER1+TURNON;
R0=0;
R0=0;
END;
TO1:DO;/*P=1,Q=1*/
HSO_COMMAND=00H;
HSO_TIME=TIMER1+TURNOFF;
R0=0;
R0=0;
HSO_COMMAND=22H;
HSO_TIME=TIMER1+TURNON;
R0=0;
R0=0;
END;
TO2:DO;/*P=0,Q=1*/
HSO_COMMAND=01H;
HSO_TIME=TIMER1+TURNOFF;
R0=0;
R0=0;
HSO_COMMAND=23H;
HSO_TIME=TIMER1+TURNON;
R0=0;
R0=0;
END;
TO3:DO;/*P=0,Q=0*/
HSO_COMMAND=02H;
HSO_TIME=TIMER1+TURNOFF;
R0=0;
R0=0;
HSO_COMMAND=20H;
HSO_TIME=TIMER1+TURNON;
R0=0;
R0=0;
END;
END;
END;
ELSE DO;/*顺时针*/
TURNON=T_SPAN/2;
TURNOFF=T_SPAN/2;
DO CASE ORDER;
T10:DO;/*P=1,Q=1*/
HSO_COMMAND=03H;
HSO_TIME=TIMER1+TURNOFF;
R0=0;
R0=0;
HSO_COMMAND=21H;
HSO_TIME=TIMER1+TURNON;
R0=0;
R0=0;
END;
T11:DO;/*P=0,Q=1*/
HSO_COMMAND=00H;
HSO_TIME=TIMER1+TURNOFF;
R0=0;
R0=0;
HSO_COMMAND=22H;
HSO_TIME=TIMER1+TURNON;
R0=0;
R0=0;
END;
T12:DO;/*P=0,Q=0*/
HSO_COMMAND=01H;
HSO_TIME=TIMER1+TURNOFF;
R0=0;
R0=0;
HSO_COMMAND=23H;
HSO_TIME=TIMER1+TURNON;
R0=0;
R0=0;
END;
T13:DO;/*P=1,Q=0*/
HSO_COMMAND=02H;
HSO_TIME=TIMER1+TURNOFF;
R0=0;
R0=0;
HSO_COMMAND=20H;
HSO_TIME=TIMER1+TURNON;
R0=0;
R0=0;
END;
END;
END;
ENABLE;
END HSO_PROCESS;
T1_INT:PROCEDURE INTERRUPT 0;
T1OVER=T1OVER+1;
IF T1OVER>50000 THEN T1OVER=0;
END T1_INT;
STOP:PROCEDURE;
DISABLE;
IOC2=80H;
HSO_COMMAND=25H; /*hso_command=05H; */
HSO_TIME=TIMER1+04H;
R0=0;
R0=0;
HSO_COMMAND=06H;
HSO_TIME=TIMER1+04H;
R0=0;
R0=0;
HSO_COMMAND=07H;
HSO_TIME=TIMER1+04H;
R0=0;
R0=0;
ENABLE;
END STOP;
PWMTIME:PROCEDURE;
IOC2=0C0H;
HSO_COMMAND=0CEH;
HSO_TIME=150;
R0=0;
R0=0;
HSO_COMMAND=0C5H; /*hso_command=0E5H;*/
HSO_TIME=150;
R0=0;
R0=0;
CALL PWM_OUT;
END PWMTIME;
HSO_INT:PROCEDURE INTERRUPT 3;
KK=KK+1;
IF RUN_SPD<300 THEN DO;
IF KK>1500 THEN DO;/*每隔0.3s变换一次pwm占空比*/
KK=1;
CALL PWM;
END;
ELSE CALL PWM_OUT;
END;
ELSE IF AIM_SPD>2000 THEN DO;
IF RUN_SPD<(AIM_SPD-300) THEN DO;
IF KK>250 THEN DO;/*每隔0.05s变换一次pwm占空比*/
KK=1;
CALL PWM;
END;
ELSE CALL PWM_OUT;
END;
ELSE DO;/*run_spd>1700*/
IF KK>500 THEN DO;/*每隔0.1s变换一次pwm占空比*/
KK=1;
CALL PWM;
END;
ELSE CALL PWM_OUT;
END;
END;
ELSE DO;
IF KK>1000 THEN DO;/*每隔0.2s变换一次pwm占空比*/
KK=1;
CALL PWM;
END;
ELSE CALL PWM_OUT;
END;
END HSO_INT;
PWM:PROCEDURE;/*每次pwm宽度增加2*/
DISABLE;
IF START_SIGN=0 THEN DO;
PWM_WIDTH=PWM_WIDTH-1;
IF T_SPAN>10000 THEN PWM_WIDTH=2;/*run_spd<187.5 (run_spd=1875000/t_span)*/
ELSE IF T1OVER>15 THEN PWM_WIDTH=2;
IF PWM_WIDTH<2 THEN PWM_WIDTH=2;
END;
PWM_WIDTH=PWM_WIDTH+2;
IF PWM_WIDTH>28 THEN PWM_WIDTH=28;
CALL PWM_OUT;
ENABLE;
END PWM;
PWM_OUT:PROCEDURE;
DISABLE;
HSO_COMMAND=75H; /*hso_command=55H;*/
HSO_TIME=PWM_WIDTH;
R0=0;
R0=0;
ENABLE;
END PWM_OUT;
/***主过程***/
MAINPROC:DO;
CALL TIME(500);
DISABLE;
IOC0=05H;
IOC1=66H;
IOC2=80H;
SP=0C0H;
INT_MASK=2DH;
INT_MASK1=23H;
INT_PENDING=00H;
INT_PEND1=00H;
HSI_MODE=0FH;
IOPORT1=0FFH;
IOPORT2=0;
COMM_8279=2FH;
R0=0;
R0=0;
COMM_8279=01H;
R0=0;
R0=0;
COMM_8279=0D3H;
R0=0;
R0=0;
HSO_COMMAND=25H; /*HSO5=1*/
HSO_TIME=TIMER1+02H;
R0=0;
R0=0;
START_SIGN=0;
AIM_SPD=0;
DIRECT=0;
FAULT=1FH;
PWM_WIDTH=0;
E0=0;
E1=0;
EC=0;
DISP_STATUS=0;
SPD_STEP=100;
RUN_SPD=0;
CONV_SPD=0;
KK=0;
DO II=0 TO 7;
TM1=HSI_TIME;
R0=0;
R0=0;
END;
ENABLE;
MAINLOOP:
DO;
CALL BITCPL(.IOPORT2,5);
IF START_SIGN=0 THEN DO;
IF T_SPAN>100000 THEN DO;
PWM_WIDTH=2;
RUN_SPD=0;
END;
ELSE IF T1OVER>5 THEN DO;
PWM_WIDTH=2;
RUN_SPD=0;
END;
END;
IF BID=1 THEN DO;
IF RUN_SPD=0 THEN DO;
IF DIRECT=1 THEN DIRECT=0;
ELSE DIRECT=1;
BID=0;
AIM_SPD=DEFAULT_SPD;
CALL START;
END;
END;
CALL DISPLAY;
END;
GOTO MAINLOOP;
END MAINPROC;
END MAIN;
EOF;
/*modified by kaka*/
/***hso_pro,hso_int,logic***/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -