$MOD51 RESET EQU 0000H STACK EQU 60H COUNT EQU 25D ;馬達輸入pulse數量暫存器 SEL EQU P2.7 ;定義SEL腳位 OE EQU P2.6 ;定義OE腳位 ORG RESET MOV SP,#STACK MOV R3,#00H ;encoder舊值暫存器 MOV P0,#00H START: SETB SEL ;讀取encoder低byte CLR OE ;開始讀取低byte MOV R0,P0 ;抓取encoder的值放入R0 MOV A,R0 SUBB A,R3 ; {{ CJNE A,#00H,NEXT ; 判斷encoder的值是否有改變 MOV A,R3 ; 若無改變則跳回start JMP START ; }} NEXT: MOV R0,P0 ;抓取encoder的值放入R0 MOV A,R0 MOV R3,A ;將encoder的值放入舊值暫存器 SETB OE ;停止讀取低btye ;;;;;;;;;;;;;;;;;;;;;反轉1~2個pulse輸出副程式;;;;;;;;;;;;;;;;; CJNE A,#0FFH,NEXT1 ;判斷encoder是否只反轉移動一個pulse MOV R4,#01H MOV A,#01110111B SJMP LOOP1 ;跳至反轉輸出副程式 NEXT1: CJNE A,#0FEH,NEXT2 ;判斷encoder是否只反轉移動兩個pulse MOV R4,#02H MOV A,#01110111B SJMP LOOP1 ;跳至反轉輸出副程式 NEXT2: JB P0.7,REV ;判斷encoder是正轉或反轉(P0.7=1為反轉) ;;;;;;;;;;;;;;;;;;;;正轉1~2個PULSE輸出副程式;;;;;;;;;;;;;;; CJNE A,#01H,NEXT3 ;判斷encoder是否只正轉移動一個pulse MOV R4,#01H ;馬達輸出一個pulse MOV A,#01110111B SJMP LOOP ;跳至開始輸出副程式 NEXT3: CJNE A,#02H,NEXT4 ;判斷encoder是否只正轉移動兩個pulse MOV R4,#02H ;馬達輸出兩個pulse MOV A,#01110111B SJMP LOOP ;跳至開始輸出副程式 ;;;;;;;;;;;;;;;;;;;;;計算輸出pulse;;;;;;;;;;;;;;;;;;;;; NEXT4: MOV B,#2D ;encoder和馬達的解析度相差0.2倍 MUL AB JNB OV,LOOP3 ;判斷是否超過256~沒超過則跳至無溢位計算副程式 MOV R0,B ;差了B個256 MOV B,#10D DIV AB MOV R4,A ;得到溢位後的pulse MOV A,#00H LOOP2: ADD A,#25D INC A DJNZ R0,LOOP2 ;每多一個256~輸出就加25 ADD A,R4 ;計算馬達總輸出pulse MOV R4,A ;放入暫存器 MOV A,#01110111B JNB P2.5,LOOP1 ;判斷是否為反轉 SJMP LOOP ;跳至正轉副程式 ;;;;;;;;;;;;;;;;;;;;無溢位計算;;;;;;;;;;;;;;;;;;;;; LOOP3: MOV B,#10D DIV AB ;計算馬達輸出pulse MOV R4,A ;放入暫存器 MOV A,#01110111B JNB P2.5,LOOP1 ;判斷是否為反轉 ;;;;;;;;;;;;;;;;;;;;;;馬達正轉副程式;;;;;;;;;;;;;;;;;;;;; LOOP: RL A ;移動相位 MOV P1,A ;由p1輸出 CALL DELAY DJNZ R4,LOOP ;判斷是否輸出完pulse SJMP START ;重新讀值 ;;;;;;;;;;;;;;;;;encoder反轉輸出記數副程式;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REV: CLR P2.5 ;將p2.5設為0 CPL A ; {{計算與0的差值並去掉正負號 INC A ; }} SJMP NEXT4 ;回到計算輸出pulse副程式 ;;;;;;;;;;;;;;;;;;;;;;馬達反轉副程式;;;;;;;;;;;;;;;;;;;;;;; LOOP1: SETB P2.5 ;清除p2.5 RR A ;移動相位 MOV P1,A ;由p1輸出 ACALL DELAY DJNZ R4,LOOP1 ;判斷是否輸出完pulse LJMP START ;重新讀值 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY: MOV R0,#10D DEL: MOV R1,#2D DE: MOV R2,#120D DJNZ R2,$ DJNZ R1,DE DJNZ R0,DEL RET END