|
遙控器是控制燈的 15f104w單片機(jī)芯片
程序是通過反編譯改過來的 怎么加入掉電喚醒模式 我試了很多次都沒成功
程序里有一段不加入(如圖) 遙控成功率就降低很多是什么原因
51hei截圖20210911140416.jpg (48.39 KB, 下載次數(shù): 20)
下載附件
2021-9-11 14:06 上傳
; LED燈遙控程序
;
; 15F104W 12C5A60S2 11.0592M
;==========================================================================
;標(biāo)號==============指令================================地址===機(jī)器碼=======
;==========================================================================
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; 按鍵標(biāo)志位 按下=1
irflag EQU 20H.1; 紅外發(fā)射標(biāo)志 發(fā)射=1
KA EQU P3.0; 開關(guān)
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; ;開始時(shí)跳轉(zhuǎn)轉(zhuǎn)到初始化程序中
;==========================================================================
ORG 000BH
LJMP timer0;
;==========================================================================
main: MOV SP,#0x20;
LCALL timer0_init; //定時(shí)0初始化
MOV count_1,#00H //中斷計(jì)數(shù)先清0
MOV count_2,#00H
CLR irflag //紅外發(fā)射標(biāo)志先置0
;==========================================================================
C01C4: LCALL keyscan; //鍵值掃描
JNB keyflag,C01C4 //若有按鍵按下
CLR LED;
LCALL DELAY20MS;
LCALL DELAY20MS;
LCALL ir_send; //發(fā)送紅外編碼
JNB KA,$;
JNB KB,$;
LCALL DELAY20MS;
JNB KA,$;
JNB KB,$;
CLR keyflag; //按鍵標(biāo)志清零
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
;==========================================================================
//發(fā)送紅外數(shù)據(jù) void ir_send()
ir_send: MOV set_count_1,#02H; //發(fā)送編碼中的引導(dǎo)碼(9ms高電平+4.5ms低電平)
MOV set_count_2,#9EH;
SETB irflag ////紅外發(fā)射標(biāo)志
LCALL TX_TIME; //定時(shí)器發(fā)送
MOV set_count_1,#01H; //發(fā)送編碼中的4.5ms低電平
MOV set_count_2,#50H;
CLR irflag //紅外發(fā)射標(biāo)志 低電平則不發(fā)射
LCALL TX_TIME; //定時(shí)器發(fā)送
MOV ircode,#80H; //發(fā)送16位用戶碼的前1-8位
LCALL ir_sendbyte //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)
MOV ircode,#7FH; //發(fā)送16位用戶碼的前9-16位
LCALL ir_sendbyte //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)
MOV ircode,irdata; //發(fā)送8位數(shù)據(jù)碼
LCALL ir_sendbyte //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)
MOV A,irdata;
CPL A ; 取反
MOV ircode,A //發(fā)送8位數(shù)據(jù)反碼
LCALL ir_sendbyte //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)
MOV set_count_1,#00H; //發(fā)送編碼中的0.56ms高電平
MOV set_count_2,#23H;
SETB irflag //紅外發(fā)射標(biāo)志
LCALL TX_TIME; //定時(shí)器發(fā)送
; SETB IR ;//發(fā)射完了關(guān)閉紅外發(fā)射二極管
; RET;
; 不加入下面這部分程序 遙控成功概率變低很多
LCALL DELAY23MS //延時(shí)23ms(編碼中的23ms低電平)
MOV set_count_1,#02H; //發(fā)送編碼中的引導(dǎo)碼(9ms高電平+4.5ms低電平)
MOV set_count_2,#9EH;
SETB irflag
LCALL TX_TIME; //定時(shí)器發(fā)送
MOV set_count_1,#01H //發(fā)送編碼中的4.5ms低電平
MOV set_count_2,#50H
CLR irflag
LCALL TX_TIME; //定時(shí)器發(fā)送
MOV set_count_1,#00H //發(fā)送編碼中的0.56ms高電平
MOV set_count_2,#23H;
SETB irflag
LCALL TX_TIME; //定時(shí)器發(fā)送
SETB IR ;//發(fā)射完了關(guān)閉紅外發(fā)射二極管
RET;
;----------------------------------------------------------------------------------
//紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù)
ir_sendbyte: MOV R7,#0x00;
Q0223: MOV set_count_1,#00H; //發(fā)送編碼中的0.56ms高電平
MOV set_count_2,#23H;
SETB irflag //紅外發(fā)射標(biāo)志 啟動紅外發(fā)射二極管發(fā)射
LCALL TX_TIME; //定時(shí)器發(fā)送
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 //紅外發(fā)射標(biāo)志 低電平則不發(fā)射
LCALL TX_TIME; //定時(shí)器發(fā)送
MOV A,ircode //判斷紅外編碼最低位,若為1則1.69ms的低電平
CLR C
RRC A //將數(shù)據(jù)右移,即從低位到高位發(fā)送
MOV ircode ,A
INC R7
CJNE R7,#0x08,Q0223
RET
;------------------------------------------------------------------------------------------------
//定時(shí)器發(fā)送
TX_TIME: MOV count_1,#00H; //中斷計(jì)數(shù)先清0
MOV count_2,#00H;
SETB TR0 //開啟定時(shí)器0
Q0232: CLR C //等待發(fā)送完
MOV A,count_2;
SUBB A,set_count_2;
MOV A,count_1;
SUBB A,set_count_1;
JC Q0232
CLR TR0 //關(guān)閉定時(shí)器0
RET;
;==========================================================================
//定時(shí)器0中斷 timer0_interrupt
timer0:
PUSH ACC
INC count_2;
MOV A,count_2;
JNZ Q02B3
INC count_1;
Q02B3: JNB irflag,Q02BA ; //有發(fā)射標(biāo)志,則發(fā)射38khz的矩形波
CPL IR;
SJMP Q02BC
Q02BA: SETB IR;//否則不發(fā)射,即相當(dāng)于發(fā)射編碼中的低電平
Q02BC: POP ACC
RETI
;==========================================================================
//定時(shí)器0初始化
timer0_init: MOV TMOD,#02H //定時(shí)0 8位自動重裝模式
MOV TH0,#0F3H; //定時(shí)13us,38K紅外矩形波
MOV TL0,#0E6H;
SETB EA
SETB ET0 ;
; SETB TR0
RET
;==========================================================================
//延時(shí)
DELAY20MS: ;誤差 -0.000000000003us 單片機(jī)小精靈生成 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 單片機(jī)小精靈生成 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 單片機(jī)小精靈生成 11.0592 1T
MOV R7,#5DH
DL5:
MOV R6,#0B2H
DL4:
MOV R5,#52H
DJNZ R5,$
DJNZ R6,DL4
DJNZ R7,DL5
RET
;==========================================================================
END;
|
|