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

STC12C2052的单电控程序程序

    LAMP      BIT    P3.7    ;电器开关指示灯
    ISP_DATA    EQU    0E2H    ;EPPROM宏定义
    ISP_ADDRH    EQU    0E3H
    ISP_ADDRL    EQU    0E4H
    ISP_CMD      EQU    0E5H
    ISP_TRIG    EQU    0E6H
    ISP_CONTR    EQU    0E7H
    ISP_IAP_BYTE_READ    EQU    1
    ISP_IAP_BYTE_PROGRAM    EQU    2
    ISP_IAP_SECTOR_ERASE    EQU    3
    WAIT_TIME    EQU    4
    AUXR      EQU    8EH         ;定义1T方式
    WDT_CONTR    EQU    0E1H         ;定义看门狗

    ORG 0000H   
    SJMP BEGIN    ;转主程序
    ORG 0003H    ;外部中断0
    RETI
    ORG 000BH    ;定时器0
    AJMP    TIME0   
    ORG 0013H    ;外部中断1
    RETI
    ORG 001BH    ;定时器1
    RETI
    ORG 0023H    ;串行口
    AJMP    INT_S
    ORG 002BH    ;定时器2/ADC/SPI
    RETI
    ORG 0033H    ;PCA/LVD/外部中断2
    RETI
    ORG 003BH    ;外部中断3
    RETI
    ORG 0040H
BEGIN:    MOV    SP,#6FH      ;系统初始化
    MOV    IE,#00H
    MOV    20H,#00H
    MOV    21H,#00H
MAIN:    MOV    ISP_ADDRH,#10H    ;从EPPROM读模块地址。把1000地址中的内容存入3AH中
    MOV    ISP_ADDRL,#00H
    MOV    ISP_CONTR,#WAIT_TIME
    ORL    ISP_CONTR,#80H
    MOV    ISP_CMD,#ISP_IAP_BYTE_READ
    MOV    ISP_TRIG,#46H
    MOV    ISP_TRIG,#0B9H
    NOP
    MOV    A,ISP_DATA
    MOV    35H,A      ;把EPP中的1000地址内容存入35H中
    MOV    ISP_ADDRH,#10H
    MOV    ISP_ADDRL,#01H
    MOV    ISP_TRIG,#46H
    MOV    ISP_TRIG,#0B9H
    NOP
    MOV    A,ISP_DATA
    MOV    36H,A      ;把EPP中的1001地址内容存入36H中
;-------准备接受命令比较字串
    MOV    30H,#0FEH    ;CMT001A的协议格式
    MOV    31H,#0FEH    ;CMT001A的协议格式
    MOV    32H,#0FEH    ;CMT001A的协议格式
    MOV    33H,#68H    ;CMT001A的协议格式
    MOV    34H,#11H    ;输出命令
    MOV    37H,#33H    ;输出数据
    MOV    38H,#16H    ;命令结束符
;-------准备接受命令比较字串结束
;-------准备发送字串
    MOV    40H,#0FEH    ;CMT001A的协议格式
    MOV    41H,#0FEH    ;CMT001A的协议格式
    MOV    42H,#0FEH    ;CMT001A的协议格式
    MOV    43H,#11H    ;输出命令
    MOV    44H,35H      ;本模块高地址
    MOV    45H,36H      ;本模块低地址
    MOV    46H,#33H    ;数据
    MOV    47H,#16H    ;命令结束符
;-------准备发送字串结束
;-------准备查询发送字串
    MOV    48H,#0FEH    ;CMT001A的协议格式
    MOV    49H,#0FEH    ;CMT001A的协议格式
    MOV    4AH,#0FEH    ;CMT001A的协议格式
    MOV    4BH,#22H    ;输出命令
    MOV    4CH,35H      ;本模块高地址
    MOV    4DH,36H      ;本模块低地址
    MOV    4EH,#00H    ;状态数据
    MOV    4FH,#16H    ;命令结束符
;-------准备查询发送字串结束
;-------准备写地址发送字串
    MOV    50H,#0FEH    ;CMT001A的协议格式
    MOV    51H,#0FEH    ;CMT001A的协议格式
    MOV    52H,#0FEH    ;CMT001A的协议格式
    MOV    53H,#0FH    ;本模块可用命令
    MOV    54H,#00H
    MOV    55H,#00H
    MOV    56H,#15H    ;命令结束符
;-------准备写地址发送字串结束
    MOV    AUXR,#40H    ;设定定时器1为1T方式定时器0为12T方式
    MOV    TMOD,#21H    ;设定定时器1为方式2(八位自动重装)设定时器0方式1(16位定时器)
    MOV    TH1,#0E8H    ;设置4800b/s的波特率
    MOV    TL1,#0E8H
    MOV    SCON,#50H    ;设定串行口为8位UART接收
    SETB    PS      ;将串行中断设为高优先级
    SETB    PT0      ;将定时器0中断设为高优先级
    MOV    IE,#92H      ;开中断总允许,串行中断,定时器0中断
    SETB    TR1      ;起动定时器1
    MOV    R0,#30H      ;设定接受数据的比较单元
    MOV    R2,#04H      ;接受数据比较长度
    MOV    TH0,#0DCH    ;设置定时器0定时30mS
    MOV    TL0,#00H
    SETB    TR0      ;起动定时器0
    MOV    WDT_CONTR,#3BH    ;启动看门狗
SLP:    MOV    PCON,#01H    ;使得芯片睡眠,由中断唤醒
    SJMP    SLP      ;继续睡眠
;-------串行中断子程序
INT_S:    SETB    0FH
    JBC    TI,SEND
    CLR    RI
    JB    03H,INS_7
    JBC    04H,INS_6
    JB    02H,INS_4
    JB    01H,INS_4
    JBC    00H,INS_1
    MOV    A,@R0
    CJNE    A,SBUF,T_EXIT
    INC    R0
    DJNZ    R2,T_CONT
    SETB    00H
    RETI
SEND:    DJNZ    R3,W_CONT
    SETB    REN      ;开串行接收
    SJMP    T_EXIT
W_CONT:    INC    R1
    MOV    A,@R1
    MOV    SBUF,A
    RETI
INS_1:    MOV    A,SBUF
    CJNE    A,34H,INS_2    ;不是执行命令转下
    SETB    01H
    MOV    R0,#35H
    MOV    R2,#04H
    RETI
INS_2:    CJNE    A,#22H,INS_3    ;非读状态转地址检查
    SETB    02H
    MOV    R0,#4CH
    MOV    R2,#02H
    RETI
T_EXIT:    MOV    20H,#00H
    MOV    R0,#30H   
    MOV    R2,#04H
T_CONT:    RETI
INS_3:    CJNE    A,#0FH,T_EXIT    ;非写地址转出错
    SETB    03H
    MOV    R0,#54H
    MOV    R2,#03H
    RETI
INS_4:    MOV    A,@R0
    CJNE    A,SBUF,T_EXIT
    INC    R0
    DJNZ    R2,T_CONT
    JB    01H,INS_5
    SETB    04H
    RETI
INS_5:    CLR    REN
    SJMP    MOUT
INS_6:    MOV    A,SBUF
    CJNE    A,#16H,T_EXIT
    CLR    REN
    CLR    TR0
    MOV    TH0,#0DCH    ;设置定时器0定时30mS
    MOV    TL0,#00H
    SETB    TR0      ;起动定时器0
    MOV    R1,#48H      ;发送数据的起始地址
    MOV    R3,#13H      ;发送数据的长度
    SETB    08H
    RETI
INS_7:    MOV    A,SBUF
    MOV    @R0,A
    INC    R0
    DJNZ    R2,T_CONT
    MOV    A,56H
    CJNE    A,#15H,T_EXIT
    CLR    REN         ;停串行接收
    SJMP    E_EPROM
;-------输出模块
MOUT:    CLR    01H
    MOV    P1,#0FCH
    MOV    R7,#40H
    SETB    0EH
    MOV    R5,#0EBH
    MOV    R6,#60H
;-------输出模块结束
    CLR    TR0
    MOV    TH0,#0DCH    ;设置定时器0定时30mS
    MOV    TL0,#00H
    SETB    TR0      ;起动定时器0
    MOV    R1,#40H      ;发送数据的起始地址
    MOV    R3,#13H      ;发送数据的长度
    SETB    08H
    RETI
;-------串行发送子程序结束
;------执行写地址命令
E_EPROM:MOV    ISP_ADDRH,#10H    ;擦除第一扇区的内容
    MOV    ISP_ADDRL,#00H
    MOV    ISP_CONTR,#WAIT_TIME
    ORL    ISP_CONTR,#80H
    MOV    ISP_CMD,#ISP_IAP_SECTOR_ERASE
    MOV    ISP_TRIG,#46H
    MOV    ISP_TRIG,#0B9H
    NOP
;-------写地址入EEPROM程序
    MOV    ISP_DATA,54H    ;把地址写入EEPROM1000-1中
    MOV    ISP_ADDRH,#10H
    MOV    ISP_ADDRL,#00H
    MOV    ISP_CONTR,#WAIT_TIME
    ORL    ISP_CONTR,#80H
    MOV    ISP_CMD,#ISP_IAP_BYTE_PROGRAM
    MOV    ISP_TRIG,#46H
    MOV    ISP_TRIG,#0B9H
    NOP
    MOV    ISP_DATA,55H
    MOV    ISP_ADDRH,#10H
    MOV    ISP_ADDRL,#01H
    MOV    ISP_CONTR,#WAIT_TIME
    ORL    ISP_CONTR,#80H
    MOV    ISP_CMD,#ISP_IAP_BYTE_PROGRAM
    MOV    ISP_TRIG,#46H
    MOV    ISP_TRIG,#0B9H
    NOP
    MOV    35H,54H
    MOV    44H,54H
    MOV    4CH,54H
    MOV    36H,55H
    MOV    45H,55H
    MOV    4DH,55H      
    MOV    R1,#50H
    MOV    R3,#0AH
    SETB    08H
    RETI
;-------定时器0中断子程序
TIME0:    JNB    08H,CTC_E    ;发送标志为0转下
    CLR    08H      ;清发送标志
    MOV    A,@R1      ;发送数据
    MOV    SBUF,A
CTC_E:    MOV    TH0,#0DCH    ;设置定时器0定时30MS
    MOV    TL0,#00H
    SETB    TR0      ;起动定时器0
    MOV    WDT_CONTR,#3BH    ;喂狗
    JNB    0EH,CTC_1
    DJNZ    R7,CTC_1
    CLR    0EH
    MOV    P1,#0FFH
    MOV    A,4EH
    MOV    C,0E0H
    MOV    LAMP,C
    CPL    A
    MOV    4EH,A
    RETI
CTC_1:    MOV    A,4EH
    JZ    CTC_2
    JBC    0FH,CTC_3
    DJNZ    R6,CTC_2
    DJNZ    R5,CTC_2
    MOV    P1,#0FCH
    MOV    R7,#40H
    SETB    0EH
    RETI
CTC_3:    MOV    R5,#0EBH
    MOV    R6,#60H
CTC_2:    RETI
;-------定时器0中断子程序结束
END

博弈 发表于 2019-5-26 16:29:47

支持,谢谢分享!

地沟油 发表于 2019-5-26 19:32:55

121339363 发表于 2019-5-27 09:45:50

henhao

fxliuqq 发表于 2019-5-27 10:12:19

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

页: [1]
查看完整版本: STC12C2052的单电控程序程序