STC11F02实现红外线遥控开关

来源:互联网 发布:石家庄淘宝托管 编辑:程序博客网 时间:2024/04/23 22:39

临睡觉时下地闭灯是最讨厌做的一件事。本人为了解决闭灯问题,所以自制了一个红外线遥控开关。所需原料:废旧5V手机充电器,面包板(不要太大),STC11F02(手头只有这个,浪费了不少IO,推荐8脚STC15F100之类的U),5v继电器2个(推荐欧姆龙的,有点小贵),三极管8550PNP 2个,1838B 38khz红外接收头1个,20K电阻一个,有条件可以来个1117 5V。12M晶振,30PF电容。IO口的限流电阻推荐加个。锡桥过线,怕费焊锡的可以导线连^_^!电路过于简单,直接焊接。PNP管子接继电器负极,在负极做开关。

程序如下:

#include "stc11f.h"   //自己写的,可以reg51.h
sbit JD2 = P1^5;      //继电器2口,电灯2
sbit JD1 = P1^0;      //继电器1口,电灯1
sbit KG  = P1^7;      //这链了个三极管,做了个额外的开关,给床头的USB小风扇供电
sbit LED = P3^6;     //工作指示灯,有一个设备打开就亮
bit IR_SEMAPHORE=0,IR_READY=0,LED_CON1=0,LED_CON2=0,LED_CON3=0;
unsigned int temp=0;
unsigned char swap=0,IR_DATA[4]={0};
void main(void)
{
 JD1=1;
 JD2=1;
 KG=1;
 LED=0;

 IT0=1;//外部中断0为下降沿触发方式
 EX0=1;//外部中断0允许

 TMOD=01;//定时器0,16位定时计数,从内部系统时钟输入。
 ET0=0;//定时器0不允许中断
 TH0=0;
 TL0=0;
 TR0=1;//定时器0运行
 
 EA=1;
 while(1)
 {
  if(IR_READY==1)
  {
   if(IR_DATA[2]==~IR_DATA[3]&&IR_DATA[2]==0x45){JD2=~JD2;LED_CON2=~LED_CON2;}
   if(IR_DATA[2]==~IR_DATA[3]&&IR_DATA[2]==0x47){JD1=~JD1;LED_CON1=~LED_CON1;}
    if(IR_DATA[2]==~IR_DATA[3]&&IR_DATA[2]==0x40){KG=~KG;LED_CON3=~LED_CON3;}
   if(LED_CON1==1||LED_CON2==1||LED_CON3==1)LED=1;else LED=0;
   IR_READY=0;
  }
 } 
}
void Interrupt0(void) interrupt 0 using 0
{
 temp=TH0*256+TL0;
 TH0=0;
 TL0=0;
 if(temp>8000&&temp<16000){IR_SEMAPHORE=1;swap=0;return;}
 if(IR_SEMAPHORE==1)
 {
  if(temp>700&&temp<1450){IR_DATA[swap/8]=IR_DATA[swap/8]>>1;swap++;}              //数据0
  if(temp>1450&&temp<3000){IR_DATA[swap/8]=IR_DATA[swap/8]>>1|0x80;swap++;}   //数据1
  if(swap==32){IR_SEMAPHORE=0;swap=0;IR_READY=1;}                                                   //4字节
 }
 
}

 

注意:12Mhz下,其它的频率要另计算数值。

 

最后把灯座卸开,连接好。也可以用胶带固定在外面(就是有点丑)!遥控器可以用38k标准的成品,X宝卖1-2块吧。