赞助论坛
  • 4799阅读
  • 0回复

采用2051单片机控制的红外解码程序 [复制链接]

楼层直达
级别: 中级会员
发帖
451
精华
2
金币
1107
威望
23
贡献
0
好评
235
注册
2009-10-15
楼主    江南闲人 发表于: 2010-11-05 10:47:58 
;*************************************************************************
;
; 文 件 名 : REMOTE.A51                                 *
; 芯片型号 : AT89C2051 MCU @6Mhz                           *
; 发射芯片 : PT2222 OR PT2213                             *
; 功   能 : 遥控器键码接收解码程式                         *
; 版 本 号 : VER. 2.00                                   *
;
;**************************************************************************

ir_rec_ok   bit   00h
ir_first     bit   01h

stack       equ   50h
custom_code   equ   21h
key_code     equ   23h

custom_id   data   0eh

leader_code   data   11h     ; 引导码
end_code     data   5ch     ; 尾码
code_0     data   02h     ; "0" 码
code_1     data   04h     ; "1" 码

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

          org   0000h
          jmp   initial
          org   0003h
          jmp   ir_recever

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

          org   0030h
    initial: mov   r0,#02h
          mov   r1,#7fh     ;#7fh=127
    clr_reg: mov   @r0,#00h
          inc   r0
          djnz   r1,clr_reg   ;条件转移指令 寄存器减1--为0顺序执行

          mov   sp,#stack    
          mov   tmod,#00000001b ;模式1:16 位计数器,无预分频器,GATE=0,TR0=1 即可启动
          mov   ip,#00000001b   ;外部中断0(EX0)为高优先级
          mov   tcon,#00000001b ;外部中断0(EX0),IT0=1 下降沿触发
          clr   et0         ;不允许T0中断
          mov   ie,#10000001b   ;允许所有中断,外部中断0(EX0)允许

  main_pro: nop
          jb     ir_rec_ok,key_pro
          nop
          jmp   main_pro

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

    key_pro: nop                 ;1 个机器周期--24us
          nop
          nop
          nop
          clr   ir_rec_ok
          jmp   main_pro

;************** 红外接收解码程式入口 *************************************

  ir_recever: push   acc
          push   psw
          setb   rs0   ;PSW.3
          clr   rs1   ;PSW.4,R1 区1--08H-0FH
          mov   a,th0
          mov   r2,a
          mov   tl0,#00h
          mov   th0,#00h
          setb   tr0
          cjne   a,#leader_code,chk_end1 ;引导码
          mov   r0,#20h
          setb   ir_first

  int_return: clr   ie0
          pop   psw
          pop   acc
          reti

  chk_end1: jnb   ir_first,int_return   ;位条件转移指令,ir_first=1 则顺序执行
          cjne   a,#end_code,read_code ;cjne a,#data,标号--相等则顺序执行
          jmp   int_return        

  read_code: mov   a,r2
          cjne   a,#code_0,receive_1
          jmp   receive_0

  receive_1: cjne   a,#code_1,int_return   ;#data--立即数,相等则顺序执行
          setb   c
          jmp   encode

  receive_0: clr   c

    encode: mov   a,key_code+1   ;key_code=23H
          rrc   a         ;带进位的循环右移指令
          mov   key_code+1,a
          mov   a,key_code
          rrc   a
          mov   key_code,a
          mov   a,custom_code+1
          rrc   a
          mov   custom_code+1,a
          mov   a,custom_code
          rrc   a
          mov   custom_code,a
          djnz   r0,int_return   ;寄存器减1条件转移指令--寄存器内容为0则顺序执行

          mov   a,custom_code
          cjne   a,#custom_id,ir_exit_int

          mov   a,key_code
          cpl   a         ;累加器取反指令
          xrl   a,key_code+1   ;逻辑异或操作指令
          jnz   ir_exit_int   ;判0转移指令,A=0 则转移执行
          setb   ir_rec_ok
          jmp   ir_ok_exit

ir_exit_int: clr   ir_rec_ok
  ir_ok_exit: clr   tr0
          mov   tl0,#00h
          mov   th0,#00h
          clr   ir_first
          pop   psw
          pop   acc
          reti

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

          db     " ver. 2.00 zhou 00-10-17 16:57 "
end