基于stc89c52单片机的红外学习型遥控器

控制/MCU

1811人已加入

描述

  在智能电视、网络机顶盒(电视盒子)上,常见的主流遥控器无外乎“红外线”、“蓝牙”两种遥控方式。“蓝牙”遥控器因其“无需对准”、“可以绕弯控制”、“控制距离远”等特点近年来越来越受到厂商的重视以及消费者的青睐,然而尽管如此,仍然有大量用户坚持使用红外线遥控,原因就是现阶段很多蓝牙遥控器存在诸多缺陷及问题,影响用户日常使用操作。

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

  

  [1] [2]

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分