汇编写的无线解码程序,求教下各位朋友

2020-02-08 12:11发布

逻辑上找不出什么问题,也没陷如什么死循环,但是读到的数据总是0XFF,开始怀疑是定时器的设置有问题,导致延时长度不够,中断总是在数据线高电平期间产生,但是用示波器看了波形以后发现,中断延时的设置应该是正确的,用设置断点的方式,发现的确是延时中断产生后的数据线总是高电平,实在想不出哪里出了问题,求教下各位朋友,先谢谢了。
编码器件是HX2262
接收器件EM78P163N+315M超再生接收模块,接收模块收到的信号用示波器确认过,没有问题。
程序如下:
INCLUDE "EM78P163N.INC"
    WILE_CHECK_S_NUM == R1A
    WILE_READ_NUM    == R1B
    WILE_DATA        == R1C
    WILE_READ_NUM3   == R1D
    WILE_HEAD        == 0X13
    WILE_BITDA       == PORT6.2
    TCC0             == 56
    TCC_INT_SIGN     == R3F.1
    CLOSE_TCC MACRO;关闭TCC溢出中断
        IOR IOCF
        AND A,@0XFE
        IOW IOCF
    ENDM
    OPEN_TCC MACRO;开启TCC溢出中断
        IOR IOCF
        OR A,@1
        IOW IOCF
    ENDM
    MOV MACRO REG1,REG2
        MOV A,REG2
        MOV REG1,A
    ENDM
    MOV MACRO REG,@LITERAL
        MOV A,@LITERAL
        MOV REG,A
    ENDM
    ORG 0
    ADD A,@0XFF
    ADD A,@0XFF
    ADD A,@0XFF
    JMP MAIN
    ORG 0X09
    BS TCC_INT_SIGN
    CLR RF
    RETI
    ORG 0X10
MAIN:
    DISI;关闭全局中断
    ;引脚初始化
    MOV A,@0;P5置为输出1
    IOW P5CR
    MOV A,@0XFF
    MOV PORT5,A
    MOV A,@0X44;P6.2,P6.6置为输入,其他P6脚置为输出1,P6.0,P6.1上拉使能.
    IOW P6CR
    MOV A,@0XFF
    MOV PORT6,A
    MOV A,@0XF4
    IOW PHCR
    ;寄存器初始化
    MOV A,@0X0A;设置定时器为1:8预分频
    CONTW
    ENI;使能全局中断
    CALL WILE_CHECK_S
    CALL WILE_READ
    BC PORT5.0
    /*MOV A,@0XFF
    SUB R13,A
    JBC Z
    BC PORT6.4
    SUB R14,A
    JBC Z
    BC PORT6.5
    SUB R15,A
    JBC Z
    BC PORT6.6*/
    MOV A,@0
    SUB A,R1C
    JBC Z
    BC PORT5.1
    MOV A,@0XFF
    SUB A,R1C
    JBC Z
    BC PORT5.2
    MOV A,@0B01010101
    SUB A,R1C
    JBC Z
    BC PORT5.3
LOOP:
    JMP LOOP     
;**无线解码子程序**
;同步位检测
WILE_CHECK_S:
    ;CALL WILE_CHECK0
    ;JBC TCC_INT_SIGN
    ;JMP WILE_CHECK_S
    MOV A,@10
    MOV WILE_CHECK_S_NUM,A
    BC TCC_INT_SIGN
    MOV TCC,@0;定时器初值置0
    CLR RF;清除中断标志位
    OPEN_TCC;开启TCC溢出中断
WILE_CHECK_S1:
    JBC WILE_BITDA
    JMP WILE_RECHECK_S;数据线电平为高,返回重检测同步位.
    JBC TCC_INT_SIGN
    JMP WILE_CHECK_S0;TCC_INT_SIGN=1
    JMP WILE_CHECK_S1;TCC_INT_SIGN=0,返回返回判断数据线电平.
WILE_CHECK_S0:
    BC TCC_INT_SIGN;清0 TCC_INT_SIGN
    DJZ WILE_CHECK_S_NUM;计数值减为0则跳至程序结尾准备结束
    JMP WILE_CHECK_S1;计数值不为0则返回判断数据线电平.
    JMP WILE_CHECK_S_END
WILE_CHECK_S_END:
    CLOSE_TCC
    RET
WILE_RECHECK_S:
    MOV TCC,@0
    BC TCC_INT_SIGN
    MOV WILE_CHECK_S_NUM,@10
    JMP WILE_CHECK_S1
;读取1字节
WILE_READ:
    MOV WILE_READ_NUM,@8
WILE_READ0:
    ;高电平长短检测:短脉冲-TCC_INT_SIGN=0,长脉冲-TCC_INT_SIGN=1.
WILE_CHECK0:;等待数据线被置为低电平
    BC TCC_INT_SIGN;清0 TCC溢出中断产生标志
    JBC WILE_BITDA
    JMP WILE_CHECK0
WILE_CHECK1:;等待数据线上升沿
    JBS WILE_BITDA
    JMP WILE_CHECK1
    MOV TCC,@TCC0;定时器初值置为50
    CLR RF;清除中断标志位
    OPEN_TCC;开启TCC溢出中断
WILE_CHECK2:;等待TCC溢出中断
    JBS TCC_INT_SIGN
    JMP WILE_CHECK2
    CLOSE_TCC;关闭TCC溢出中断   
    JBC WILE_BITDA
    JMP WITE_SET_C
    BC C
    BC PORT6.6
    JMP WILE_RD1BIT
WITE_SET_C:
    BS C
    BC PORT6.7
WILE_RD1BIT:
    RLC WILE_DATA
    DJZ WILE_READ_NUM
    JMP WILE_READ0
    MOV A,WILE_DATA   
    RET
;连续读取3字节
WILE_READ3:
    MOV WILE_READ_NUM3,@3
    MOV R4,@WILE_HEAD
    CALL WILE_CHECK_S
WILE_READ30:
    CALL WILE_READ
    MOV R0,A
    DJZ WILE_READ_NUM3
    JMP WILE_READ3_GO
    JMP WILE_READ3_END
WILE_READ3_GO:
    INC R4
    JMP WILE_READ30
WILE_READ3_END:
    RET
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
zyp568
2020-02-09 03:25
回复【5楼】topdog
-----------------------------------------------------------------------

呵呵,主要是用的义隆单片机,手边只有个借来的烧录器,没有仿真器,用汇编可以利用ADD A,0XFF来节省点芯片,另外调试时也直观一点。话说这义隆也太黑了,ADP064转接板,就1小块PCB+1条双排弯针居然要75块。。。

一周热门 更多>