📄 pro1.asm
字号:
; URAT_LEN EQU 0060H
; URAT_FUNCTION EQU 0061H
; URAT_WORK_V EQU 0062H
; URAT_IO_YINJIAO EQU 0063H
; URAT_LOGIC EQU 0064H
ORG 0000H
LJMP START
ORG 0023H
LJMP URATINT
ORG 0080H
;初始化52
START: MOV R1,#60H ;规定接收数据的存放首地址
MOV R3,#10H ;规定接收数据的长度
INTNEXT: MOV @R1,#00H;URAT接收数据区初始化
INC R1
DJNZ R3,INTNEXT
CLR P2.0
CLR P2.1
CLR P2.2
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7
; CLR P3.3;控制搭铁12V
SETB P3.5; 12V
CLR P3.4 ;关闭上位机L线输入通道
CLR P1.7 ;关闭上位机L线输出通道
CLR P1.6 ;关闭上位机k线输出通道
CLR p1.5 ;关闭12v电平
SETB P1.4 ;关闭5V电平
SETB P2.7 ;收通道负逻辑
CLR P2.6 ;发通道负逻辑
; CLR P4.1
MOV T2CON,#34H
MOV PCON,#00H;使SMOD=1
MOV SCON,#50H;选择URAT方式1
CLR TR2
MOV RCAP2H,#0FFH
MOV RCAP2L,#0F3H
MOV TH2,#0FFH
MOV TL2,#0F3H
SETB TR2
SETB EA ;开中断
SETB ES ;允许UART中断
;主程序
MAIN: MOV A,65H
CJNE A,#00H,NEXT1;比较UART有没有新的接收数据
LJMP MAIN
NEXT1: MOV R0,#68H; 备份URAT接收数据.
MOV R1,#60H
MOV A,@R1
MOV @R0,A
ANL A,#0FH
MOV R4,A
INC R0
INC R1
DATA0: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R4,DATA0
MOV 65H,#00H;清URAT接收数据标志位
MOV A,68H
CJNE A,#84H,ENDEXT5
LJMP ENDEXT4
ENDEXT5: LJMP NEXT2
ENDEXT4: MOV A,69H
CJNE A,#03H,ENDEXT3
LJMP ENDEXT2
ENDEXT3: LJMP NEXT3
ENDEXT2: MOV A,6AH;电平设置
CJNE A,#00H,NEXT8 ;SET 0V通道
SETB P1.4 ;关闭5V电平
;CLR P1.4
CLR P1.5 ;关闭12V电平
NEXT8: ANL A,#0FH
CJNE A,#01H,NEXT9 ;SET 5V通道
CLR P1.4 ;打开5V电平
;SETB P1.4
CLR P1.5 ;关闭12V电平
NEXT9: CJNE A,#02H,NEXT10 ;SET 12v通道
SETB P1.4 ;关闭5V电平
;CLR P1.4
SETB P1.5
NEXT10: CJNE A,#03H,NEXT11;三菱自动识别
NOP
LJMP SEND_COM;在功能码中已设置完成。
NEXT11: MOV A,6BH
ANL A,#0F0H
CJNE A,#20H,NEXT12 ;选择接收ECU数据通道3(IO3)
CLR P2.0
CLR P2.1
SETB P2.2
NEXT12: CJNE A,#40H,NEXT13 ;选择接收ECU数据通道7(IO0)
SETB P2.0
SETB P2.1
SETB P2.2
NEXT13: CJNE A,#80H,NEXT14 ;选择接收ECU数据通道8(IO0)
SETB P2.0
SETB P2.1
SETB P2.2
NEXT14: CJNE A,#60H,NEXT15 ;选择接收ECU数据通道9(IO2)
SETB P2.0
CLR P2.1
SETB P2.2
NEXT15: CJNE A,#0A0H,NEXT16 ;选择接收ECU数据通道11(IO4)
SETB P2.0
SETB P2.1
CLR P2.2
NEXT16: CJNE A,#0C0H,NEXT17 ;选择接收ECU数据通道12(IO7)
CLR P2.0
CLR P2.1
CLR P2.2
NEXT17: CJNE A,#0E0H,NEXT18 ;选择接收ECU数据通道13(IO5)
CLR P2.0
SETB P2.1
CLR P2.2
NEXT18: MOV A,6BH
ANL A,#0FH
SETB P1.6 ;选择IC16作为下发通道IC
CJNE A,#01H,NEXT19 ;选择下发ECU数据通道3(IO3)
CLR P2.3
CLR P2.4
SETB P2.5
NEXT19: CJNE A,#02H,NEXT20 ;选择下发ECU数据通道7(IO0)
SETB P2.3
SETB P2.4
SETB P2.5
NEXT20: CJNE A,#04H,NEXT21 ;选择下发ECU数据通道8(IO0)
SETB P2.3
SETB P2.4
SETB P2.5
NEXT21: CJNE A,#03H,NEXT22 ;选择下发ECU数据通道9(IO2)
SETB P2.3
CLR P2.4
SETB P2.5
NEXT22: CJNE A,#05H,NEXT23 ;选择下发ECU数据通道11(IO4)
SETB P2.3
SETB P2.4
CLR P2.5
NEXT23: CJNE A,#06H,NEXT24 ;选择下发ECU数据通道12(IO7)
CLR P2.3
CLR P2.4
CLR P2.5
NEXT24: CJNE A,#07H,NEXT25 ;选择下发ECU数据通道13(IO5)
CLR P2.3
SETB P2.4
CLR P2.5
NEXT25: MOV A,6CH
ANL A,#0FH
CJNE A,#00H,NEXT26 ;选择通道收发为负逻辑
SETB P2.7
CLR P2.6
NEXT26: CJNE A,#01H,NEXT27 ;选择通道收负逻辑,发为正逻辑
SETB P2.7
SETB P2.6
NEXT27: CJNE A,#02H,NEXT28 ;选择通道收为正逻辑,发为负逻辑
CLR P2.7
CLR P2.6
NEXT28: CJNE A,#03H,PENDEXT ;选择通道收发为正逻辑
CLR P2.7
SETB P2.6
PENDEXT: CJNE A,#05H,PENDEXT1
SETB P1.4
;CLR P1.4
CLR P1.5
PENDEXT1:CJNE A,#06H,ENDEXT
SETB P1.4
;CLR P1.4
CLR P1.5
ENDEXT: LJMP SEND_COM
NEXT3: CJNE A,#10H,NEXT4
NOP
LJMP SEND_COM;VPW
NEXT4: CJNE A,#11H,NEXT5
NOP
LJMP SEND_COM;PWN
NEXT5: CJNE A,#12H,NEXT6
NOP
LJMP SEND_COM;CNA
NEXT6: CJNE A,#0FFH,NEXT7
NOP ;三菱自动识别
LJMP SEND_COM
NEXT7: CJNE A,#0FEH,STEP1;奥迪L线打开和K线打开
;设置K线电平(12V)
SETB P1.4 ;关闭5V电平
SETB P1.5
;打开K线的下发ECU通道7
SETB P2.3
SETB P2.4
SETB P2.5
;打开K线的接收ECU通道7
SETB P2.0
SETB P2.1
SETB P2.2
;打开L线输出和输入通道
SETB P1.7
SETB P3.4
;K线正逻辑
CLR P2.7
SETB P2.6
STEP1: LJMP SEND_COM;KL线
NEXT2: CJNE A,#81H,STEP2
MOV A,69H
ANL A,#0FH
CJNE A,#01H,function1;控制L开关
;SETB P3.4
SETB P1.7 ;打开上位机L线输出通道
function1: CJNE A,#02H,function2;控制是否搭铁通道(IO1),低电平输出
;SETB P3.5;关闭5V电平
CLR P3.5;关闭12V电平
nop
function2: CJNE A,#04H,function3;控制开关CAN时钟
; SETB P4.1
NOP
function3: CJNE A,#08H,function4;关闭L线输入输出通道
CLR P3.4;关闭输出通道
CLR P1.7;关闭输入通道
function4: MOV A,69H
ANL A,#0F0H
CJNE A,#20H,function5;搭铁12v高电平输出
SETB P3.5
;CLR P3.3
function5: CJNE A,#40H,ENDSTEP1;搭铁12v高电平输出
SETB P3.5
;SETB P3.3
ENDSTEP1: CJNE A,#30H,ENDSTEP2
CLR P3.4;关闭输出通道
CLR P1.7;关闭输入通道
CLR P2.7
SETB P2.6
SETB P2.3
SETB P2.4
SETB P2.5
SETB P2.0
SETB P2.1
SETB P2.2
ENDSTEP2: CJNE A,#50H,STEP2
CLR P3.4;关闭输出通道
CLR P1.7;关闭输入通道
CLR P2.7
;SETB P2.6
SETB P2.0
SETB P2.1
SETB P2.2
STEP2: LJMP SEND_COM
SEND_COM: MOV A,60H
CLR TI
MOV SBUF,A
LJMP MAIN
URATINT: CLR EA ;关中断
PUSH ACC
PUSH PSW
CLR RS0
SETB RS1
JBC TI,SEND1
CLR RI ;清中断标志位
MOV R1,#60H
MOV A,SBUF
; CJNE A,#84H,URATNEXT1
; LJMP URATNEXT2
;URATNEXT1:CJNE A,#81H,EXT
URATNEXT2:MOV @R1,A
ANL A,#0FH
MOV R0,A;数据长度保存在R4中
INC R1
WAIT: JNB RI,WAIT
CLR RI
MOV A,SBUF
MOV @R1,A
INC R1
DJNZ R0,WAIT
MOV 65H,#0FFH;刷新数据完成标志
LJMP EXT
SEND1: MOV R1,#60H;发送程序开始
MOV A,@R1
INC R1
ANL A,#0FH
MOV R0,A
;WAIT_T: JBC TI,NEXT
; LJMP WAIT_T
NEXT: MOV A,@R1
MOV SBUF,A
INC R1
DJNZ R0,WAIT_T
LJMP WAIT_END
WAIT_T: JBC TI,NEXT
LJMP WAIT_T
WAIT_END:JBC TI,EXT
LJMP WAIT_END
EXT: POP PSW
POP ACC
SETB EA
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -