首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

请大家解答遥控解码程序利用寄存器设置9MS引导码和4.5MS结果码的检测方法解决思路

2012-03-24 
请大家解答遥控解码程序利用寄存器设置9MS引导码和4.5MS结果码的检测方法本来这个程序是用延时子程序10MS

请大家解答遥控解码程序利用寄存器设置9MS引导码和4.5MS结果码的检测方法
本来这个程序是用延时子程序10MS来检测引导码,但是这样设计后在实际仿真中解码出现的问题好多,这个硬件电路的晶振是4MHZ的机器周期为3,本人用
DCNT1     EQU     24H
DCNT2     EQU     25H     分别放入计数值\   大家请在   “IR   译码子程序”应该怎样设置   A.9MS引导码     的计数范围在   8.5 <计数时间 <9     B.   4.5MS结果码计数范围在
4 <计数时间 <4.5


                    9012   遥控键值读取器                                                                                               *
;*                   LED   显示,   P1口为LED的数据口                                                                                     *
;*                   上电后,将8个LED全部点亮                                                                                           *
;*                   K17键按下,继电器吸合。K19键按下,继电器关闭。                                               *
;*                                                                                                                                                             *


;-----------------------------------------------
              IRCOM     EQU     20H               ;20H-23H   IR使用
              DCNT1     EQU     24H
              DCNT2     EQU     25H

              IRIN       EQU     P3.2             ;IR信号输入,外部中断0入口
              BEEP       EQU     P2.4             ;蜂鸣器连接地址
              RELAY     EQU     P2.6             ;使P2.6输出高,关闭继电器21F吸合线圈,使P2.6输出低,打开继电器21F吸合线圈
;------------------------------------------------
                  ORG   0000H
                  JMP     MAIN
;------------------------------------------------
MAIN:


                    MOV       SP,#60H                 ;设置堆栈指针为60H   P165
                    MOV       A,#00H
                    MOV       R0,#20H
LOOP0:         MOV       @R0,A                     ;20H-27H清零   地址20H的内容00H,R0和A的内容都不变   P116
                    INC       R0                           ;R0的内容加1
                    CJNE     R0,#25H,LOOP0     ;寄存器与立即数不相等,跳到LOOP0
                    SETB     IRIN
                    SETB     BEEP
                    SETB     RELAY
                    MOV     22H,#0FFH               ;8位用户编码,8位反码
                    CALL     IR_SHOW                 ;8个LED全部亮
LOOP1:
                    CALL     IR_IN
                    CPL       A                               ;累加器取补数
                    CJNE     A,#40H,LOOP2         ;K17键按下
                    CLR       RELAY                       ;继电器吸合
LOOP2:         CJNE     A,#04H,LOOP3         ;K19键按下
                    SETB     RELAY                       ;继电器关闭

LOOP3:         JMP       LOOP1

;---------------------------------------------------
;   IR   译码子程序
;---------------------------------------------------
IR_IN:
                    MOV       R0,#IRCOM
  I1:             JNB     IRIN,I2               ;等待   IR   信号出现,IRIN=0则跳转到I2
                    JMP     N1
                                                                    ;I2:             MOV     R4,#20
                                                                    ;I20:           CALL     DEL                     ;DELAY     R5*0.14MS


  I2:            
                    MOV       DCNT1,#8
  A2:             MOV       DCNT2,#200
  ;如果计数8MS不成功如下处理
  A1:             JNB       IRIN,AA
                    JMP       N1
  AA:             JNB       DCNT2,   BB
                    JMP       A1
  BB:             JNB       DCNT1,   CC
                    JMP       A2
  ;开始计数2MS
  CC:             MOV       DCNT1,#2
  DD:             MOV       DCNT1,#200
  ;如果计数2MS不成功如下处理
  EE:             JNB       IRIN,FF
                    JMP       ISHEADE
  FF:             JNB       DCNT2,GG
                    JMP       EE
  GG:             JNB       DCNT1,N1
                    JMP       DD

  ISHEADE:   MOV       DCNT1,#4
  HH:             MOV       DCNT2,#200
  ;如果计数4MS无效,如下处理
  II:             JNB       IRIN,JJ
                    JMP       N1
  JJ:             JNB       DCNT2,KK
                    JMP       II
  KK:             JNB       DCNT1,LL
                    JMP       HH
 
  LL:             JB       IRIN,MM
                    JMP     LL
  ;同时清空计数器,重新接收解码                  
  MM:             MOV       DCNT1,#00H
  NN:             CALL     DELAY1                                                                    
                    MOV     A,#8
                    CLR     C
                    SUBB     A,R2                   ;判断高低位   A=8-0-1=7H     大于1有进位,小于1无进位   P126   看I5:             MOV     R2,#0


                                                          ;IF   C=0     BIT=0
                    MOV     A,@R0                   ;A=20H,R0的内容不变       P114     IR_IN:         MOV       R0,#IRCOM
                    RRC     A                           ;00100000   \00010000   C=0   P=124   即A=10H                                   这句注释对吗??
                    MOV     @R0,A                   ;处理完一位     地址20H的内容10H,R0和A的内容都不变   P116       这句注释对吗??
                    INC     R3                         ;R3内容加1
                    CJNE     R3,#8,LL           ;需处理完8位,寄存器与立即数不相等则跳转
                    MOV     R3,#0
                    INC     R0                         ;20H+1
                    CJNE     R0,#24H,LL       ;收集到4字节了即32位,1字节8位     这句注释对吗??
                    JMP     IR_SHOW
  N1:             ;INC     R2
                    ;CJNE     R2,#30,L1         ;0.14ms   计数过长则时间到自动离开,寄存器与立即数不相等即跳转
                    RET
;---------------------------
;键值显示
;22H存入用户编码,23H存入用户编码的反码
;---------------------------
IR_SHOW:
                    MOV   A,22H
                    CPL   A                                 ;将22H取反后和23H比较
                    CJNE   A,23H,IR_SHOW1     ;如果不等表示接收数据发生错误,放弃。
                    MOV     P1,A
                    CALL     BEEP_BL                 ;蜂鸣器鸣响表示解码成功
IR_SHOW1:   RET

;--------------------
;蜂鸣器响一声子程序
;--------------------
BEEP_BL:
                  MOV     R6,#100
    BL1:       CALL     DEX1
                  CPL     BEEP


                  DJNZ     R6,BL1
                  MOV     R5,#20
                  CALL     DELAY
                  RET
  DEX1:       MOV     R7,#180
  DEX2:       NOP
                  DJNZ     R7,DEX2
                  RET
  DELAY:                                         ;延时R5×10MS
                  MOV     R6,#50
    D1:         MOV     R7,#100
                  DJNZ     R7,$                 ;LOOP:     DJNZ   R7,LOOP   寄存器减一不为0跳转
                  DJNZ     R6,D1
                  DJNZ     R5,DELAY
                  RET
;------------------------------------------------
;   DELAY     R5*0.14MS
DEL:
                    MOV     R5,#1               ;IR解码使用
DEL0:           MOV     R6,#2
DEL1:           MOV     R7,#32
DEL2:           DJNZ     R7,DEL2
                    DJNZ     R6,DEL1
                    DJNZ     R5,DEL0
                    RET                                                                          
DELAY1:       MOV     R6,#03H         ;延时10US
      DL1:       NOP
                    DJNZ   R6,DL1
                    RET

;---------------------------------
                END                               ;结束

;================================


;******     红外遥控器键值表     ******

;     10           03             01             06
;     09           1D             1F             0D
;     19           1B             11             15
;     17           12             16             4C


;     40           48             04             00
;     02           05             54             4D
;     0A           1E             0E             1A
;     1C           14             0F             0C
;================================


[解决办法]
你可以用一个TCC当生命周期来用 时间扣的紧一点 这东西是很简单的
单纯用记数 会有误动作
还有注意 多检测几次 进行表决 避免干扰哈

热点排行