我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1479|回复: 5

[技术文章] STC12C2052的单电控程序程序

[复制链接]

该用户从未签到

3

主题

0

回帖

0

积分

一级逆天

积分
0

终身成就奖

发表于 2019-5-26 16:19:11 | 显示全部楼层 |阅读模式
    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    CA/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
回复

使用道具 举报

该用户从未签到

8

主题

470

回帖

0

积分

PADS-190603高级班

积分
0

终身成就奖

发表于 2019-5-26 16:29:47 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

12

主题

7221

回帖

100

积分

游客

积分
100

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2019-5-26 19:32:55 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

7

主题

258

回帖

210

积分

二级逆天

积分
210

终身成就奖

发表于 2019-5-27 09:45:50 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

5

主题

1480

回帖

897

积分

1元学习Allegro(1期)

积分
897

终身成就奖优秀斑竹奖

QQ
发表于 2019-5-27 10:12:19 | 显示全部楼层
回复

使用道具 举报

  • TA的每日心情
    慵懒
    2024-6-14 16:03
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    0

    主题

    1万

    回帖

    7618

    积分

    二级逆天

    积分
    7618

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2019-5-27 11:26:43 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表