本帖最后由 tyw 于 2012-5-30 14:46 编辑
wang-pro-1.rar 就是下面东东
ORG 0000H
MOV SP,#05FH
LJMP MAIN0
CTRL_REG1 EQU 20H
CTRL_REG2 EQU 21H
CTRL_REG3 EQU 22H
STATUS_REG EQU 27H
OUTX EQU 29H
OUTY EQU 2BH
OUTZ EQU 2DH
FF_WU_CFG_1 EQU 30H
FF_WU_SRC_1 EQU 31H
FF_WU_THS_1 EQU 32H
FF_WU_DURATION_1 EQU 33H
SADW EQU 3AH
SADR EQU 3BH
SDA EQU P1.3
SCL EQU P1.2
ORG 0030H
MAIN0: MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH ;T1计数器时间值 9600HZ
SETB TR1
MOV SCON,#40H ;工作于方式2
MOV PCON,#00000000B ;波特率不加倍
CLR EA ;关中断
MAIN1: LCALL STA ;写CTRL_REG1控制字
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,MAIN1
WREG1: MOV A,#CTRL_REG1
LCALL WRB
LCALL CACK
JB F0,WREG1
WDAT1: MOV A,#11000111B ;c7H
LCALL WRB
LCALL CACK
JB F0,WDAT1
LCALL STOP
MAIN2: LCALL STA ;写CTRL_REG2控制字
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,MAIN2
WREG2: MOV A,#CTRL_REG2
LCALL WRB
LCALL CACK
JB F0,WREG2
WDAT2: MOV A,#10000000B ;80H
LCALL WRB
LCALL CACK
JB F0,WDAT2
LCALL STOP
/*
MAIN3: LCALL STA ;写CTRL_REG3控制字
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,MAIN3
WREG3: MOV A,#CTRL_REG3
LCALL WRB
LCALL CACK
JB F0,WREG3
WDAT3: MOV A,#11011100B ;DCH
LCALL WRB
LCALL CACK
JB F0,WDAT3
LCALL STOP
MAIN4: LCALL STA ;写FF_WU_CFG_1控制字
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,MAIN4
WREG4: MOV A,#FF_WU_CFG_1
LCALL WRB
LCALL CACK
JB F0,WREG4
WDAT4: MOV A,#01111111B
LCALL WRB
LCALL CACK
JB F0,WDAT4
LCALL STOP
MAIN5: LCALL STA ;写FF_WU_THS_1控制字
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,MAIN5
WREG5: MOV A,#FF_WU_THS_1
LCALL WRB
LCALL CACK
JB F0,WREG5
WDAT5: MOV A,#00000011B ;具体数据待定???
LCALL WRB
LCALL CACK
JB F0,WDAT5
LCALL STOP
*/
;]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
;MOV A,#55H
RSTATU:
; MOV SBUF,A ;将上个循环的z轴数据传给电脑
; JNB TI,$ ;z轴数据是否传完,传完传x轴给电脑
; CLR TI
MOV A,#55H
MOV SBUF,A
RSTAA: LCALL STA ;读STATUS_REG的状态
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,RSTAA
WSUB1: MOV A,#STATUS_REG
LCALL WRB
LCALL CACK
JB F0,WSUB1
RSAT: LCALL STA
MOV A,#SADR
LCALL WRB
LCALL CACK
JB F0,RSAT
LCALL RDB
LCALL MNACK
LCALL STOP
MOV A,R6
ANL A,#00001111B ;???
;检验STATUS_REG状态是否符合要求
CJNE A,#00001111B,RSTAA
/*
RSRC1: LCALL STA ;读FF_WU_SRC_1的状态
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,RSRC1
WSUB2: MOV A,#FF_WU_SRC_1
LCALL WRB
LCALL CACK
JB F0,WSUB2
RSAT2: LCALL STA
MOV A,#SADR
LCALL WRB
LCALL CACK
JB F0,RSAT2
LCALL RDB
LCALL MNACK
LCALL STOP
;检验FF_WU_SRC_1的状态是否符合要求
CJNE R6,#00000000B,RSRC1
*/
REDX: LCALL STA ;读OUTX的状态
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,REDX
WSUB3: MOV A,#OUTX
LCALL WRB
LCALL CACK
JB F0,WSUB3
RSAT3: LCALL STA
MOV A,#SADR
LCALL WRB
LCALL CACK
JB F0,RSAT3
LCALL RDB
LCALL MNACK
LCALL STOP
JNB TI,$ ;开始信号是否传完,传完传x轴给电脑
CLR TI
; MOV A,#01H
MOV SBUF,A
REDY: LCALL STA ;读OUTY的状态
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,REDY
WSUB4: MOV A,#OUTY
LCALL WRB
LCALL CACK
JB F0,WSUB4
RSAT4: LCALL STA
MOV A,#SADR
LCALL WRB
LCALL CACK
JB F0,RSAT4
LCALL RDB
LCALL MNACK
LCALL STOP
JNB TI,$ ;x轴数据是否传完,传完传y轴数据给电脑
CLR TI
; MOV A,#02H
MOV SBUF,A
REDZ: LCALL STA ;读OUTZ的状态
MOV A,#SADW
LCALL WRB
LCALL CACK
JB F0,REDZ
WSUB5: MOV A,#OUTZ
LCALL WRB
LCALL CACK
JB F0,WSUB5
RSAT5: LCALL STA
MOV A,#SADR
LCALL WRB
LCALL CACK
JB F0,RSAT5
LCALL RDB
LCALL MNACK
LCALL STOP
JNB TI,$ ;y轴数据是否传完,传完传z轴
CLR TI
MOV SBUF,A
JNB TI,$ ;z轴数据是否传完
CLR TI
; MOV A,#03H
LJMP RSTATU
;]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
STA: SETB SDA ;产生起始信号
SETB SCL
NOP
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
STOP: CLR SDA ;产生停止信号
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
NOP
CLR SCL
RET
MACK: CLR SDA ;发送应答位ACK
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
MNACK: SETB SDA ;发送非应答位
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
RET
CACK: SETB SDA ;应答位检查子程序
SETB SCL
NOP
MOV C,SDA
MOV F0,C
CLR SCL
NOP
RET
WRB: MOV R7,#8 ;字节数据发送子程序
WLP: RLC A
JC WR1
CLR SDA
SETB SCL
NOP
NOP
CLR SCL
DJNZ R7,WLP
RET
WR1: SETB SDA
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
DJNZ R7,WLP
RET
RDB: MOV R7,#8 ;字节数据接收子程序
RLP: SETB SDA
SETB SCL
MOV C,SDA
MOV A,R6
RLC A
MOV R6,A
CLR SCL
DJNZ R7,RLP
RET
END |