来源 CEPARK电子网 http://www.cepark.com/Index.html#
作者: hnrain
红外接收目前用的比较多的有三种方法.
1,查询法,既软件不停地查询是否为低(遥控信号)然后通过精确延时读头码.和
数据0或1码.
2,读到有信号输入时开打开定时计数器,然后通过读定时器的中断次数,来判定头码和0,1的.
3 RB0或RB4-RB7加定时器(或软件延时)利用输入中断的好处是可做实时控制.
如下:
;***发射为6221,把接收到的码值送到ICD的PORTC口显示******
;**************** ***************
org 0000h
nop
goto start
org 0004h
goto serv
;**************************************************
start
bsf status,rp0 ;体1
movlw 0000h
movwf trisc ;C口输出
movlw 0ffh ;B口RB0输入
movwf trisb
movlw B'00000100' ;1:64
movwf option_reg ;TMR0定时器
bcf status,rp0 ;体0
clrf intcon ;10010000
bsf intcon,7 ;开放INT下降沿中断
bsf intcon,4
bcf intcon,1
clrf portc
loop
sleep
nop
goto loop
;*************现场保护********************************
serv
movwf w_temp
swapf status,0
clrf status
movwf status_temp
movf pclath,0
movwf pclath_temp
clrf pclath
;***************遥控处理.******************************
bcf intcon,1
btfsc portb,0 ;检测RB0是否为0.
goto zdhh ;RB0不为0,误中断.反回
call delay8 ;调用8MS延时.头码检测.
btfsc portb,0 ;检测头码
goto zdhh ;不是中断反回
call delay5 ;延时5MS后进行数据检测.
btfss portb,0 ;检测RB0是否为高电平.
goto zdhh ;不是继续检测.
;*********************************************
clrf data1 ;20H
clrf data2 ;21H
clrf data3 ;22H
clrf data4 ;24H
clrf jsp2 ;32位计数器
clrf sj ;接收的数据寄存器
clrf jsp1 ;8位计数器
movlw 0x20 ;20H寄存器送W
movwf fsr ;由W送20H到FSR
jc btfsc portb,0 ;检测RB0是否为低电平.
goto jc ;不是继续检测.
;**************0和1数据检测****************************
js call delay1 ;延时1.3MS
btfsc portb,0 ;检测头码过后是0还是1,
goto s1 ;检测的数据不"1"
;*************0数据处理*****************************
bcf sj,c ;数据是"0"
rrf sj,1 ;0数据右移到SJ寄存器
goto j1
;**************1数据处理.*************************
s1 bsf sj,c
rrf sj,1
ddp btfsc portb,0
goto ddp
;**************RAM移位***************************
j1 incf jsp1 ;8位计数寄存器
incf jsp2 ;32位数,计存器.
btfss jsp1,3 ;是否有8位
goto js
clrf jsp1
movf sj,0 ;移8位数到W
movwf indf ;W到DATA
incf fsr ;RAM地址加1
clrf sj
;*****************************
btfss jsp2,5 ;检测是否接收完32位.
goto js ;否,再检测.
movlw B'10001111' ;送IC高8位码
xorwf data1,0 ;相减(Z:1=结果为0;0=结果不为0)
btfss status,2 ;结果为0则下一步.
goto zdhh ;相减结果不为0中断返回
movlw B'101010101' ;低8位IC码检测
xorwf data2,0
btfss status,2
goto zdhh
;comf data4,0 ;数据反码检测.暂不用.
;subwf data3,0
;btfss status,2
;goto zdhh
movf data3,0 ;送数码到C口
movwf portc
goto zdhh ;接收完32位则中断返回
;****************zdhh中断返回程序*********************
zdhh
movf pclath_temp,0
movwf pclath
swapf status_temp,0 ;交换STATUS与W内容,将体选还原.
movwf status ;将W内容送STATUS寄存器
swapf w_temp,1 ;交换w_temp
swapf w_temp,0 ;交换w_temp与w内容,将w_temp内?
bcf intcon,1
retfie ;中断返回,
;****************8ms*********************************
delay8 bcf intcon,5
bcf intcon,2
movlw D'15'
movwf tmr0
loop1 btfss intcon,2
goto loop1
return
;****************5ms*********************************
delay5 bcf intcon,5
bcf intcon,2
movlw D'120'
movwf tmr0
loop2 btfss intcon,2
goto loop2
return
;****************1.3ms*******************************
delay1 bcf intcon,5
bcf intcon,2
movlw D'240'
movwf tmr0
loop3 btfss intcon,2
goto loop3
return
;*************
end
错码的可能有两种
一个是字头对不好
一个是数据传输有错误 特别是时序错误
后面的可以用软件校验
字头不好确认 最好可以在软件规定上连续多发几个 然后用移位方法判断有多次连续相同子头出现 对齐字头 比如连续出现20个1 0转换后 表示准备发送数据 然后等待1 0 传输结束后 跟着有一个字头 如11110000 这样 后面就可以接数据了
A 我在外面买了一个万能遥控器,他就是用pic16c57c作的,那就说明它是没有中断的,我真搞不懂他是怎么做的,它是没有解码芯片的,请问有谁知道,我现在也在做这个,有谁能提示一下,谢谢。
B 这很容易
上次我用两片PIC16C57C作了一个发射与一个接收的小模块。有效控制,没能出现乱码,但有一缺点就是会受到其它红外线产品的干扰!!
C 红外接受
用外中断,加定时,即可检测出编码,非常准确。我用的是PIC16F72芯片。
D 我使用红外线接受管加两级放大,看红外线的输出波形,用长虹的遥控器当信号源,在示波器上要打到10ms才能看到完整的信号波形,像个稳压后的波形一样的东西,我看了有关方面的书说,红外线信号时调制在38khz的信号上的,那我将示波器打到50ns上为什么看不到波形,这样的话程序不是没有办法编了,望哪位高人帮帮我,谢谢
E 可以用CCP中的input capture(输入捕捉)功能,很好用的,仔细阅读一下input capture有关内容,很容易的
在CCP的引脚上若有事件发生(可设置为上升沿,下降沿或其他方式),TMR1的内容背记录,这样很准确的,即使中断响应较慢也没问题的,这样的功能来做红外遥控最恰当不过!!
F 回复红外定时接收原理
用RB0做中断(FIRST:RISING TRIG,SECOND:FALLING TRIG),同时启动TIMER2定时100US)计数.当下一个中断来临时,由TIMER2有88个数,9MS就检测出来。其余时间,
类推。注意,RBO的中断沿,要根据时序,来改变。据此原理,很容易编出代码。
还有一个地方值得注意 ; 红外信号的衰减很厉害的,所以一定要考虑它的接受范围的选择
其实用那种方法都可以,在接收数据时时间方面留够余量,这样对正确接收数据有好处
文章评论(0条评论)
登录后参与讨论