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