钻石会员 
 
主题
回帖0
积分11931
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
;可以用C51或2051单片机 
;用12兆的晶振 
;P1.7遥控输出控制继电器 
;P1.6接LED发光管(学习指示) 
;p3.5 SDA(24C02 5脚) 
;p3.4 SCL(24C02 6脚) 
;单片机接上电源 复位 晶振 24C02  即可 
;开机后按遥控5秒以上 ,P1.6接LED发光管亮,进入学习状态, 
;再按任意要学习的按键,P1.6接LED发光管灭,学习就成功了,就可以控制P1.7的输出 
  IRCOM  EQU 20H 
  IRIN  EQU P3.2 
  BEEP  EQU P3.7 
  RELAY  EQU P1.0 
  SDA  BIT P2.0;p3.5 
  SCL  BIT P2.1;p3.4 
  JSTEM  EQU 33H 
  I2CADD  EQU 34H 
;------------------------------------------------ 
  ORG  0000H 
  JMP  MAIN 
  ORG  0003H 
  JMP  IR_IN 
;------------------------------------------------ 
MAIN: 
  MOV  SP,#60H 
  MOV  A,#00H 
  MOV  R0,#20H 
LOOP0:  
  MOV  @R0,A ; 
  INC  R0 
  CJNE  R0,#28H,LOOP0 
  MOV  IE,#81H 
  MOV  TCON,#01H 
  SETB  IRIN ;P3.2 
  SETB  BEEP ;P3.7 
  SETB  RELAY ;P1.0 
  MOV  29H,#27H 
  MOV  A,29H 
Q1: 
  CJNE  A,#28H,Q1 
  MOV  31H,#28H 
  CLR  P1.0 
  JMP  Q1 
;=============== 中断服务程序 ====================   
IR_IN: 
  CLR  EA 
  PUSH  ACC 
  PUSH  PSW 
  SETB  PSW.3  ;选择工作寄存器器组 
  CLR  PSW.4  ;选择工作寄存器器组 
  MOV  R2,#04H 
  MOV  R0,#IRCOM ;20H单元地址送R0 
I1:  
  JNB  IRIN,I2  ;如果P3.2为低电平转I2 
  DJNZ  R2,I1  ; 
  JMP  IR_OUT 
I2:  
  MOV  R4,#20  ; 
I20:  
  CALL  DELAY140US ;调用延时140微秒子程序 
  DJNZ  R4,I20  ;延时140微秒 * 20 * 2 = 5600微秒 
  JB   IRIN,I1  ;如果P3.2为高电平转I1 
I21:  
  JB   IRIN,I3  ;如果P3.2为高电平转I3 
  CALL  DELAY140US 
  JMP  I21 
I3:  
  MOV  R3,#0 
LL:  
  JNB  IRIN,I4  ;如果P3.2为低电平转I2 
  CALL  DELAY140US ;调用延时140微秒子程序 
  JMP  LL 
I4:  
  JB   IRIN,I5  ;如果P3.2为高电平转I5 
  CALL  DELAY140US ;调用延时140微秒子程序 
  JMP  I4 
I5:  
  MOV  R2,#0 
L1:  
  CALL  DELAY140US ;调用延时140微秒子程序 
  JB   IRIN, N1 ;如果P3.2为高电平转N1 
  MOV  A,#8  ;每个单元共有八位 
  CLR  C 
  SUBB  A,R2 
  MOV  A,@R0  ;将20H单元的内容送A / IRCOM = 20H单元 
  RRC  A   ;右移 
  MOV  @R0,A  ;右移后存回R0所指的单元空间 
  INC  R3 
  CJNE  R3,#8,LL ;八位都接收完了吗?未完继续 
  MOV  R3,#0 
  INC  R0   ;指向下一个单元 
  CJNE  R0,#24H,LL ;20H~24H共四个存储单元都存完了吗?未完继续 
  MOV  A,31H  ; 
  CJNE  A,#28H,S1 ; 
  MOV  A,23H  ;将23H单元的值送A,即遥控器的键值反码送A 
  MOV  JSTEM ,A ;将23H单元的值暂存JSTEM=33H,即遥控器的键暂存JSTEM=33H 
  MOV  A,20H  ;将20H单元的值送A,即遥控器的用户码高八位 
  MOV  I2CADD,A ;将20H单元的值送I2CADD=34H,即遥控器的用户码高八位 
  LCALL  I2CWRI  ;调用写24C02子程序 
  MOV  31H,#02H ; 
  SETB  P1.6 
  SETB  P1.0 
S1: 
  MOV  24H,#80 ;改变其值大小可改变长按进入学习状态的等待时间 
  JMP  IR_COMP 
N1:  
  INC  R2 
  CJNE  R2,#30,L1 
IR_OUT:  
  POP  PSW 
  POP  ACC 
  DJNZ  24H,Q6 
  CLR  P1.6 
  MOV  A,#28H 
  JMP  Q8 
Q6: 
  MOV  A,#27H 
Q8: 
  SETB  EA 
  RETI 
;--------------------------------------------------   
IR_COMP: 
  MOV  A,20H ;将20H单元的值送A,即遥控器的用户码高八位  
  MOV  I2CADD,A;将20H单元的值送I2CADD=34H,即遥控器的用户码高八位 
  LCALL  I2CREAD ;读I2C的20H单元内容 
  MOV  A,23H ;与单片机的23H单元内容作比较 
  CJNE  A,JSTEM,S3 
  CPL  P1.7 ;如果相同取反P1.7口 
S3: 
  JMP  IR_OUT 
;=================================================   
I2CWRI:  
  SETB  SDA 
  SETB  SCL ; 
  ACALL  R2STAR ; 
  MOV  R7,#10100000B ; 
  ACALL  R2SEND 
  MOV  ACC,I2CADD 
  MOV  R7,ACC ; 
  ACALL  R2SEND 
  MOV  R0,I2CADD 
  MOV  ACC,JSTEM ; 
  MOV  R7,ACC ; 
  ACALL  R2SEND ; 
  ACALL  R2STOP ; 
  ACALL  DELAY5124US ;延时5124微秒 
  RET 
;----------------------------------------------   
R2SEND:  
  PUSH  ACC ; 
  MOV  ACC,R7 ; 
  MOV  R6,#08H ; 
R2SLOP1:  
  RLC  A ; 
  MOV  SDA,C ; 
  ACALL  DELAY23US ;延时23微秒 
  SETB  SCL ; 
  ACALL  DELAY23US ;延时23微秒 
  CLR  SCL 
  DJNZ  R6,R2SLOP1 ; 
  SETB  SDA 
  ACALL  DELAY23US ;延时23微秒 
  SETB  SCL 
  ACALL  DELAY23US ;延时23微秒 
R2SLOP2:  
  MOV  C,SDA 
  JC   R2SLOP2 
  CLR  SCL ; 
  CLR  SDA 
  POP  ACC ; 
  ACALL  DELAY203US ;延时203微秒 
  RET 
I2CREAD:  
  ACALL  R2STAR ; 
  MOV  R7,#10100000B 
  ACALL  R2SEND ; 
  MOV  A,I2CADD ; 
  MOV  R7,A ; 
  ACALL  R2SEND ; 
  SETB  SDA 
  SETB  SCL 
  ACALL  R2STAR 
  MOV  R7,#10100001B 
  ACALL  R2SEND 
  ACALL  R2READ 
  ACALL  R2STOP 
  MOV  JSTEM,R7 
  RET 
R2STAR:  
  ACALL  DELAY23US ;延时23微秒 
  CLR  SDA 
  ACALL  DELAY23US ;延时23微秒 
  CLR  SCL 
  ACALL  DELAY23US ;延时23微秒 
  RET 
R2READ:  
  PUSH  ACC 
  MOV  R6,#08H 
R2RLOP1:  
  SETB  SDA 
  ACALL  DELAY23US ;延时23微秒 
  SETB  SCL 
  ACALL  DELAY23US ;延时23微秒 
  MOV  C,SDA 
  RLC  A 
  ACALL  DELAY23US ;延时23微秒 
  CLR  SCL 
  DJNZ  R6,R2RLOP1 
  ACALL  DELAY23US ;延时23微秒 
  CLR  SDA 
  MOV  R7,ACC 
  POP  ACC 
  RET 
R2STOP:  
  ACALL  DELAY23US ;延时23微秒 
  SETB  SCL 
  ACALL  DELAY23US ;延时23微秒 
  SETB  SDA 
  ACALL  DELAY23US ;延时23微秒 
  RET 
;**************** 延时140微秒 ********************** 
DELAY140US: 
  MOV  R5,#1  ; 1   =1 
DEL0:   
  MOV  R6,#2  ; 1*1   =1 
DEL1:  
  MOV  R7,#32  ; 1*2*1  =2 
DEL2:  
  DJNZ  R7,DEL2  ; 2*32*2*1 =128 
  DJNZ  R6,DEL1  ; 2*2*1*1  =4 
  DJNZ  R5,DEL0  ; 2*1   =2 
  RET     ; 2   =2 
;================ 延时23微秒 =======================  
DELAY23US:  
  MOV  R3,#10  ; 1   =1 
  DJNZ  R3, $  ; 2*10  =20 
  RET     ; 2   =2 
;**************** 延时5124微秒 ******************* 
DELAY5124US:  
  MOV  R2,#10  ; 1   =1 
D10:  
  MOV  R3,#0FFH ; 1   =1 
  DJNZ  R3,$  ; 2*255*10 =5100 
  DJNZ  R2,D10  ; 2*10  =20 
  RET     ; 2   =2 
;**************** 延时203微秒 *********************** 
DELAY203US:  
  MOV  R3,#100  ; 1   =1 
  DJNZ  R3,$  ; 2*100  =200 
  RET     ; 2   =2 
  END |   
 
 
 
 |