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

📄 pt2262.asm.txt

📁 无线解码程序
💻 TXT
字号:
--  软件模拟PT2272解码程序[作者:蓝妮雅]
;软件解码程序(仿真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            ;



222222
CODE_ADDRESS1    EQU    0B10001100    ;遥控器地址码,更改常数即可实现其他遥控器收码
            CODE_ADDRESS2    EQU    0B00101100  


  R3        EQU    0X03
            PORT5        EQU    0X05
            PORT6        EQU    0X06
            R3        EQU    0X03

            KEY_STATUS    EQU    0X10    ;低半字节为按键标志,高半字节为控制标志
            SIGNAL_LOW    EQU    0X11    ;信号电平低计数器
            SIGNAL_HIGH    EQU    0X12    ;信号电平高计数器
            DATA_RECORDER    EQU    0X13    ;接收码数据字节
            CODE_RECORDER2    EQU    0X14    ;接收码地址高字节
            CODE_RECORDER1    EQU    0X15    ;接收码地址低字节
            CODE_TOTAL    EQU    0X16    ;接收数据位计数器
            KEY_COUNTER    EQU    0X17    ;两次按键检测计数器
/**********************KEY_STATUS标志位定义***********************************/
            AUTORUN_KEY    EQU    0    ;遥控键标志
            LOCK_KEY    EQU    1    ;防盗键标志
            SEARCH_KEY    EQU    2    ;寻车键标志
            OPEN_KEY    EQU    3    ;解除键标志
            PRESS_FLAG    EQU    4    ;有键按下标志
            CHECK_FLAG    EQU    5    ;校验标志
/***********************CONSTANT DEFINE*************************************/
            CODE_ADDRESS1    EQU    0B10001100    ;遥控器地址码,更改常数即可实现其他遥控器收码
            CODE_ADDRESS2    EQU    0B00101100        
            AUTORUN_VALUE    EQU    0B00000011    ;遥控器相应键值,改变相应数值即可更改其功能
            LOCK_VALUE    EQU    0B00001100
            SEARCH_VALUE    EQU    0B00110000
            OPEN_VALUE    EQU    0B11000000
/**********************当PORT6.2口电平为高时调用该程序收码******************/
;PORT6.2为信号输入口

collect_2262:
            mov    a,@0xf0
            And     KEY_STATUS,a
            clr    code_total
            clr    signal_high
collect1:
            inc    signal_high
            MOV    A,SIGNAL_HIGH
            SUB    A,@30
            JBS    R3,0
            RET
            clr    signal_low
            call    delay20us
            jbs    port6,2
            jmp    collect_low
            jmp    collect1
collect_low:    
            mov    a,signal_high    ;信号高电平宽度<80US时滤除
            sub    a,@4
            jbc    r3,0
            ret
            mov    a,@20        ;信号高电平宽度在80—400US时为采集为0
            sub    a,signal_high    ;信号高电平宽度在400US以上时为采集为1
            rrc    data_recorder
            rrc    code_recorder2
            rrc    code_recorder1
            inc    code_total
            clr    signal_high
            mov    a,@24
            xor    a,code_total
            jbc    r3,2
            jmp    collect_end
input_low:
            inc    signal_low
            mov    a,signal_low    ;信号低电平宽度大于800US时滤除
            sub    a,@40
            jbs    r3,0
            ret
            call    delay20us
            jbs    port6,2;3
            jmp    input_low    
            jmp    collect1
collect_end:    
            mov    a,code_recorder1    ;校验低字节地址
            xor    a,@code_address1
            jbs    r3,2
            ret
            mov    a,code_recorder2    ;校验高字节地址
            xor    a,@code_address2
            jbs    r3,2
            ret
            jbs    KEY_STATUS,check_flag    ;是否是第一串收码?
            jmp    storage_data
            bc    KEY_STATUS,check_flag  
            mov    a,com_data_rec
            xor    a,data_recorder
            jbs    r3,2
            jmp    storage_data
            mov    a,data_recorder
            xor    a,@autorun_value        ;是启动键?
            jbs    r3,2
            jmp    key1
            bs    KEY_STATUS,autorun_key    ;置启动键标志
            bs    KEY_STATUS,press_flag    ;置有键按下标志
            clr    key_counter        ;清除按键间隔计数器
            ret            
key1:
            mov    a,data_recorder
            xor    a,@open_value        ;是解除键?
            jbs    r3,2
            jmp    key2
            bs    KEY_STATUS,open_key    
            bs    KEY_STATUS,press_flag
            clr    key_counter    
            ret
key2:
            mov    a,data_recorder
            and    a,@0x0c            ;同时有两个键按下时不为0X30
            xor    a,@lock_value        ;是防盗键?
            jbs    r3,2            
            jmp    key3
            bs    KEY_STATUS,lock_key
            bs    KEY_STATUS,press_flag
            clr    key_counter
key3:
            mov    a,data_recorder
            and    a,@0x30
            xor    a,@search_value    ;是寻车键?
            jbs    r3,2
            ret    
            bs    KEY_STATUS,search_key    
            bs    KEY_STATUS,press_flag
            clr    key_counter            
            ret
storage_data:                        ;第一次收码存储数据字节
            bs    KEY_STATUS,check_flag
            mov    a,data_recorder
            mov    com_data_rec,a
            ret

delay20us:
            wdtc
            mov    a,@3;9
            mov    delay1,a
delay20us_1:        
            nop
            djz    delay1
            jmp    delay20us_1
            ret

⌨️ 快捷键说明

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