程序是反编译后整理修改 单片机用的是15w201s 支持掉电唤醒 INT0 INT1 INT4唤醒
两节CR2016电池供电 电池容量太小 红外耗电有点大 发射时电压从6V降到5V甚至更低 电池可能用不了多久
制作出来的实物图如下:
单片机源程序如下:
- ;==========================================================================
- //发送红外数据 void ir_send()
- ir_send: MOV set_count_1,#02H; //发送编码中的引导码(9ms高电平+4.5ms低电平)
- MOV set_count_2,#9EH;
- SETB irflag ////红外发射标志
- LCALL TX_TIME; //定时器发送
-
- MOV set_count_1,#01H; //发送编码中的4.5ms低电平
- MOV set_count_2,#50H;
- CLR irflag //红外发射标志 低电平则不发射
- LCALL TX_TIME; //定时器发送
-
- MOV ircode,#80H; //发送16位用户码的前1-8位
- LCALL ir_sendbyte //红外发送一个字节数据
-
- MOV ircode,#7FH; //发送16位用户码的前9-16位
- LCALL ir_sendbyte //红外发送一个字节数据
-
- MOV ircode,irdata; //发送8位数据码
- LCALL ir_sendbyte //红外发送一个字节数据
-
- MOV A,irdata;
- CPL A ; 取反
- MOV ircode,A //发送8位数据反码
- LCALL ir_sendbyte //红外发送一个字节数据
- MOV set_count_1,#00H; //发送编码中的0.56ms高电平
- MOV set_count_2,#23H;
- SETB irflag //红外发射标志
- LCALL TX_TIME; //定时器发送
-
- ; SETB IR ;//发射完了关闭红外发射二极管
- ; RET;
- ; 不加入下面这部分程序 遥控成功概率变低很多
- LCALL DELAY23MS //延时23ms(编码中的23ms低电平)
- MOV set_count_1,#02H; //发送编码中的引导码(9ms高电平+4.5ms低电平)
- MOV set_count_2,#9EH;
- SETB irflag
- LCALL TX_TIME; //定时器发送
- MOV set_count_1,#01H //发送编码中的4.5ms低电平
- MOV set_count_2,#50H
- CLR irflag
- LCALL TX_TIME; //定时器发送
- MOV set_count_1,#00H //发送编码中的0.56ms高电平
- MOV set_count_2,#23H;
- SETB irflag
- LCALL TX_TIME; //定时器发送
- SETB IR ;//发射完了关闭红外发射二极管
- RET;
-
- ;----------------------------------------------------------------------------------
- //红外发送一个字节数据
- ir_sendbyte: MOV R7,#0x00;
- Q0223: MOV set_count_1,#00H; //发送编码中的0.56ms高电平
- MOV set_count_2,#23H;
- SETB irflag //红外发射标志 启动红外发射二极管发射
- LCALL TX_TIME; //定时器发送
- MOV A,ircode //判断红外编码最低位,若为1则1.69ms的低电平
- JNB ACC.0,Q024C
- MOV set_count_1,#00H; //为0则0.565ms的低电平
- MOV set_count_2,#82H;
- SJMP Q0252
- Q024C: MOV set_count_1,#00H;
- MOV set_count_2,#0x2B;
- Q0252: CLR irflag //红外发射标志 低电平则不发射
- LCALL TX_TIME; //定时器发送
- MOV A,ircode //判断红外编码最低位,若为1则1.69ms的低电平
- CLR C
- RRC A //将数据右移,即从低位到高位发送
- MOV ircode ,A
- INC R7
- CJNE R7,#0x08,Q0223
- RET
- ;------------------------------------------------------------------------------------------------
- //定时器发送
- TX_TIME: MOV count_1,#00H; //中断计数先清0
- MOV count_2,#00H;
- SETB TR0 //开启定时器0
- Q0232: CLR C //等待发送完
- MOV A,count_2;
- SUBB A,set_count_2;
- MOV A,count_1;
- SUBB A,set_count_1;
-
- JC Q0232
- CLR TR0 //关闭定时器0
- RET;
复制代码
; LED灯遥控程序
;
; 15W201S 11.0592M
;==========================================================================
;标号==============指令================================地址===机器码=======
;==========================================================================
count_1 EQU 08H;
count_2 EQU 09H;
set_count_1 EQU 0CH;
set_count_2 EQU 0DH;
irdata EQU 0EH;
ircode EQU 0FH;
keyflag EQU 20H.0; 按键标志位 按下=1
irflag EQU 20H.1; 红外发射标志 发射=1
P5M1 DATA 0xC9 ; P5M1.n,P5M0.n =00--->Standard, 01--->push-pull
P5M0 DATA 0xCA
P5 EQU 0C8H
KA EQU P3.0; 开关
KB EQU P3.2; 变光
KC EQU P3.3; 亮度加
KD EQU P5.4; 亮度减
IR EQU P3.1; 输出
LED EQU P5.5; 指示灯
INT_CLKO DATA 08FH //外部中断与时钟输出控制寄存器
; INT2 BIT P3.6 //INT2引脚定义
; INT3 BIT P3.5 //INT3引脚定义
INT4 BIT P3.0 //INT4引脚定义
ORG 0000H
LJMP main;
ORG 0003H
LJMP INT_0
;==========================================================================
ORG 000BH
LJMP timer0;
ORG 0013H
LJMP INT_1
; ORG 0053H //INT2中断入口
; RETI
; ORG 005BH //INT3中断入口
; RETI
ORG 0083H //INT4中断入口
RETI
ORG 100H
;==========================================================================
main: MOV SP,#3FH; MOV SP,#0x20;
; ORL INT_CLKO,#10H //(EX2 = 1)使能INT2下降沿中断
; ORL INT_CLKO,#20H //(EX3 = 1)使能INT3下降沿中断
ORL INT_CLKO,#40H //(EX4 = 1)使能INT4下降沿中断
CLR A
MOV P5M1, A ;设置为准双向口
MOV P5M0, A
LCALL timer0_init; //定时0初始化
MOV count_1,#00H //中断计数先清0
MOV count_2,#00H
CLR irflag //红外发射标志先置0
SETB LED;
SETB KA;
SETB KB;
SETB KC;
SETB KD;
;==========================================================================
C01C4: LCALL keyscan; //键值扫描
JB keyflag,C01C5 //若有按键按下
JNB INT0, $ ;高电平时才进入睡眠
JNB INT1, $ ;高电平时才进入睡眠
CLR IE0 ;外中断0标志位
CLR IE1 ;外中断1标志位
SETB EX0 ;INT0 Enable
SETB EX1 ;INT1 Enable
SETB IT0 ;INT0 下降沿中断
SETB IT1 ;INT1 下降沿中断
ORL PCON, #0x02;
NOP
NOP
LJMP C01C4
//---------------------------------------------------------------------------
C01C5: CLR LED;
LCALL DELAY6MS;
LCALL ir_send; //发送红外编码
JNB KA,$;
JNB KB,$;
LCALL DELAY6MS;
JNB KA,$;
JNB KB,$;
CLR keyflag; //按键标志清零
SETB LED;
; MOV R1, #110
SJMP C01C4
//---------------------------------------------------------------------------
//void keyscan() // 按键扫描
keyscan:
JB ka,C01EE; //A键按下
MOV irdata,#0x01;
SETB keyflag;
RET;
C01EE: JB kb,C01F6; //B键按下
MOV irdata,#0x06;
SETB keyflag;
RET;
C01F6: JB kc,C01FE; //C键按下
JB KD,C01F7; //D键按下
MOV irdata,#0x1E;
SETB keyflag;
RET;
C01F7: MOV irdata,#0x12;
SETB keyflag;
RET
C01FE: ; JB kd,C0206; //D键按下
; MOV irdata,#0x1E;
; SETB keyflag;
C0206: RET
;==========================================================================
//定时器0中断 timer0_interrupt
timer0:
PUSH ACC
INC count_2;
MOV A,count_2;
JNZ Q02B3
INC count_1;
Q02B3: JNB irflag,Q02BA ; //有发射标志,则发射38khz的矩形波
CPL IR;
SJMP Q02BC
Q02BA: SETB IR;//否则不发射,即相当于发射编码中的低电平
Q02BC: POP ACC
RETI
;==========================================================================
//定时器0初始化
timer0_init: MOV TMOD,#02H //定时0 8位自动重装模式
MOV TH0,#0F3H; //定时13us,38K红外矩形波
MOV TL0,#0E6H;
SETB EA
SETB ET0 ;
RET
;========================================================================
INT_1:
CLR EX1 ;INT1 Disable
CLR IE1 ;外中断1标志位
RETI
;========================================================================
INT_0:
CLR EX0 ;INT0 Disable
CLR IE0 ;外中断0标志位
RETI
;==========================================================================
//延时
DELAY6MS: ;误差 -0.018084490741us
MOV R6,#0C2H
DL0:
MOV R5,#54H
DJNZ R5,$
DJNZ R6,DL0
NOP
RET
;==========================================================================
DELAY23MS: ;误差 -0.054253472225us 11.0592 1T
MOV R7,#38H
DL3:
MOV R6,#0FCH
DL2:
MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL2
DJNZ R7,DL3
MOV R5,#01H
DJNZ R5,$
RET
;==========================================================================
$INCLUDE (TX.ASM)
END;
上图Keil代码下载:
15W201S 15W204S红外遥控器 - 掉电唤醒.rar
(30.89 KB, 下载次数: 31)
|