|
红外接收目前用的比较多的有三种方法.
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的中断沿,要根据时序,来改变。据此原理,很容易编出代码。 还有一个地方值得注意 ; 红外信号的衰减很厉害的,所以一定要考虑它的接受范围的选择 其实用那种方法都可以,在接收数据时时间方面留够余量,这样对正确接收数据有好处 |