专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

带存储功能的学习型红外遥控器源代码

作者:佚名   来源:本站原创   点击数:  更新时间:2010年10月06日   【字体:

  很详细的红外学习型遥控器,储存在24c64中的汇编子程序,在你自己的设计中只要修改一下IO调用它就可以了,是本人的工程验证能学习市面常用的绝大部分红外线遥控器
用的是stc89c52单片机,下面是汇编代码:
 

;************************************************
;**********************************
;---------------------AT24C64 CODE-------------------------      
;==========================================================
ICSTART:			       ;I2C 开始
       SETB  SDA
       NOP
       NOP
       NOP
       NOP
       SETB  SCK
       NOP
       NOP
       NOP
       NOP
       CLR   SDA
       NOP
       NOP
       NOP
       NOP
       CLR   SCK
       RET 
;==========================================================
ICSTOP:				       ;I2C 结束
       CLR   SDA
       NOP
       NOP
       NOP
       NOP
       CLR   SCK
       NOP
       NOP
       NOP
       NOP
       SETB  SCK
       NOP
       NOP
       NOP
       NOP
       SETB  SDA
       RET
;==========================================================
ICACK:				       ;I2C 应答 
       CLR   SDA
       NOP
       NOP
       NOP
       NOP
       SETB  SCK
       NOP
       NOP
       NOP
       NOP
       CLR   SCK
       RET
;==========================================================
NOACK:				       ;I2C 无应答
       SETB  SDA
       NOP
       NOP
       NOP
       NOP
       SETB  SCK
       NOP
       NOP
       NOP
       NOP
       CLR   SCK
       RET
;==========================================================
ICREADBIT:			       ;I2C 读取一位
       SETB  SDA
       NOP
       NOP
       NOP
       NOP
       SETB  SCK
       NOP
       NOP
       NOP
       NOP
       MOV   C,SDA
       CLR   SCK       
       RET   				   
;----------------------------------------------------------
ICREADACK:
       MOV   R7,#200
       SETB  SDA
       NOP
       NOP
       NOP
       NOP
       SETB  SCK
       NOP
       NOP
       NOP
       NOP 
    READACKS:
       JNB   SDA,ACKEND
       DJNZ  R7,READACKS
       SETB  C
       CLR   SCK
       RET
    ACKEND:
       CLR   C
       CLR   SCK
       RET
    
;==========================================================
ICREADBYTE:			       ;I2C 读取一个字节
       MOV   R7,#8       
READLOOP:
       LCALL ICREADBIT
       RLC   A
       DJNZ  R7,READLOOP
       MOV   R7,A
       RET
;==========================================================
ICWRITEBIT:			       ;I2C 写一位       
       MOV   SDA,C
       NOP
       NOP
       NOP
       NOP
       SETB  SCK
       NOP
       NOP
       NOP
       NOP
       CLR   SCK       
       RET	
;==========================================================
ICWRITEBYTE:			       ;I2C 写一个字节
       MOV   A,R7
       MOV   R7,#8
   WRITELOOP:
       RLC   A
       LCALL ICWRITEBIT
       DJNZ  R7,WRITELOOP
       RET
;==========================================================
READAT:
       MOV   A,R7                      ;计算I2C地址	
       MOV   B,#208 ;144
       MUL   AB
       MOV   R2,B
       MOV   R3,A		       


       LCALL ICSTART		       ;I2C  数据读入缓冲区
       MOV   R7,#0A0H		       ;R2R3 I2C地址
       LCALL ICWRITEBYTE	       ;R0   缓冲区地址
       LCALL ICREADACK		       ;R1   数据个数
       JNC   RACKEND
       RET
;
 RACKEND:
       MOV   A,R2
       MOV   R7,A
       LCALL ICWRITEBYTE
       LCALL ICREADACK
       MOV   A,R3
       MOV   R7,A
       LCALL ICWRITEBYTE
       LCALL ICREADACK

       LCALL ICSTART
       MOV   R7,#0A1H
       LCALL ICWRITEBYTE
       LCALL ICREADACK
       MOV   R0,#LRDBUF
       MOV   R1,#208 ;144

   READDATAS:
       LCALL ICREADBYTE
       LCALL ICACK
       MOV   @R0,A
       INC   R0
       DJNZ  R1,READDATAS
       LCALL NOACK
       LCALL ICSTOP
       RET

;==========================================================
WRITEAT:			       ;缓冲区数据写入 I2C

       MOV   A,R7                      ;计算I2C地址	
       MOV   B,#208 ;;144
       MUL   AB
       MOV   R2,B
       MOV   R3,A
       MOV   R5,#13 ;9    13*16=208
       
       MOV   R0,#LRDBUF

   ICWRITENEXT:   
       LCALL ICSTART
       MOV   R7,#0A0H		       
       LCALL ICWRITEBYTE
       LCALL ICREADACK
       JNC   WACKEND
;
;
   WACKEND:
       MOV   A,R2
       MOV   R7,A
       LCALL ICWRITEBYTE
       LCALL ICREADACK
       MOV   A,R3
       MOV   R7,A
       LCALL ICWRITEBYTE
       LCALL ICREADACK


       MOV   R1,#16             
   WRITEDATAS:
       MOV   A,@R0
       INC   R0      
       MOV   R7,A
       LCALL ICWRITEBYTE
       LCALL ICREADACK       
       DJNZ  R1,WRITEDATAS
       LCALL ICSTOP


       MOV   R7,#250
     DELAY_D:
       MOV   R6,#20
       DJNZ  R6,$
       DJNZ  R7,DELAY_D

       MOV   A,R3
       ADD   A,#16
       MOV   R3,A
       MOV   A,R2
       ADDC  A,#0
       MOV   R2,A


       DJNZ  R5,ICWRITENEXT
       RET       
;*****************************************************************

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LRDREAD:	
             			                       ;红外代码读取
             MOV      R0,#LRDBUF		       ;代码缓冲区清零
             MOV      R1,#208  ;144
             CLR      A
CLRLRDBUF:
            MOV       @R0,A
            INC       R0
            DJNZ      R1,CLRLRDBUF
            MOV       R0,#LRDBUF
            SETB      LRDR
LRDTEST:			       		            
           SETB       TR2         
           SETB       ES			        ;红外代码起始检测
           JB         RI,LLOOP              ;这里是检测有键按下时。。。。。。
           CLR        TR2
           JNB        LRDR,READSTART      
           JB         HWXX,LRDTEST          ;红外学习标志位
           LJMP       LLLOOP
LLOOP:     ;
           CLR     RI
           MOV     A,SBUF
           MOV     R0,#250
           MOV     R1,#250
LP4:       JB      RI,LP3
           DJNZ    R0,LP4
           DJNZ    R1,LP4
           LJMP    LRDTEST
LP3:       CLR     RI
           CLR     ES
           MOV     A,SBUF
           MOV     A,#00H
           
LP2:       
           CLR     HONGWAI                ;红外按钮标志位
           CLR     P3.3
           CLR     HWXX
           MOV     SBUF,#37H
           JNB     TI,$
           CLR     TI
           DEC     SP
           DEC     SP
           LJMP    LOOP 
LLLOOP:     RET 
           	  				        
;--------------------------------------
READSTART:
    CLR  EA
    ;SETB P0.6                          
    MOV  TH1,#0
    MOV  TL1,#12		       
    SETB LRDR
;--------------------------------------
READLOOP_S:
    SETB TR1
    CLR  TF1
TEST_LRDR:
    MOV  A,TH1
    JB   TF1,LRDOVER
    JNB  LRDR,TEST_LRDR
    CLR  TR1			       ;

    INC  R0
    MOV  A,TL1
    MOV  @R0,A
    INC  R0
    MOV  A,TH1
    MOV  @R0,A
    INC  R1			       ;红外线时间	   1
;--------------------------------------
;--------------------------------------
    MOV  TH1,#0
    MOV  TL1,#12
    SETB TR1
    CLR  TF1
    
  TESTLRD:
    MOV  A,TH1
    JB   TF1,LRDOVER
    JB   LRDR,TESTLRD     

    CLR  TR1			       
    INC  R0
    MOV  A,TL1
    MOV  @R0,A
    INC  R0
    MOV  A,TH1
    MOV  @R0,A   		       ;代码        	   2
    INC  R1 
;**************************************	
  
  TEST_DATA: 
    MOV  TH1,#0
    MOV  TL1,#12
    SETB TR1 
    CLR  TF1         

    MOV  A,R1
    SUBB A,#101  ;44H
    JC   READLOOP_S		       ;下一代码    
;--------------------------------------
 LRDOVER:
    CLR  TR1
    SETB EA
    MOV  A,R1
    MOV  LRDBUF,A                      ;代码个数缓冲
    RET 					   
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LRD1SEND:
     CLR   EA
    MOV   R1,LRDBUF
    MOV   R0,#LRDBUF 
    MOV   A,R1
    JZ    LRD_END
    SUBB  A,#101   ;72
    JNC   LRD_END
    CLR   EA
    MOV   TH1,#0

 LRD1OUTLOOP:
    CLR   TR1
    INC   R0
    MOV   A,@R0
    CPL   A
    MOV   TL1,A     
    INC   R0
    MOV   A,@R0
    CPL   A
    MOV   TH1,A 
    SETB  TR1			       
    CLR   TF1
;--------------------------------------
  LRD1CONT:
    CPL   LRD1
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP                                ;发送红外波形  38K HZ 
    JNB   TF1,LRD1CONT      	       ;红外前导代码   	              
    CLR   LRD1     
    DJNZ  R1,SEND_DATA
    LJMP  LRD_END

 SEND_DATA:
;--------------------------------------
 
    CLR   TR1
    INC   R0
    MOV   A,@R0
    CPL   A
    MOV   TL1,A    
    INC   R0
    MOV   A,@R0
    CPL   A
    MOV   TH1,A
    SETB  TR1
    CLR   TF1
    DJNZ  R1,OUT_1_CODE


 LRD_END:
    CLR   TR1
    CLR   TF1
    SETB  EA
    RET
 OUT_1_CODE:
    JNB   TF1,$			       ;红外代码
;--------------------------------------
    LJMP  LRD1OUTLOOP 
    RET  	       ;取下一个代码
;==========================================================
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 


DELAY:
      MOV   R7,#200
DEL_L:
      MOV   R6,#30
      DJNZ  R6,$
      DJNZ  R7,DEL_L
      RET
      
DELY_2:
            MOV     R7,#250
DEL_2:         
           LJMP    DELAY
           DJNZ    R7,DEL_2
           MOV     R7,#250
DEL_3:     LJMP    DEL_2
           DJNZ    R7,DEL_3
           RET
     

源代码下载地址:http://www.51hei.com/ziliao/file/hogwxx1.rar

关闭窗口

相关文章