马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
JC_ADDRH EQU 0FEH ;模块地址高
JC_ADDRL EQU 01H ;模块地址低
WDT_CONTR EQU 0E1H ;定义看门狗
SET1 BIT P3.2
SET2 BIT P3.3
OUTS BIT P3.5
;-------中断向量表
ORG 0000H
NOP
SJMP BEGIN ;转主程序
ORG 0003H ;外部中断0
RETI
ORG 000BH ;定时器0
AJMP TIME0
ORG 0013H ;外部中断1
RETI
ORG 001BH ;定时器1
RETI
ORG 0023H ;串行口
AJMP INTS_S
ORG 002BH ;定时器2/ADC/SPI
RETI
ORG 0033H CA/LVD/外部中断2
RETI
ORG 003BH ;外部中断3
RETI
;-------中断向量表结束
ORG 0040H
BEGIN: MOV SP,#5FH ;系统初始化
MOV IE,#0H
MOV 20H,#00H ;清标志位
MOV 21H,#00H ;清标志位
CLR OUTS
SETB SET1
SETB SET2
MAIN: MOV 28H,#0FFH ;1--8号传感有被击发保存数据
MOV 29H,#0FFH ;9--16号传感有被击发保存数据
MOV 2AH,#0FFH ;17--24号传感有被击发保存数据
MOV 2BH,#0FFH ;25--32号传感有被击发保存数据
MOV 25H,#JC_ADDRH
MOV 26H,#JC_ADDRL
;-------准备接受探点开启,关毕命令比较字串
MOV 30H,#0FEH ;CMT001A的协议格式
MOV 31H,#0FEH ;CMT001A的协议格式
MOV 32H,#0FEH ;CMT001A的协议格式
MOV 33H,#68H ;CMT001A的协议格式
MOV 34H,#11H
MOV 35H,25H
MOV 36H,26H
MOV 37H,#00H
MOV 38H,#00H
MOV 39H,#0FFH
MOV 3AH,#0FFH
MOV 3BH,#16H
;准备接受命令比较字串结束
;准备写开启,关毕命令发送字串
MOV 3CH,#0FEH ;CMT001A的协议格式
MOV 3DH,#0FEH ;CMT001A的协议格式
MOV 3EH,#0FEH ;CMT001A的协议格式
MOV 3FH,#11H ;本模块可用命令
MOV 40H,25H
MOV 41H,26H
MOV 42H,#00H
MOV 43H,#00H
MOV 44H,#0FFH
MOV 45H,#0FFH
MOV 46H,#16H ;命令结束符
;-------准备写地址发送字串结束
;-------准备接受读报警命令比较字串
MOV 47H,#0FEH ;CMT001A的协议格式
MOV 48H,#0FEH ;CMT001A的协议格式
MOV 49H,#0FEH ;CMT001A的协议格式
MOV 4AH,#68H ;CMT001A的协议格式
MOV 4BH,#22H ;本模块可用命令
MOV 4CH,25H
MOV 4DH,26H
MOV 4EH,#16H ;命令结束符
;准备写读报警命令比较字串
MOV 50H,#0FEH ;CMT001A的协议格式
MOV 51H,#0FEH ;CMT001A的协议格式
MOV 52H,#0FEH ;CMT001A的协议格式
MOV 53H,#22H
MOV 54H,25H
MOV 55H,26H
MOV 56H,#00H
MOV 57H,#00H
MOV 58H,#00H
MOV 59H,#00H
MOV 5AH,#0FFH
MOV 5BH,#0FFH
MOV 5CH,#0FFH
MOV 5DH,#0FFH
MOV 5EH,#16H
;-----准备写读报警命令比较字串结束
; MOV AUXR,#40H ;设定定时器1为1T方式定时器0为12T方式
MOV TMOD,#21H ;设定定时器1为方式2(八位自动重装)设定时器0方式1(16位定时器)
MOV TH1,#0FAH ;设置4800b/s的波特率
MOV TL1,#0FAH
MOV SCON,#50H ;设定串行口为8位UART接收
CLR PT0 ;将定时器0中断设为低优先级
SETB PS S=1将串行中断设为高优先级
MOV IE,#92H ;开中断总允许,串行中断,定时器0中断
SETB TR1 ;起动定时器1
MOV 23H,#04H
MOV 24H,#0E8H
MOV R0,#47H ;设定接受数据的比较单元
MOV R2,#04H ;接受数据比较长度
MOV TH0,#094H ;设置定时器0定时30mS
MOV TL0,#00H
SETB TR0 ;起动定时器0
MOV WDT_CONTR,#3BH ;启动看门狗
;-------读安防模块开始
R_DATE: CLR EA
CLR SET1
MOV 28H,P0
MOV 29H,P2
SETB SET1
CLR SET2
MOV 2AH,P0
MOV 2BH,P2
SETB SET2
SETB EA
MOV A,2CH
CJNE A,28H,NOTEQU
CJNE A,29H,NOTEQU
CJNE A,2AH,NOTEQU
CJNE A,2BH,NOTEQU
DJNZ 2DH,SLP
MOV 2DH,#10H
STORAGE:MOV A,28H
MOV 56H,A
CPL A
MOV 5AH,A
MOV A,29H
MOV 57H,A
CPL A
MOV 5BH,A
MOV A,2AH
MOV 58H,A
CPL A
MOV 5CH,A
MOV A,2BH
MOV 59H,A
CPL A
MOV 5DH,A
SJMP SLP
NOTEQU: DJNZ 27H,SLP
MOV 27H,#03H
SJMP STORAGE
SLP: MOV PCON,#01H ;使得芯片睡眠,由中断唤醒
MOV WDT_CONTR,#3BH ;喂狗
JNB 04H,SLP ;非定时器0中断唤醒转读数据
CLR 04H
LJMP R_DATE
SJMP SLP ;继续睡眠
;串行中断子程序
INTS_S: PUSH ACC
JBC TI,SEND
CLR RI
JB 01H,CD_ADD1 ;转写安防数据接收与判断子程序
JB 03H,R_DATA1 ;转读安防模块接收
JB 02H,C_ADD1 ;转写安防模块地址判断接收
JBC 00H,R_DATA
S_ALL: MOV A,@R0
CJNE A,SBUF,T_EXIT ;比较接受命令字串
INC R0
DJNZ R2,T_CONT ;比较结束是否继续
SETB 00H ;置CMBUS正确标志
T_CONT: POP ACC
RETI
SEND: DJNZ R3,W_CONT
SETB REN ;开串行接收
SJMP T_EXIT
W_CONT: INC R1
MOV A,@R1
MOV SBUF,A
POP ACC
RETI
;------判断为何种命令
R_DATA: MOV A,SBUF
CJNE A,#22H,CW_ADD ;非读命令跳至写命令命令判断
SETB 03H ;设置读地址标志位
MOV R0,#4CH
MOV R2,#03H
POP ACC
RETI
CW_ADD: CJNE A,#11H,T_EXIT
SETB 02H
MOV R0,#35H
MOV R2,#02H
POP ACC
RETI
;-------判断结束
T_EXIT: MOV 20H,#00H ;清所有标志
MOV R0,#47H
MOV R2,#04H
POP ACC
RETI
;-----接收检查读安防模块命令
R_DATA1:MOV A,@R0
CJNE A,SBUF,T_EXIT
INC R0
DJNZ R2,R_EXIT
CLR 03H
CLR REN ;停串行接收
MOV R1,#50H
MOV R3,#13H
CLR TR0
MOV TH0,#0CAH ;设置定时器0定时15MS
MOV TL0,#00H
SETB TR0 ;起动定时器0
MOV 20H,#00H ;清所有标志
SETB 07H ;置发送标志
R_EXIT: POP ACC
RETI
;-----接收检查写安防模块命令
C_ADD1: MOV A,@R0
CJNE A,SBUF,T_EXIT
INC R0
DJNZ R2,C_EXIT
CLR 02H
SETB 01H
MOV R0,#37H
MOV R2,#05H
C_EXIT: POP ACC
RETI
CD_ADD1:MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R2,CD_EXIT
CLR 01H
MOV A,37H ;检查数据是否正确
CPL A
CJNE A,39H,T_EXIT
MOV 44H,A
CPL A
MOV 42H,A
MOV A,38H
CPL A
CJNE A,3AH,T_EXIT
MOV 45H,A
CPL A
MOV 43H,A
MOV A,3BH
CJNE A,#16H,T_EXIT
CLR REN
SJMP W_SAFE ;转向执行程序段
CD_EXITOP ACC
RETI
;---执行程序段
W_SAFE:
;-------输出模块
MOV A,39H
MOV P0,A
MOV A,3AH
MOV P2,A
SETB OUTS
;-------输出模块结束
CLR TR0
MOV TH0,#0CAH ;设置定时器0定时15mS
MOV TL0,#00H
SETB TR0 ;起动定时器0
CLR OUTS
;-------串行发送子程序
MOV R1,#3CH ;发送数据的起始地址
MOV R3,#13H ;发送数据的长度
CLR TR0
MOV TH0,#0CAH ;设置定时器0定时15MS
MOV TL0,#00H
SETB TR0 ;起动定时器0
MOV 20H,#00H ;清所有标志
SETB 07H ;置发送标志
POP ACC
RETI
;-------定时器0中断子程序
TIME0: JNB 07H,CTC_E ;发送标志为0转下
CLR 07H ;清发送标志
MOV A,@R1 ;发送数据
MOV SBUF,A
CTC_E: SETB 04H
MOV TH0,#094H ;设置定时器0定时30MS
MOV TL0,#00H
SETB TR0 ;起动定时器0
RETI
;-------定时器0中断子程序结束
END |