这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 关于红外接收的问题

共2条 1/1 1 跳转至

关于红外接收的问题

院士
2006-09-17 18:14:16     打赏
关于红外接收的问题



关键词: 关于     红外     接收     问题    

院士
2006-12-22 22:43:00     打赏
2楼
问 我做一个东东自己玩完的,但是碰到了问题。
红外协议为ht6221,我能够接受到遥控器上的32位编码了然后
校验,查询表,得到 相应的键值,最后2个数码管显示键的编号。
即遥控器按1,数码管显示为1。
现在是按键可以显示相应的数值,但是反映太慢。
原因是除了正确的编码以外还有好多校验不通过的编码。
系统在不停的校验,而且有可能把下次按键信息丢失,罩成又在校验
无效数据,系统没反映。
如果等他校验完成后在按键,则没有问题,但是时间查不多在4秒左右
希望得到帮助。 1: 程序比较乱,还没完成。KREM EQU P0.0
DATA0 EQU 1AH
DATA1 EQU DATA0+1
DATA2 EQU DATA0+2
DATA3 EQU DATA0+3
BUFF0 EQU 20H
BUFF1 EQU BUFF0+1
BUFF2 EQU BUFF0+2
BUFF3 EQU BUFF0+3
FLAG_LIANJI EQU 50H
DATA_HIGH   EQU 51H
DATA_LOW    EQU 52H
DATA_ALL    EQU 53H
COUNT       EQU 54H


;INIT          初始化寄存器
;GET_DATA      接受数据
;JUDGE_DATA    判断数据
;CHANGE_DATA   转换数据
;DSP_DATA      显示数据
;DELAY         延时
;CODE          编码数据

ORG 0000H
      LJMP START0
ORG 0030H
START0:
      LCALL INIT                   ;初始化
START:LCALL GET_DATA               ;接受数据   应该返回一个1或者0表示
      LCALL JUDGE_DATA     
     /* LCALL CHANGE_DATA */
      ;MOV  COUNT,R2
;///////////////////////
      REM_BAK0: MOV A,R2
       SJMP  END_YK0
       REM_BAK: ;CLR A
       END_YK0: CLR FLAG_LIANJI
       END_YK: SETB EA
   ;///////////
         CLR  P1.4
         ;//////////
      /*  MOV COUNT,A
    MOV A,BUFF2
    XRL A,DATA2
    JZ START*/
        LCALL DISPLAY
        AJMP  START
;//////////////////////
INIT:
    MOV SP,#60H
    MOV P0,#0FFh
    MOV P1,#0FFh
    MOV P2,#0FFh
    MOV P3,#0FFh
    MOV FLAG_LIANJI,#0
    MOV COUNT,#0
    ;/////////
    CLR P1.0
   ; /////////////
    MOV DATA0,#0
    MOV DATA1,#0
    MOV DATA2,#0
    MOV DATA3,#0
    MOV BUFF0,#0
    MOV BUFF1,#0
    MOV BUFF2,#0
    MOV BUFF3,#0
    RET
/*    ;代码转换
CHANGE_DATA:
  MOV R2,#10
  MOV DPTR,#TAB_REMOT
  LOOKUP_1: MOV A,R2
  MOVC A,@A+DPTR
  XRL A,DATA2
  JZ REM_BAK0
  DJNZ R2,LOOKUP_1
   ;///////////
         CLR  P1.7
         ;//////////
  RET  */
;///////////////
;识别代码
JUDGE_DATA:
   MOV A,BUFF0   
   XRL A,#00H    ;系统码的低八位
   JNZ REM_BAK   ;寄存器A中不为0跳到REM_BAK,为0则顺序向下走
   ;JNZ GET_DATA
   MOV A,BUFF1
   XRL A,#0FFH  ;系统码的高八位
   JNZ REM_BAK  ;寄存器A中不为0跳到REM_BAK,为0则顺序向下走
   ; JNZ GET_DATA
   MOV A,BUFF2  ;比较数据码和数据反码是否正确
   CPL A
   XRL A,BUFF3  ;将1CH的值取反后和1DH比较 不同则无效丢弃,核对数据是否准确序
   JNZ REM_BAK  ;如果不相等说明解码失败退出解码程
   ; JNZ GET_DATA
   ;///////////
         CLR  P1.3
         ;//////////
       MOV A,BUFF2
    XRL A,DATA2
    JZ OUT22
      MOV A,BUFF0
      MOV DATA0,A
      MOV A,BUFF1
      MOV DATA1,A
      MOV A,BUFF2
      MOV DATA2,A
      MOV A,BUFF3
      MOV DATA3,A
      MOV BUFF0,#0
      MOV BUFF1,#0
      MOV BUFF2,#0
      MOV BUFF3,#0
      ;///////////
         CLR  P1.6
         ;//////////
  OUT22:
   RET
;//////////////////////
GET_DATA:
         ;///////////
         CLR  P1.1
         ;//////////
         CLR EA
         JNB KREM,REMOT1  ;等待遥控信号出现,有低电平进来,跳到REMOT1,信号有效
     AJMP GET_DATA
REMOT1: ;JB KREM,$
        MOV R6,#10  ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
     SB:LCALL YS1  ;调用900us延时子程序
        JB  KREM,GET_DATA
    DJNZ R6,SB
        JNB KREM,$
    LCALL YS2  ;调用4700us延时子程序
/*     LCALL YS1
         LCALL YS1
         LCALL YS1
         JB  KREM,OUT
         LCALL YS1
         LCALL YS1
         LCALL YS3  */
        MOV R1,#20H
        MOV R2,#4
  PP:    MOV R3,#8       
  JJJJ: JB KREM,$    
        JNB KREM,$ ;等待低电平到来,直到高电平结束
        LCALL YS1    ;延时900us
        MOV C,KREM   
    JNC UUU    ;假如寄存器C是低,就跳到UUU
    JB  KREM,$
   UUU: MOV A,@R1
        RLC A
        MOV @R1,A
        DJNZ R3,JJJJ
        INC R1       
        DJNZ R2,PP
        
     ;///////////
         CLR  P1.2
         ;//////////
     ;存储数据到DATA0--DATA3
  /*    MOV A,BUFF0
       MOV DATA0,A
       MOV A,BUFF1
      MOV DATA1,A
       MOV A,BUFF2
       MOV DATA2,A
      MOV A,BUFF3
      MOV DATA3,A*/
   ;OUT:
   RET  
;////////////////////////    
DISPLAY:
    ; MOV COUNT,A
     MOV A,DATA2   
     ANL A,#0FH     
    ; MOV A,COUNT
     MOV DPTR,#LOW_CODE
     MOVC   A,@A+DPTR
     MOV  P2,A


    
      MOV A,DATA2
      ANL A,#0F0H
      SWAP A
    ;MOV A,COUNT
     MOV DPTR,#HIGH_CODE
     MOVC   A,@A+DPTR
     MOV  P0,A
     RET
;///////////////
;///////////////
YS1: MOV R5,#203    ;延时子程序1,精确延时900us      
  D1:NOP
     NOP
     DJNZ R5,D1
     RET
;///////////////
YS2: MOV R5,#10      ;延时子程序1,精4700US
D2:  MOV R6,#216
     DJNZ R6,$
     DJNZ R5,D2
     RET
;///////////////
YS3: MOV R5,#100    ;延时子程序1,精确延时450us      
  D3:NOP
     NOP
     DJNZ R5,D3
     RET
;///////////////
TAB_REMOT:
    DB   9ah,90h,0b8h,0f8h,0b0h,98h,0d8h,88h,0a8h,0e8h
        ;0   1    2    3   4    5    6   7    8    9  
;////////////////////
HIGH_CODE:
    DB   21h,0afh,45h,0dh,8bh,19h,11h,0adh,01h,09h,81H,13H,71H,07H,51H,0D1H
        ; 0  1    2    3   4   5  6    7   8   9    
LOW_CODE:
    DB  08h,0eah,44h,60h,0a2h,30h,10h,6ah,00h,20h,08H,02H,90H,1CH,0C0H,14H,16H
       ; 0  1    2   3   4    5   6   7   8   9   
;////////////////////
END  2: 原理图,就是没事情完完。 3: 我想1提高系统的校验速度。
2减少无效的编码进入校验子程序。

第一个办法好象不是特别可行,校验肯定要那么几句的。
或者我的判断子程序就是效率较低,总有延时。
请问那位可以帮我看看,谢谢了。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]