采用stc89c52单片机的红外学习型遥控器汇编代码

发布者:梦中徐来最新更新时间:2018-03-08 来源: eefocus关键字:stc89c52  单片机  红外  遥控器 手机看文章 扫描二维码
随时随地手机看文章

很详细的红外学习型遥控器,储存在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


关键字:stc89c52  单片机  红外  遥控器 引用地址:采用stc89c52单片机的红外学习型遥控器汇编代码

上一篇:中断触发定时器:99秒计时+99秒倒计时
下一篇:四位数码管显示的数字钟c程序自制

推荐阅读最新更新时间:2024-03-16 15:56

内嵌微控制器的无线数据发射器的特性及应用
    摘要: 简要介绍内嵌AVR RISC微控制器的无线数据发射器AT86RF401的功能、内部结构、引脚排列及典型的应用电路。     关键词: 线数据传输 无线发射器 微控制器 概 述 AT86RF401是单片机集成内嵌AVR RISC微控制器的RF无线数据发射器,输出频率范围为250~450MHz,最大输出功率+6dBm,发射率10Kband。芯片内嵌AVR RISC微控制器、2KB(1K×16b)的Flash程序存储器、128B(字节)的可下载的EEPROM数据存储器、128B的RISC SRAM、看门狗定时器、6个通用I/O、在系统可编程。工作电压2.0~
[嵌入式]
51单片机复位电路设计
单片机在可靠的复位之后,才会从0000H地址开始有序的执行应用程序。同时,复位电路也是容易受到外部噪 声干扰的敏感部分之一。因此,复位电路应该具有两个主要的功能: 1. 必须保证系统可靠的进行复位; 2. 必须具有一定的抗干扰的能力; 复位电路应该具有上电复位和手动复位的功能。以MCS-51单片机为例,复位脉冲的高电平宽度必须大于2个机器周期,若系统选用6MHz晶振,则一个机器周期为2us,那么复位脉冲宽度最小应为4us。在实际应用系统中,考虑到电源的稳定时间,参数漂移,晶振稳定时间以及复位的可靠性等因素,必须有足够的余量。图1是利用RC充电原理实现上电复位的电路设计。实践证明,上电瞬间RC电路充电,RESET引脚出现正脉冲。只要R
[单片机]
51<font color='red'>单片机</font>复位电路设计
WS51F7340系列物联网 MCU的特点和概括
1T 8051 内核,16KB Flash,2KB 可编程 Boot Loader,1KB SRAM,128B EEPROM,25通道低功耗 Touch Key,1 个 26 通道 12 位 SAR-ADC,4 个通用定时器,4 对 8 通道16 位互补输出 PWM,1 路蜂鸣器输出,2 个 UART,1 个 I2C,1 个 SPI,1 个 WDT, 1 个 WKT,硬件和软件 LED 驱动,软件 LCD 驱动。 1 WS51F7340特性 n 工作电压: 2.0V-5.5V n 工作温度: -40-+105℃ n 封装类型: SOP28/TSSOP28/SOP24/TSSOP24/SOP20/TSSOP20 n 内
[单片机]
单片机(51) 中断函数如何使用
1.定时器与延时的区别 大家可能会觉得我们用延时函数照样可以实现代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。 而定时器是不需要占用CPU的使用权的,它是独立自己运行的,就像我们调好5分钟的闹钟,在这5分钟里我们可以随意执行任务,也可以什么事都不做,但是5分钟过后闹钟响了就要执行相关的任务了。 所以代码的实现原理就是每隔51微秒,有个变量会自加1,过了1000个51微秒的时候LED的状态才会改变,可以说CPU在51ms的时间里基本没什么事做,只是在51微秒到了的时候做了“cnt++;”这样简单的任务,然后又空闲地等下一个51微秒的到
[单片机]
<font color='red'>单片机</font>(51) 中断函数如何使用
PL2303单片机串口转USB口实现串行通信
引言 随着科学技术的快速发展,单片机的应用已经渗入到了生产、生活的方方面面,其应用范围越来越广泛,应用前景越来越好。基于单片机的开发应用在目前创新技术发展中一支独秀,非常受广大科技爱好者、在校大学生以及科技开发工作者的青睐。多功能、超强型的单片机在市场上也层出不穷,为单片机的开发应用提供了很好的基础。目前,在单片机的应用系统设计中,USB接口的使用越来越多,简化了单片机系统与外部系统进行信息交换的接口电路,提高了信息交换的可靠性及交换速度。目前市场上提供的各类型单片机品种中,有些型号的单片机在其内部集成有USB接口部件,但大部分的单片机不含有USB接口电路。对芯片内部不含有USB串行接口的单片机,进行USB接口设计时,要通过外
[单片机]
PL2303<font color='red'>单片机</font>串口转USB口实现串行通信
PIC单片机系列介绍
PIC 单片机 目前有8位系列、16位系列和32位系列,简单介绍如下: 8位机系列: 早期一次性编程的有PIC12Cxxxx系列、PIC16CXXX系列,目前不推荐使用,但还有一些老产品在用,所以还有出货。 目前的FLASH系列产品,PIC10FXXX、PIC12FXXX、PIC16FXXX,PIC18FXXXX等,PIC10F/PIC12F属于低档8位单片机,某些系列带8BIT AD口,价格低,体积小,适合一些小应用,PIC16F属于中档8位单片机,大多数带10BIT AD口,还有诸如CCP,SPI,I2C,UART等外设端口,价格适中,出货量大,PIC18F系列属于高档8位单片机,价格偏高,小批量购买的价格和16位单片机差不多
[单片机]
430单片机之定时器A功能的大致介绍
总的来说,430单片机一共有三个定时器,定时器A,定时器B,还有就是看门狗定时器,这里我们主要是讨论430单片机的定时器A的功能,定时器A的功能是我目前见过最厉害的定时器,视频上说用好定时器A的话,对于今后真正的掌握430具有很重要的意义 同样是先介绍一下定时器A的特点:(英语六级科学类文章的常用写法,总分总) 1:可作为异步的16位定时器,16位的计数器,其中计数器有四种工作方式 2:可以调节的外部时钟源 3:3个捕获比较源 4:拥有可以输出PWM功能 5:异步的输入与输出锁存 6:拥有多个中断源 其实,看datasheet现在真的掌握方法了,看完简介关键就是看懂下面这张图,在编程的时候熟悉相关寄存器的操作就可以了 并且
[单片机]
430<font color='red'>单片机</font>之定时器A功能的大致介绍
单片机在电源设计中的应用
电源设计人员经常面临种种互相对立的要求。一方面要缩小体积、降低成本,另一方面又要提供更多功能并提高输出功率。受原理上的限制,模拟电源本身的功能有限,而模拟电源控制器的设计更是越来越复杂。由于这一原因,有些设计人员转向了纯数字电源设计。然而,对于许多设计人员来说,如此快速地转向不熟悉的领域并不容易。比较可行的一种折衷方法是采用传统模拟电源,但增加数字单片机做为前端。 这种设计的优点在于电源本身的控制仍然使用模拟技术来实现。因此电源设计人员不需要从头重新开始全数字设计就可以为现有设计增加新的功能。采用这种方法,设计中仍然使用熟悉的误差放大器、电流检测以及电压检测电路。当然,尽管有些设计单元(如补偿网络)仍然采用分立器件实现,但其余部
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved