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

📄 jrdmdytx.asm

📁 用增强型单片机51RD2做的控制器
💻 ASM
📖 第 1 页 / 共 3 页
字号:





;
;   ******* 发送16个字节到速度模块 *******
;
SendToSpdCpu:   CLR     EA
                CLR     A
                MOV     B,#DataHead             ; 发送数据贞头
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteA
                MOV     B,#DataHead             ; 发送数据贞头
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteA

                MOV     B,CallAddr              ; 发送被呼的主机地址
                MOV     TxdBuf,B                ;
                ADD     A,B
                LCALL   SendByteA

                MOV     B,#SelfAddr             ; 发送本机地址
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteA
                MOV     B,FuncCode              ; 发送状态码
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteA
                MOV     R0,#SendBuf
                MOV     R1,#10                  ; 发送10个字节
SendToSpdCpu1:  movx    a,@R0
                mov     b,a
               ; MOVx     B,@R0
                INC     R0
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteA
                DJNZ    R1,SendToSpdCpu1
                MOV     TxdBuf,A
                LCALL   SendByteA               ; 发送累加和
                SETB    EA
                RET
;
;   ******* 发送一个字节到速度模块 *******
;
SendByteA:      PUSH    ACC
                MOV     A,TxdBuf
                MOV     BitCntA,#8
                CLR     TxdPortA
                SETB    TxdFlagA
SendByteA1:     CALL    BaudDelayA1
                RRC     A
                MOV     TxdPortA,C
                DJNZ    BitCntA,SendByteA1
                CALL    BaudDelayA1
                SETB    TxdPortA
                CALL    BaudDelayA1
                CLR     TxdFlagA
                LCALL   DL1MS
                POP     ACC
                RET

;
;   ******* 发送八个字节到键盘模块 *******
;
SendDatToSubB:  CLR     EA
                CLR     A
                MOV     B,#DataHead             ; 发送数据贞头
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteB
                MOV     B,#DataHead             ; 发送数据贞头
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteB

                MOV     B,CallAddr              ; 发送被呼的主机地址
                MOV     TxdBuf,B                ;
                ADD     A,B
                LCALL   SendByteB

                MOV     B,#SelfAddr             ; 发送本机地址
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteB
                MOV     B,FuncCode              ; 发送状态码
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteB
                MOV     R0,#SendBuf
                MOV     R1,#2                   ; 发送两个字节
SendDatToSubB1: movx    a,@R0
                mov     b,a
                ;MOVx     B,@R0
                INC     R0
                MOV     TxdBuf,B
                ADD     A,B
                LCALL   SendByteB
                DJNZ    R1,SendDatToSubB1
                MOV     TxdBuf,A
                LCALL   SendByteB               ; 发送累加和
                SETB    EA
                RET
;
;    *******发送一个字节到键盘模块 *******
;
SendByteB:      PUSH    ACC
                MOV     A,TxdBuf
                MOV     BitCntB,#8
                CLR     TxdPortB
                SETB    TxdFlagB
SendByteB1:     CALL    BaudDelayB1
                RRC     A
                MOV     TxdPortB,C
                DJNZ    BitCntB,SendByteB1
                CALL    BaudDelayB1
                SETB    TxdPortB
                CALL    BaudDelayB1
                CLR     TxdFlagB
                POP     ACC
                RET
;
; 资源使用:PAGE=2 R0 , R2 , R6 , R7 , ACC , B
;
;   ******* 中断接收16个调速模块数据 *******
;
Int0RecvCom:    CLR     EX0
                PUSH    ACC
                PUSH    B
                PUSH    PSW
                CLR     PSW.3                    ; RX : PAGE 2
                SETB    PSW.4
                CLR     RxdErrA
                LCALL   BaudDelayA2
                JB      RxdPortA,Int0RecvCom8   ; 判断是否起始位
                JB      RxdPortA,Int0RecvCom8   ; 判断是否起始位
                MOV     DPTR,#Int0Buf
                MOV     B,#16                   ; 一次接收16个字节
                MOV     R6,#250
Int0RecvCom1:   MOV     R7,#250
                MOV     BitCntA,#08
Int0RecvCom2:   LCALL   BaudDelayA1
                MOV     C,RxdPortA
                RRC     A
                DJNZ    BitCntA,Int0RecvCom2
                MOVX    @DPTR,A
                INC     DPTR
                LCALL   BaudDelayA1
                JNB     RxdPortA,Int0RecvCom8   ; 判断是否停止位(高电平)
                JNB     RxdPortA,Int0RecvCom8   ; 判断是否停止位(高电平)
                MOV     BitCntA,#250
Int0RecvCom3:   JB      RxdPortA,Int0RecvCom4   ; 判断是否下一起始位
                JB      RxdPortA,Int0RecvCom4   ; 判断是否下一起始位
                SJMP    Int0RecvCom5
Int0RecvCom4:   DJNZ    BitCntA,Int0RecvCom3
                NOP
Int0RecvCom5:   LCALL   BaudDelayA2
                DJNZ    B,Int0RecvCom7
                LCALL   BaudDelayA1
                JNB     RxdPortA,Int0RecvCom8   ; 判断是否结束位
                JNB     RxdPortA,Int0RecvCom8   ; 判断是否结束位

                MOV     DPTR,#Int0Buf             ; 判断校验和是否正确
                MOV     R2,#14
                CLR     A
                MOVX    A,@DPTR
                MOV     R3,A       ; 1
                INC     DPTR
              
Int0RecvCom6:   MOVX    A,@DPTR
                ADD     A,R3
                MOV     R3,A       ;1+2
                INC     DPTR
                                              
                DJNZ    R2,Int0RecvCom6
                MOVx    A,@DPTR
                XRL     A,R3
                JNZ     Int0RecvCom8

                LCALL   RecvSpdCpuDat           ; 接收调速模块数据

                POP     PSW
                POP     B
                POP     ACC
                SETB    EX0
                RETI
Int0RecvCom7:   DJNZ    R7,Int0RecvCom1
                DJNZ    R6,Int0RecvCom1
Int0RecvCom8:   SETB    RxdErrA
                POP     PSW
                POP     B
                POP     ACC
                SETB    EX0
                RETI
;
; 资源使用:PAGE=2 R1 , R3 , R4 , R5 , ACC , B
;
;   ******* 中断接收八个键盘模块数据 *******
;
Int1RecvCom:    CLR     EX1
                PUSH    ACC
                PUSH    B
                PUSH    PSW
                CLR     PSW.3                   ; RX : PAGE 2
                SETB    PSW.4
                CLR     RxdErrB
                LCALL   BaudDelayB2
                JB      RxdPortB,Int1RecvCom8   ; 判断是否起始位
                JB      RxdPortB,Int1RecvCom8   ; 判断是否起始位
                MOV     R1,#Int1Buf
                MOV     B,#08                   ; 一次接收08个字节
                MOV     R4,#250
Int1RecvCom1:   MOV     R5,#250
                MOV     BitCntB,#08
Int1RecvCom2:   LCALL   BaudDelayB1
                MOV     C,RxdPortB
                RRC     A
                DJNZ    BitCntB,Int1RecvCom2
                MOV     @R1,A
                INC     R1
                LCALL   BaudDelayB1
                JNB     RxdPortB,Int1RecvCom8   ; 判断是否停止位(高电平)
                JNB     RxdPortB,Int1RecvCom8   ; 判断是否停止位(高电平)
                MOV     BitCntB,#250
Int1RecvCom3:   JB      RxdPortB,Int1RecvCom4   ; 判断是否下一起始位
                JB      RxdPortB,Int1RecvCom4   ; 判断是否下一起始位
                SJMP    Int1RecvCom5
Int1RecvCom4:   DJNZ    BitCntB,Int1RecvCom3
                NOP
Int1RecvCom5:   LCALL   BaudDelayB2
                DJNZ    B,Int1RecvCom7
                LCALL   BaudDelayB1
                JNB     RxdPortB,Int1RecvCom8   ; 判断是否结束位
                JNB     RxdPortB,Int1RecvCom8   ; 判断是否结束位

                MOV     R1,#Int1Buf
                MOV     R2,#7
                CLR     A
Int1RecvCom6:   ADD     A,@R1
                INC     R1
                DJNZ    R2,Int1RecvCom6
                MOV     B,@R1
                XRL     A,B
;                JNZ     Int1RecvCom8

                MOV     R1,#Int1Buf+5
                MOV     A,@R1
                MOV     KeyNumber,A
                SETB    CommandBF

                POP     PSW
                POP     B
                POP     ACC
                SETB    EX1
                RETI
Int1RecvCom7:   DJNZ    R5,Int1RecvCom1
                DJNZ    R4,Int1RecvCom1
Int1RecvCom8:   SETB    RxdErrB
                POP     PSW
                POP     B
                POP     ACC
                SETB    EX1
                RETI

;
;       ******* 波特率产生子程序 *******
;
BaudDelayA1:    MOV     R2,#BaudVal
BaudDelA1:      DJNZ    R2,BaudDelA1
                RET
BaudDelayA2:    MOV     R2,#StrtVal
BaudDelA2:      DJNZ    R2,BaudDelA2
                RET

;
;       ******* 波特率产生子程序 *******
;
BaudDelayB1:    MOV     R3,#BaudVal
BaudDelB1:      DJNZ    R3,BaudDelB1
                RET
BaudDelayB2:    MOV     R3,#StrtVal
BaudDelB2:      DJNZ    R3,BaudDelB2
                RET

;
;       ******  接收调速模块数据  ******
;
RecvSpdCpuDat:  MOV     DPTR,#Int0Buf                     ; 通信接收缓冲区(16Byte)
                MOVX    A,@DPTR
                CLR     C
                SUBB    A,#0AAH                         ; 判断贞头
                JZ      RecvSpdCpuDat2
                RET
RecvSpdCpuDat2: INC     DPTR
                MOVX    A,@DPTR
                CLR     C
                SUBB    A,#0AAH                         ; 判断贞头
                JZ      RecvSpdCpuDat3
                RET
RecvSpdCpuDat3: INC     DPTR
                MOVX    A,@DPTR
                CLR     C
                SUBB    A,#00H                          ; 被呼叫机(主机)地址
                JZ      RecvSpdCpuDat4
                RET
RecvSpdCpuDat4: INC     DPTR
                MOVX    A,@DPTR
                MOV     HjjAddr,A                       ; 呼叫机的地址
                INC     DPTR
                MOVX    A,@DPTR                          ; 取功能码
                INC     DPTR
                CJNE    A,#RecvCpu2Func01,RecvSpdCpuDat5
                LCALL   JsKglZt                         ; 接收开关量状态
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat5: CJNE    A,#RecvCpu2Func02,RecvSpdCpuDat6
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat6: CJNE    A,#RecvCpu2Func03,RecvSpdCpuDat7
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat7: CJNE    A,#RecvCpu2Func04,RecvSpdCpuDat8
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat8: CJNE    A,#RecvCpu2Func05,RecvSpdCpuDat9
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat9: CJNE    A,#RecvCpu2Func06,RecvSpdCpuDat10
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat10:CJNE    A,#RecvCpu2Func07,RecvSpdCpuDat11
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat11:CJNE    A,#RecvCpu2Func08,RecvSpdCpuDat12
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat12:CJNE    A,#RecvCpu2Func09,RecvSpdCpuDat13
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat13:CJNE    A,#RecvCpu2Func10,RecvSpdCpuDat14
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat14:CJNE    A,#RecvCpu2Func11,RecvSpdCpuDat15
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat15:CJNE    A,#RecvCpu2Func12,RecvSpdCpuDat16
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat16:CJNE    A,#RecvCpu2Func13,RecvSpdCpuDat17
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat17:CJNE    A,#RecvCpu2Func14,RecvSpdCpuDat18
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat18:CJNE    A,#RecvCpu2Func15,RecvSpdCpuDat19
                LJMP    RecvSpdCpuEnd
RecvSpdCpuDat19:CJNE    A,#RecvCpu2Func16,RecvSpdCpuEnd
                LJMP    RecvSpdCpuEnd
RecvSpdCpuEnd:  RET

;
;       ******* 接收开关量状态 *******
;
JsKglZt:        MOV     A,@R0
                MOV     KglStatus,A
                RET
;
; 资源使用:PAGE=3  R1 , R2 , R6 , R7 , ACC , B
;
;       ******  接收远程CPU指令 ******
;
RecvFarCpuDat:  CLR     RI
                PUSH    PSW
                PUSH    ACC
                PUSH    B
                SETB    PSW.3                   ; RX : PAGE 3
                SETB    PSW.4
                MOV     A,SBUF
                XRL     A,#DataHead
                JZ      RecvFarCpuDat1
                MOV     A,SBUF
                POP     B
                POP     ACC
                POP     PSW
                RETI
RecvFarCpuDat1: MOV     R6,#200
RecvFarCpuDat2: MOV     R7,#200
RecvFarCpuDat3: JNB     RI,RecvFarCpuDat4
                CLR     RI
                MOV     A,SBUF
                XRL     A,#DataHead
                JZ      RecvFarCpuDat5
                MOV     A,SBUF
                POP     B
                POP     ACC
                POP     PSW
                RETI
RecvFarCpuDat4: DJNZ    R7,RecvFarCpuDat3
                DJNZ    R6,RecvFarCpuDat2
                MOV     A,SBUF
                POP     B
                POP     ACC
                POP     PSW
                RETI
RecvFarCpuDat5: MOV     R6,#200
RecvFarCpuDat6: MOV     R7,#200
RecvFarCpuDat7: JNB     RI,RecvFarCpuDat8
                CLR     RI
                MOV     A,SBUF
                MOV     B,A
                XRL     A,#CurrentAdr           ; 广播地址
                JZ      RecvFarCpuDat9
                MOV     A,B
                MOV     B,#SelfAddr             ; 本机地址
                CLR     C
                SUBB    A,B
                JZ      RecvFarCpuDat9
                MOV     A,SBUF
                POP     B
                POP     ACC
                POP     PSW
                RETI
RecvFarCpuDat8: DJNZ    R7,RecvFarCpuDat7
                DJNZ    R6,RecvFarCpuDat6
                MOV     A,SBUF
                POP     B
                POP     ACC
                POP     PSW
                RETI
RecvFarCpuDat9: MOV     R1,#RecvBuf
                MOV     R2,#RecvNum-3                        ; 一条记录字节数

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -