用STc15f104e做了个学习型红外遥控开关
是上电学习的不带按键的, 上电学习指示灯闪烁,按遥控器,指示灯灭了下, 学习开机键成功。
指示灯继续闪,再按遥控器,指示灯灭了,学习关机键成功,进入待机状态。
上电2秒不学习退出,进入待机状态。
电路原理图如下:
这个是上电学习型红外遥控开关,须要学习开,和关,须要学习两只按键,
单片机源程序如下:
#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);
/********************************************/
/********************* 主函数 *************************/
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;
}*/
那位师博能修改一下程序改成学习一只按键就有开,和关的功能,修改分亨一下谢谢大家!
全部资料51hei下载地址:
上电自动学习型红外遥控开关.rar
(1.49 KB, 下载次数: 183)
|