×
单片机 > 单片机程序设计 > 详情

PIC做的红外线遥控接收程序

发布时间:2020-06-08 发布时间:
|

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





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法