|
這款單片機(jī)紅外線萬(wàn)能學(xué)習(xí)遙控器,使用的單片機(jī)是STC15F104單片機(jī),長(zhǎng)按進(jìn)入學(xué)習(xí),這樣就有3個(gè)學(xué)習(xí)鍵,電路簡(jiǎn)單,容易制作,缺點(diǎn):測(cè)試了一下,效果不錯(cuò),但是還發(fā)現(xiàn)個(gè)問(wèn)小題,就是按鍵發(fā)射信號(hào)時(shí)稍微按久了點(diǎn)就會(huì)進(jìn)入從新學(xué)習(xí)的狀態(tài)中,這時(shí)已學(xué)習(xí)的波形也被擦除了。
;STC15F104E 3路學(xué)習(xí)萬(wàn)能遙控器
;內(nèi)部振蕩11.0592M
;EPPROM寄存器
IAP_DATA EQU 0C2H
IAP_ADDRH EQU 0C3H
IAP_ADDRL EQU 0C4H
IAP_CMD EQU 0C5H
IAP_TRIG EQU 0C6H
IAP_CONTR EQU 0C7H
;***********************
;F38_4KHZ EQU 0FF70H ;38.4KHZ 1T MODE (65536-11059200/2/38400)
;F38_4KHZ EQU 0FFF4H ;38.4KHZ 12T MODE(65536-11059200/2/38400/12)
AUXR EQU 08EH
INT_CLKO EQU 08FH ;輸出時(shí)鐘使能
K0 BIT P3.0;按鍵1
K1 BIT P3.1;按鍵2
K2 BIT P3.2;按鍵3
LED BIT P3.3;指示燈
IR BIT P3.4;紅外接收頭
T1CLKO BIT P3.5;紅外發(fā)射管
;****************************
ORG 0
LJMP START
ORG 0BH
LJMP INT_T0;T0中斷
ORG 30H
START:;初始化
MOV R0,#20H
QL:
MOV @R0,#0;內(nèi)存清0
INC R0
CJNE R0,#80H,QL
;MOV AUXR,#40H ; 1T
MOV P3,#0FFH;拉高管腳
MOV AUXR,#00H ;定時(shí)器12T模式
MOV TMOD,#00H ;定時(shí)器16位自動(dòng)重裝
;--------------------
MOV TH1,#0FFH ;38K方波定時(shí)T1
MOV TL1,#0F4H
SETB TR1
;MOV INT_CLKO,#02H;發(fā)射38K
;MOV INT_CLKO,#00H;停止發(fā)射
;-----------------------------
MAIN:;主程序
CALL KEY0
CALL KEY1
CALL KEY2
JMP MAIN
;-----------------------------
KEY0:
JB K0,KEY0OUT
CALL DELAY20MS;延時(shí)消抖
JB K0,KEY0OUT
;-----------------
CALL OPEN_T0INT;打開(kāi)T0中斷判斷長(zhǎng)按
;-----------------
JBC 0,XUEXI0;長(zhǎng)按,跳轉(zhuǎn)到學(xué)習(xí)功能
JNB K0,$-3;短按等待放開(kāi)
;-----------------
CLR TR0;關(guān)T0
CLR ET0;關(guān)T0中斷
CLR EA;發(fā)射關(guān)中斷
MOV DPTR,#1000H;第1扇區(qū)
CALL FFSS;紅外發(fā)射
KEY0OUT:
RET
XUEXI0:;學(xué)習(xí)
MOV DPTR,#0;第1扇區(qū)
CALL ERASE;扇區(qū)擦除,做好寫(xiě)入準(zhǔn)備
MOV DPTR,#1;第1扇區(qū)第2字節(jié)
CALL XIEXI;紅外接收,存入第1扇區(qū)
RET
;************************
KEY1:
JB K1,KEY1OUT
CALL DELAY20MS;延時(shí)消抖
JB K1,KEY1OUT
;-----------------
CALL OPEN_T0INT;打開(kāi)T0中斷判斷長(zhǎng)按
;-----------------
JBC 0,XUEXI1;長(zhǎng)按跳轉(zhuǎn)到學(xué)習(xí)
JNB K0,$-3;等待放開(kāi)
;-----------------
CLR TR0;關(guān)T0
CLR ET0;關(guān)T0中斷
CLR EA;關(guān)中斷
MOV DPTR,#1200H;第2扇區(qū)
CALL FFSS;紅外發(fā)射
KEY1OUT:RET
XUEXI1:;學(xué)習(xí)
MOV DPTR,#200H;第2扇區(qū)
CALL PDSQ;讀數(shù)判斷扇區(qū)是否為空
MOV DPTR,#201H;第2扇區(qū)第2字節(jié)
CALL XIEXI;紅外接收,存入第2扇區(qū)
RET
;************************
KEY2:
JB K2,KEY2OUT
CALL DELAY20MS;延時(shí)消抖
JB K2,KEY2OUT
;-----------------
CALL OPEN_T0INT;打開(kāi)T0中斷判斷長(zhǎng)按
;-----------------
JBC 0,XUEXI2;長(zhǎng)按跳轉(zhuǎn)到學(xué)習(xí)
JNB K0,$-3;等待放開(kāi)
;-----------------
CLR TR0;關(guān)T0
CLR ET0;關(guān)T0中斷
CLR EA;關(guān)中斷
MOV DPTR,#1300H;第2扇區(qū)
CALL FFSS;紅外發(fā)射
KEY2OUT:RET
XUEXI2:;學(xué)習(xí)
MOV DPTR,#300H;第2扇區(qū)
CALL PDSQ;讀數(shù)判斷扇區(qū)是否為空
MOV DPTR,#301H;第2扇區(qū)第301字節(jié)
CALL XIEXI;紅外接收,存入第2扇區(qū)
RET
;***********************
PDSQ:;讀數(shù)判斷扇區(qū)是否為空,是空就擦除
MOV R1,#200;讀200個(gè)字節(jié)
ZDKA:;
CALL EEPROMR
INC DPTR
CJNE A,#0FFH,RESA;跳到扇區(qū)擦除
DJNZ R1,ZDKA;是否讀完
RET
RESA:
CALL ERASE;扇區(qū)擦除
RET
;*********************
;-----------------------
OPEN_T0INT:;打開(kāi)T0中斷
CLR 0;清長(zhǎng)按標(biāo)志位
MOV 2FH,#0;清計(jì)數(shù),每計(jì)一次70MS
MOV TH0,#0;定時(shí)器0初值
MOV TL0,#0
CLR TF0
SETB ET0;開(kāi)T0中斷
SETB TR0;開(kāi)T0
SETB EA
RET
;***************************
INT_T0:;T0中斷,判斷長(zhǎng)按,長(zhǎng)按標(biāo)志位0置1
INC 2FH;中斷計(jì)數(shù),
MOV A,2FH
CJNE A,#12,INT_T0OUT;70MS*12=840MS
SETB 0;置1
CLR TR0
CLR ET0
CLR EA
INT_T0OUT:
RETI
;***************************
;***************************
XIEXI:;;紅外接收;存入EEPROMW
PUSH DPL;保護(hù)指針
PUSH DPH
CLR 2;清判斷位
CLR LED;亮燈
MOV R1,#0;高電平和低電平總數(shù)
CLR TR0;停止計(jì)時(shí)
X0: JB IR,X0;等待接收頭,無(wú)信號(hào)返回等待
MOV TH0,#0;;定時(shí)器初值歸0
MOV TL0,#0
SETB TR0;有信號(hào)開(kāi)始計(jì)數(shù)
;-------------------
WAIT0:JBC TF0,XOUT;等待超時(shí);超過(guò)70MS退出
JNB IR,WAIT0;等待高電平到來(lái)
CLR TR0;停止計(jì)數(shù),存低電平時(shí)長(zhǎng)
;-------------------
BAOCUN:;存低(高)電平時(shí)長(zhǎng)
MOV A,TH0;高位
CPL A;取反計(jì)數(shù)值就是定時(shí)初值
CALL EEPROMW;寫(xiě)一字節(jié)EEPROMW大約60US
INC DPTR;下一地址
MOV A,TL0;低位
CPL A;取反
CALL EEPROMW;寫(xiě)一字節(jié)EEPROMW大約60US
;-------------------
MOV TH0,#0;定時(shí)器初值歸0
MOV TL0,#6EH;補(bǔ)償120US
SETB TR0;開(kāi)始計(jì)數(shù)
INC DPTR;下一地址
INC R1;電平個(gè)數(shù)加1
CPL 2;取反判斷位,初始是0
JNB 2,WAIT0;是0就跳到等待高電平到來(lái)
;***********************************
WAIT1:JBC TF0,XOUT;等待超時(shí)
JB IR,WAIT1;是1就等待低電平到來(lái)
CLR TR0;停止計(jì)時(shí)
;---------------------------
JMP BAOCUN;存高電平時(shí)長(zhǎng)
XOUT:;退出
CLR TR0;停止計(jì)時(shí)
POP DPH;指針出棧
POP DPL
DEC DPL;減1就是第1字節(jié)地址;用來(lái)保存電平總數(shù)
MOV A,R1;電平總數(shù)
CALL EEPROMW;寫(xiě)入扇區(qū)第1個(gè)地址
SETB LED;關(guān)燈
RET
;***************************
;***************************
FFSS:;紅外發(fā)射
CLR LED;;開(kāi)燈
MOV A,#0;
MOVC A,@A+DPTR
MOV R1,A;從第1扇區(qū)第1地址取出電平總數(shù)
CLR TR0;停止計(jì)數(shù)
INC DPTR;下一地址開(kāi)始為發(fā)射數(shù)據(jù)時(shí)長(zhǎng)
FFSS0:
MOV INT_CLKO,#02H;發(fā)射38K紅外(A版T1為3.5)
;***************************
ZCZ:;讀出定時(shí)時(shí)長(zhǎng)裝入定時(shí)器
MOV A,#0;
MOVC A,@A+DPTR
MOV TH0,A
INC DPTR;下一地址
MOV A,#0
MOVC A,@A+DPTR
;---------------------
CLR C;數(shù)據(jù)修正,10US左右
ADD A,#10
MOV TL0,A
MOV A,#0
ADDC A,TH0
MOV TH0,A
;***************************
SETB TR0;開(kāi)始計(jì)時(shí)
INC DPTR;下一地址
JNB TF0,$;等待溢出
MOV INT_CLKO,#00H;停止發(fā)射
SETB P3.5;熄滅紅外管
CLR TF0;清溢出位
CLR TR0;停止計(jì)數(shù)
;-----------------------
DJNZ R1, FFSS1;電平數(shù)-1是否完畢
SETB P3.5;熄滅紅外管
SETB LED;;關(guān)燈
RET
FFSS1:
MOV A,#0;裝入初值
MOVC A,@A+DPTR
MOV TH0,A
INC DPTR;下一地址
MOV A,#0
MOVC A,@A+DPTR
;---------------------
CLR C;數(shù)據(jù)修正
ADD A,#10
MOV TL0,A
MOV A,#0
ADDC A,TH0
MOV TH0,A
;***************************
SETB TR0;開(kāi)始計(jì)數(shù)
INC DPTR;下一地址
JNB TF0,$;等待溢出
CLR TF0
CLR TR0;停止計(jì)數(shù)
;-----------------------
DJNZ R1,FFSS0;電平數(shù)-1是否完畢
;***************************
MOV INT_CLKO,#00H;停止發(fā)射
SETB P3.5;熄滅紅外管
SETB LED;關(guān)燈
RET
;******************
;EPPROM讀寫(xiě)
;******************
ERASE:;擦除
MOV IAP_CONTR,#83H;允許IAP/IAP操作
MOV IAP_CMD,#3 ;扇區(qū)擦除
MOV IAP_ADDRH,DPH ;送高地址
MOV IAP_ADDRL,DPL ;送低地址
ACALL IAPXX ;觸發(fā)
RET
;************************
EEPROMW:;寫(xiě)
MOV IAP_CONTR,#83H;允許IAP/IAP操作
MOV IAP_CMD,#2 ;送寫(xiě)命令
MOV IAP_ADDRH,DPH ;送高地址
MOV IAP_ADDRL,DPL ;送低地址
MOV IAP_DATA,A ;A是要寫(xiě)入的數(shù)據(jù)
ACALL IAPXX ;觸發(fā)
RET
;************************
EEPROMR:;讀
MOV IAP_CONTR,#83H;允許IAP/IAP操作
MOV IAP_CMD,#1 ;送讀命令
MOV IAP_ADDRH,DPH ;送高地址
MOV IAP_ADDRL,DPL ;送低地址
ACALL IAPXX ;觸發(fā)
MOV A,IAP_DATA ;讀出的數(shù)據(jù)放到A
RET
;************************
IAPXX:;觸發(fā)
;CLR EA ;關(guān)中斷在觸發(fā)之前
MOV IAP_TRIG, #5AH;和11F/15F的相同,而與12C2052的不同
MOV IAP_TRIG, #0A5H ;
NOP
NOP
NOP
;SETB EA
RET
;----------------------
IAP_DISABLE:;禁止IAP/IAP操作
MOV IAP_CONTR,#0
MOV IAP_CMD,#0
MOV IAP_TRIG,#0
MOV IAP_ADDRH,#0FFH
MOV IAP_ADDRL,#0FFH
RET
;----------------------
DELAY20MS: ;延時(shí)
MOV R7,#0EH
DL1:
MOV R6,#0A8H
DL0:
MOV R5,#16H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
END
|
|