又人问我关于编码器正反转计数的问题,在此发表我自己写的关于编码器正反转计数程序,
此程序主要是判断正反转和计数值。(转载请注明原帖)
程序为51汇编,中断接收A相,得到计数值,并判断正/反转。
;进入中断(A相低电平),端口(B相)如果是高电平,正转(脉冲加1);否则 反转(脉冲减1)
;注释:【硬件有光耦隔离,电平信号要取反(A相和B相),结果不变】
;B相两次判断,如果相同则脉冲有效加减,否则认为是干扰回复原脉冲值。
;B相两次判断时间为脉冲加减处理时间[加46T;减100T]
;中断处理运行时间:脉冲正 88T;脉冲负142T
;------------------------------------------------------------------------------------
XINT0:
CLR EA
PUSH ACC
PUSH B
PUSH PSW
PUSH SUMM_MINU_CELL_L
PUSH SUMM_MINU_CELL_L-1
PUSH SUMM_MINU_CELL_L-2
PUSH PULSE_XINT0_BUF-2
PUSH PULSE_XINT0_BUF-1
PUSH PULSE_XINT0_BUF
SETB RS0
SETB XINT0_MARK
JB HEIGHT0_B,XINT0_C
LJMP XINT0_R
;------------------------------------------------------------------------------------
;正转
XINT0_C:
SETB C_R_MARK0
MOV A,PULSE_XINT0_BUF-2
JB ACC.7,XINT0_C_0
ULSE0_XINT0_BUF 值为正;PULSE0_XINT0_BUF 加 1
MOV SUMM_MINU_CELL_L,#01H
MOV SUMM_MINU_CELL_L-1,#00H
MOV SUMM_MINU_CELL_L-2,#00H
MOV R0,#SUMM_MINU_CELL_L
MOV R1,#PULSE_XINT0_BUF
MOV R2,#03H
LCALL MBCDADD ;加法,结果在R1中
LJMP XINT0_END_F
ULSE0_XINT0_BUF 值为负
XINT0_C_0:
MOV A,PULSE_XINT0_BUF-2
CLR ACC.7
MOV PULSE_XINT0_BUF-2,A
JNZ XINT0_C_1
MOV A,PULSE_XINT0_BUF-1
JNZ XINT0_C_1
MOV A,PULSE_XINT0_BUF
JNZ XINT0_C_1
LJMP XINT0_C_2
ULSE0_XINT0_BUF 值为负,且不等于0;PULSE0_XINT0_BUF 减 1;结果负
XINT0_C_1:
MOV SUMM_MINU_CELL_L,#01H
MOV SUMM_MINU_CELL_L-1,#00H
MOV SUMM_MINU_CELL_L-2,#00H
MOV R0,#PULSE_XINT0_BUF
MOV R1,#SUMM_MINU_CELL_L
MOV R2,#03H
LCALL MBCDSUB ;减法
MOV PULSE_XINT0_BUF,SUMM_MINU_CELL_L
MOV PULSE_XINT0_BUF-1,SUMM_MINU_CELL_L-1
MOV A,SUMM_MINU_CELL_L-2
SETB ACC.7
MOV PULSE_XINT0_BUF-2,A
LJMP XINT0_END_F
ULSE0_XINT0_BUF 值为负,且等于0;PULSE0_XINT0_BUF 加 1;结果正
XINT0_C_2:
MOV PULSE_XINT0_BUF,#01H
MOV PULSE_XINT0_BUF-1,#00H
MOV PULSE_XINT0_BUF-2,#00H
LJMP XINT0_END_F
;------------------------------------------------------------------------------------
;反转
XINT0_R:
CLR C_R_MARK0 ;反转
MOV A,PULSE_XINT0_BUF-2
JNB ACC.7,XINT0_R_0
ULSE0_XINT0_BUF 值为负;PULSE0_XINT0_BUF 加 1;结果 负
MOV SUMM_MINU_CELL_L,#01H
MOV SUMM_MINU_CELL_L-1,#00H
MOV SUMM_MINU_CELL_L-2,#00H
MOV R0,#SUMM_MINU_CELL_L
MOV R1,#PULSE_XINT0_BUF
MOV R2,#03H
LCALL MBCDADD ;结果在R1中
MOV A,PULSE_XINT0_BUF-2
SETB ACC.7
MOV PULSE_XINT0_BUF-2,A
LJMP XINT0_END_R
ULSE0_XINT0_BUF 值为正
XINT0_R_0:
MOV A,PULSE_XINT0_BUF-2
JNZ XINT0_R_1
MOV A,PULSE_XINT0_BUF-1
JNZ XINT0_R_1
MOV A,PULSE_XINT0_BUF
JNZ XINT0_R_1
LJMP XINT0_R_2
ULSE0_XINT0_BUF 值为正,且不等于0;PULSE0_XINT0_BUF 减 1;结果正
XINT0_R_1:
MOV SUMM_MINU_CELL_L,#01H
MOV SUMM_MINU_CELL_L-1,#00H
MOV SUMM_MINU_CELL_L-2,#00H
MOV R0,#PULSE_XINT0_BUF
MOV R1,#SUMM_MINU_CELL_L
MOV R2,#03H
LCALL MBCDSUB ;减法
MOV PULSE_XINT0_BUF,SUMM_MINU_CELL_L
MOV PULSE_XINT0_BUF-1,SUMM_MINU_CELL_L-1
MOV PULSE_XINT0_BUF-2,SUMM_MINU_CELL_L-2
LJMP XINT0_END_R
ULSE0_XINT0_BUF 值为正,且等于0;PULSE0_XINT0_BUF 减 1;结果负
XINT0_R_2:
MOV PULSE_XINT0_BUF,#01H
MOV PULSE_XINT0_BUF-1,#00H
MOV PULSE_XINT0_BUF-2,#80H
LJMP XINT0_END_R
;------------------------------------------------------------------------------------
;判断是否真是 正转?
XINT0_END_F:
JB HEIGHT0_B,XINT0_END
AJMP XINT0_END_ERR
;判断是否真是 反转?
XINT0_END_R:
JNB HEIGHT0_B,XINT0_END
AJMP XINT0_END_ERR
XINT0_END:
POP ACC
POP ACC
POP ACC
POP SUMM_MINU_CELL_L-2
POP SUMM_MINU_CELL_L-1
POP SUMM_MINU_CELL_L
POP PSW
POP B
POP ACC
SETB EA
RETI
XINT0_END_ERR:
POP PULSE_XINT0_BUF
POP PULSE_XINT0_BUF-1
POP PULSE_XINT0_BUF-2
POP SUMM_MINU_CELL_L-2
POP SUMM_MINU_CELL_L-1
POP SUMM_MINU_CELL_L
POP PSW
POP B
POP ACC
SETB EA
RETI
|