?? 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 + -