用STc15f104e做了個學習型紅外遙控開關(guān)
是上電學習的不帶按鍵的, 上電學習指示燈閃爍,按遙控器,指示燈滅了下, 學習開機鍵成功。
指示燈繼續(xù)閃,再按遙控器,指示燈滅了,學習關(guān)機鍵成功,進入待機狀態(tài)。
上電2秒不學習退出,進入待機狀態(tài)。
電路原理圖如下:
108_541075_af0a4644c678d93.jpg (20.12 KB, 下載次數(shù): 169)
下載附件
2019-8-27 15:22 上傳
這個是上電學習型紅外遙控開關(guān),須要學習開,和關(guān),須要學習兩只按鍵,
單片機源程序如下:
#include "STC15F104E.H"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define CPU_Fosc 12000000UL//12M晶振
#define M 1//時鐘
#define Tc 100 //us采樣
#define TH_0 (65536-CPU_Fosc/100*Tc/M/10000)/256
#define TL_0 (65536-CPU_Fosc/100*Tc/M/10000)%256
#define TH_1 (65536-CPU_Fosc/100*5/M/10)/256
#define TL_1 (65536-CPU_Fosc/100*5/M/10)%256
#define delaytime 0x83
/*********************************************/
sbit IR = P3^4;//紅外
sbit LED=P3^3;//學習指示燈
sbit JIDIANQU=P3^0;//可控硅
uint OKCode;
uint ON,OFF;
uchar tim1,tim2,sec;
bit shan,IR_ok;
/*********************************************/
union
{
ulong longcode;
uchar p[4];
} Code;
/*********************************************/
void Delay(uint t);
void InitTimer();
void IAP_disable();
void byte_write(uint addr, uchar dat);
void SectorErase(uint sector_addr);
uchar byte_read(uint addr);
/********************************************/
/********************* 主函數(shù) *************************/
void main()
{
P3=0xFF;
ON=byte_read(0)<<8;
ON|=byte_read(1);
OFF=byte_read(0x200)<<8;
OFF|=byte_read(0x201);
InitTimer();
tim1=tim2=sec=0;
while(sec<2)
{ LED=shan;
if(IR_ok)
{
SectorErase(0);
byte_write(0,Code.p[1]);
byte_write(1,Code.p[2]);
ON=OKCode;
IR_ok=0;
LED=1;
Delay(400);
tim1=tim2=sec=0;
while(sec<2)
{
LED=shan;
if(IR_ok)
{
SectorErase(0x200);
byte_write(0x200,Code.p[1]);
byte_write(0x201,Code.p[2]);
OFF=OKCode;
IR_ok=0;
break;
}
}
break;
}
}
LED=1;
TR1=0;
while(1)
{
if(IR_ok)
{
if(OKCode==ON)
{
JIDIANQU=0;
}
if(OKCode==OFF)
{
JIDIANQU=1;
}
IR_ok=0;
}
}
}
/***********************************/
void InitTimer()
{
#if (M==1)
AUXR=0xc0;//定時器1T時鐘
#endif
TH0=TH_0;
TL0=TL_0;
TH1=TH_1;
TL1=TL_1;
EA=ET0=TR0=ET1=TR1=1;
}
/***********************************/
void Delay(uint t)
{
uchar a,b;
for(; t>0; t--)
for(b=222; b>0; b--)
for(a=12; a>0; a--)
{
;
}
}
/***********************************/
void timer1() interrupt 3 using 1
{
if(++tim1>=40)
{
tim1=0;
shan=!shan;
if(++tim2>=5)
{
tim2=0;
++sec;
}
}
}
/***********************************/
void timer0() interrupt 1 using 2
{
static uint Step;
static uchar Count;
static bit IRb,IRa,IRsync;
if(IR_ok)
{
return;
}
IRb = IRa;
IRa = IR;
++Step;
if(IRb && !IRa)
{
if(Step>(14000/Tc))
{
IRsync=0;
}
else if(IRsync)
{
if(Step>(3000/Tc))
{
IRsync=0;
}
else
{
Code.longcode<<=1;
if(Step>(1500/Tc))
{
Code.longcode|=1;
}
if (--Count==0)
{
if(Code.p[2]=~Code.p[3])
{
OKCode=Code.longcode>>8;
IR_ok=1;
}
IRsync=0;
}
}
}
else if (Step>(9000/Tc-4)&&Step<(13500/Tc+4))
{
IRsync=1 ;
Count=32;
}
Step=0;
}
}
/***********************************/
void byte_write(uint addr, uchar dat)
{
IAP_CONTR=delaytime;
IAP_ADDRH=addr>>8;
IAP_ADDRL=addr;
IAP_CMD=0x02;
IAP_DATA=dat;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
_nop_();
_nop_();
_nop_();
IAP_disable();
}
/*********************************/
void SectorErase(uint sector_addr)
{
IAP_CONTR=delaytime;
IAP_ADDRH=(sector_addr&0xfe00)>>8;
IAP_ADDRL=sector_addr;
IAP_CMD=0x03;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
_nop_();
_nop_();
_nop_();
IAP_disable();
}
/********************************/
uchar byte_read(uint addr)
{
IAP_CONTR=delaytime;
IAP_ADDRH=addr>>8;
IAP_ADDRL=addr;
IAP_CMD=0x01;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
_nop_();
_nop_();
_nop_();
IAP_disable();
return (IAP_DATA);
}
/**********************************/
void IAP_disable()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0x80;
IAP_ADDRL=0;
}
/*********************************/
/*uchar reverse8( uchar c )
{
c=(c&0x55)<<1|(c&0xAA)>>1;
c=(c&0x33)<<2|(c&0xCC)>>2;
c=(c&0x0F)<<4|(c&0xF0)>>4;
return c;
}*/
那位師博能修改一下程序改成學習一只按鍵就有開,和關(guān)的功能,修改分亨一下謝謝大家!
全部資料51hei下載地址:
上電自動學習型紅外遙控開關(guān).rar
(1.49 KB, 下載次數(shù): 183)
2019-8-27 15:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|