逻辑上找不出什么问题,也没陷如什么死循环,但是读到的数据总是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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
-----------------------------------------------------------------------
呵呵,主要是用的义隆单片机,手边只有个借来的烧录器,没有仿真器,用汇编可以利用ADD A,0XFF来节省点芯片,另外调试时也直观一点。话说这义隆也太黑了,ADP064转接板,就1小块PCB+1条双排弯针居然要75块。。。
一周热门 更多>