这是写好测试过的速率较快的红外线遥控程序,一秒大概可送50个码,很够用了,发射与接收管距离30CM,直接读取每个位的电平,模仿通用的反码检测,错码不多,应该可用,重要是要能标准的NEC码共存共用,主机除了能用手动遥控器,也能用单片机发射编码控制主机,办法是在接收端的接收程序检测9ms引导码时若发现高电平就跳去快速接收的程序。
发射部分:
;INFRA-RED TRANSMIITION FOR CRYSTAL 11.0592M
AUXR EQU 8EH
WAKE_CLKO EQU 08FH
ORG 0000H
MOV WAKE_CLKO,#00000001B ;ENABLE BRT(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4
MOV AUXR, #11111100B ;T0x12,T1x12,UART_M0x6,BRTRUN,S2SMOD,BRTx12,EXTRAM,S1BRS
MOV TMOD, #00100010B ;TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0)
MOV TL0, #111 ;Tx12 111=38.2K OUTPUT AT P3.4
MOV TH0, #111
SETB TR0 ;RUN T0
SETB EA
START:
SETB P1.0
SETB TR0
LCALL DELAY900 ;1
LCALL DELAY450 ;2
LCALL DELAY185 ;5 3600+185
CLR P1.0
CLR TR0
LCALL DELAY900 ;1
LCALL DELAY450 ;2
LCALL DELAY185 ;5 3600+185
;INC 36H
MOV 36H, #10101010B
MOV 33H, 36H
LCALL BIT8START
LCALL SENT8BIT
MOV A, 33H
CPL A
MOV 33H, A
LCALL SENT8BIT
LCALL BIT8STOP
LCALL DELAY4
JMP START
SENT8BIT:
MOV 31H, 33H ;STORE FOR RE-USE
MOV 34H, #8
SENT8BIT1:
MOV A, 31H
RRC A
MOV 31H, A
JC BIT8ONE
LCALL BIT8LOW
JMP SENTBIT8END
BIT8ONE:
LCALL BIT8HIGH
SENTBIT8END:
DJNZ 34H, SENT8BIT1
RET
BIT8LOW:
CLR P1.0
CLR TR0
LCALL DELAY450
RET
BIT8HIGH:
SETB P1.0
SETB TR0
LCALL DELAY450
RET
BIT8STOP:
CLR P1.0
CLR TR0
LCALL DELAY450
RET
BIT8START:
SETB P1.0
SETB TR0
LCALL DELAY450
RET
DELAY4:
MOV 56H, #255 ;
SLOWDOWN0:
MOV 55H, #35 ;255
SLOWDOWN:
MOV 57H, #1 ;1=3.64M 11=18M
SLOWDOWN2:
DJNZ 57H, SLOWDOWN2
DJNZ 55H, SLOWDOWN
DJNZ 56H, SLOWDOWN0
RET
DELAY900: ;900.0000us ;11M
MOV R3,#100
DELAY900_A:
MOV R4, #23
DELAY900_B:
DJNZ R4, DELAY900_B
NOP
DJNZ R3,DELAY900_A
MOV R3, #9
DELAY900_C:
DJNZ R3, DELAY900_C
NOP
RET
DELAY560: ;560.0000US ;11M
MOV R3,#100
DELAY560_A:
MOV R4, #13
DELAY560_B:
DJNZ R4, DELAY560_B
DJNZ R3,DELAY560_A
MOV R3, #90
DELAY560_C:
DJNZ R3, DELAY560_C
NOP
RET
DELAY1680: ; 1680.0000us 11M
MOV R3,#110
DELAY1680_A:
MOV R4, #40
DELAY1680_B:
DJNZ R4, DELAY1680_B
NOP
NOP
DJNZ R3, DELAY1680_A
MOV R3, #15
DELAY1680_C:
DJNZ R3, DELAY1680_C
NOP
NOP
NOP
RET
DELAY450: ; 450.0000us 11M
MOV R3,#100
DELAY450_A:
MOV R4, #10
DELAY450_B:
DJNZ R4, DELAY450_B
NOP
NOP
NOP
DJNZ R3, DELAY450_A
MOV R3, #14
DELAY450_C:
DJNZ R3, DELAY450_C
NOP
NOP
NOP
NOP
RET
DELAY185: ; 185.0000us 11M
MOV R3,#100
DELAY185_A:
MOV R4, #3
DELAY185_B:
DJNZ R4, DELAY185_B
DJNZ R3, DELAY185_A
MOV R3, #58
DELAY185_C:
DJNZ R3, DELAY185_C
RET
DELAY1000: ;996.5us 11M
MOV R3,#110
DELAY1000_A:
MOV R4, #23
DELAY1000_B:
DJNZ R4, DELAY1000_B
NOP
NOP
;NOP 10065
DJNZ R3,DELAY1000_A
RET
DELAY2400: ;2409us 11M
MOV R3,#242
DELAY2400_A:
MOV R4, #25
DELAY2400_B:
DJNZ R4, DELAY2400_B
NOP
NOP
NOP
NOP
DJNZ R3,DELAY2400_A
RET
END
接收部分:
;THIS VERSION USE NEW IR AND USE 18M CRSTAL
ORG 0000H
ORG 0013H
LJMP EXT_INT1 ;EXTERNAL INTERRUPT1
ORG 0100H ; PROGRAM START
MOV 95H, #00000000B ;SETP2.7 AS HIGHOUTXURRENT FOR IR POWER
MOV 96H, #00010000B ;SETP2.7 AS HIGHOUTXURRENT
SETB P2.7
SETB EX1 ;ENABLE EXTERNAL INTERRUT P3.3
CLR PX1 ;SET EXTERNAL INTERRUT PARITY TO LOW
CLR IE1 ;CLEAR EXTERNAL INTERRUT FLAG
SETB IT1 ;SET AS H TO L AS INTERRUT METHOD
SETB EA
START:
LCALL DELAY3
;LCALL DELAY3
JMP START
EXT_INT1: ;USE FOR INFRA RED
CLR EX1 ;STOP THE INTERRUPT_1
LCALL INFRARED
SETB EX1 ;REOPEN EXTERNAL INTERRUPT 1
CLR IE1 ;CLEAR EXTERNAL INTERRUT FLAG
RETI
INFRARED: ;21-12-2018 NO MORE USING R0
CPL P2.7
MOV DPH, #0
PUSH ACC
IR: ;DETECT 9000US INIT LOW
MOV 62H,#2 ;TEST 5 TIMES 882uS=8820us
IR_SB1:
LCALL DELAY882 ;882us
DJNZ 62H,IR_SB1 ;
JB P3.3,IRNEW ;IF HIGH THEN NEW
CPL P2.7
MOV P0, #0
IREXIT:
POP ACC
RET
IRNEW: ;NEW CODE ;NO START BIT, ONE STOP BIT
CPL P2.7
LCALL DELAY800
LCALL DELAY800
CPL P2.7
JNB P3.3,IREXIT ;IF HIGH THEN NEW
LCALL DELAY250 ;START BIT
CPL P2.7
MOV R7, #8
IRNEW1:
LCALL DELAY450
CPL P2.7
MOV C,P3.3 ;STORE P3.3 TO C
RLC A
DJNZ R7, IRNEW1
MOV 67H, A
MOV R7, #8
IRNEW2:
LCALL DELAY450
CPL P2.7
MOV C,P3.3 ;STORE P3.3 TO C
RLC A
DJNZ R7, IRNEW2
MOV 68H, A
;-----------------STOPBIT
MOV A, 67H
CPL A
CJNE A, 68H, IRNEWEXIT
MOV P1, 68H
SETB 25H ;VALID CODE
IRNEWEXIT:
JMP IREXIT
;========18m
DELAY882: ;882us 18M
MOV R3,#100
DELAY882_A:
MOV R4, #39
DELAY882_B:
DJNZ R4, DELAY882_B
DJNZ R3,DELAY882_A
RET
DELAY1000: ;999.285us 18M
MOV R3,#110
DELAY1000_A:
MOV R4, #40
DELAY1000_B:
DJNZ R4, DELAY1000_B
DJNZ R3,DELAY1000_A
RET
DELAY2400: ;2397.85us 18M
MOV R3,#242
DELAY2400_A:
MOV R4, #44
DELAY2400_B:
DJNZ R4, DELAY2400_B
DJNZ R3,DELAY2400_A
RET
DELAY450: ;450us 18M
MOV R3,#100
DELAY450_A:
MOV R4, #19
DELAY450_B:
DJNZ R4, DELAY450_B
DJNZ R3,DELAY450_A
MOV R3, #29
DELAY450_C:
DJNZ R3, DELAY450_C
RET
DELAY250: ;250us 18M
MOV R3,#75
DELAY250_A:
MOV R4, #19
DELAY250_B:
DJNZ R4, DELAY250_B
DJNZ R3,DELAY250_A
RET
DELAY800: ;800us 18M
MOV R3,#100
DELAY800_A:
MOV R4, #26
DELAY800_B:
DJNZ R4, DELAY800_B
DJNZ R3,DELAY800_A
RET
DELAY3:
MOV 56H, #255 ;
SLOWDOWN0:
MOV 55H, #125 ;255
SLOWDOWN:
MOV 57H, #11 ;1=3.64M 11=18M
SLOWDOWN2:
DJNZ 57H, SLOWDOWN2
DJNZ 55H, SLOWDOWN
DJNZ 56H, SLOWDOWN0
RET
END |