找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1390|回复: 0
打印 上一主题 下一主题
收起左侧

五功能码接收器

[复制链接]
跳转到指定楼层
楼主
ID:288962 发表于 2018-3-7 22:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C_RX_PORT        EQU               
C_RX_PIN                EQU               
C_HEAD_NUM                EQU        4
C_DU_HEAD_CHECK        EQU        0001B
C_DU_LOW_LEVEL_FILTER        EQU        1000B
C_DU_CLEAR_LOW_LEVEL_FILTER        EQU        0111B
C_RX_HEAD1_HIGH_NUM        EQU        1
C_RX_HEAD_TIMER0        EQU        15      
C_RX_HEAD_TIMER1        EQU        15 ;ERROR>=31.35*15^2=8000US=8MS
C_RX_HEAD_TIMER2        EQU        0
C_RX_HEAD_TIMER3        EQU        2        ;2*500=1MS
C_RX_HEAD_TIMER4        EQU 0
C_RX_HEAD_TIMER5        EQU        4        ;4*500=2MS
C_RX_DATA_TIMER0                EQU        7
C_RX_DATA_TIMER1                EQU        0        ;ERROR<=7*31.25=220US
C_RX_DATA_TIMER2                EQU        0
C_RX_DATA_TIMER3                EQU        4        ;ERROR>=4*500=2MS
C_RX_DATA_TIMER4                EQU        0
C_RX_DATA_TIMER5                EQU        2        ;1_0 //1>=1000uS

MACRO_RECEIVER MACRO
RECEIVER:
        LDPCH        RECEIVER
       
        LDMAH        #0
        LD        A,(R_IR_TX_RX);//BIT3=1收到码后,等待处理再收下一组码
        AND        A,#1000B
        JNZ        EXIT_RECEIVER

        CLR C
        INC        (M0_RX_TIMER0);0~500US
        ADR (M0_RX_TIMER1);500US~8000US(8MS)
       
        LD        A,(M0_RX_INDEX)
        AND        A,#C_DU_LOW_LEVEL_FILTER
        JNZ        LOW_LEVEL_FILTER        ;1
       
        LD        A,(M0_RX_INDEX)
        AND        A,#C_DU_HEAD_CHECK       
        JNZ        CHECK_DATA                ;1
        JMP        CHECK_HEAD                ;0
       
        LOW_LEVEL_FILTER:
                LD        A,(C_RX_PORT)
                AND        A,#C_RX_PIN
                JZ        CLEAR_RECEIVER_TIMER_AND_EXIT
                LD        A,(M0_RX_INDEX)
                AND        A,#C_DU_CLEAR_LOW_LEVEL_FILTER
                LD        (M0_RX_INDEX),A
                JMP        CLEAR_RECEIVER_TIMER_AND_EXIT
               
        CHECK_HEAD:
                LD        A,(C_RX_PORT)
                AND        A,#C_RX_PIN
                JZ        RX_HEAD1_LEVEL_HOP ;JZ        EXIT:CHECK HIGH _ JNZ EXIT :CHECK LOW
               
                        CLR C
                        LD        A,(M0_RX_TIMER0)
                        SBC        A,#C_RX_HEAD_TIMER0 ;OVERFLOW CHECK
                        LD        A,(M0_RX_TIMER1)
                        SBC        A,#C_RX_HEAD_TIMER1
                        JNC        RECEIVER_IS_ERROR
                        JMP        RECEIVER_EXIT       
                       
                RX_HEAD1_LEVEL_HOP:       
                        CLR C
                        LD        A,(M0_RX_TIMER0)
                        SBC        A,#C_RX_HEAD_TIMER2               
                        LD        A,(M0_RX_TIMER1)
                        SBC        A,#C_RX_HEAD_TIMER3
                        JC        RECEIVER_IS_ERROR                ;<JUMP
                       
                                CLR C
                                LD        A,(M0_RX_TIMER0)
                                SBC        A,#C_RX_HEAD_TIMER4               
                                LD        A,(M0_RX_TIMER1)
                                SBC        A,#C_RX_HEAD_TIMER5
                                JNC        RECEIVER_IS_ERROR                ;>JUMP
                               
                                ;HEAD RIGHT
                                LD        A,(M0_RX_INDEX)
                                OR        A,#C_DU_LOW_LEVEL_FILTER        ;HEAD AVOID LOW LEVEL
                                LD        (M0_RX_INDEX),A
                                INC        (M2_HEAD_NUM_CNT)
                                LD        A,(M2_HEAD_NUM_CNT)
                                CMP        A,#C_HEAD_NUM               
                                JNZ        CLEAR_RECEIVER_TIMER_AND_EXIT
                                ;HEAD NUM RIGHT
                                LD        A,(M0_RX_INDEX)
                                OR        A,#C_DU_HEAD_CHECK       
                                LD        (M0_RX_INDEX),A
                                JMP        CLEAR_RECEIVER_TIMER_AND_EXIT
                       
        CHECK_DATA:
                LD        A,(C_RX_PORT)
                AND        A,#C_RX_PIN
                JZ        DATA_PROCESS       
                JMP        EXIT_RECEIVER       
                DATA_PROCESS:
                CLR C
                LD        A,(M0_RX_TIMER0)
                SBC        A,#C_RX_DATA_TIMER0               
                LD        A,(M0_RX_TIMER1)
                SBC        A,#C_RX_DATA_TIMER1
                JC        CHECK_DATA_ORDER                ;<JUMP
                        CLR C
                        LD        A,(M0_RX_TIMER0)
                        SBC        A,#C_RX_DATA_TIMER2               
                        LD        A,(M0_RX_TIMER1)
                        SBC        A,#C_RX_DATA_TIMER3
                        JNC        CHECK_DATA_ORDER                ;>JUMP
                                ;DATA IS RIGHT
                                CLR        C
                                INC        (5FUC_CNT_DATA0)
                                ADR        (5FUC_CNT_DATA1)
                                LD        A,(M0_RX_INDEX)
                                OR        A,#C_DU_LOW_LEVEL_FILTER        ;HEAD AVOID LOW LEVEL
                                LD        (M0_RX_INDEX),A
                                JMP        CLEAR_RECEIVER_TIMER_AND_EXIT
CHECK_DATA_ORDER:       
        LD        A,(5FUC_CNT_DATA1)
        JZ        FORWARD
        CMP        A,#0001B
        JZ        CHECK_F_LEFT_AND_MORPH
        CMP        A,#0010B
        JZ        CHECK_BACK_FRIGHT_BRIGHT
        CMP        A,#0011B
        JZ        CHECK_LEFT_BLEFT
        CMP        A,#1000B
        JZ        RIGHT
        JMP        RECEIVER_IS_ERROR
       
        CHECK_F_LEFT_AND_MORPH:
                LD        A,(5FUC_CNT_DATA0)
                CMP        A,#0110B
                JZ        MORPH
                CMP        A,#1100B
                JZ        FORWAR_LEFT
                JMP        RECEIVER_IS_ERROR
               
        CHECK_BACK_FRIGHT_BRIGHT:
                LD        A,(5FUC_CNT_DATA0)
                CMP        A,#0010B
                JZ        FORWAR_RIGHT
                CMP        A,#1000B
                JZ        BACK
                CMP        A,#1110B
                JZ        BACK_RIGHT
                JMP        RECEIVER_IS_ERROR
               
        CHECK_LEFT_BLEFT:
                LD        A,(5FUC_CNT_DATA0)
                CMP        A,#0100B
                JZ        BACK_LEFT
                CMP        A,#1010B
                JZ        LEFT
                JMP        RECEIVER_IS_ERROR
        FORWARD:
                LD        A,#0010B
                JMP        GET_A_DIRECTION_ORDER
        BACK:
                LD        A,#0001B
                JMP        GET_A_DIRECTION_ORDER
        LEFT:
                LD        A,#0100B
                JMP        GET_A_DIRECTION_ORDER
        RIGHT:
                LD        A,#1000B
                JMP        GET_A_DIRECTION_ORDER
        FORWAR_LEFT:
                LD        A,#0110B
                JMP        GET_A_DIRECTION_ORDER
        FORWAR_RIGHT:
                LD        A,#1010B
                JMP        GET_A_DIRECTION_ORDER
        BACK_LEFT:
                LD        A,#0101B
                JMP        GET_A_DIRECTION_ORDER
        BACK_RIGHT:
                LD        A,#1001B
                JMP        GET_A_DIRECTION_ORDER
        MORPH:
                ;LDMAH #0
                LD        A,#0010B                        ;变形
                LD        (R_RX_DATA0),A
                LD        A,#0
                LD        (R_RX_DATA1),A
                JMP        RECEIVED_SUCCESSFUL
               
GET_A_DIRECTION_ORDER:
        ;LDMAH #0
        LD        (R_RX_DATA1),A
        LD        A,#0
        LD        (R_RX_DATA0),A
RECEIVED_SUCCESSFUL:
        LD        A,(R_IR_TX_RX)               
        OR        A,#1000B                        ;SUCCESSFUL
        LD        A,#0
        LD        (M0_RX_INDEX),A
        LD        (DU_CNT_DATA0),A
        LD        (DU_CNT_DATA1),A
        LD        (M0_HEAD_NUM_CNT),A
        JMP        CLEAR_RECEIVER_TIMER_AND_EXIT
RECEIVER_IS_ERROR:
        LD        A,#0
        LD        (M0_HEAD_NUM_CNT),A
        LD        (M0_RX_INDEX),A
        LD        (R_IR_TX_RX),A
        LD        (DU_CNT_DATA0),A
        LD        (DU_CNT_DATA1),A
        LD        (R_RX_DATA0),A
        LD        (R_RX_DATA1),A
CLEAR_RECEIVER_TIMER_AND_EXIT:
        LD        A,#0
        LD        (M0_RX_TIMER0),A
        LD        (M0_RX_TIMER1),A
EXIT_RECEIVER:
ENDM





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表