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

📄 main000.asm

📁 这是一个MSC51单片机程序它读出片外RAM中的数据从串行口发向机
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;********************************************************************
;      朱 学 兵 支 标 打 印 项 目 程 序
;       M C U :  AT89C51   晶体振荡器: 11.0952MHz
;       编 制 :  成 光 清  2005/09/15
;      工 作 过 程 描 述:
;      通过将串行口接口(DB9)的第9脚拉低,使单片机89C52的PIN31为高电平,
;      这样,它就会运行片内程序,正常工作时DB9/PIN9为高,89C52/PIN31为低,
;      单片机运行片外程序.
;
;********************************************************************
; 系统硬件配置定义
;--------------------------------------------------------------------
;内存配置定义
TEMP            EQU     30H
SYS_STATUS      EQU     31H
OVER_TIME       EQU     32H     ; 超时计时变量(10MS的次数)
SIGN_OVER       BIT     01H     ; 超时标志(时限设为1S)

NUM_RX          EQU     34H
NUM_TX          EQU     35H

ADDR_HIGH       EQU     38H     ; 片外存储器偏移地址高字节
ADDR_LOW        EQU     39H     ; 片外存储器偏移地址低字节
LINE_H          EQU     3AH
LINE_L          EQU     3BH     ; 行计数(4096行=256*16)


CRC_VALUE       EQU     4FH
BUFFER_RX       EQU     50H     ;接收缓冲区起始地址定义
BUFFER_TX       EQU     68H     ;发送缓冲区起始地址定义


;--------------------------------------------------------------------
;常量定义
ADDR_BIN        EQU     50H     ; 16进制数据缓冲区首地址
OVER_TIME0      EQU     0FH     ; 超时时限设为3S
;--------------------------------------------------------------------
                ORG          0000H
                LJMP         PORT_RST
;--------------------------------------------------------------------
                ORG          0003H
                LJMP         PORT_INT0
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
                ORG          000BH
                LJMP         PORT_TMR0
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
                ORG          0013H
                LJMP         PORT_INT1
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
                ORG          001BH
                LJMP         PORT_TMR1
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
                ORG          0023H
                LJMP         PORT_SERIAL
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
                ORG          002BH
                LJMP         PORT_TMR2
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
                ORG     0040H
PORT_INT0:      RETI
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
PORT_INT1:      RETI
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
PORT_TMR0:      ;超时计时处理
                PUSH         A
                PUSH         PSW
                MOV          TH0,#0B8H         ;(65536-18432)/256
                MOV          TL0,#00H          ;(65536-18432)%256
                ; TIMER0设定为20MS溢出一次
                DJNZ         OVER_TIME,PORT_TMR01
                MOV          OVER_TIME,#OVER_TIME0
                SETB         SIGN_OVER          ; 设超时标志
PORT-TMR01:     POP          PSW
                POP          A
                RETI
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
PORT_TMR1:      ;
                RETI
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
PORT_TMR2:      ;
                RETI
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
PORT_SERIAL:    ; 串行口中断处理程序
                JB       RI,PORT_SR
                RETI
PORT_SR:        ;接收中断
                PUSH     A
                PUSH     PSW
                MOV      A,SBUF
                MOV      @R0,A
                INC      R0
                DJNZ     RECIEVE_NUM,PORT_SR1
                CLR      REN                    ; 接收到的字节数达到预定值,禁止接收
                MOV      A,055H
                MOV      RECIEVE_STATUS,A       ; 设接收结束标志
PORT_SR1:       POP      PSW
                POP      A
                RETI
                NOP
                NOP
                LJMP          ERR
;--------------------------------------------------------------------
ERR:            ;出错处理段落程序
                NOP
                NOP
                LJMP    MAIN_RRR
;*******************************************************************
PORT_RST:       MOV     SP,#0E0H
                MOV     R0,#0FFH
                CLR     A
LP_CLRRAM:      MOV     @R0,A
                DJNZ    R0,LP_CLRRAM

DOMMAND_ERR:    MOV     PCON,#00H
                MOV     SCON,#50H       ; 串行口工作在方式1,接收允许
                MOV     TMOD,#21H       ; TMR1工作在MODE2(8位自动重装方式)
                                        ; TMR0工作在MODE1(16位定时器)
                MOV     TH0,#0B8H
                MOV     TL0,#00H       ; 设定TMR0为20MS溢出一次
                MOV     TH1,#0FDH
                MOV     TL1,#0FDH       ; 波特率为9600(11.0592MHz)
                SETB    TR1             ; 启动T1
                MOV     SYS_STATUS,#0A0H; 系统设定为接收状态
                MOV     RECIEVE_NUM,#06H; 设定从上位机发来的命令字长为6字节
                MOV     R0,#COMMAND0
                CLR     RI
                MOV     R0,#BUFFER_RX
                MOV     NUM_RX,#03H
                SETB    REN
                CLR     SIGN_VOER
                MOV     OVER_TIME,#OVER_TIME0
                SETB    TR0
MAIN_RXLINKER:  JB      SIGN_OVER,COMMAND_ERR
                JNB     RI,MAIN_RXLINKER
                MOV     A,SBUF
                MOV     @R0,A
                CLR     RI
                INC     R0
                MOV     OVER_TIME,#OVER_TIME0
                DJNZ    RECIEVE_NUM,LPR
                CLR     REN
                MOV     SYS_STATUS,0A0H
;---------------------------------------------------------
MAIN_BLOCK:     ;接收结束后的数据检查处理
                MOV     A,#0AAH
                XRL     A,BUFFER_RX
                JNZ     COMMAND_ERR
                MOV     A,#55H
                XRL     A,BUFFER_RX+2
                JNZ     COMMAND_ERR
                MOV     A,#69H
                XRL     A,BUFFER_RX+1
                JNZ     COMMAND_ERR
                NOP
                NOP     ;上位机发来的联机标志正确, 发送0AAH以回应
                MOV     A,#0AAH
                CLR     TI
                MOV     SBUF,A
LP_ACK_CM:      JNB     TI,LP_ACK_CM
                CLR     TI
                MOV     R0,#BUFFER_RX
                MOV     NUM_RX,#03H
                SETB    REN
                CLR     RI
                CLR     SIGN_OVER
                MOV


;-------------------------------------------------------------------
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

⌨️ 快捷键说明

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