2646|2

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请大家解答遥控解码程序利用寄存器设置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当生命周期来用 时间扣的紧一点 这东西是很简单的 单纯用记数 会有误动作 还有注意 多检测几次 进行表决 避免干扰哈  详情 回复 发表于 2007-2-1 11:24
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
今天有位单片机高手指点用 DCNT1 EQU 24H DCNT2 EQU25H 地址放入计数值,如计数600次才产生9MS迟时,那么600H怎样放入24H 和25H,可以这样吗?24H放入100H,满100H后24H地址清0,地址25H进1位,这样还要设置计时器0中断吗,要设置初始值吗
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你可以用一个TCC当生命周期来用 时间扣的紧一点 这东西是很简单的
单纯用记数 会有误动作
还有注意 多检测几次 进行表决 避免干扰哈
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表