📄 pcm16c550.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;位寻址区: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为电平触发方式
MOV TH0,#04CH
MOV TL0,#00H
MOV IP,#04H ;外中断优先机高,其次串口,再次定时器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允许,接收,发送FIFO复位,1字节的触发电平
MOVX @DPTR,A
MOV DPTR,#ier ;中断允许寄存器地址
MOV A,#01H ;开放接收中断,暂时关发送
MOVX @DPTR,A ;
RET
;========================================================================================
;读取地址,地址为1字节,高半字节为1,低半字节有拨码开关设定
;========================================================================================
READ_PCMADDR: MOV A,P1
SWAP A
ANL A,#0FH
ADD A,#0F0H ; 地址以高位为F
MOV PCM_ADDR,A
RET
;**************************************************************************************
;通信服务程序,看门狗信号清零,与主程序看门狗信号高电平形成变化电平而喂狗
;程序产生允许发送信号,使发送程序每过3S发送一帧命令给智能设备,
;程序中中产生的分钟标志用来判断协议转换器是否与上位机是否失去联系,而判断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
;*******************************
;将发送的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 ;与零异或为零是发送中断
JNZ INT_RECE
LJMP INT_SEND ;跳转到发送程序
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 ;接收版本号高字节
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 ;接收版本号低字节
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 ;接收地址号高字节
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 ;接收版本号低字节
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高字节
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低字节
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高字节
MOV A,B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -