📄 main000.asm
字号:
;********************************************************************
; 朱 学 兵 支 标 打 印 项 目 程 序
; 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 + -