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 |