找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1986|回复: 4
收起左侧

以STC12单片机用最笨的方法产生最精准的红外线遥控讯号

[复制链接]
ID:283954 发表于 2018-12-28 04:23 | 显示全部楼层 |阅读模式
     想用单片机通过红外线向另一个单片机输入控制讯号,所以就得自己写个能根据NEC遥控码的发射程序,首先是产生38K的载波,用11.0592m的晶振,在STC12的P3.4脚用T0定时器可获得38.2K的载波,不是很准,应该可以用,接着就是用循环程序获得450US, 560US, 900US, 1680US的定时,要通过计算来得到精确的定时是不可能的,只能用逻辑分析仪观察P1.0的波形周期了,用简单的循环也不能获得精确的定时,得有大循环(2层),小循环(一层),加上无循环的NOP,不断地试,这才得到精准的定时,这方法是很笨,因此花费了不少小时,这就是最后的结果了,至于如何编码发射,那是很简单的事了。


IR-1.jpg
IR-2.jpg
IR-4.jpg


;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:
LCALL LEADINGBIT
LCALL ZEROBIT
LCALL ONEBIT
JMP START

LEADINGBIT:
SETB P1.0
SETB TR0
LCALL DELAY900 ;1
LCALL DELAY900 ;2
LCALL DELAY900 ;3
LCALL DELAY900 ;4
LCALL DELAY900 ;5
LCALL DELAY900 ;6
LCALL DELAY900 ;7
LCALL DELAY900 ;8
LCALL DELAY900 ;9
LCALL DELAY900 ;10
NOP
NOP
NOP
NOP
NOP
NOP
CLR P1.0
CLR TR0
LCALL DELAY450
LCALL DELAY450
LCALL DELAY450
LCALL DELAY450
LCALL DELAY450
LCALL DELAY450
LCALL DELAY450
LCALL DELAY450
LCALL DELAY450
LCALL DELAY450
NOP
NOP
NOP
NOP
NOP
RET

ZEROBIT:
SETB P1.0
SETB TR0
LCALL DELAY560
CLR P1.0
CLR TR0
LCALL DELAY560
RET

ONEBIT:
SETB P1.0
SETB TR0
LCALL DELAY560
CLR P1.0
CLR TR0
LCALL DELAY1680
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

END


IR-3.jpg

评分

参与人数 1黑币 +90 收起 理由
admin + 90 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:283954 发表于 2018-12-29 01:02 | 显示全部楼层
终于把发送一个完整遥控码的程序写完了,原来发射完所有32BIT的码后得加上一个560US载波的停止位,否则最后那个位是0的时候就会出错,另外发现 CPL 33H 这个命令是无效的,而编译软件并没有报错,执行时 33H 根本没有对補,而必须先把33H送进A,CPL A 后,再送回33H才行。

红外线的传输速率是很有限的,因为一个周期是108MS,所以还得在传送后DELAY,否则接收端无反应

START:
MOV A, #01010101B
LCALL SENTINFRA
MOV A, #10101010B
LCALL SENTINFRA
JMP START

SENTINFRA:            ;VALUE PUT A
MOV 32H, A            ;SAVE FOR RE-USE
MOV 33H, #11110000B   ;USER CODE
LCALL LEADINGBIT
;----------------USERCODE
MOV 30H, 33H
LCALL SENTBYTE
MOV A, 33H
CPL A
MOV 30H, A
LCALL SENTBYTE
;----------------SCANCODE
MOV 30H, 32H
LCALL SENTBYTE
MOV A, 32H
CPL A
MOV 30H, A
LCALL SENTBYTE
LCALL STOPBIT
LCALL DELAY3
RET

SENTBYTE:
MOV 31H, 30H
MOV 34H, #8
SENTBYTE1:
MOV A, 31H
RRC A
MOV 31H, A
JC BIT1
LCALL ZEROBIT
JMP BITEND
BIT1:
LCALL ONEBIT
BITEND:
DJNZ 34H, SENTBYTE1
RET

DELAY3:
MOV 56H, #255 ;
SLOWDOWN0:
MOV 55H, #100  ;255
SLOWDOWN:
MOV 57H, #1   ;1=3.64M 11=18M
SLOWDOWN2:
DJNZ 57H, SLOWDOWN2
DJNZ 55H, SLOWDOWN
DJNZ 56H, SLOWDOWN0
RET

回复

使用道具 举报

ID:343102 发表于 2018-12-29 10:45 | 显示全部楼层
用单片机通过红外线向另一个单片机输入控制讯号没必要编码,可以模拟串口,就像无线发射。
不过你的研究还是有用的,可以当红外遥控器用。
回复

使用道具 举报

ID:283954 发表于 2018-12-29 13:02 | 显示全部楼层
我的那台用STC12做的主机已经有标准的NEC红外线接收设备,可以用标准的遥控器控制了,而两个串口都已经被占用了,要想用另一个单片机给它下点控制命令只能通过红外线了, 在摸懂了这个编码后,就可以做另外的实验,第一的想法就是要加快传输速率,一个码要108MS实在太慢,那是因为是“遥控”,距离远,如果发射管和接收管距离短,几乎面对面,提高速率是完全可能的,正在构思。
回复

使用道具 举报

ID:283954 发表于 2018-12-30 16:04 | 显示全部楼层
这是写好测试过的速率较快的红外线遥控程序,一秒大概可送50个码,很够用了,发射与接收管距离30CM,直接读取每个位的电平,模仿通用的反码检测,错码不多,应该可用,重要是要能标准的NEC码共存共用,主机除了能用手动遥控器,也能用单片机发射编码控制主机,办法是在接收端的接收程序检测9ms引导码时若发现高电平就跳去快速接收的程序。

IR450JJJ.jpg

发射部分:

;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
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表