📄 main_b0.asm
字号:
;********************************************************************
; 朱 学 兵 支 标 打 印 项 目 程 序
; M C U : AT89C51 晶体振荡器: 11.0952MHz
; 编 制 : 成 光 清 2005/09/15
; 工 作 过 程 描 述:
; 通过将串行口接口(DB9)的第9脚拉低,使单片机89C52的PIN31为高电平,
; 这样,它就会运行片内程序,正常工作时DB9/PIN9为高,89C52/PIN31为低,
; 单片机运行片外程序.
; 片内程序工作过程如下: 单片机初始化后串行口设中按收状态;
; 在收到一个数据包后,单片机进入工作状态;
; 数据包格式如下: 第一字节: 0AAH 数据包开始标志
; 第二字节: 0A6h 单片机向上位机发送数据
; 0A9h 上位机向单片机发数据
; 第三字节: 结束标志(055H)
;********************************************************************
;#INCLUDE "REG52.INC"
; 系统硬件配置定义
;--------------------------------------------------------------------
;内存配置定义
TEMP EQU 30H
CNT EQU 31H
NUM EQU 32H
LINE EQU 33H
RECIEVE_NUM EQU 34H
BLOCK_NUM EQU 38H ;0-3
RECORD_HIGH EQU 39H ;记录号高字节
RECORD_LOW EQU 3AH ;记录号低字节
ADDR_HIGH EQU 3BH ;地址高字节
ADDR_LOW EQU 3CH ;地址低字节
SYS_STATUS EQU 3DH
COMMAND0 EQU 40H
COMMAND1 EQU 41H
COMMAND2 EQU 42H
COMMAND3 EQU 43H
COMMAND4 EQU 44H
COMMAND5 EQU 45H
COMMAND6 EQU 46H
COMMAND7 EQU 47H
RECIEVE_POINT EQU 48H
;--------------------------------------------------------------------
;常量定义
ADDR_BIN EQU 060H ; 16进制数据缓冲区首地址
ADDR_HEX EQU 080H ; 此段每记录为43字节(BCD)=2Bh
;--------------------------------------------------------------------
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: ;
RETI
NOP
NOP
LJMP ERR
;--------------------------------------------------------------------
PORT_TMR1: ;
RETI
NOP
NOP
LJMP ERR
;--------------------------------------------------------------------
PORT_TMR2: ;
RETI
NOP
NOP
LJMP ERR
;--------------------------------------------------------------------
PORT_SERIAL: ; 串行口中断处理程序
PUSH A
PUSH PSW
JB RI,PORT_SR
JB TI,PORT_ST
PORT_RRR: POP PSW
POP A
RETI
PORT_SR: ;接收中断
MOV A,#0A0H
XRL A,SYS_STATUS
JNZ PORT_RRR
MOV A,SBUF
MOV @R0,A
INC R0
CLR RI
DJNZ RECIEVE_NUM,PORT_RRR
MOV SYS_STATUS,#0A1H
CLR REN
POP PSW
POP A
RETI
PORT_ST: CLR TI
MOV A,@R0
MOV SBUF,A
DJNZ NUM,PORT_RRR
MOV SYS_STATUS,#0A5H
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
MOV PCON,#00H
MOV SCON,#50H ; 串行口工作在方式1,接收允许
MOV TMOD,#20H ; TMR1工作在MODE2(8位自动重装方式)
;MOV TH1,#0F3H
;MOV TL1,#0F3H ; 波特率为2400(12MHz)
MOV TH1,#0F4H
MOV TL1,#0F4H ; 波特率为2400(11.0592MHz)
SETB TR1 ; 启动T1
MOV SYS_STATUS,#0A0H; 系统设定为接收状态
MOV RECIEVE_NUM,#06H; 设定从上位机发来的命令字长为6字节
MOV R0,#COMMAND0
CLR RI
LPR:
MAIN_RRR: SETB REN
JNB RI,LPR
MOV A,SBUF
MOV @R0,A
CLR RI
INC R0
DJNZ RECIEVE_NUM,LPR
CLR REN
MOV SYS_STATUS,0A1H
;---------------------------------------------------------
MAIN_BLOCK: ;接收结束后的数据检查处理
MOV A,#41H
XRL A,COMMAND0
JNZ COMMAND_ERR
MOV A,#41H
XRL A,COMMAND1
JNZ COMMAND_ERR
MOV A,#35H
XRL A,COMMAND4
JNZ COMMAND_ERR
MOV A,#35H
XRL A,COMMAND5
JNZ COMMAND_ERR
MOV A,COMMAND2
ANL A,#0FH
SWAP A
MOV BLOCK_NUM,A
MOV A,COMMAND3
ANL A,#0FH
ADD A,BLOCK_NUM
MOV BLOCK_NUM,A
MOV SYS_STATUS,#0A2H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -