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