电路原理图如下:
STC15W104单片机遥控开关
功能介绍:
1.按键控制继电器释放吸合
2.遥控码控制继电器(只一个按键编码识别,其他编码无效)
3.按键按下时,按遥控器,学习当前遥控码,前码失效(利用内部eeprom)
/*15W408单片机遥控灯,外部中断方式通过测试2018.09.04
IAP_DATA EQU 0C2H ;IAP数据寄存器
IAP_ADDRH EQU 0C3H ;IAP地址寄存器高字(地址需要改变时,才需要重新送地址)
IAP_ADDRL EQU 0C4H ;IAP地址寄存器低字(指令完成后地址不会自动加1或减1)
IAP_CMD EQU 0C5H ;IAP命令寄存器
IAP_TRIG EQU 0C6H ;IAP命令触发寄存器
IAP_CONTR EQU 0C7H ;IAP控制寄存器
P0M1 DATA 0x93 ; P0M1.n,P0M0.n =00--->准双向口, 01--->推挽输出
P0M0 DATA 0x94 ; =10--->高阻输入, 11--->开漏输出
P1M1 DATA 0x91 ; P1M1.n,P1M0.n
P1M0 DATA 0x92 ;
P2M1 DATA 0x95 ; P2M1.n,P2M0.n
P2M0 DATA 0x96 ;
P3M1 DATA 0xB1 ; P3M1.n,P3M0.n
P3M0 DATA 0xB2 ;
P4M1 DATA 0xB3 ; P4M1.n,P4M0.n
P4M0 DATA 0xB4 ;
P5M1 DATA 0xC9 ; P5M1.n,P5M0.n
P5M0 DATA 0xCA ;
P6M1 DATA 0xCB ; P6M1.n,P6M0.n
P6M0 DATA 0xCC ;
P7M1 DATA 0xE1 ;
P7M0 DATA 0xE2 ;
;ENABLE_IAP EQU 80H ;if SYSCLK<30MHz
;ENABLE_IAP EQU 81H ;if SYSCLK<24MHz
;ENABLE_IAP EQU 82H ;if SYSCLK<20MHz
;ENABLE_IAP EQU 83H ;if SYSCLK<12MHz
ENABLE_IAP EQU 84H ;if SYSCLK<6MHz
;ENABLE_IAP EQU 85H ;if SYSCLK<3MHz
;ENABLE_IAP EQU 86H ;if SYSCLK<2MHz
;ENABLE_IAP EQU 87H ;if SYSCLK<1MHz
ADDRESS EQU 00H ;EEPROM扇区地址(第1扇区0000H)(第2扇区0200H)(第3扇区0400H)(第4扇区0600H
P5_0 BIT 0C8H ;P5口定义
P5_1 BIT 0C9H
P5_2 BIT 0CAH
P5_3 BIT 0CBH
P5_4 BIT 0CCH
P5_5 BIT 0CDH
SSR BIT P3.4 ;输出控制脚
S0 BIT P3.3 ;开关灯键和记忆键
IRIN BIT P3.2 ;红外线输入脚
ORG 0000H
LJMP MAIN
ORG 0003H ;外部中断P3.2脚INT0入口地址
LJMP INT_0
ORG 0100h
;=========================主程序================================
MAIN:
MOV SP, #60h
CLR P3.5
CLR A
MOV P0M1, A ;设置准双向口 00--->准双向口, 01--->推挽输出
MOV P0M0, A
MOV P1M1, A ;设置准双向口 10--->高阻输入, 11--->开漏输出
MOV P1M0, A
MOV P2M1, A ;设置准双向口
MOV P2M0, A
MOV P3M1, A ;设置准双向口
MOV P3M0, A
SETB SSR
mov IE,#10000001b ;允许外部中断0
mov IP,#00000001B ;外中断1优先中断
MOV TCON,#00000101B ;都是脉冲下降中
MOV R0,#20h ;20h单元开始放数据
MAIN1:
; LCALL DISPLAY
ACALL KEY
JMP MAIN1
;==================================继电器输出========================================
OUT_0:
MOV A,20H
CJNE A,2AH,WWW ;将接收到的20H、21H、22H与读出的数据比较,
MOV A,21H ;相同继电器就进行动作
CJNE A,2BH,WWW ;
MOV A,22H
CJNE A,2CH,WWW
MOV A,23H
CJNE A,2DH,WWW
CPL SSR
WWW:
RET
;=================================按键程序===========================================
KEY:
JB S0, KEY_D
ACALL DELAY
JB S0, KEY_D
JNB S0, $
ACALL DELAY
JNB S0, $
cpl SSR
KEY_D:
RET
;=========================写入EEPROM数据========================================
WERED:
MOV DPTR,#ADDRESS ;EEPROM扇区起始地址(擦除起始地址)
LCALL IAP_ERASE ;扇区擦除
; MOV DPTR,#ADDRESS ;EEPROM指针写入数据起始地址
; MOV R0,#0 ;检测512字节(256*2=512)
; MOV R1,#2
;CHECK_0: ;检测是否擦除成功(全FF检测)
; LCALL IAP_READ ;读IAP数据
; CJNE A,#0FFH,ERROR ;如果出错,则退出
; INC DPTR ;IAP地址+1
; DJNZ R0,CHECK_0
; DJNZ R1,CHECK_0
;写入数据程序 ;
MOV DPTR,#ADDRESS ;EEPROM扇区起始地址(写数据起始地址)
MOV R0,#4 ;编程3字节
MOV R1,#20H ;写红外解码数据地址
NEXT:
MOV A,@R1 ;准备数据
LCALL IAP_PROGRAM ;字节编程
INC DPTR ;IAP地址+1
INC R1 ;修改数据地址
DJNZ R0,NEXT
RET
;===============读取EEPROM数据===========================
READ_ROM:
MOV DPTR,#ADDRESS ;设置要读取的EEPROM地址(扇区)
MOV R0,#4 ;读取多少字节
MOV R1,#2AH ;数据存放起始地址
CHECK2:
LCALL IAP_READ ;读IAP数据
MOV @R1,A ;数据转移到地址R1指向
INC DPTR ;IAP地址+1
INC R1 ;数据保存地址加1
DJNZ R0,CHECK2 ;是否读完
RET
;=====================关闭IAP========================
IAP_IDLE:
MOV IAP_CONTR,#0 ;关闭IAP功能
MOV IAP_CMD,#0 ; 清除命令寄存器
MOV IAP_TRIG,#0 ;清除触发寄存器
MOV IAP_ADDRH,#80H ;将地址设置到非IAP区域
MOV IAP_ADDRL,#0
RET
;=====================读取一字节=====================
IAP_READ:
MOV IAP_CONTR,#ENABLE_IAP ;允许擦除与等待时间设置(10000xxxB)
MOV IAP_CMD,#01H ;字节读命令
MOV IAP_ADDRL,DPL ;设置IAP低地址
MOV IAP_ADDRH,DPH ;设置IAP高地址
MOV IAP_TRIG,#5AH ;写触发命令(0x5a)
MOV IAP_TRIG,#0A5H ;写触发命令(0xa5)
NOP ;等待ISP/IAP/EEPROM操作完成
MOV A,IAP_DATA ;度IAP数据
LCALL IAP_IDLE ;关闭IAP功能
RET
;====================写一字节数据==================
IAP_PROGRAM:
MOV IAP_CONTR,#ENABLE_IAP ;允许擦除与等待时间设置(10000xxxB)
MOV IAP_CMD,#02H ;字节写命令
MOV IAP_ADDRL,DPL ;设置IAP低地址
MOV IAP_ADDRH,DPH ;设置IAP高地址
MOV IAP_DATA,A ;写IAP数据
MOV IAP_TRIG,#5AH ;写触发命令(0x5a)
MOV IAP_TRIG,#0A5H ;写触发命令(0xa5)
NOP ;等待ISP/IAP/EEPROM操作完成
LCALL IAP_IDLE ;关闭IAP功能
RET
;====================扇区擦除======================
IAP_ERASE:
MOV IAP_CONTR,#ENABLE_IAP ;允许擦除与等待时间设置(10000xxxB)
MOV IAP_CMD,#03H ;扇区擦除命令
MOV IAP_ADDRL,DPL ;设置IAP低地址
MOV IAP_ADDRH,DPH ;设置IAP高地址
MOV IAP_TRIG,#5AH ;写触发命令(0x5a)
MOV IAP_TRIG,#0A5H ;写触发命令(0xa5)
NOP ;等待ISP/IAP/EEPROM操作完成
LCALL IAP_IDLE ;关闭IAP功能
RET
;===================中断程序=======================
INT_0:
CLR EA ;暂时关闭CPU的所有中断请求
MOV R0,#20h ;20h单元开始放数据
MOV R5,#17
L2: ACALL DELAY05_R5
JB IRIN,L10 ;
DJNZ R5,L2 ;重复多次
JNB IRIN,$
MOV R5,#8
L3: ACALL DELAY05_R5
JNB IRIN,L10
DJNZ R5,L3
L4: MOV R3,#0
L5: JNB IRIN,L6
ACALL DEL
JMP L5
L6: JB IRIN,L7
ACALL DEL
JMP L6
L7: MOV R2,#0
L8: ACALL DEL
JB IRIN,L9
MOV A,#8
CLR C
SUBB A,R2
MOV A,@R0
RRC A
MOV @R0,A
INC R3
CJNE R3,#8,L5
MOV R3,#0
INC R0
CJNE R0,#24H,L5
JMP L10
L9: INC R2
CJNE R2,#30,L8
JB S0,L9_0
LCALL WERED
LCALL READ_ROM
L9_0:
L10:
SETB EA ;允许中断,然后退出中断程序
RETI
;=============================================
DE:
DELAY540US: ;@6.000MHz
NOP
PUSH 38H
PUSH 39H
MOV 38H,#3
MOV 39H,#128
NEXT1:
DJNZ 39H,NEXT1
DJNZ 38H,NEXT1
POP 39H
POP 38H
RET
DELAY05_R5: ;总延时时间为0.5ms*R5
DELAY500US: ;@6.000MHz
NOP
PUSH 38H
PUSH 39H
MOV 38H,#3
MOV 39H,#80
NEXT2:
DJNZ 39H,NEXT2
DJNZ 38H,NEXT2
POP 39H
POP 38H
RET
DEL: ;延时为0.093ms
DELAY93US: ;@6.000MHz
NOP
NOP
PUSH 38H
MOV 38H,#108
NEXT3:
DJNZ 38H,NEXT3
POP 38H
RET
;=================延时程序==================
DELAY: MOV R6, #30
D1: MOV R7, #250
DJNZ R7, $
DJNZ R6, D1
RET
;==================================================
END
|