?? pcm16c550.asm
字號:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;位尋址區(qū):20h-->25h即(00-->2fh)用語一些數制轉換計算,25H(28H-->2FH)用于標志
;26h-->2Ah(即30H-->57H):用于上位機通信
;2Bh-->2Fh(即58h-->7fh)用于與設備通信標志
;RAM 10H-->1FH用于上位機(即兩組寄存器)
;RAM 30H-->3FH及浮點數運算
;RAM 40H-->4FH用于設備
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RECE_PC_OK_FLAG BIT 30H
T1M_FLAG BIT 31H
communicate_state EQU 11H
REG_H_BYTE EQU 12H
FIFO_LEN EQU REG_H_BYTE
LENGTH EQU 13H
CMD_STATE EQU 14H
POINTL EQU 15H
POINTH EQU 16H
REG_CHK2L EQU 17H
REG_CHK2H EQU 18H
T1M EQU 1AH
_3S_ EQU 1BH
STATE_SOI EQU 1
STATE_VERH EQU 2
STATE_VERL EQU 3
STATE_ADRH EQU 4
STATE_ADRL EQU 5
STATE_CMD1H EQU 6
STATE_CMD1L EQU 7
STATE_CMD2H EQU 8
STATE_CMD2L EQU 9
STATE_LENCHK EQU 10
STATE_LENH EQU 11
STATE_LENM EQU 12
STATE_LENL EQU 13
STATE_DATAH EQU 14
STATE_DATAL EQU 15
STATE_CHKSUM1H EQU 16
STATE_CHKSUM1L EQU 17
STATE_CHKSUM2H EQU 18
STATE_CHKSUM2L EQU 19
STATE_EOI EQU 20
STATE_OTHER EQU 21
STATE_SEND EQU 22
STATE_SEND_OVER EQU 23
CMD2_REAL EQU 41H
CMD2_PARA EQU 46H
CMD2_SETUP EQU 45H
CMD2_OTHER EQU 47H
BUFFER2 EQU 0010H ;暫存接收上位機的COMMANDINFO數據,設置時接收到的浮點數
DATA_BUFFER EQU 0600H ;接收下位機信息緩存
BCD_BUFFER EQU 0700H
DATA_BUFFER0 EQU 0300H
ADDR_PARA EQU 2000H-150
ADDR_REAL EQU 2000H
HEAD_REAL EQU 3000H
HEAD_PARA EQU 5000H
HEAD_SETUP EQU 6000H
reset_ace equ p1.2
ctrl_485 equ p1.1
ACE_PORT EQU 8000H
IER EQU 8001H
IIR EQU 8002H
FCR EQU 8002H
LCR EQU 8003H
LSR EQU 8005H
lsb equ 8000h
msb equ 8001h
;******************************************
;單片機工作寄存器初始化,
;*****************************************
INIT_COOL: MOV PCON,#80H ;SMOD=0
MOV SCON,#50H ;串口以方式2工作
MOV TMOD,#21H ;定時器0、1分別為方式4.8
MOV TH1,#0f4H ;定時器1溢出率
MOV TL1,#0f4H ;設置定時器、使串口波特率為2.4/S
MOV TCON,#40H ;定時器1啟動、定時器0為電平觸發(fā)方式
MOV TH0,#04CH
MOV TL0,#00H
MOV IP,#04H ;外中斷優(yōu)先機高,其次串口,再次定時器0
CLR RS0 ;選工作寄存器組
CLR RS1
;************************************************
;一些寄存器,標志的初始化的初始化
;**************************************************
CLR SETUP_FLAG ;設置標志
CLR ALLOW_SEND_FLAG
CLR ALLOW_TRANS_FLAG
CLR ALLOW_MOVE_FLAG
CLR RECE_PC_OK_FLAG
MOV T3S,#60
MOV _3S_,#60
MOV T1M,#20
MOV SMRECE_STATE,#RSTATE_STX_10H
MOV communicate_state,#STATE_SOI
;*****************************************
;16C550初始化
;*****************************************
ACE_INIT: setb reset_ace ;SETB P1.2
NOP
NOP
NOP
CLR RESET_ACE
MOV DPTR,#lcr ;線控制寄存器地址
MOV A,#80H ;置除數鎖存器位
MOVX @DPTR,A ;除數鎖寸器DLAB置1,以下設置波特率
MOV DPTR,#lsb ;除數低位
MOV A,#06H ;
MOVX @DPTR,A ;
MOV A,#00H ;
MOV DPTR,#msb ;除數高位
MOVX @DPTR,A ;
MOV DPTR,#lcr ;線控制寄存器地址
MOV A,#03H ;串行字符長8位,1位停止位
MOVX @DPTR,A ;設置通信數據格式,8位數據位,1位停止位
nop
MOV DPTR,#fcr ;FIFO控制寄存器地址
MOV A,#07H ;FIFO允許,接收,發(fā)送FIFO復位,1字節(jié)的觸發(fā)電平
MOVX @DPTR,A
MOV DPTR,#ier ;中斷允許寄存器地址
MOV A,#01H ;開放接收中斷,暫時關發(fā)送
MOVX @DPTR,A ;
RET
;========================================================================================
;讀取地址,地址為1字節(jié),高半字節(jié)為1,低半字節(jié)有撥碼開關設定
;========================================================================================
READ_PCMADDR: MOV A,P1
SWAP A
ANL A,#0FH
ADD A,#0F0H ; 地址以高位為F
MOV PCM_ADDR,A
RET
;**************************************************************************************
;通信服務程序,看門狗信號清零,與主程序看門狗信號高電平形成變化電平而喂狗
;程序產生允許發(fā)送信號,使發(fā)送程序每過3S發(fā)送一幀命令給智能設備,
;程序中中產生的分鐘標志用來判斷協議轉換器是否與上位機是否失去聯系,而判斷485總線是否斷開
;*******************************************************************************************
EVENT: PUSH ACC
PUSH PSW
CLR P1.3
MOV TL0,#01
MOV TH0,#4CH
TIM3S: DJNZ T3S,TIME ;3S到
MOV T3S,#60
SETB ALLOW_SEND_FLAG
TIME: DJNZ _3S_,ABCD
MOV _3S_,#60
DJNZ T1M,ABCD ;1分到
MOV T1M,#20
CLR EA
SETB RESET_ACE
CLR CTRL_485
MOV P0,#0FFH
MOV P1,#11111101B
MOV P2,#0FFH
MOV P3,#0FFH
PUSH 00
PUSH 00
RETI
ABCD: POP PSW
POP ACC
RETI
;*******************************
;將發(fā)送的A解釋為ASCII碼
;A入口 A出口
;*******************************
ASCII: CLR C
CJNE A,#0AH,ASC1
ADD A,#37H
RET
ASC1: JC ASC2
ADD A,#37H
RET
ASC2: ADD A,#30H
RET
;*******************************
;將ASCII碼還原為16進制數字
;A入口 A出口
;*******************************
HEX: CLR C
CJNE A,#41H,HE1
SUBB A,#37H
RET
HE1: JC HE2
SUBB A,#37H
RET
HE2: CLR C
SUBB A,#30H
RET
;====================================================
;16c550中斷程序
;=================================================
INT: PUSH A ;保護現場
PUSH B
PUSH DPL
PUSH DPH
PUSH PSW
SETB RS1 ;選工作寄存器
CLR RS0
nop
MOV DPTR,#LSR
MOVX A,@DPTR
JB ACC.7,INT_LSR_ERROR
MOV DPTR,#iir ;讀中斷識別寄存器
MOVX A,@DPTR
ANL A,#0FH
XRL A,#2 ;與零異或為零是發(fā)送中斷
JNZ INT_RECE
LJMP INT_SEND ;跳轉到發(fā)送程序
INT_LSR_ERROR:SETB RESET_ACE
CLR CTRL_485 ;
LCALL ACE_INIT
LJMP INT_RETURN
INT_RECE: MOV DPTR,#LSR
MOVX A,@DPTR
JB ACC.0,INT_R0
LJMP INT_LSR_ERROR
INT_R0: MOV DPTR,#ace_port ;讀數
MOVX A,@DPTR
MOV B,A ;暫存保護
MOV A,communicate_state
RECE_SOI: CJNE A,#STATE_SOI,RECE_VERH ;接收其始位
MOV A,B
CJNE A,#7EH,RS
MOV REG_CHK2L,#0
MOV REG_CHK2H,#0
MOV POINTL,#LOW(BUFFER2)
MOV POINTH,#HIGH(BUFFER2)
CLR RECE_PC_OK_FLAG
MOV communicate_state,#STATE_VERH
RS: LJMP INT_RETURN
RECE_VERH: CJNE A,#STATE_VERH,RECE_VERL ;接收版本號高字節(jié)
MOV A,B
CJNE A,#32H,RV_ERROR
MOV A,B
LCALL INT_CHKSUM
MOV communicate_state,#STATE_VERL
LJMP INT_RETURN
RV_ERROR: MOV COMMUNICATE_STATE,#STATE_SOI
LJMP INT_RETURN
RECE_VERL: CJNE A,#STATE_VERL,RECE_ADRH ;接收版本號低字節(jié)
MOV A,B
CJNE A,#30H,RV_ERROR
MOV A,B
LCALL INT_CHKSUM
MOV communicate_state,#STATE_ADRH
LJMP INT_RETURN
RECE_ADRH: CJNE A,#STATE_ADRH,RECE_ADRL ;接收地址號高字節(jié)
MOV A,B
LCALL INT_CHKSUM
MOV A,B
LCALL HEX
SWAP A
MOV REG_H_BYTE,A
MOV communicate_state,#STATE_ADRL
LJMP INT_RETURN
RECE_ADRL: CJNE A,#STATE_ADRL,RECE_CMD1H ;接收版本號低字節(jié)
MOV A,B
LCALL INT_CHKSUM
MOV A,B
LCALL HEX
ADD A,REG_H_BYTE
XRL A,PCM_ADDR
JZ RA_RIGHT
MOV communicate_state,#STATE_SOI
LJMP INT_RETURN
RA_RIGHT: MOV communicate_state,#STATE_CMD1H
LJMP INT_RETURN
RECE_CMD1H: CJNE A,#STATE_CMD1H,RECE_CMD1L ;接收命令1高字節(jié)
MOV A,B
CJNE A,#44H,RCH_ERROR
MOV A,B
LCALL INT_CHKSUM
MOV communicate_state,#STATE_CMD1L
LJMP INT_RETURN
RCH_ERROR: MOV COMMUNICATE_STATE,#STATE_SOI
LJMP INT_RETURN
RECE_CMD1L: CJNE A,#STATE_CMD1L,RECE_CMD2H ;接收命令1低字節(jié)
MOV A,B
LCALL INT_CHKSUM
MOV A,B
CJNE A,#30H,RCH_ERROR
MOV communicate_state,#STATE_CMD2H
LJMP INT_RETURN
RECE_CMD2H: CJNE A,#STATE_CMD2H,RECE_CMD2L ;接收命令2高字節(jié)
MOV A,B
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -