foxwhb 发表于 2019-5-26 16:16

STC12C2052的外部报警采集程序

    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    ;PCA/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      ;PS=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_EXIT:POP   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

博弈 发表于 2019-5-26 16:31

受教了。

yangxf0120 发表于 2019-5-26 17:42

谢谢分享STC12C2052的外部报警采集程序

pbk82 发表于 2019-5-26 22:54

郑先生 发表于 2019-5-27 08:05

mj8abcd 发表于 2019-5-27 11:26

sen1 发表于 2023-2-12 08:49

zjk103 发表于 2023-2-13 08:52

我擦,汇编啊

lqsgg 发表于 2023-2-13 08:57

页: [1]
查看完整版本: STC12C2052的外部报警采集程序