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

📄 main_b0.asm

📁 这是一个MSC51单片机程序它读出片外RAM中的数据从串行口发向机
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                MOV     LINE,#00H
                NOP
                NOP
                LJMP    MAIN_INITADDR
;-----------------------------------------------------------------
COMMAND_ERR:    ;接收数据出错处理
                MOV     SCON, #50H      ;串行口工作在方式1,接收允许
                MOV     TMOD, #20H      ;TMR1工作在MODE2(8位自动重装方式)
                ;MOV     TH1,#0F3H
                ;MOV     TL1,#0F3H       ; 波特率为2400
                MOV     TH1,#0F4H
                MOV     TL1,#0F4H       ; 波特率为2400
                MOV     PCON,#00H
                SETB    TR1             ; 启动T1
                MOV     SYS_STATUS,#0A0H; 系统设定为接收状态
                MOV     RECIEVE_NUM,#06H; 设定从上位机发来的命令字长为6字节
                MOV     R0,#COMMAND0
                NOP
                NOP
                LJMP    MAIN_RRR
;-------------------------------------------------------------------
MAIN_INITADDR:  ;先由块序号和行号求出偏移地址
                MOV     A,LINE
                RL      A
                SWAP    A
                ANL     A,#0F0H
                MOV     ADDR_LOW,A
                MOV     A,BLOCK_NUM
                RL      A
                SWAP    A
                ANL     A,#0F0H
                MOV     ADDR_HIGH,A
                MOV     A,LINE
                SWAP    A
                ANL     A,#0FH
                ADD     A,ADDR_HIGH
                MOV     ADDR_HIGH,A
                MOV     SYS_STATUS,#0A3H
                NOP
                NOP
                NOP
;-----------------------------------------------------------------
MAIN_RDD:       ;读入一行数据(16字节),并转化为INTER HEX的数据格式
                LCALL   READ_BIN
                LCALL   HEX2ASC
                MOV     SYS_STATUS,#0A4H
                MOV     R0,#ADDR_HEX
                MOV     NUM,#4CH    ; 每个记录为44字节
LP_TTT0:        MOV     A,@R0
                CLR     TI
                MOV     SBUF,A      ; 送出一个字节
LP_TTT:
                JNB     TI,LP_TTT
                CLR     TI
                ;发好一个字节的处理
                INC     R0
                DJNZ    NUM,LP_TTT0     ;此行记录未发完则继续发送
                MOV     SYS_STATUS,0A5H
                ; 0A5H---LINE计数及地址刷新处理
                INC     LINE
                MOV     A,#20H
                ADD     A,ADDR_LOW
                MOV     ADDR_LOW,A
                CLR     A
                ADDC    A,ADDR_HIGH
                MOV     ADDR_HIGH,A
                MOV     SYS_STATUS,#0A4H
                MOV     A,LINE
                JZ      MAIN_ALINE0
                NOP
                NOP
                LJMP    MAIN_RDD
;-----------------------------------------------------------------------
MAIN_ALINE0:    MOV     SYS_STATUS,#0A0H
                LJMP    COMMAND_ERR
                NOP
                NOP
                LJMP    MAIN_RRR
;-----------------------------------------------------------------------
READ_BIN:       ;从片外存储器中读取16字节数据
                MOV     CNT,#20H
                MOV     R0,#ADDR_BIN
                MOV     DPL,ADDR_LOW
                MOV     DPH,ADDR_HIGH
                MOV     A,BLOCK_NUM
                MOV     C,ACC.3
                MOV     P1.7,C
LP_RD:          MOVX    A,@DPTR
                MOV     @R0,A
                INC     DPTR
                INC     R0
                DJNZ    CNT,LP_RD
                RET
                NOP
                NOP
                LJMP    ERR
;--------------------------------------------------------------------
TAB_HEX2ASC:
                DB      30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
                ;   0,1,2,3,4,5,6,7,8,9
                DB      41H,42H,43H,44H,45H,46H
                ;   A,B,C,D,E,F
                ;  ":"的ASCII码为:3AH,"CR"(回车)的ASCII为:0DH
                NOP
                NOP
                LJMP    ERR
;--------------------------------------------------------------------
HEX2ASC:        ; 由十六进制数据生成INTER HEX 格式文件数据的子程序
                MOV     R0,#ADDR_HEX
                MOV     TEMP,#00H
                ; 取INTER HEX 文件数据段首地址作为指针
                MOV     A,#3AH
                MOV     @R0,A
                INC     R0              ; 数据段以":" 打头
                MOV     A,#32H
                MOV     @R0,A
                INC     R0
                MOV     A,#30H
                MOV     @R0,A
                INC     R0              ; 记录长度(20H)
                MOV     A,#20H
                ADD     A,TEMP
                MOV     TEMP,A          ; 记录长度加入累加和中

                MOV     DPTR,#TAB_HEX2ASC
                MOV     A,ADDR_HIGH
                SWAP    A
                ANL     A,#0FH
                MOVC    A,@A+DPTR
                MOV     @R0,A
                INC     R0
                MOV     A,ADDR_HIGH
                ANL     A,#0FH
                MOVC    A,@A+DPTR
                MOV     @R0,A
                INC     R0              ; 加入偏移地址高字节

                MOV     A,ADDR_LOW
                SWAP    A
                ANL     A,#0FH
                MOVC    A,@A+DPTR
                MOV     @R0,A
                INC     R0
                MOV     A,ADDR_LOW
                ANL     A,#0FH
                MOVC    A,@A+DPTR
                MOV     @R0,A
                INC     R0              ; 加入偏移地址低字节

                MOV     A,ADDR_HIGH
                ADD     A,TEMP
                ADD     A,ADDR_LOW
                MOV     TEMP,A          ; 偏移地址加入累加和

                MOV     A,#30H
                MOV     @R0,A
                INC     R0
                MOV     @R0,A
                INC     R0              ; 此记录为数据记录
                ; 记录类别为数据(00H),不用加入累加和中

                MOV     CNT,#20H        ; 设定记录长度为10H
                MOV     R1,#ADDR_BIN
LP_HEX:         MOV     A,@R1           ; 读入一字节数据
                ADD     A,TEMP
                MOV     TEMP,A          ; 加入累加和中
                MOV     A,@R1           ; 重读此字节
                SWAP    A
                ANL     A,#0FH
                MOVC    A,@A+DPTR
                MOV     @R0,A
                INC     R0
                MOV     A,@R1
                ANL     A,#0FH
                MOVC    A,@A+DPTR
                MOV     @R0,A
                INC     R0
                INC     R1
                DJNZ    CNT,LP_HEX
                ;加上校验和
                MOV     A,TEMP
                CPL     A
                INC     A
                MOV     TEMP,A
                SWAP    A
                ANL     A,#0FH
                MOVC    A,@A+DPTR
                MOV     @R0,A
                INC     R0
                MOV     A,#0FH
                ANL     A,TEMP
                MOVC    A,@A+DPTR
                MOV     @R0,A
                INC     R0
                MOV     A,#0AH
                MOV     @R0,A           ;记录以回车符结束
                RET
                NOP
                NOP
                LJMP    ERR
;-------------------------------------------------------------------------
                END

⌨️ 快捷键说明

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