CARD1 EQU 30H ;卡1
CARD2 EQU 31H ;卡2
CARD3 EQU 32H ;卡3
CARD4 EQU 33H ;卡4(自检)
MULCARD EQU 31H ;放大倍数
SERDATA1 EQU 32H ;串口数据1(卡号)
SERDATA2 EQU 33H ;串口数据2(放大倍数)
SUMDATA EQU 34H ;串口数据3(校验和)
;-----------------------------------------
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP SERVE ;串口中断服务程序入口
ORG 0050H
;------------------初始化-----------------------
MAIN: LCALL DOG
LCALL INITIAL
LCALL INIOUT
LOOP1:
LCALL SELFCHELK
JB SEND_INDEX.0,LOOP1
LCALL DATA_SEND
AJMP LOOP1
;------------------串口初始化-----------------------
INIOUT:
LCALL DOG
MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)
SETB TR1;启动定时器T1
;以上完成通讯初始化设置
RET
;------------------系统初始化---------------------
INITIAL: MOV DPH,#01H
MOV DPL,#01H
SETB PD0
SETB PD1
SETB PD2
SETB PD3
CLR PD3
MOV A,#0FFH
MOVX @DPTR,A
SETB PD3
CLR PD2
MOV A,#0FFH
MOVX @DPTR,A
SETB PD2
CLR PD1
MOV A,#0FFH
MOVX @DPTR,A
SETB PD1
CLR PD0
MOV A,#0FFH
MOVX @DPTR,A
SETB PD0
MOV SEND_INDEX,#01H
RET
;------------------数据接收-----------------------
SERVE: LCALL DOG
PUSH A
PUSH PSW
WAIT: JBC RI,RECET
AJMP WAIT ;保护现场
RECET: MOV A,SBUF
MOV SERDATA1,A
WAIT0: JBC RI,RECET0
AJMP WAIT0
RECET0:
MOV A,SBUF
MOV SERDATA2,A
WAIT1: JBC RI,RECET1
AJMP WAIT1
RECET1: MOV A,SBUF
MOV SUMDATA,A
WAIT2: JNB RI,WAIT2
CLR RI
RETURN: POP PSW
POP A
SETB EA
RETI
;
;------------------信号校验---------------------
SELFCHELK: MOV A,SERDATA1
ADD A,SERDATA2
CJNE A,SUMDATA,SERVE
MOV SEND_INDEX,#00H
RET
;----------------------锁存器选择---------------------------------
DATA_SEND:
PRI1: MOV A,SERDATA1
CJNE A,#03H,PRI2
CLR PD0 ;开启A组锁存器
LCALL DATA_SEND0
SETB PD0
AJMP SEND_EXIT
PRI2: CJNE A,#06H,PRI3
CLR PD1 ;开启B组锁存器
LCALL DATA_SEND0
SETB PD1
AJMP SEND_EXIT
PRI3: CJNE A,#09H,SELF_TEST1 ;开启C组锁存器
CLR PD2
LCALL DATA_SEND0
SETB PD2
AJMP SEND_EXIT
SELF_TEST1:
CJNE A,#0CH,SELF_TEST2
CLR PD3 ;开启D组锁存器
MOV A,#38H ;开自检
MOVX @DPTR,A
NOP
SETB PD3
SELF_TEST2:
CJNE A,#0FH,SEND_EXIT
CLR PD3 ;开启D组锁存器
MOV A,#3FH ;关自检
MOVX @DPTR,A
NOP
SETB PD3
SEND_EXIT:
RET
;-----------------------------------------------
;------------------增益选择---------------------
DATA_SEND0:
LCALL DOG
MOV R1,SERDATA2
CJNE R1,#01H,CMP2
MOV A,#3FH ;增益为1
MOVX @DPTR,A
AJMP SEND0_EXIT
CMP2: CJNE R1,#02H,CMP3
MOV A,#3EH ;增益为2
MOVX @DPTR,A
AJMP SEND0_EXIT
CMP3: CJNE R1,#04H,CMP4
MOV A,#36H ;增益为4
MOVX @DPTR,A
AJMP SEND0_EXIT
CMP4: CJNE R1,#08H,CMP5
MOV A,#26H ;增益为8
MOVX @DPTR,A
AJMP SEND0_EXIT
CMP5: CJNE R1,#10H,CMP6
MOV A,#24H ;增益为16
MOVX @DPTR,A
AJMP SEND0_EXIT
CMP6: CJNE R1,#20H,CMP7
MOV A,#20H ;增益为32
MOVX @DPTR,A
AJMP SEND0_EXIT
CMP7: CJNE R1,#40H,SEND0_EXIT
MOV A,#00H ;增益为64
MOVX @DPTR,A
SEND0_EXIT:
RET
;------------------看门狗---------------------
DOG:
SETB WDI
CLR WDI
RET
;------------------结束---------------------
END