原创 如何用PIC做红外线遥控接收?(二)

2009-8-3 12:45 1475 1 1 分类: MCU/ 嵌入式

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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /3 下一条