ddcchh 发表于 2012-5-5 10:55:44

单片机红外线解码程序(日本三菱M50462系列)----原创1

本帖最后由 ddcchh 于 2012-5-5 11:01 编辑

;==========================================================================
;====Power Disassembler for MCS-51 and 6502================================
;==========================================================================
;   Writen by: 覃远高
;   Copyright: 覃远高
;    HomePage: http://coolsh.163.net
;      E-mail: qinyg@163.net
;         Tel: 0755-2282553
;      Update: 3.Jul,2000
;==========================================================================
;===========Disassemble information========================================
;==========================================================================
;    File Name: C:\My Documents\Hwx_18A
;      IC Body: MCS-51
;         Date: 07-11-10
;==========================================================================
;==========================================================================
;标号==============指令================================地址===机器码=======
;==========================================================================

;******************************************************************

;************红外线接收器程序    2007/11/11 修改2003年5月在合肥市原创*********************

;**************处理16位红外线编码和八位键值P3.7 ,P3.5,P3.3,P3.2*************************

; *********************************八位键值   P1.2 ,P1.3,P1.4,P1.5**********************


Q0000:             NOP                              ;   待CPU复位

                   CLR   A                            ;   清零

                   MOV   P1,#00                     ;   外部P1=0

                   MOV   P3,#00                     ;   外部P3=0

                  SETB P3.0                           ;串行口移位寄存器方式用

                  SETB P3.1                           ;   串行口移位寄存器方式用,应为高电平

Q0006:             LCALL Q003D                        ;   调用89C51内部RAM单元清0子程序

                   LCALL Q006E                        ;   调用初始化和遥控数据读取子程序

                   NOP                              ;
                   NOP                              ;
                   NOP                              ;

                   LCALL Q0121                        ;   调用键值处理子程序

                   LCALL WWW                        ;调用内存单元2FH,2EH 编码显示子程序

                   LCALL Q025C                        ;调用 延时子程序50ms

                   LCALL Q025C                        ;调用 延时子程序50ms
            
START:            LJMPQ0006                        ;   从头开始循环

;==========================================================================
Q001B:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0023:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q002B:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0033:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q003B:               DB00H, 00H        ;..

;=============    89C51内部RAM单元清0子程序   =======================================

Q003D:             NOP

                   CLR A                              ;A=0
                  
                   SETBP3.4                         ; 红外线信号输入口置为输入壮态

                   MOV   R0,#08H                      ;从内部RAM 08H单元开始清0

                   MOV   R1,#55H                      ;共计77个单元清0

Q0044:             MOV   @R0,A                        ; 送0至各单元

                   INC   R0                           ; 指向下一个单元

                   DJNZR1,Q0044                     ; 循环

                   MOV   SP,#60H                      ; 内部堆栈指针

                   RET                              ;子程序返回

;==========================================================================
Q004C:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0054:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q005C:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0064:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q006C:               DB00H, 00H        ;..

;============================初始化和遥控数据读取子程序   ===============

Q006E:             CLR   ET1                        ;关T1中断允许

                   CLR   TR1                        ;关定时器T1

                   CLR   EX0                        ;关外部中断0口

               ;    CLR   EA                           ;关总中断

                   MOV   R0,#08H                      ;   高电平计数值存放首地址

                   MOV   R1,#3DH                      ;   低电平计数值存放首地址

                   CLR   A                            ;A清零

                   MOV   DPH,A                        ;高位计数器清零

                   MOV   DPL,A                        ;低位计数器清零

Q007F:             JNB   P3.4,Q0094                   ;寻找红外线输入起始位,此位为0时转Q0094
                                                      ;判断是否为起始位

                   INC   DPTR                         ;此位为高平时对DPTR 循环计数,每过21us计数一次

                   NOP                              ; 以下为空操作延时

                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;

                   AJMPQ007F                        ; 转开始检测,等待低电平出现

;***********************判断是否为起始位 *********************************************

Q0094:             CJNEA,DPH,Q009D                  ;高八位计数值不为0是起始位(255*21us=5.355ms,大于此值一般为起始位)

                   MOV   DPH,A                        ; 高位计数值为0,不是起始位

                   MOV   DPL,A                        ;清0

                   AJMPQ007F                        ;重新寻找起始位

Q009D:             CLR   A                            ;处理起始位开始,A清0

                   MOV   DPH,A                        ; 计数器高位清零

                   MOV   DPL,A                        ; 计数器低位清零

Q00A2:             JB    P3.4,Q00B7                   ;    检测输入端电平,决定程式方向

                   INC   DPTR                         ;    低电平时循环对DPTR计数

                   NOP                              ;   空操作延时

                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;

                   AJMPQ00A2                        ;   循环周期为21us

Q00B7:             MOV   R4,DPH                     ;   存起始位,高八位送R4中

                   MOV   R5,DPL                     ;   存起始位,低八位送R5中

                   MOV   DPH,#00H                     ;   计数器高位清0

                   MOV   DPL,#00H                     ;    计数器低位清0或放入校正值

                   AJMPQ00EE                        ;    转处理高平程序

;*******************************低电平处理,并且存高电平时的计数值**********************

Q00C3:             NOP                              ;
                   NOP                              ;

                   MOV   @R0,DPL                      ;存入高电平时的计数值(在08H--**H单元中)

                   INC   R0                           ; 指向下一个单元
                  
                   MOV   DPL,#00H                     ; 清0,为下一次计数作准备

                   MOV   DPH,#00H                     ;

Q00CE:             JB    P3.4,Q00E3                   ;读低电平程序,高电平时再转Q00E3

                   INC   DPTR                         ;   低电平时对DPTR计数

                   NOP                              ;   空操作延时

                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;

                   AJMPQ00CE                        ;    每21us循环计数一次

Q00E3:             NOP                              ;
                   NOP                              ;

                   MOV   @R1,DPL                      ; 存低电平数据(地址从89C2051从3DH开始)

                   INC   R1                           ;   指向下一个单元

                   MOV   DPL,#00H                     ;清零

                   MOV   DPH,#00H                     ;

;***********************处理高平程序***************************************

Q00EE:             JNB   P3.4,Q0103                   ;检测红外线输入端 ,高电平顺序执行,低电平转移至LL9

                   INC   DPTR                         ; 高电平计数

                   NOP                              ; 空操作延时
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   NOP                              ;
                   AJMPQ00EE                        ;循环计数

Q0103:             CLR   A                            ;低电平时入口,清A

                   CJNEA,DPH,Q0109                  ; 比较,DPH为0时,顺序执行;不为0时是停止位转Q0109处理   

                   AJMPQ00C3                        ; 转低电平处理,并且存高电平时的计数值

Q0109:             MOV   @R0,A                        ;

                   MOV   @R1,A                        ;

                   SETBP3.4                         ;

                   NOP                              ;

                   RET                              ;
;==========================================================================
Q010F:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q0117:               DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H        ;........
Q011F:               DB00H, 00H        ;..
;==========================================================================

;*******************************   键值处理子程序****************************               

Q0121:             PUSH00H                        ; 压堆栈保护R0

                   PUSH01H                        ; 压堆栈保护R1

                   PUSH2EH                        ; 压堆栈保护2EH

                   PUSH2FH                        ; 压堆栈保护2FH

                   MOV   R1,#10H                      ;电平计数值存放首地址(10H、11H、12H、13H、14H、15H、16H、17H)

                   MOV   R0,#08H                      ;电平计数值存放首地址(08H、09H、0AH、0BH、0CH、0DH、0EH、0FH)
;*********************************处理2F.7位 ************************************************
                   CLR   C                            ; 清进位位

                   MOV   A,@R0                        ; 高位一个计数值送A中

                   SUBBA,#47H                     ; 和临界值比较

                   JNC   Q017F                        ;小于47转

                   SETBC                            ;大于47 置进位位

                   MOV   2FH.7,C                      ;这位值送位地址7FH

Q0136:             INC   R0                           ;指向下一个高位计数值
;*********************************处理2F.6位 ************************************************

                   CLR   C                            ;清进位位

                   MOV   A,@R0                        ;高位一个计数值送A中

                   SUBBA,#47H                     ;和临界值比较

                   JNC   Q0184                        ;小于47转

                   SETBC                            ;大于47 置进位位

                   MOV   2FH.6,C                      ;这位值送位地址7FH

Q0140:             INC   R0                           ;
;*********************************处理2F.5位 ***************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBBA,#47H                     ;
                   JNC   Q0189                        ;
                   SETBC                            ;
                   MOV   2FH.5,C                      ;
Q014A:             INC   R0                           ;
;*********************************处理2F.4位 ****************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBBA,#47H                     ;
                   JNC   Q018E                        ;
                   SETBC                            ;
                   MOV   2FH.4,C                      ;
Q0154:             INC   R0                           ;
;*********************************处理2F.3位 **************************
                  CLR   C                            ;
                   MOV   A,@R0                        ;
                  SUBBA,#47H                        ;
                   JNC   Q0193                        ;
                   SETBC                            ;
                   MOV   2FH.3,C                      ;
Q015E:             INC   R0                           ;
;*********************************处理2F.2位 ***************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBBA,#47H                     ;
                   JNC   Q0198                        ;
                   SETBC                            ;
                   MOV   2FH.2,C                      ;
Q0168:             INC   R0                           ;
;*********************************处理2F.1位 ***************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBBA,#47H                     ;
                   JNC   Q019D                        ;
                   SETBC                            ;
                   MOV   2FH.1,C                      ;
Q0172:             INC   R0                           ;
;*********************************处理2F.0位 ***************************
                   CLR   C                            ;
                   MOV   A,@R0                        ;
                   SUBBA,#47H                     ;
                   JNC   Q01A2                        ;
                   SETBC                            ;
                   MOV   2FH.0,C                      ;

                   LJMPQ01A5                        ;
;==========================================================================

;*********************************处理2F.7_0位 *************************
Q017F:             CLR   C                            ; 清进位位

                   MOV   2FH.7,C                      ;0送位地址

                   AJMPQ0136                        ;指向下一位

;*********************************处理2F.6_0位 ****************************

Q0184:             CLR   C                            ;清进位位

                   MOV   2FH.6,C                      ;0送位地址

                   AJMPQ0140                        ;指向下一位

;*********************************处理2F.5位_0位 **************************

Q0189:             CLR   C                            ;
                   MOV   2FH.5,C                      ;
                   AJMPQ014A                        ;
;*********************************处理2F.4位_0位 **************************

Q018E:             CLR   C                            ;
                   MOV   2FH.4,C                      ;
                   AJMPQ0154                        ;
;*********************************处理2F.3位_0位 ***************************

Q0193:             CLR   C                            ;
                   MOV   2FH.3,C                      ;
                   AJMPQ015E                        ;
;*********************************处理2F.2位_0位 ****************************

Q0198:             CLR   C                            ;
                   MOV   2FH.2,C                      ;
                   AJMPQ0168                        ;
;*********************************处理2F.1位_0位 *****************************

Q019D:             CLR   C                            ;
                   MOV   2FH.1,C                      ;
                   AJMPQ0172                        ;
;*********************************处理2F.0位_0位 ******************************

Q01A2:             CLR   C                            ;
                   MOV   2FH.0,C                      ;
;*********************************处理后八位键值 ******************************


;*********************************处理2E.7位_1位 ******************************

Q01A5:             CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBBA,#47H                     ;
                   JNC   Q01F6                        ;
                   SETBC                            ;
                   MOV   2EH.7,C                      ;
;*********************************处理2E.6位_1位 *******************************
Q01AE:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBBA,#47H                     ;
                   JNC   Q01FB                        ;
                   SETBC                            ;
                   MOV   2EH.6,C                      ;
;*********************************处理2E.5位_1位 *******************************
Q01B8:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBBA,#47H                     ;
                   JNC   Q0200                        ;
                   SETBC                            ;
                   MOV   2EH.5,C                      ;
;*********************************处理2E.4位_1位 *******************************
Q01C2:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBBA,#47H                     ;
                   JNC   Q0205                        ;
                   SETBC                            ;
                   MOV   2EH.4,C                      ;
;*********************************处理2E.3位_1位 *******************************
Q01CC:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBBA,#47H                     ;
                   JNC   Q020A                        ;
                   SETBC                            ;
                   MOV   2EH.3,C                      ;
;*********************************处理2E.2位_1位 *******************************
Q01D6:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBBA,#47H                     ;
                   JNC   Q020F                        ;
                   SETBC                            ;
                   MOV   2EH.2,C                      ;
;*********************************处理2E.1位_1位 *******************************
Q01E0:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBBA,#47H                     ;
                   JNC   Q0214                        ;
                   SETBC                            ;
                   MOV   2EH.1,C                      ;
;*********************************处理2E.7位_0位 *******************************
Q01EA:             INC   R1                           ;
                   CLR   C                            ;
                   MOV   A,@R1                        ;
                   SUBBA,#47H                     ;
                   JNC   Q0219                        ;
                   SETBC                            ;
                   MOV   2EH.0,C                      ;
;*******************************************************************************************

                   AJMPQ021A                        ; 转进一步处理,从外部口输出电平

;*******************************************************************************************

;*********************************处理2E.7_0位 ************************
Q01F6:             CLR   C                            ;
                   MOV   2EH.7,C                      ;
                   AJMPQ01AE                        ;
;*********************************处理2E.6_0位 ************************
Q01FB:             CLR   C                            ;
                   MOV   2EH.6,C                      ;
                   AJMPQ01B8                        ;
;*********************************处理2E.5_0位 ************************
Q0200:             CLR   C                            ;
                   MOV   2EH.5,C                      ;
                   AJMPQ01C2                        ;
;*********************************处理2E.4_0位 ************************
Q0205:             CLR   C                            ;
                   MOV   2EH.4,C                      ;
                   AJMPQ01CC                        ;
;*********************************处理2E.3_0位 ************************
Q020A:             CLR   C                            ;
                   MOV   2EH.3,C                      ;
                   AJMPQ01D6                        ;
;*********************************处理2E.2_0位 ************************
Q020F:             CLR   C                            ;
                   MOV   2EH.2,C                      ;
                   AJMPQ01E0                        ;
;*********************************处理2E.1_0位 ************************
Q0214:             CLR   C                            ;
                   MOV   2EH.1,C                      ;
                   AJMPQ01EA                        ;
;*********************************处理2E.0_0位 ************************
Q0219:             CLR   C                            ;
                   MOV   2EH.0,C                      ;

;*******************************进一步处理,从外部口输出电平*******************************

Q021A:            CLR A                              ; A清0

                   CJNE A, 2FH,Q0220                  ; 未按键时不存显示数据

                   AJMP   Q021C                     ; 转正常显示                     
               
Q0220:             MOVA,2EH                         ; 送代码

                   CPLA                           ;求反

                   MOV7FH,A                        ;作显示保存用

                   MOVA,2FH                         ;送数据

                   CPL   A                            ;求反

                   MOV7EH,A                         ;作显示保存用
                              
Q021C:             MOV   A,2FH                        ;键值单元送A中

                   CPL   A                            ;取反

                   MOV   B,A                        ;送B中保存

                   CJNEA,#0E2H,Q024F                ;和常数E2H比较,各遥控器值不同

                   MOV   A,2EH                        ;键值单元送A中

                   CPL   A                            ;取反

                   CJNEA,#14H,Q022C               ;熊猫YKF-9电视机遥控器1#键

                   CPL   P3.7                         ;口位值取反

Q022C:             CJNEA,#04H,Q0231               ;熊猫YKF-9电视机遥控器2#键

                   CPL   P3.5                         ;口位值取反

Q0231:             CJNEA,#18H,Q0236               ;   熊猫YKF-9电视机遥控器3#键

                   CPL   P3.3                         ;口位值取反

Q0236:             CJNEA,#08H,Q023B               ;   熊猫YKF-9电视机遥控器4#键

                   CPL   P3.2                         ;   口位值取反

Q023B:             CJNEA,#0CH,Q0240               ;   熊猫YKF-9电视机遥控器5#键

                   CPL   P1.5                         ;   口位值取反

Q0240:             CJNEA,#10H,Q0245               ;   熊猫YKF-9电视机遥控器6#键

                   CPL   P1.4                         ;   口位值取反

Q0245:             CJNEA,#00H,Q024A               ;    熊猫YKF-9电视机遥控器7#键

                   CPL   P1.3                         ;   口位值取反

Q024A:             CJNEA,#90H,Q024F               ;    熊猫YKF-9电视机遥控器0#键

                   CPL   P1.2                         ;   口位值取反

Q024F:             POP   2FH                        ;   弹出堆栈

                   POP   2EH                        ;    弹出堆栈

                   POP   01H                        ;    弹出堆栈

                   POP   00H                        ;    弹出堆栈

                      RET                           ;   子程序返回

;==========================================================================
Q0258:               DB00H, 00H, 00H, 00H        ;....
;==========================================================================

;*****************************   延时子程序50ms   ************************************

Q025C:             PUSH05H                        ;
                   PUSH06H                        ;
                   MOV   R5,#0BFH                     ;
Q0262:             MOV   R6,#0FFH                     ;
                   DJNZR6,$                         ;
                   DJNZR5,Q0262                     ;
                   POP   06H                        ;
                   POP   05H                        ;
                   RET                              ;
;==========================================================================

Q02FD:               DB00H, 00H, 00H, 00H        ;....
;==========================================================================

;******************** 内存单元编码显示子程序   **************************************

ORG 0500H

WWW:SETBES      ;串行口中断允许

      SETBEA      ;   总中断允许

         
      MOV SCON,#00H ;串行口模式为移位寄存器模式,P3.0 接数据 P3.1接时钟

;**********************   2FH单元数据显示   *******************************************

LOOP: MOV A,7FH       ;送一个数据
      
XXX:        MOV R6,A         ; 数据送R6暂存

        SWAP A         ;半字节交换,处理高四位

        ANL A,#0FH       ;去掉高四位

      MOV DPTR ,#TABLE ; 码表首地址

      MOVC A, @A+DPTR; 查表转换

        MOV SBUF,A       ; 送串口发送

        JNB TI,$         ; 等候发完

      CLR TI         ;清标致位
       
        PUSH 06          ;

        MOV A,R6      ;取出存数

        ANL A,#0FH       ;处理低四位

        MOV DPTR ,#TABLE ; 表首地址

        MOVC A, @A+DPTR; 查表

        MOV SBUF,A       ;送串行口发送

WAIT: JNB TI,WAIT      ; 等等

        CLR TI         ; 清标致
       

        AJMP PPP         ;转低电平单元数据显示

;**********************2EH单元数据显示*******************************************

PPP:MOV A,7EH      ;送数

        MOV R6,A          ; 不是0送入R6保存

        SWAP A            ;半字节交换,先处理高四位

        ANL A,#0FH      ; 去掉高四位

      MOV DPTR ,#TABLE;码表地址

      MOVC A, @A+DPTR   ; 查表

        MOV SBUF,A      ; 送串行口发送

        JNB TI,$          ; 等候

      CLR TI            ;清标致

        MOV A,R6          ; 取数

        ANL A,#0FH      ; 处理低四位

        MOV DPTR ,#TABLE; 码表

        MOVC A, @A+DPTR   ; 查表

       MOV SBUF,A      ;送串口

WAIT2: JNB TI,WAIT2   ; 等候

       CLR TI            ;清标致
               
PPP1:    POP 06H         ;弹出

           RET            ;      

TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;码表--0,1,2,3,4,5,6,7,8
       DB 90H,88H,83H,0C6H,0A1H,86H,8EH         ;--9,A,B,C,D,E,F



END

nf新生 发表于 2012-5-6 00:07:00

要好好研究一下才行。。。学习了。。。谢谢共享

ddcchh 发表于 2012-10-12 09:23:50

我用这个程序做的客厅红外线遥控灯(2008年使用至今),正如网上评论的一样,有时误动作(电视机遥控器在作怪!),抽点时间将电路整理出来!供大家点评!

renwocai 发表于 2012-10-13 18:56:24

楼主就是覃远高吗,这个名字好熟

ddcchh 发表于 2012-10-15 17:17:47

没有"覃远高"老师伟大,他开的一个网页我看过,里面东东不少!

tonyone 发表于 2012-10-15 22:09:47

是不是反编译出来的?

ddcchh 发表于 2012-10-16 08:34:04

2004年写的程序,注解不详,后来源文件丢失,HEX文件在,后又反汇编改写.
页: [1]
查看完整版本: 单片机红外线解码程序(日本三菱M50462系列)----原创1