cpubbs 发表于 2005-9-22 22:36:18

[转帖]软件解码程序(仿真PT2272)

<P>转贴自电子制作实验室:</P>
<P>;软件解码程序(仿真PT2272)               ;
;晶体频率为11.0592Mhz
;本程序中的时间定位关系只适用于接3.3M振荡电阻的PT2262解码
;使用其它阻值电阻时,应将定位时间按电阻比例缩放
;下面的程序中 REM 为信号输入端
;RECEIVE      检测到有效信号标志位
;ENABLE_DETE    连续按键标志
;3AH,3BH用作定时器                      ;
;PT2262共12根地址线                     ;
;31H,32H:接收的前8 位地址编码         ;
;33H,30H:接收的后4 位地址编码(若最后4位用作数据端,则只须读第33H单元的内容即可)
;当用作数据端时,PT2262对应脚悬空被认为是低电平。
;地址数据说明                           ;
;以31H.0 和32H.0 为例                   ;
;悬空 : 31H.0=0 32H.0=1               ;
;    1: 31H.0=1 32H.0=1               ;
;    0: 31H.0=0 32H.0=0               ;
;出错   31H.0=1 32H.0=0               ;
;
;说明:为了能可靠检测到有效信号,建议每次接收至少检测3次,然后比较3次检测值
;3次值相同才认为收到了正确信号。可在主程序中如下处理:第1次检测时调用REMOTE
;第2、3次检测时调用REMOTES,请注意必需连续调用,否则得不到正确的数据
;
;注意:将T1设定为16位定时器,允许中断,否则将导致接收数据错误
;---------------------------------------;
REMOTE:                                 ;
      CLR   RECEIVE               ;
;检测50ms 内有没有编码接收            ;
      MOV   3AH,#55               ;
REMOTEA:                              ;
      MOV   3BH,#250                ;
REMOTEB:                              ;
      JB      REM,REMOTE0             ;有码发送则跳转
      DJNZ    3BH,REMOTEB             ;
      DJNZ    3AH,REMOTEA             ;
REMOTE_END_1:                           ;
      CLR   ENABLE_DETE             ;
REMOTE_END:                           ;
      CLR   REMOTING                ;清除探头检测标志
      RET                           ;
REMOTE0:                              ;
      JB      ENABLE_DETE,REMOTE_END_1;按键没有放开则返回
REMOTES:
      MOV   34H,#12               ;接收12位编码
;解码                                 ;
;先找出接收码的开头即10ms 左右的高电平;
;设置高电平时间为8~12ms               ;
;检测和等待8ms 的低电平,70ms门限      ;
      CLR   T_OVER                  ;
      MOV   TH1,#00H                ;
      MOV   TL1,#00H                ;
      SETB    TR1                     ;
REMOTE1:                              ;
      MOV   3AH,#50               ;
REMOTE2:                              ;
      MOV   3BH,#25               ;
REMOTE3:                              ;
      JB      REM,REMOTE1             ;
      JB      T_OVER,REMOTE_END       ;
      DJNZ    3BH,REMOTE3             ;
      DJNZ    3AH,REMOTE2             ;
                                        ;
;等待在4ms 内接收到的高电平             ;
      CLR   T_OVER                  ;
      MOV   TH1,#0F1H               ;
      MOV   TL1,#0F0H               ;
      SETB    TR1                     ;
REMOTE_4:                               ;
      JB      T_OVER,REMOTE_5         ;
      JNB   REM,REMOTE_4            ;
      CLR   TR1                     ;
      AJMP    REMOTE6               ;
;超出12ms 接收错误返回                  ;
REMOTE_5:                               ;
      AJMP    REMOTE_END            ;
REMOTE6:                              ;
;等待550us 后采集接收信号               ;
      MOV   3AH,#00               ;
      DJNZ    3AH,$                   ;
;采集接收信号并记录                     ;
      MOV   C,REM                   ;
      MOV   A,33H                   ;
      RLC   A                     ;
      MOV   33H,A                   ;
      MOV   A,31H                   ;
      RLC   A                     ;
      MOV   31H,A                   ;
;等待第二个上升沿,限时1.5ms             ;
      CLR   T_OVER                  ;
      MOV   TH1,#0FAH               ;
      MOV   TL1,#099H               ;
      SETB    TR1                     ;
RM1:    JB      T_OVER,REMOTE_END       ;
      JB      REM,RM1               ;
      CLR   TR1                     ;
                                        ;
      CLR   T_OVER                  ;
      MOV   TH1,#0FAH               ;
      MOV   TL1,#099H               ;
      SETB    TR1                     ;
RM2:    JB      T_OVER,REMOTE_END       ;
      JNB   REM,RM2               ;
      CLR   TR1                     ;
;等待550us 后采集接收信号               ;
      MOV   3AH,#00               ;
      DJNZ    3AH,$                   ;
      MOV   C,REM                   ;
      MOV   A,30H                   ;
      RLC   A                     ;
      MOV   30H,A                   ;
      MOV   A,32H                   ;
      RLC   A                     ;
      MOV   32H,A                   ;
;等待第二个码值的上升沿               ;
      CLR   T_OVER                  ;
      MOV   TH1,#0FAH               ;
      MOV   TL1,#099H               ;
      SETB    TR1                     ;
RM3:    JB      T_OVER,RM5            ;
      JB      REM,RM3               ;
      CLR   TR1                     ;
                                        ;
      CLR   T_OVER                  ;
      MOV   TH1,#0FAH               ;
      MOV   TL1,#099H               ;
      SETB    TR1                     ;
RM4:    JB      T_OVER,RM5            ;
      JNB   REM,RM4               ;
      CLR   TR1                     ;
      DJNZ    34H,REMOTE6             ;
;把接收的编码左移4 位将8 位密码放在同一字节上
      MOV   34H,#4                  ;
      AJMP    REMOTE7               ;
RM5:    AJMP    REMOTE_END            ;
REMOTE7:                              ;
      CLR   C                     ;
      MOV   A,33H                   ;
      RLC   A                     ;
      MOV   33H,A                   ;
      MOV   A,31H                   ;
      RLC   A                     ;
      MOV   31H,A                   ;
      CLR   C                     ;
      MOV   A,30H                   ;
      RLC   A                     ;
      MOV   30H,A                   ;
      MOV   A,32H                   ;
      RLC   A                     ;
      MOV   32H,A                   ;
      DJNZ    34H,REMOTE7             ;
;把4 位数据编码由高4 位移到低4 位上   ;
      MOV   A,33H                   ;
      SWAP    A                     ;
      MOV   33H,A                   ;
      MOV   A,30H                   ;
      SWAP    A                     ;
      MOV   30H,A                   ;
      SETB    ENABLE_DETE             ;
      SETB    RECEIVE               ;
                                        ;
      AJMP    REMOTE_END_1            ;


:   </P>
[此贴子已经被作者于2005-9-22 14:47:43编辑过]
页: [1]
查看完整版本: [转帖]软件解码程序(仿真PT2272)