⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用pic做红外线遥控接收1.txt

📁 pic单片机对红外设备控制得一个源程序
💻 TXT
字号:
如何用PIC做红外线遥控接收?  
 ============================    
先用20106之类的片子解调后,你用示波器挂在20106的输出端就可以查看遥控波形。 
=============================
NEC遥控接收第一次正常,以后就不行了(附遥控子程序)请指正。 
不才是PIC领域的新手,最近写了一个关于NEC遥控接收解码的测试程序,下面是此程序的遥控解码部分但是它只能第一次正确判断出接收码,以后就不行了请高手指点

我知道遥控码的连发情况,但我已经设置了32位接收码的计数器,应该不会有问题的
我判断0(1.125ms)和1(2.25ms) 由于我用的是C57,只能通过查询方式来确定.通过高电平的时间(以下程序中延时0.9MS)不同来决定0或1的。

;NEC格式遥控码的接收与解码子程序
;本程序中采用PORTA  0口接收红外遥控,地址码为00H,高位FFH,数据码为00H,反码为FFH,接收到的依次存放到  25H   ADD8L,   26H   ADD8H,DAT8    27H ,
  28H    DAT8F寄存器中。
;第一次接收到此信号即关机.
;============ GOOD ========================

REMOTE_RECEIVER  
         CLRF 20H              ;20H的第0位遥控接收正确与否标志位
         BTFSC     PORTA,0     ;RA0=0接收到信号
         GOTO      BACK        ;判断9MS低电平和4.5MS高电平。

;----5ms delay----------------
         MOVLW     06H         ;防止抖动,延时5ms
         MOVWF     30H
LOOP4 	 MOVLW 0FFH
         MOVWF 31H
LOOP5    DECFSZ 31H,1
         GOTO LOOP5
         DECFSZ 30H,1
         GOTO LOOP4  
;-----------------------------
         BTFSC PORTA,0
         GOTO BACK	      ;遥控接收无效。
LOOP0    BTFSS PORTA,0        ;遥控接收,等待高电平出现,约9-5ms
         GOTO LOOP0

;------------测一个脉冲接收-----
STEP      MOVLW D'32'         ;设置32位接收码的计数器.
          MOVWF BIT32
STEP1     BTFSC PORTA,0       ;等待4.5ms
          GOTO STEP1
STEP2     BTFSS PORTA,0
          GOTO STEP2	     
;-----------------------------
          MOVLW D'180'         ;延时0.9ms,测试高电平的脉宽。
          MOVWF 29H
          BCF STATUS,C
WAIT      NOP
          NOP
          DECFSZ 29H,1
          GOTO WAIT  
;-----------------------------
          BTFSS PORTA,0         ;PA0 TO C
          GOTO C0
          GOTO C1
C0        BCF STATUS,C
          GOTO STEP3
C1        BSF STATUS,C

STEP3     MOVLW D'4'
          MOVWF 2AH
          MOVLW 28H        ;28H是DAT8F的地址
          MOVWF FSR        ;利用FSR进行间接寻址。
STEP4     RLF INDF,1
          DECF FSR,1
          DECFSZ 2AH,1
          GOTO STEP4

          DECFSZ BIT32,1
          GOTO STEP1

          MOVF ADD8L,0
          XORLW 00H
          BTFSS STATUS,Z
          GOTO BACK        ;低8位地址码不对,返回

          MOVF ADD8H,0
          XORLW 0FFH
          BTFSS STATUS,Z
          GOTO BACK

   	  MOVF DAT8,0       ;8位数据码不对,返回
 	  XORLW 00H
  	  BTFSS STATUS,Z
  	  GOTO BACK

   	  MOVF DAT8F,0      ;8位数据反码不对,返回
   	  XORLW 0FFH
    	  BTFSS STATUS,Z
    	  GOTO BACK  

	  GOTO REM_OK       ;代码接收正确
BACK      BSF 20H,0
REM_OK    RETURN
 
 
  
  
回复  先清32位数据再接收.
然后每接收完8位后,RAM要清0

如;**************RAM移位***************************
j1       incf     jsp1     ;8位计数寄存器
         incf     jsp2      ;32位数,计存器.
         btfss    jsp1,3   ;是否有8位
         goto     js
         clrf     jsp1
         movf     sj,0     ;移8位数到W
         movwf       **    ;W到DATA
         incf     f       ;RAM地址加1
         clrf     sj       ;注意这里!!!!!!!!!!!!!!!
;*****************************
         btfss    jsp2,5     ;检测是否接收完32位.
         goto     js         ;否,再检测.
这是6122和6121  IC的接收程序. 
发表于:2003-03-04 17:34:51     
 
  
小宝:很高兴看到你的提示,不过我的程序不是按照每8位接收后经过RAM放入寄存器中,而是每位都经过4次循环移位后直接放入存放数据的寄存器中(参见接收程序中的STEP4),所以不可能按昭你所说的那样清0。
 
 你的程序单独看是没有问题的。我想关键在于发射编码究竟如何?你所谓“第一次可以,以后就不行了”,是不是每次复位后的第一次发射和接受是正常的?如果是这样的,说明还是连发的处理不是很合适。发生连发时,应该将25H-28H清空。否则第二次发射时,25H-28H已经有了部分不完整的数据,造成移位过程中的错误数据,接受失败。
我的意见不一定正确,仅供参考。



NEC遥控接收问题  
NEC遥控接收问题出错在位接收上。
我看程序有点问题,主要是在接收位上,应该是每接受8位后才把FSR-1,在回到接受程序上。如此进行4次可以接受32位的数据。
发表于:2003-03-04 20:46:38     
 
 并不是位接收问题   
我那程序的位接收问题不是先接收8位再保存的,那个4次循环指的是每接收一位后即改变STATUS标志位C,同时4个接收寄存器依次带C位移位,等到接收32位后(即第1位移位32次后恰好保存到了第一个接收寄存器的第7位,第2位移到了第6位)你可以自己演示一下,这样32位正好保存到了4个寄存器中。
可以参见我那段程序的STEP3,STEP4。
很感谢有这么多热心的朋友关心这个问题!
 
 =========================
 红外线遥控编码有几种类型   
 类型不知道,但格式有上千种  
我要做个通用型的红外接收器, 就是不管遥控器发送什么码,反正照收不误, 然后按原样把它发送出去, 我想用PIC做,你看要用哪种型号的控制器做较好!    
 
 既然是转发你管他格式干什么?  
你又不解码,只要检测联接红外管的PIC的I/O口的电压变化就行了,再在另一个脚把他发送出去。送你一个检测红外的小程序。只不过要自己做一点电路。点击浏览该文件  


 最后一位数据位的宽度如何检测!!  
以红外接收器为准,如果没有遥控信号的情况下,接收器的输出端是不是高电平,如果是,最后一位码,0.56ms低电平过后,接着是出现高电平对吧,那高电平的宽度如何确定就不好办了!请教老兄!

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -