请大家解答遥控解码程序利用寄存器设置9MS引导码和4.5MS结果码的检测方法
本来这个程序是用延时子程序10MS来检测引导码,但是这样设计后在实际仿真中解码出现的问题好多,这个硬件电路的晶振是4MHZ的机器周期为3,本人用
DCNT1 EQU 24H
DCNT2 EQU 25H 分别放入计数值\ 大家请在 “IR 译码子程序”应该怎样设置 A.9MS引导码 的计数范围在 8.5 <计数时间 <9 B. 4.5MS结果码计数范围在
4 <计数时间 <4.5
9012 遥控键值读取器 *
;* LED 显示, P1口为LED的数据口 *
;* 上电后,将8个LED全部点亮 *
;* K17键按下,继电器吸合。K19键按下,继电器关闭。 *
;* *
;-----------------------------------------------
IRCOM EQU 20H ;20H-23H IR使用
DCNT1 EQU 24H
DCNT2 EQU 25H
IRIN EQU P3.2 ;IR信号输入,外部中断0入口
BEEP EQU P2.4 ;蜂鸣器连接地址
RELAY EQU P2.6 ;使P2.6输出高,关闭继电器21F吸合线圈,使P2.6输出低,打开继电器21F吸合线圈
;------------------------------------------------
ORG 0000H
JMP MAIN
;------------------------------------------------
MAIN:
MOV SP,#60H ;设置堆栈指针为60H P165
MOV A,#00H
MOV R0,#20H
LOOP0: MOV @R0,A ;20H-27H清零 地址20H的内容00H,R0和A的内容都不变 P116
INC R0 ;R0的内容加1
CJNE R0,#25H,LOOP0 ;寄存器与立即数不相等,跳到LOOP0
SETB IRIN
SETB BEEP
SETB RELAY
MOV 22H,#0FFH ;8位用户编码,8位反码
CALL IR_SHOW ;8个LED全部亮
LOOP1:
CALL IR_IN
CPL A ;累加器取补数
CJNE A,#40H,LOOP2 ;K17键按下
CLR RELAY ;继电器吸合
LOOP2: CJNE A,#04H,LOOP3 ;K19键按下
SETB RELAY ;继电器关闭
LOOP3: JMP LOOP1
;---------------------------------------------------
; IR 译码子程序
;---------------------------------------------------
IR_IN:
MOV R0,#IRCOM
I1: JNB IRIN,I2 ;等待 IR 信号出现,IRIN=0则跳转到I2
JMP N1
;I2: MOV R4,#20
;I20: CALL DEL ;DELAY R5*0.14MS
I2:
MOV DCNT1,#8
A2: MOV DCNT2,#200
;如果计数8MS不成功如下处理
A1: JNB IRIN,AA
JMP N1
AA: JNB DCNT2, BB
JMP A1
BB: JNB DCNT1, CC
JMP A2
;开始计数2MS
CC: MOV DCNT1,#2
DD: MOV DCNT1,#200
;如果计数2MS不成功如下处理
EE: JNB IRIN,FF
JMP ISHEADE
FF: JNB DCNT2,GG
JMP EE
GG: JNB DCNT1,N1
JMP DD
ISHEADE: MOV DCNT1,#4
HH: MOV DCNT2,#200
;如果计数4MS无效,如下处理
II: JNB IRIN,JJ
JMP N1
JJ: JNB DCNT2,KK
JMP II
KK: JNB DCNT1,LL
JMP HH
LL: JB IRIN,MM
JMP LL
;同时清空计数器,重新接收解码
MM: MOV DCNT1,#00H
NN: CALL DELAY1
MOV A,#8
CLR C
SUBB A,R2 ;判断高低位 A=8-0-1=7H 大于1有进位,小于1无进位 P126 看I5: MOV R2,#0
;IF C=0 BIT=0
MOV A,@R0 ;A=20H,R0的内容不变 P114 IR_IN: MOV R0,#IRCOM
RRC A ;00100000 \00010000 C=0 P=124 即A=10H 这句注释对吗??
MOV @R0,A ;处理完一位 地址20H的内容10H,R0和A的内容都不变 P116 这句注释对吗??
INC R3 ;R3内容加1
CJNE R3,#8,LL ;需处理完8位,寄存器与立即数不相等则跳转
MOV R3,#0
INC R0 ;20H+1
CJNE R0,#24H,LL ;收集到4字节了即32位,1字节8位 这句注释对吗??
JMP IR_SHOW
N1: ;INC R2
;CJNE R2,#30,L1 ;0.14ms 计数过长则时间到自动离开,寄存器与立即数不相等即跳转
RET
;---------------------------
;键值显示
;22H存入用户编码,23H存入用户编码的反码
;---------------------------
IR_SHOW:
MOV A,22H
CPL A ;将22H取反后和23H比较
CJNE A,23H,IR_SHOW1 ;如果不等表示接收数据发生错误,放弃。
MOV P1,A
CALL BEEP_BL ;蜂鸣器鸣响表示解码成功
IR_SHOW1: RET
;--------------------
;蜂鸣器响一声子程序
;--------------------
BEEP_BL:
MOV R6,#100
BL1: CALL DEX1
CPL BEEP
DJNZ R6,BL1
MOV R5,#20
CALL DELAY
RET
DEX1: MOV R7,#180
DEX2: NOP
DJNZ R7,DEX2
RET
DELAY: ;延时R5×10MS
MOV R6,#50
D1: MOV R7,#100
DJNZ R7,$ ;LOOP: DJNZ R7,LOOP 寄存器减一不为0跳转
DJNZ R6,D1
DJNZ R5,DELAY
RET
;------------------------------------------------
; DELAY R5*0.14MS
DEL:
MOV R5,#1 ;IR解码使用
DEL0: MOV R6,#2
DEL1: MOV R7,#32
DEL2: DJNZ R7,DEL2
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
DELAY1: MOV R6,#03H ;延时10US
DL1: NOP
DJNZ R6,DL1
RET
;---------------------------------
END ;结束
;================================
;****** 红外遥控器键值表 ******
; 10 03 01 06
; 09 1D 1F 0D
; 19 1B 11 15
; 17 12 16 4C
; 40 48 04 00
; 02 05 54 4D
; 0A 1E 0E 1A
; 1C 14 0F 0C
;================================
[解决办法]
你可以用一个TCC当生命周期来用 时间扣的紧一点 这东西是很简单的
单纯用记数 会有误动作
还有注意 多检测几次 进行表决 避免干扰哈