⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pro1.asm

📁 51串口中断程序
💻 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 + -