📄 8051参考解码程序.txt
字号:
参考解码软件
说明:ADD1,ADD2中为8位地址,DAT0中为4位数据
REMOTE: CLR TR2 ;探头信号检测子程序
CLR RECEIVE ;清零接收标志位
MOV DETE_LOOP,#12 ;接收12位编码,将立即数12赋给DETE_LOOP
REMO0: CLR DETE_T_OVER ;
MOV TH2,#0FEH ;测第1位电平宽度
MOV TL2,#041H ;
SETB TR2 ;
REMO1: JB REM,REMO2 ;等待出现高电平.如果直接寻址位REM为1则转到REM02。
JB DETE_T_OVER,REMO3 ;限时1500us,超时则认为误码,退出
AJMP REMO1 ; AJMP:绝对转移
REMO2: MOV A,TH2 ;测低电平宽度,0FF为宽脉冲,0FE为窄脉冲
CJNE A,#0FFH,REMO4 ;若A的值不是宽脉冲,则跳至REM04去检测A的置是否为窄脉冲
MOV A,TL2 ;
CLR C ;
CJNE A,#098H,$+3 ; 比较A与#098H,不相等则跳回前3句
JNC REMO3 ;电平过宽(超过1150us),退出
CLR C ;
CJNE A,#020H,$+3 ;
JC REMO3 ;电平过窄(小于780us),退出。JC:如果进位位为1则转移
SETB C ;
AJMP REMO5 ;
REMO3: AJMP REMOTE_END ;
REMO4: CJNE A,#0FEH,REMO3 ;A的值是否为窄脉冲?否则跳至REM0TE_END,退出
MOV A,TL2 ;
CLR C ;
CJNE A,#0C7H,$+3 ;
JNC REMO3 ;电平过宽(超过450us),退出
CLR C ;
CJNE A,#060H,$+3 ;
JC REMO3 ;电平过窄(小于210us),退出
CLR C ;
REMO5: MOV A,DAT0 ;存储电平值,DATA0的值从哪里来?
RLC A ;A左移
MOV DAT0,A ;
MOV A,ADD1 ;
RLC A ;
MOV ADD1,A ;
REMO6: JNB REM,REMO7 ;等待出现低电平,JNB:如果直接寻址位REM为0则转移
JB DETE_T_OVER,REMO3 ;脉冲下降沿间隔限时1500us,超时则认为误码
AJMP REMO6 ;
REMO7: CLR TR2 ;
CLR DETE_T_OVER ;
MOV A,TH2 ;
CJNE A,#0FFH,REM13 ;脉冲间隔过小.若A与#0FFH不相等则转移,退出
MOV A,TL2 ;
CLR C ;
CJNE A,#050H,$+3 ;
JC REM13 ;电平过窄(小于1200us),退出
MOV TH2,#0FEH ;测第2位电平宽度
MOV TL2,#041H ;
SETB TR2 ;
REM11: JB REM,REM12 ;等待出现高电平
JB DETE_T_OVER,REM13 ;限时1500us,超时则认为误码
AJMP REM11 ;
REM12: MOV A,TH2 ;测低电平宽度,0FE为宽脉冲,0FF为窄脉冲
CJNE A,#0FFH,REM14 ;
MOV A,TL2 ;
CLR C ;
CJNE A,#098H,$+3 ;
JNC REM13 ;电平过宽(超过1100us),退出
CLR C ;
CJNE A,#020H,$+3 ;
JC REM13 ;电平过窄(小于1000us),退出
SETB C ;
AJMP REM15 ;
REM13: AJMP REMOTE_END ;
REM14: CJNE A,#0FEH,REM13 ;
MOV A,TL2 ;
CLR C ;
CJNE A,#0C7H,$+3 ;
JNC REM13 ;电平过宽(超过450us),退出
CLR C ;
CJNE A,#060H,$+3 ;
JC REM13 ;电平过窄(小于210us),退出
CLR C ;
REM15: MOV A,TEMP ;存储电平值
RLC A ;
MOV TEMP,A ;
MOV A,ADD2 ;
RLC A ;
MOV ADD2,A ;
REM16: JNB REM,REM18 ;等待出现低电平
JB DETE_T_OVER,REM13 ;脉冲下降沿间隔限时1500us,超时则认为误码
AJMP REM16 ;
REM17: AJMP REMO0
REM18: CLR TR2 ;
CLR DETE_T_OVER ;
MOV A,TH2
CJNE A,#0FFH,REM13 ;脉冲间隔过小
MOV A,TL2 ;
CLR C ;
CJNE A,#050H,$+3 ;
JC REM13 ;电平过窄(小于1200us),退出
DJNZ DETE_LOOP,REM17 ; DETE_LOOP减1,不为0则跳至REM17,即接收下一位编码,直至接收完12位
REM19: MOV DETE_LOOP,#4 ;把接收的编码左移4位
REM20: CLR C ;将8位密码放在同一字节上
MOV A,DAT0 ;
RLC A ;
MOV DAT0,A ;
MOV A,ADD1 ;
RLC A ;
MOV ADD1,A ;
CLR C ;
MOV A,TEMP ;
RLC A ;
MOV TEMP,A ;
MOV A,ADD2 ;
RLC A ;
MOV ADD2,A ;
DJNZ DETE_LOOP,REM20 ;
;把4 位数据编码由高4 位移到低4 位上 ;
MOV A,DAT0 ;
SWAP A ;
MOV DAT0,A ;
MOV A,TEMP ;
SWAP A ;
MOV TEMP,A ;
ANL DAT0,#0FH ;立即数与到直接字节
SETB RECEIVE ;
REMOTE_END: ;
CLR TR2
CLR REMOTING ;
RET ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -