遥控器是控制灯的 15f104w单片机芯片
程序是通过反编译改过来的 怎么加入掉电唤醒模式 我试了很多次都没成功
程序里有一段不加入(如图) 遥控成功率就降低很多是什么原因
; LED灯遥控程序
;
; 15F104W 12C5A60S2 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
KA EQU P3.0; 开关
KB EQU P3.1; 变光
KC EQU P3.2; 亮度加
KD EQU P3.3; 亮度减
IR EQU P3.4; 输出
LED EQU P3.5; 指示灯
SETB KA;
SETB KB;
SETB KC;
SETB KD;
ORG 0000H
LJMP main; ;开始时跳转转到初始化程序中
;==========================================================================
ORG 000BH
LJMP timer0;
;==========================================================================
main: MOV SP,#0x20;
LCALL timer0_init; //定时0初始化
MOV count_1,#00H //中断计数先清0
MOV count_2,#00H
CLR irflag //红外发射标志先置0
;==========================================================================
C01C4: LCALL keyscan; //键值扫描
JNB keyflag,C01C4 //若有按键按下
CLR LED;
LCALL DELAY20MS;
LCALL DELAY20MS;
LCALL ir_send; //发送红外编码
JNB KA,$;
JNB KB,$;
LCALL DELAY20MS;
JNB KA,$;
JNB KB,$;
CLR keyflag; //按键标志清零
SETB LED;
SJMP C01C4
//---------------------------------------------------------------------------
//void keyscan() // 按键扫描
keyscan:
LCALL DELAY20MS;
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键按下
MOV irdata,#0x12;
SETB keyflag;
RET
C01FE: JB kd,C0206; //D键按下
MOV irdata,#0x1E;
SETB keyflag;
C0206: RET
;==========================================================================
//发送红外数据 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;
;==========================================================================
//定时器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 ;
; SETB TR0
RET
;==========================================================================
//延时
DELAY20MS: ;误差 -0.000000000003us 单片机小精灵生成 11.0592 1T
MOV R7,#0C1H
DL1:
MOV R6,#72H
DL0:
MOV R5,#01H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
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
//---------------------------------------------------------------------------
DELAY500MS: ;误差 -0.000000000063us 单片机小精灵生成 11.0592 1T
MOV R7,#5DH
DL5:
MOV R6,#0B2H
DL4:
MOV R5,#52H
DJNZ R5,$
DJNZ R6,DL4
DJNZ R7,DL5
RET
;==========================================================================
END;
|