|
8051 受控端上的程式碼
DEMO EQU 20H
RESET EQU 21H
DEMOFNL EQU 22H
ORG 0
LJMP START
ORG 30H
;********************
;* 初始化一切設定值
;********************
START:
MOV P1,#20H ;傳送燈亮起,傳送出0
MOV R7,#50
CALL DELAY
MOV P0,#00H
MOV P1,#80H
MOV P2,#FFH
MOV R0,#1 ;起始指標位置為1 並用以紀錄最後停留的指標位置
MOV R1,#0 ;紀錄總相激磁的大小(也就是激磁Talbe 的大小)
MOV R2,#0 ;紀錄R1 所需再重複的次數(Table 重複次數)
MOV R3,#0 ;一般暫存用
CLR DEMO
CLR RESET
CLR DEMOFNL ;DEMO 最後一步的指示旗標
;****************************************
;* 主程式,接收指令並適當的做出回應與動作
;****************************************
OUTPUT:
MOV A,P2
ANL A,#0FH
JZ OUTPUT
CALL Motor
JB RESET,START
JMP OUTPUT
;************************************************
;* 依照指令跳至對應的副程式運作,必須使用CALL 呼叫
;************************************************
Motor:
$1: CJNE A,#1,$2
MOV DPTR,#Forward
66 of 74
MOV R1,#8
MOV R2,#80
JMP RUN
$2: CJNE A,#2,$3
MOV DPTR,#Backward
MOV R1,#8
MOV R2,#80
JMP RUN
$3: CJNE A,#3,$4
MOV DPTR,#Left
MOV R1,#8
MOV R2,#64
JMP RUN
$4: CJNE A,#4,$5
MOV DPTR,#Right
MOV R1,#8
MOV R2,#64
JMP RUN
$5: CJNE A,#5,$6 ;DEMO1
SETB DEMO
MOV A,#1
CALL $1
JB RESET,$INT
MOV A,#3
CALL $3
JB RESET,$INT
MOV A,#1
CALL $1
JB RESET,$INT
MOV A,#3
CALL $3
JB RESET,$INT
MOV A,#1
CALL $1
JB RESET,$INT
MOV A,#3
CALL $3
JB RESET,$INT
MOV A,#1
CALL $1
JB RESET,$INT
67 of 74
MOV A,#3
CALL $3
JB RESET,$INT
MOV A,#1
CALL $1
JB RESET,$INT
MOV A,#4
CALL $4
JB RESET,$INT
MOV A,#1
CALL $1
JB RESET,$INT
MOV A,#4
CALL $4
JB RESET,$INT
MOV A,#1
CALL $1
JB RESET,$INT
MOV A,#4
CALL $4
JB RESET,$INT
MOV A,#1
CALL $1
JB RESET,$INT
SETB DEMOFNL
MOV A,#4
CALL $4
$INT:
CLR DEMO
CLR DEMOFNL
RET
$6: CJNE A,#6,$7 ;若Pause/Continue 在這時被按下將不做任何處理
JMP $F
$7: CJNE A,#7,$8 ;若RESET 被按下
SETB RESET
JMP $F
$8: CJNE A,#8,$9 ;逆時針旋轉180 度
MOV DPTR,#Left
MOV R1,#8
MOV R2,#128
JMP RUN
68 of 74
$9: CJNE A,#9,$A ;順時針旋轉180 度
MOV DPTR,#Right
MOV R1,#8
MOVR2,#128
JMP RUN
$A: CJNE A,#AH,$B ;未定義
$B: CJNE A,#BH,$C ;未定義
$C: CJNE A,#CH,$D ;未定義
$D: CJNE A,#DH,$E ;未定義
$E: CJNE A,#EH,$F ;未定義
$F: CALL TOUT ;若指令未定義則不做任何動作
CALL OVER
RET
;**********************************************
;* 步進馬達驅動,R0 決定指標值在相激磁表中的位置
;* R1 決定總驅動的相激磁數目,R2 決定R1 重複的次數
;* 行程中會檢查暫停/繼續或停止有無被按下,行程
;* 從Motor 跳過來因此最後會以RET 結束
;**********************************************
RUN:
MOV R3,A
CALL TOUT
LOOP:
MOV A,R1
SUBB A,R0
JNZ MotorStep
MOV R0,#1
MotorStep:
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,P2
ANL A,#0FH
JZ MotorNext
CJNE A,#6,$1 ;若Pause/Continue 被按下
CALL TOUT
CALL OVER
CALL PCCHK
JB RESET,$0
CALL TOUT
JMP MotorNext
69 of 74
$1: CJNE A,#7,MotorNext
SETB RESET
CALL TOUT
CALL OVER
$0: RET
MotorNext:
CALL DELAYINI
INC R0
DJNZ R2,LOOP
JNB DEMO,$1 ;若正在演示中就判斷是否要傳送結束位元
JNB DEMOFNL,$2 ;DEMOFNL 被設定表示已達最後一步要傳送結束位元
$1: CALL OVER
$2: RET
;**************************************************
;* 負責暫停/繼續的工作,當暫停時行程會被限制在此,
;* 並等待再次暫停指令到來才繼續,必須用CALL 呼叫
;**************************************************
PCCHK: ;Pause/Continue 的檢查機制
$waitp:
MOV A,P2
ANL A,#0FH
CJNE A,#7,$wait0
SETB RESET
CALL TOUT
CALL OVER
RET
$wait0:
CJNE A,#6,$waitp ;等待控制端送出Continue 的指令(再次Pause)
CALL TOUT
CALL OVER
MOV A,R3
RET
;*****************************************
;* 負責回傳結束位元使控制端能繼續下一指令
;* 必須用CALL 呼叫
;*****************************************
OVER:
MOV P1,#2FH
CALL TDELAY
MOV P1,#20H
CALL TDELAY
MOV P1,#80H
70 of 74
RET
;*****************************************
;* 傳送A 中的資料給控制端,必須使用CALL 呼叫
;*****************************************
TOUT:
ADD A,#20H ;使傳送燈亮起的位元
JNB DEMO,$1
ADD A,#10H
$1: MOV P1,A
SUBB A,#20H ;將A 中的值恢復原狀
JNB DEMO,$2
SUBB A,#10H
$2: CALL TDELAY
MOV P1,#20H
CALL TDELAY
JNB DEMO,$3
MOV P1,#90H ;停止傳送,避免影響接收模組,DEMO 指示燈亮
RET
$3: MOV P1,#80H ;停止傳送,避免影響接收模組
RET
;**********************************************
;* 傳送專用延遲,使本地端有足夠時間送出回傳值
;* 給控制端,必須使用CALL 呼叫
;**********************************************
TDELAY:
MOV R7,#15
JMP DELAY
;************************************************
; 步進馬達專用延遲,必須使用CALL 呼叫
;************************************************
DELAYINI:
MOV R7,#4
DELAY:
MOV R6,#10
D1: MOV R5,#249
D2: DJNZ R5,D2
DJNZ R6,D1
DJNZ R7,DELAY
RET
;************************************************
;* Motor Table
;************************************************
71 of 74
Forward DB 45H,61H,29H,A8H,8AH,92H,16H,54H
Backward DB 54H,16H,92H,8AH,A8H,29H,61H,45H
Left DB 55H,11H,99H,88H,AAH,22H,66H,44H
Right DB 44H,66H,22H,AAH,88H,99H,11H,55H
END |
|