您的位置:控制工程论坛网论坛 » 教程与手册 » 遥控信号接收子程序

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

遥控信号接收子程序

xilinxue  发表于 2008/9/17 13:18:23      764 查看 1 回复  [上一主题]  [下一主题]

手机阅读

;******************************* 遥控信号接收子程序集 ****************************
;占用: ACC, R0, R1, R2, R3, TIME0中断
;遥控发送以4个字节为一组, 长按按键时, 4个--4个字节连发, 每组(4字节为一组)之间只有3.5ms的间隙
;第1与2字节为用户码, 固定不变(用于区别其它的遥控器)
;第3字节为键码, 第4字节为键码的取反码(用于校验)
;注:键码不等同于需要的键值


       ;************* 外部变量说明 ********************************
        BC_REMOTE BIT P3.3 ;***** 遥控信号读入脚 *****
        
        
 EXTRN DATA(RKEY_NUM)          ;现键值寄存
 EXTRN BIT(B_RKEY)           ;有remote key时置1, 注:主程序检测该位后清0

 EXTRN DATA(RKEY_SPEED)      ;连发灵敏度计数, 开机时初始化
 EXTRN DATA(RKEY_KEEP)      ;连发的监控计时数


 ;遥控完整读入的4个字节存放数组  uchar rmbyte_in[4]
 EXTRN DATA(RMBYTE_IN)     ;第1字节 -- 用户码1存放  ,RMBYTE_IN
     ;第2字节 -- 用户码2存放  ,RMBYTE_IN+01H
     ;第3字节 -- 键码存放  ,RMBYTE_IN+02H
     ;第4字节 -- 键码的反码存放 ,RMBYTE_IN+03H


 ;************ 公共变量定义 ****************
 PUBLIC GET_REMOTE

 

 ;************** 常数定义 ******************
 USER_CODE1    EQU   20H         ;remote user_code low 8bit(用户码1)
 USER_CODE2    EQU   0DFH        ;remote user_code high 8bit(用户码2)

 CANT_FIND     EQU   0AEH        ;remote key not find(无键标识)
 N_RKEY_KEEP   EQU   02H         ;允许连发的停顿时间 0.2ms


;=============================== 公共子程序 (可被C调用) ===============================
;*************** 遥控信号检测, 键值读入 ***************
;******************************************************
;注!!!: 只当主程序中检测到BC_REMOTE脚有低电平时才调用该字程序, 然后再进入键功能程序.
;返回: RKEY_NUM(键值)代表的功能参考-- 表RKEY_TABLE, 值=#CANT_FIND (#0AEH)即为无按键
;      B_RKEY   有remote key时置1, 注:主程序检测该位后清0
;子程序调用分辨率要在1ms之内


GET_REMOTE:
      SETB  BC_REMOTE
      NOP
      NOP
      NOP
      JNB   BC_REMOTE, GET_REMOTE_P0
      RET

GET_REMOTE_P0:
      MOV   TH0,#000H
      MOV   TL0,#000H
      MOV   A,TMOD
      ANL   A,#0F0H
      SETB  ACC.0
      MOV   TMOD,A       ;timer/counter0 16bit timer/counter

      MOV   A, #0FFH
LBL_P25:
      JNB   BC_REMOTE,LBL_P256       ;get remote key
      DJNZ  ACC, LBL_P25
      RET
     
LBL_P256:
      SETB  TR0
LBL_P28:
      MOV   A,TH0
      CJNE  A,#014H,LBL_P26     ;10ms
LBL_P26:
      JNC   LBL_P27      ;if >10ms,regard this is a nosie
      JNB   BC_REMOTE,LBL_P28       ;get remote key
      CJNE  A,#005H,LBL_P29     ;2.5ms
LBL_P29:
      JC    LBL_P27      ;if <2.5ms,regard this is a nosie
      MOV   TH0,#000H
      MOV   TL0,#000H
LBL_P31:
      MOV   A,TH0
      CJNE  A,#00AH,LBL_P30
LBL_P30:
      JNC   LBL_P27      ;if >5ms,regard this is a nosie
      JB    BC_REMOTE,LBL_P31       ;get remote key
      CJNE  A,#007H,LBL_P32
LBL_P32:
      JC    LBL_P33      ;if<3.5ms, 当是连发时
      SJMP  LBL_P34      ;above is the start flag, 当是起始信号时
LBL_P27:
      RET


LBL_P34:    ;****** 是新按下的******
      CLR   A     ;>3.5ms and <5ms
      MOV   R2,#004H     ;4 BYTE
      MOV   R0,#RMBYTE_IN         ;用户码存放地址1
LBL_P41:
      MOV   R1,#008H     ;8bit
LBL_P40:
      MOV   TH0,#000H
      MOV   TL0,#000H
LBL_P36:
      MOV   R3,TH0
      CJNE  R3,#002H,LBL_P35
LBL_P35:
      JNC   LBL_P27      ;>1ms
      JNB   BC_REMOTE,LBL_P36       ;get remote key
      MOV   TH0,#000H
      MOV   TL0,#000H
LBL_P38:
      MOV   R3,TH0
      CJNE  R3,#004H,LBL_P37
LBL_P37:
      JNC   LBL_P27      ;>2ms
      JB    BC_REMOTE,LBL_P38       ;get remote key
      CJNE  R3,#002H,LBL_P39    ;>1ms is bit 0,<1ms is bit 1
LBL_P39:
      CPL   C
      RRC   A     ;the data is low bit first
      DJNZ  R1,LBL_P40
      MOV   @R0,A
      INC   R0
      DJNZ  R2,LBL_P41          ;32 bit

      MOV   A,RMBYTE_IN
      CJNE  A,#USER_CODE1,LBL_P42
      MOV   A,RMBYTE_IN+01H
      CJNE  A,#USER_CODE2,LBL_P42
      MOV   A,RMBYTE_IN+02H
      ADD   A,RMBYTE_IN+03H
      CJNE  A,#0FFH,LBL_P42     ;后两字节是互补编码,若不是即是出错
;      MOV   R0,#48D            ;******键值表为0-38 ******
;      MOV   DPTR,#RKEY_TABLE
;      MOV   RKEY_SPEED, #00H     ;remote 连发速度, 先设置为最慢
;LBL_P46:
;      MOV   A,R0
;      MOVC  A,@A+DPTR
;      CJNE  A,RMBYTE_IN+02H,LBL_P43     ;get the low code byte from the table
;      MOV   RKEY_NUM,R0         ;save the offset
       MOV   RKEY_NUM,RMBYTE_IN+02H
      LJMP  LBL_P44      ;get it
;LBL_P43:
;      MOV   A,R0
;      JZ    LBL_P45
;      DEC   R0
;      SJMP  LBL_P46
;LBL_P45:
;      MOV   RKEY_NUM,#CANT_FIND        ;can't find the code
LBL_P42:
      RET

 


LBL_P33:    ;<3.5ms CONTINUES ****** 连发的 *******
      MOV   RKEY_KEEP, #N_RKEY_KEEP ;允许连发的停顿时间 0.2ms
      DJNZ  RKEY_SPEED, LBL_P50  ;remote 灵敏度
LBL_P51:
      MOV   A,RKEY_NUM
      CJNE  A,#CANT_FIND,LBL_P48
LBL_P50:
      RET
LBL_P44:
      MOV   A,RKEY_NUM
      CJNE  A,#CANT_FIND,LBL_P48
      RET         ;can't find the code
LBL_P48:
LBL_P49:
      MOV   RKEY_KEEP, #N_RKEY_KEEP ;允许连发的停顿时间 0.2s
      SETB   B_RKEY   ;有按键
      RET
     
;================================= 文件内部子程序 ================================
;        键码     功能名称      键值
;RKEY_TABLE:                 ;本表是SRS遥控器各遥控键值
;     DB        19H          ;MUTE 0
;     DB        15H          ;INPUT 1
;     DB        0bH          ;CH-MODE 2
;     DB        1dH          ;MIC1.VOL- 3
;     DB        0fH          ;MIC1.VOL+ 4
;     DB        1eH          ;NIGHT 5
;     DB        09H          ;MIC2.VOL- 6
;     DB        0dH          ;MIC2.VOL+ 7
;     DB        11H          ;ECHO+ 8
;     DB        12H          ;MIC.TRE- 9
;     DB        16H          ;MIC.TRE+ 10
;     DB        0aH          ;ECHO- 11
;     DB        08H          ;MIC.BASS- 12
;     DB        1fH          ;MIC.BASS+  13
;     DB        1bH          ;DELAY      14
;     DB        17H          ;CEN.VOL+   15
;     DB        13H          ;SL.VOL+    16
;     DB        01H          ;SR.VOL+    17
;     DB        10H          ;CEN.VOL-   18
;     DB        04H          ;SL.VOL-    19
;     DB        18H          ;SR.VOL-    20
;     DB        00H     ;TRE-       21 
;     DB        0CH     ;TRE+       22 
;     DB        02H          ;DSP        23
;     DB        14H          ;BASS+      24
;     DB        03H          ;VOL+       25
;     DB        1AH          ;BAL R      26
;     DB        06H          ;BASS-      27
;     DB        07H          ;MVOL -     28
;     DB        0EH          ;BAL L      29

 

1楼 0 0 回复
  • xilinxue

    xilinxue   |   当前状态:在线

    总积分:16186  2024年可用积分:0

    注册时间: 2008-06-26

    最后登录时间: 2020-03-22

    空间 发短消息加为好友

    xilinxue   发表于 2008/9/17 13:18:23

     org 00h
     AJMP START
    START:
     JB P3.2,$ ;等待遥控信号出现
    SB:
     MOV R4,#8 ;8毫秒为高电平错误
    SBA:
     MOV R5,#250
    SBB:
     JB P3.2,SXB1
     DJNZ R5,SBB
     DJNZ R4,SBA
     MOV R4,#2
     JMP SBC
    SXB1:
     MOV R5,#5
    SXB2: ;去掉20US的尖峰干扰信号
     JNB P3.2,SBB
     DJNZ R5,SXB2
     JMP START
    SBC:
     MOV R5,#250
    SB1:
     JB P3.2,SB2 ;2MS内不为高电平错误(监测9MS的低电平引导码)
     DJNZ R5,SB1
     DJNZ R4,SBC
     JMP START
    SB2: ;去掉20US的尖峰干扰信号
     MOV R5,#5
    SB2_A:
     JNB P3.2,SB1
     DJNZ R5,SB2_A
     MOV R4,#3
    SB2_1:
     MOV R5,#250
    SB3: ;监测4.5MS高电平,如3MS内出现低电平错误
     JNB P3.2,SXC
     DJNZ R5,SB3
     DJNZ R4,SB2_1
     MOV R4,#2
     JMP SB3_1
    SXC: ;去掉20US的尖峰干扰信号
     MOV R5,#5
    SXC1:
     JB P3.2,SB3
     DJNZ R5,SXC1
     JMP START
    SB3_1: ;监测4.5MS高电平,如5MS内不为低电平错误
     MOV R5,#250
    SB3_2:
     JNB P3.2,SB4
     DJNZ R5,SB3_2
     DJNZ R4,SB3_1
     JMP START
    SB4: ;去掉20US的尖峰干扰信号
     MOV R5,#5
    SB4_1:
     JB P3.2,SB3_2
     DJNZ R5,SB4_1
     MOV R1,#1AH ;设定1AH为起始RAM区
     MOV R2,#4
    PP:  MOV R3,#8
    JJJJ:
     MOV R5,#250
    JJJJ2: ;1MS内不为低电平错误
     JB P3.2,JJJJ3
     DJNZ R5,JJJJ2
     JMP START
    JJJJ3:
     LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
     MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
     JNC UUU ;如果为0就跳转到UUU
     MOV R5,#250
    JJJJ4:
     JNB P3.2,UUU
     NOP
     DJNZ R5,JJJJ4
     JMP START
    UUU:  MOV A,@R1 ;将R1中地址的给A
     RRC A ;将C中的值0或1移入A中的最低位
     MOV @R1,A ;将A中的数暂时存放在R1中
     DJNZ R3,JJJJ ;接收地址码的高8位
     INC R1 ;对R1中的值加1,换成下一个RAM
     DJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
     ;以下对代码是否正确和定义进行识别
     MOV A,1CH ;比较数据码和数据反码是否正确?
     CPL A
     XRL A,1DH ;将1CH的值取反后和1DH比较 不同则无效丢弃,核对数据是否准确
     JNZ EXIT ;如果不相等说明解码失败退出解码程序
    EXIT: AJMP START
    YS1:  MOV R4,#20  ;延时子程序1,精确延时882微秒
    D1:  MOV R5,#20
     DJNZ R5,$
     DJNZ R4,D1
     RET
    YS2:  MOV R4,#10  ;延时子程序2,精确延时4740微秒
    D2:  MOV R5,#235
     DJNZ R5,$
     DJNZ R4,D2
     RET
    YS3:  MOV R4,#2 ;延时程序3,精确延时1000微秒
    D3: MOV R5,#248
     DJNZ R5,$
     DJNZ R4,D3
     RET
     END
    2楼 回复本楼

    引用 xilinxue 2008/9/17 13:18:23 发表于2楼的内容

总共 , 当前 /