電路原理圖如下:
QQ圖片20181203190916.png (27.45 KB, 下載次數: 164)
下載附件
2018-12-3 19:13 上傳
QQ圖片20181203190952.png (31.83 KB, 下載次數: 171)
下載附件
2018-12-3 19:13 上傳
QQ圖片20181203191014.png (31.4 KB, 下載次數: 145)
下載附件
2018-12-3 19:13 上傳
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
|