EADDRL REG 26H ;28C66的位址 EADDRH REG 27H ;28C66的位址 EDATA REG 28H ;28c66的傳送資料 DO REG P3.7 ;28C66 DO腳 DI REG P3.6 ;28C66 DI腳 SK REG P3.5 ;28C66 SK腳 CS REG P3.4 ;28C66 CS腳 MEN REG P3.2 REC1 REG 20H REC2 REG 21H POS REG 22H TMP REG 23H TEMP REG 24H ONLINE REG 25H.0 MOTS REG 29H AXNS REG 2AH AXNTIME REG 2BH DELTIM REG 2CH AXNSPD REG 2DH TEMP1 REG 2EH TEMP2 REG 2FH P2S REG 30H EADH REG 31H EADL REG 32H TI REG SCON.1 RI REG SCON.0 ;--------------------------------------- ORG 00H JMP MAIN ORG 23H JMP RECOP MAIN: MOV P0,#0 MOV P1,#0 MOV AXNSPD,#6 MOV AXNS,#50 MOV MOTS,#24 CLR ONLINE CALL INITUART CALL INITEEP ; MOV R0,#50H MOV R1,#30H ;MOT POS START ADD MOV R4,#24 LOOP: INC R0 INC R1 MOV @R0,#90 MOV @R1,#90 DJNZ R4,LOOP MOV IE,#10010000B MOV R3,#0 CALL READAXN ;----------------------------------- START: JB ONLINE,J0 CALL READAXN MOV R4,AXNTIME ; J0: MOV R1,#30H ;@30START MOV R0,#50H MOV R2,#24 ;R2,馬達數 INC R2 ;*****************************1 TO 8 MOV A,#00000001B LOP0: DJNZ R2,J2 JMP CHKTIM J2: INC R1 INC R0 MOV POS,@R0 PUSH A ;-----------R0-NOW POS R1-NEX POS---------------- CHKOUT1: CLR C MOV A,@R1 SUBB A,@R0 JNC IN1 ;減速度值 MOV A,AXNSPD XCH A,@R0 CLR C ;減完是否借位 SUBB A,@R0 JC EQQ1 MOV @R0,A CLR C ;是否減過頭 MOV A,@R1 SUBB A,@R0 JNC EQQ1 JMP EXT1 IN1: CJNE A,#0,DE1 JMP EXT1 DE1: MOV A,AXNSPD;加速度值 ADD A,@R0 MOV @R0,A CLR C ;是否加過頭 MOV A,@R1 SUBB A,@R0 JC EQQ1 JMP EXT1 EQQ1: MOV A,@R1 MOV @R0,A EXT1: MODOUT1: MOV TMOD,#21H MOV A,#9 MOV B,POS MUL AB CPL A MOV TL0,A MOV A,B INC A INC A CPL A MOV TH0,A POP A MOV P0,A SETB TR0 JNB TF0,$ MOV P0,#0 CLR TF0 CLR TR0 ; RL A CJNE A,#01H,LOP0 ;****************************9 TO 16 SETB MEN LOP1: DJNZ R2,J3 JMP CHKTIM J3: INC R1 INC R0 MOV POS,@R0 PUSH A ;-----------R0-NOW POS R1-NEX POS---------------- CHKOUT2: CLR C MOV A,@R1 SUBB A,@R0 JNC IN2 ;減速度值 MOV A,AXNSPD XCH A,@R0 CLR C ;減完是否借位 SUBB A,@R0 JC EQQ2 MOV @R0,A CLR C ;是否減過頭 MOV A,@R1 SUBB A,@R0 JNC EQQ2 JMP EXT2 IN2: CJNE A,#0,DE2 JMP EXT2 DE2: MOV A,AXNSPD;加速度值 ADD A,@R0 MOV @R0,A CLR C ;是否加過頭 MOV A,@R1 SUBB A,@R0 JC EQQ2 JMP EXT2 EQQ2: MOV A,@R1 MOV @R0,A EXT2: MODOUT2: MOV TMOD,#21H MOV A,#9 MOV B,POS MUL AB CPL A MOV TL0,A MOV A,B INC A INC A CPL A MOV TH0,A POP A MOV P1,A SETB TR0 JNB TF0,$ MOV P1,#0 CLR TF0 CLR TR0 ; RL A CJNE A,#01H,LOP1 ;****************************17 TO 24 CLR MEN LOP2: DJNZ R2,J4 JMP CHKTIM J4: INC R1 INC R0 MOV POS,@R0 PUSH A ;-----------R0-NOW POS R1-NEX POS---------------- CHKOUT3: CLR C MOV A,@R1 SUBB A,@R0 JNC IN3 ;減速度值 MOV A,AXNSPD XCH A,@R0 CLR C ;減完是否借位 SUBB A,@R0 JC EQQ3 MOV @R0,A CLR C ;是否減過頭 MOV A,@R1 SUBB A,@R0 JNC EQQ3 JMP EXT3 IN3: CJNE A,#0,DE3 JMP EXT3 DE3: MOV A,AXNSPD;加速度值 ADD A,@R0 MOV @R0,A CLR C ;是否加過頭 MOV A,@R1 SUBB A,@R0 JC EQQ3 JMP EXT3 EQQ3: MOV A,@R1 MOV @R0,A EXT3: MODOUT3: MOV TMOD,#21H MOV A,#9 MOV B,POS MUL AB CPL A MOV TL0,A MOV A,B INC A INC A CPL A MOV TH0,A POP A MOV P1,A SETB TR0 JNB TF0,$ MOV P1,#0 CLR TF0 CLR TR0 RL A CJNE A,#01H,LOP2 CHKTIM: DJNZ R4,JJ0 JMP START JJ0: JMP J0 ;--------------------------- READAXN: PUSH A CJNE R3,#0,RJ2 ;資料計數結束 MOV EADDRL,#255 MOV EADDRH,#1 CALL READBYTE MOV MOTS,EDATA ;讀取馬達數 ; MOV EADDRL,#0 MOV EADDRH,#0 CALL READBYTE CALL READBYTE MOV EADL,#0 MOV EADH,#0 MOV TEMP1,#0 MOV TEMP2,#0 MOV R3,EDATA MOV AXNS,R3 LOT: MOV A,EDATA ;A=動作數 MOV B,MOTS INC B INC B ;B=資料寬度 MUL AB ADD A,TEMP1 MOV TEMP1,A MOV A,B ADDC A,TEMP2 MOV TEMP2,A ; CALL READBYTE ;讀索引 MOV A,EDATA CJNE A,#FEH,RJ0 ;收到FE值 JMP RJ RJ0: MOV TEMP,EDATA ; CALL READBYTE ;讀動作數 MOV A,P2 CPL A CJNE A,TEMP,LOT ;索引等於P2 MOV R3,EDATA ;儲存索引對應動作數 MOV AXNS,R3 MOV EADL,TEMP1 ;儲存位址差 MOV EADH,TEMP2 JMP LOT RJ: MOV A,EADDRL ADD A,EADL MOV EADDRL,A MOV A,EADDRH ADDC A,EADH MOV EADDRH,A RJ2: CALL READBYTE ;讀速度 MOV AXNSPD,EDATA CALL READBYTE ;讀時間 MOV AXNTIME,EDATA MOV R1,MOTS ;讀馬達位置 MOV R0,#30H RLO: INC R0 CALL READBYTE MOV @R0,EDATA DJNZ R1,RLO DEC R3 ;資料計數-1 POP A RET ;-------------------------- RECOP: MOV IE,#00000000B PUSH A MOV TMP,R1 ; CALL UARTIN CJNE A,#FFH,OUT2 ;設定 CALL UARTIN CJNE A,#55,OUT0 ;下載 JNB ONLINE,OUTT CALL DOWNLOAD JMP OUTT OUT0: CJNE A,#35,OUT1 ;連線 MOV AXNSPD,#6 MOV AXNTIME,#10 MOV MOTS,#24 SETB ONLINE MOV A,#"O" CALL UARTOUT MOV A,#"N" CALL UARTOUT JMP OUTT OUT1: CJNE A,#42,OUT2 ;離線 JNB ONLINE,OUTT CLR ONLINE MOV R3,#0 CALL READAXN MOV A,#"O" CALL UARTOUT MOV A,#"F" CALL UARTOUT MOV A,#"F" CALL UARTOUT JMP OUTT OUT2: CJNE A,#30,OUT3 ;馬達數 JNB ONLINE,OUTT CALL UARTIN MOV MOTS,A JMP OUTT OUT3: CJNE A,#50,OUT4 ;速度 JNB ONLINE,OUTT CALL UARTIN MOV AXNSPD,A JMP OUTT OUT4: JNB ONLINE,OUTT ADD A,#30H MOV R1,A CALL UARTIN MOV @R1,A OUTT: MOV R1,TMP POP A MOV IE,#10010000B RETI ;------------DOWNLOAD DATA---------- DOWNLOAD: MOV EADDRL,#255 MOV EADDRH,#1 CALL UARTIN MOV EDATA,A CALL WRITEBYTE MOV EADDRL,#0 MOV EADDRH,#0 DLOOP: CALL UARTIN CJNE A,#FFH,OOP RET OOP: MOV EDATA,A CALL WRITEBYTE JMP DLOOP RET ;***************串列訊號相關*************** ;---------------初始化-------------------- INITUART: MOV SCON,#01010000B MOV TMOD,#00100001B MOV TH1,#253 SETB TR1 RET ;--------------A=INDATA------------------- UARTIN: JNB RI,$ MOV A,SBUF CLR RI RET ;--------------A=OUTDATA------------------- UARTOUT: MOV SBUF,A JNB TI,$ CLR TI RET ;***************EEPROM相關*************** ;--------------初始化-------------- INITEEP: CLR CS SETB SK CLR DI SETB DO CALL EWEN RET ;--------------產生SK脈波----------- CLOCK: CLR SK SETB SK RET ;---------檢查資料是否已寫入--------- CHK_EBUSY: CLR CS SETB CS BUSY: JNB DO,BUSY CLR CS RET ;--------------寫入位址-------------- WR_ADDR: MOV A,EADDRH RRC A MOV DI,C CALL CLOCK MOV A,EADDRL MOV B,#08 WRADDR: RLC A MOV DI,C CALL CLOCK DJNZ B,WRADDR CLR DI RET ;--------------寫入資料--------------- WR_EDATA: MOV B,#08 WREDATA: RLC A MOV DI,C CALL CLOCK DJNZ B,WREDATA CLR DI RET ;--------------接收資料--------------- A=接收的資料 RD_DATA: MOV B,#08 RDDATA: CALL CLOCK MOV C,DO RLC A DJNZ B,RDDATA RET ;--------------設定CS及DI=1------------ SET11: SETB CS SETB DI CALL CLOCK RET ;--------------設定讀取模式------------- SET_READ: MOV A,#80H MOV B,#02 SRD: RLC A MOV DI,C CALL CLOCK DJNZ B,SRD RET ;--------------設定寫入模式-------------- SET_WRITE: MOV A,#40H MOV B,#02 SWR: RLC A MOV DI,C CALL CLOCK DJNZ B,SWR RET ;--------------設定其他模式--------------- SET_ELSE: MOV A,#00H MOV B,#02H SETELSE: RLC A MOV DI,C CALL CLOCK DJNZ B,SETELSE RET ;--------讀取EADDR位址的資料存於EDATA------ READBYTE: PUSH B PUSH A ; CALL SET11 CALL SET_READ CALL WR_ADDR CALL RD_DATA MOV EDATA,A CLR CS ; INC EADDRL MOV A,EADDRL CJNE A,#0,RJAM INC EADDRH RJAM: ; POP A POP B RET ;------------將EDATA存於EADDR位址---------- WRITEBYTE: PUSH B PUSH A CALL SET11 CALL SET_WRITE CALL WR_ADDR MOV A,EDATA CALL WR_EDATA CALL CHK_EBUSY ; INC EADDRL MOV A,EADDRL CJNE A,#0,WJ INC EADDRH WJ: ; POP A POP B RET ;--------------讀寫致能---------------------- EWEN: PUSH B PUSH A PUSH EADDRL PUSH EADDRH CALL SET11 CALL SET_ELSE MOV EADDRL,#80H MOV EADDRH,#01H CALL WR_ADDR CLR CS POP EADDRH POP EADDRL POP A POP B RET ;----------------------------------------- END