钻石会员
主题
回帖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 |
|