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

📄 main.asm

📁 这是一个MSC51单片机程序它读出片外RAM中的数据从串行口发向机
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                SETB    P1.7
                SJMP    LP_RDBIN
MAIN_3X:        SETB    P1.6
                MOV     A,ADDR_HIGH
                MOV     C,ACC.7
                MOV     P1.7,C
                CLR     ACC.7
                MOV     DPH,A
                ;-------------
LP_RDBIN:       MOVX    A,@DPTR
                MOV     @R1,A
                INC     DPTR
                INC     R1
                DJNZ    R2,LP_RDBIN
                NOP
                NOP
                ;R1为字符串指针;R3为字节数,结果存放在CRC_VALUE中
                MOV     R1,#BUFFER_TX
                MOV     R3,#20H
                MOV     CRC_VALUE,#00H
                MOV     DPTR,#TAB_CRC
LP_GCRC:        MOV     A,@R1
                XRL     A,CRC_VALUE
                MOVC    A,@A+DPTR
                MOV     CRC_VALUE,A
                INC     R1
                DJNZ    R3,LP_GCRC
                MOV     @R1,A
                MOV     SYS_STATUS,#0A4H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
;--------------------------------------------------------------------------
MAIN_4:         ; 将数据及CRC校验字节发向上位机
                MOV     RX_CHAR,#55H
                MOV     R0,#BUFFER_RX
                MOV     R2,#01H         ;准备好接收上位机的回应
                MOV     R1,#BUFFER_TX
                MOV     R3,#21H
                CLR     EA
LP_TXBIN:       CLR     TI
                MOV     A,@R1
                MOV     SBUF,A
                INC     R1
                DJNZ    R3,W_TXBIN
                SETB    REN
                SJMP    WAIT_ACK_BIN
W_TXBIN:        NOP
                JNB     TI,W_TXBIN
                SJMP    LP_TXBIN
                ; 以上程序段将数据发往上位机
WAIT_ACK_BIN:   SETB    REN
                CLR     ES
                MOV     IP,#01H
                MOV     IE,#91H
                CLR     TR0
                MOV     TH0,#0B8H
                MOV     TL0,#00H
                MOV     OVER_TIME,#OVER_TIME0
                CLR     SIGN_OVER
                SETB    TR0
                MOV     SYS_STATUS,#0A5H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
;--------------------------------------------------------------------------
MAIN_5:         ; 上位回应的处理
                JNB     SIGN_OVER,MAIN_5A  ;未超时则转
                ;超时处理
                CLR     TR0
                MOV     SYS_STATUS,#0A4H
                LJMP    MAIN
MAIN_5A:        MOV     A,#0AAH
                XRL     A,RX_CHAR
                JNZ     MAIN_5
                MOV     A,#0AAH
                XRL     A,BUFFER_RX
                JZ      MAIN_5B
                MOV     SYS_STATUS,#0A4H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
MAIN_5B:        ;回应数据正确
                MOV     A,#20H
                ADD     A,ADDR_LOW
                MOV     ADDR_LOW,A
                CLR     A
                ADDC    A,ADDR_HIGH
                MOV     ADDR_HIGH,A
		CLR	A
		ADDC	A,ADDR_BLOCK
		MOV	ADDR_BLOCK,A         ;地址更新
                DJNZ    LINE_L,MAIN_5C
                DJNZ    LINE_H,MAIN_5C
                ;数据发完128K字节则退出此任务
                CLR     TR0
                MOV     SYS_STATUS,#0A0H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR

MAIN_5C:        MOV     SYS_STATUS,#0A3H        ;未发完64K,则发下一个16B数据
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
;-------------------------------------------------------------------------
MAIN_6:         ; 下载代码到下位机
		MOV	ADDR_BLOCK,#00H
                MOV     ADDR_HIGH,#00H
                MOV     ADDR_LOW,#00H
                MOV     LINE_H,#10H
                MOV     LINE_L,#00H
                MOV     SYS_STATUS,#0A7H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
;--------------------------------------------------------------------------
MAIN_7:         ; 接收上位机发来的16字节二进制数据及CRC校验码
                MOV     R0,#BUFFER_RX
                MOV     R2,#21H
                SETB    REN
                MOV     RX_CHAR,#55H
                SETB    TR1
                CLR     RI
                MOV     IE,#92H
                MOV     OVER_TIME,#040H
                SETB    TR0
LP_RXBIN:       JNB     SIGN_OVER,PPPP
                MOV     SYS_STATUS,#0A0H
                LJMP    MAIN
PPPP:           CLR      TI
                NOP
                NOP
                MOV     A,#0AAH
                XRL     A,RX_CHAR
                JNZ     LP_RXBIN
                ; 己收到21H字节数
                MOV     R0,#BUFFER_RX
                MOV     R2,#21H
                MOV     CRC_VALUE,#00H
                MOV     DPTR,#TAB_CRC
LP_CHK_CRC:     MOV     A,@R0
                XRL     A,CRC_VALUE
                MOVC    A,@A+DPTR
                MOV     CRC_VALUE,A
                INC     R0
                DJNZ    R2,LP_CHK_CRC
                MOV     A,CRC_VALUE
                JZ      MAIN_7A
                CLR     TI
                MOV     A,#55H
                MOV     SBUF,A
LP_WAIT_ERR:    NOP
                NOP
                JNB     TI,LP_WAIT_ERR
                SJMP    MAIN_7          ; CRC检查错误,则向上位机发出错误回应
                ;本批数据重新接收
                ;-------------------------------------------------------------
MAIN_7A:        ; CRC校验正确,向片外存储器写入32字节
                MOV     R2,#20H
                MOV     R0,#BUFFER_RX   ; 设二进制数据地址指针(上位机送来的数据)
                MOV     DPL,ADDR_LOW
                MOV     DPH,ADDR_HIGH
                ;这时添加片选及区块寻址代码
                MOV     A,ADDR_BLOCK
                JNZ     MAIN_7X
                CLR     P1.6
                SETB    P1.7
                SJMP    LP_WRBIN
MAIN_7X:        SETB    P1.6
                MOV     A,ADDR_HIGH
                MOV     C,ACC.7
                MOV     P1.7,C
                CLR     ACC.7
                MOV     DPH,A
                ;---------------
LP_WRBIN:       MOV     A,@R0
                MOVX    @DPTR,A
                MOVX    @DPTR,A
                MOVX    @DPTR,A
                nop
                MOVX    A,@DPTR
                XRL     A,@R0
                JNZ     LP_WRBIN
                INC     R0              ; 数据指针更新
                INC     DPTR            ; 地址指针更新
                DJNZ    R2,LP_WRBIN
                ;地址更新处理
                MOV     A,#20H
                ADD     A,ADDR_LOW
                MOV     ADDR_LOW,A
                CLR     A
                ADDC    A,ADDR_HIGH
                MOV     ADDR_HIGH,A
                CLR     A
                ADDC    A,ADDR_BLOCK
                MOV     ADDR_BLOCK,A
                DJNZ    LINE_L,MAIN_7B
                DJNZ    LINE_H,MAIN_7B
                MOV     A,#0AAH
                CLR     TI
                SETB    TR1
                MOV     SBUF,A
LP_WAIT_RT:     NOP
                NOP
                JNB     TI,LP_WAIT_RT
                MOV     SYS_STATUS,#0A0H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
                ;--------------------------------
MAIN_7B:        CLR     TI
                SETB    TR1
                MOV     A,#0AAH
                MOV     SBUF,A
LP_WAIT_RT0:    NOP
                NOP
                JNB     TI,LP_WAIT_RT0
                MOV     SYS_STATUS,#0A7H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
;-------------------------------------------------------------------------
TAB_CRC:        ; CRC校验数据表
                DB      000,094,188,226,097,063,221,131
                DB      194,156,126,032,163,253,031,065
                DB      157,195,033,127,252,162,064,030
                DB      095,001,227,189,062,096,130,220
                DB      035,125,159,193,066,028,254,160
                DB      225,191,093,003,128,222,060,098
                DB      190,224,002,092,223,129,099,061
                DB      124,034,192,158,029,067,161,255
                DB      070,024,250,164,039,121,155,197
                DB      132,218,056,102,229,187,089,007
                DB      219,133,103,057,186,228,006,088
                DB      025,071,165,251,120,038,196,154
                DB      101,059,217,135,004,090,184,230
                DB      167,249,027,069,198,152,122,036
                DB      248,166,068,026,153,199,037,123
                DB      058,100,134,216,091,005,231,185
                DB      140,210,048,110,237,179,081,015
                DB      078,016,242,172,047,113,147,205
                DB      017,079,173,243,112,046,204,146
                DB      211,141,111,049,178,236,014,080
                DB      175,241,019,077,206,144,114,044
                DB      109,051,209,143,012,082,176,238
                DB      050,108,142,208,083,013,239,177
                DB      240,174,076,018,145,207,045,115
                DB      202,148,118,040,171,245,023,073
                DB      008,086,180,234,105,055,213,139
                DB      087,009,235,181,054,104,138,212
                DB      149,203,041,119,244,170,072,022
                DB      233,183,085,011,136,214,052,106
                DB      043,117,151,201,074,020,246,168
                DB      116,042,200,150,021,075,169,247
                DB      182,232,010,084,215,137,107,053
                NOP
                NOP
                LJMP    ERROR
;-------------------------------------------------------------------------
                END

⌨️ 快捷键说明

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