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

📄 main.asm

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

TEMP            EQU     30H
SYS_STATUS      EQU     31H
SYS_CHAR        EQU     32H
OVER_TIME       EQU     33H     ; 超时计时变量(10MS的次数)

NUM_RX          EQU     34H     ; 接收时的总字节数(计数时用R2)
NUM_TX          EQU     35H     ; 接收时的总字节数(计数时用R3)
RX_CHAR         EQU     36H     ; 接收时的工作控制字节(055H, 正在接收, 0AAH, 接收结束)
TX_CHAR         EQU     37H     ; 发送时的工作控制字节(055H, 正在发送, 0AAH, 发送结束)

ADDR_BLOCK	EQU	38H	; 片外存储器块区
ADDR_HIGH       EQU     39H     ; 片外存储器偏移地址高字节
ADDR_LOW        EQU     3AH     ; 片外存储器偏移地址低字节(工作用)
LINE_H          EQU     3BH
LINE_L          EQU     3CH     ; 行计数( 4096 行 = 256 * 32 BYTE)


CRC_VALUE       EQU     3FH
BUFFER_RX       EQU     40H     ;接收缓冲区起始地址定义
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          ERROR
;--------------------------------------------------------------------
                ORG          000BH
                LJMP         PORT_TMR0
                NOP
                NOP
                LJMP          ERROR
;--------------------------------------------------------------------
                ORG          0013H
                LJMP         PORT_INT1
                NOP
                NOP
                LJMP          ERROR
;--------------------------------------------------------------------
                ORG          001BH
                LJMP         PORT_TMR1
                NOP
                NOP
                LJMP          ERROR
;--------------------------------------------------------------------
                ORG          0023H
                LJMP         PORT_SERIAL
                NOP
                NOP
                LJMP          ERROR
;--------------------------------------------------------------------
                ORG          002BH
                LJMP         PORT_TMR2
                NOP
                NOP
                LJMP          ERROR
;--------------------------------------------------------------------
                ORG     0040H
PORT_INT0:      RETI
                NOP
                NOP
                LJMP          ERROR
;--------------------------------------------------------------------
PORT_INT1:      RETI
                NOP
                NOP
                LJMP          ERROR
;--------------------------------------------------------------------
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     ERROR
;--------------------------------------------------------------------
PORT_TMR1:      ;
                RETI
                NOP
                NOP
                LJMP     ERROR
;--------------------------------------------------------------------
PORT_TMR2:      ;
                RETI
                NOP
                NOP
                LJMP     ERROR
;--------------------------------------------------------------------
PORT_SERIAL:    ; 串行口中断处理程序
                JB       RI,PORT_SR
                RETI
PORT_SR:        ;接收中断
                PUSH     A
                PUSH     PSW
                MOV      A,SBUF
                MOV      @R0,A
                INC      R0
                CLR      RI
                DJNZ     R2,PORT_SR1
                CLR      REN                    ; 接收到的字节数达到预定值,禁止接收
                MOV      A,#0AAH
                MOV      RX_CHAR,A       ; 设接收结束标志
PORT_SR1:       POP      PSW
                POP      A
                RETI
                NOP
                NOP
                LJMP     ERROR
;--------------------------------------------------------------------
ERROR:         ;出错处理段落程序
                MOV     SYS_STATUS,#0A0H
                NOP
                NOP
                LJMP    MAIN
;*******************************************************************
PORT_RST:       MOV     SP,#0C0H
                MOV     R0,#0FFH
                CLR     A
LP_CLRRAM:      MOV     @R0,A
                DJNZ    R0,LP_CLRRAM
                MOV     SYS_CHAR,#0AAH
                MOV     SYS_STATUS,#0A0H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
;--------------------------------------------------------------------
MAIN:           MOV     A,#07H
                ANL     A,SYS_STATUS
                MOV     B,#03H
                MUL     AB
                MOV     DPTR,#TAB_MAIN
                JMP     @A+DPTR
TAB_MAIN:       LJMP    MAIN_0
                LJMP    MAIN_1
                LJMP    MAIN_2
                LJMP    MAIN_3
                LJMP    MAIN_4
                LJMP    MAIN_5
                LJMP    MAIN_6
                LJMP    MAIN_7
                NOP
                NOP
                LJMP    ERROR
;--------------------------------------------------------------------
MAIN_0:         ; 串行口初始化,TMR0初始化
                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       ; BAND=9600(11.0592MHz)--(256-6)
                SETB    TR1             ; 启动T1
                MOV     OVER_TIME,#OVER_TIME0
                                        ; 设定超时初值
                CLR     SIGN_OVER       ; 清超时标志
                SETB    TR0             ; 超时计时开始
                MOV     IP,#01H         ; 中断优先级控制
                MOV     IE,#91H         ; 开放串行与计数器/定时器0的中断

                MOV     R0,#BUFFER_RX   ; 设定接收数据存放地址指针
                MOV     R2,#03H         ; 设定接收的字节数
                CLR     RI              ; 清接收中断标志
                SETB    REN             ; 开始接收
                MOV     SYS_STATUS,#0A1H
                MOV     RX_CHAR,#55H
                LJMP    MAIN
;-----------------------------------------------------------------------
MAIN_1:         ; 接收上位机发来的操作命令
                JNB     SIGN_OVER,MAIN_1A
                CLR     TR0
                MOV     SYS_STATUS,#0A0H
                LJMP    MAIN            ; 接收超时,则重新开始接收
MAIN_1A:        MOV     A,#0AAH
                XRL     A,RX_CHAR
                JZ      MAIN_1B
                MOV     A,#55H
                XRL     A,RX_CHAR
                JZ      MAIN_1A
                NOP
                NOP
                LJMP    MAIN_0          ; 接收状态出错,重新初始化
MAIN_1B:        ; 己经收到上位机发来的命令
                MOV     R0,#BUFFER_RX
                MOV     A,@R0
                XRL     A,#0AAH
                JNZ     MAIN_0          ; 数据错,重新初始化
                MOV     R0,#BUFFER_RX+2
                MOV     A,@R0
                XRL     A,#55H
                JNZ     MAIN_0          ; 数据错,重新初始化
                CLR     TI
                MOV     A,BUFFER_RX+1
                MOV     SBUF,A
LP_ACK_COMM:    NOP
                NOP
                JNB     TI,LP_ACK_COMM
                CLR     TI
                MOV     R0,#BUFFER_RX+1
                MOV     A,@R0
                XRL     A,#69H
                JZ      MAIN_1C         ; 收到读下位机代码命令的处理
                MOV     A,@R0
                XRL     A,#96H
                JNZ     MAIN_0          ; 数据错,重新初始化
                ; 收到下载代代码到下位机命令的处理
                MOV     SYS_STATUS,#0A6H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
MAIN_1C:        ; 收到读下位机代码命令的处理
                MOV     SYS_STATUS,#0A2H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
;--------------------------------------------------------------------------
MAIN_2:         ; 读下位机代码,送到上位机保存
		MOV	ADDR_BLOCK,#00H
                MOV     ADDR_HIGH,#00H
                MOV     ADDR_LOW,#00H
                MOV     LINE_H,#10H
                MOV     LINE_L,#00H
                MOV     SYS_STATUS,#0A3H
                LJMP    MAIN
                NOP
                NOP
                LJMP    ERROR
;--------------------------------------------------------------------------
MAIN_3:       ; 从片外存储器中读取16字节数据,并生成CRC校验数据
                MOV     R2,#20H
                MOV     R1,#BUFFER_TX
                MOV     DPL,ADDR_LOW
                ;这时添加片选及区块寻址代码
                MOV     A,ADDR_BLOCK
                JB      ACC.0,MAIN_3X
                MOV     DPH,ADDR_HIGH
                CLR     P1.6

⌨️ 快捷键说明

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