这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 拆壁扇,并改成遥控控制,详细的过程图解

共2条 1/1 1 跳转至

拆壁扇,并改成遥控控制,详细的过程图解

高工
2014-06-23 07:25:07     打赏
懒人总是想改装,就是为了图方便,这个壁扇只能是绳子拉拉拉,极不方便,厨房东西堆着,人进去就比较麻烦,还要拉绳子,所以一直想改成遥控,正好,这几天有空,把一些没用的东西都找出来了。


下图是遥控器,以前买学习板送的,一块多一只
左边是红外接收管,之前改装机顶盒买的,大概4毛一只



这个单片机坏了一半,P1口坏了,其它口还正常,放着一直不知道做什么,正好,拆掉多余的东西,把这个拿过来


没用的都拆掉,留个晶振


还有几个继电器,是之前拆老式的稳压电源里拆出来的,很旧,质量也不好,想扔又可惜,正好也给他用这里了,电风扇用的次数不多的,一年继电器估计也跳不到100次,所以质量差的没有关系,本来用双向可控硅最方便,但是手头没有这个东西,本着废物利用的原则,先用垃圾继电器




开拆风扇,这个没什么好看的,大家都知道里面长啥样


很简单的,三档加摇头


下面开始组装
把复位电路和5V稳压电路,贴到背面
贴片体积小,稳定可靠


正面4个三极管,用来驱动继电器


把空的地方弄掉不要


反面




这样就差不多了,找位置安装
还好风扇里面还是比较空的
位置这样摆,最右边那点小小的线路板是阻容降压,忘了拍正面照了






接线












相当乱,哈哈,扎下吧
后面空间很大,就这样吧,不影响




红外头贴在正面






试机一次成功,这下方便多了,遥控按按就可以控制了,包括风速调节,摇头,有时间还可以从程序上增加定时功能,先弄到这里


补充一下,4个继电器,最多同时工作是二个,单个电流是24ma,单片机整块是13ma,所以最多是61ma,我阻容降压的电容是1uf,万用表测量值是1.045uf

理论电流是1.04/14.5=72ma,所以够用,就没有使用变压器


谢谢大家耐心看完!


程序代码:

#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit IR=P3^2;  //红外接口标志
sbit J0=P3^4;  //摇头继电器
sbit J1=P3^5;  //一档
sbit J2=P3^6;  //二档
sbit J3=P3^7;  //三档

/*------------------------------------------------
                全局变量声明
------------------------------------------------*/

unsigned char  irtime;    //红外用全局变量

bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];

/*------------------------------------------------
                  函数声明
------------------------------------------------*/

void Ir_work(void);
void Ircordpro(void);
/*------------------------------------------------
                定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{

  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  TH0=0x00; //重载值
  TL0=0x00; //初始化值
  ET0=1;    //开中断
  TR0=1;    
}
/*------------------------------------------------
                  外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1;   //使能外部中断
EA = 1;    //开总中断
}

/*------------------------------------------------
                  定时器0中断处理
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
  irtime++;  //用于计数2个下降沿之间的时间
}

/*------------------------------------------------
                  外部中断0中断处理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
  static unsigned char  i;             //接收红外信号处理
  static bit startflag;                //是否开始处理标志位

if(startflag)                         
   {
    if(irtime<63&&irtime>=33)          //引导码 TC9012的头码,9ms+4.5ms
    i=0;
    irdata=irtime;                  //存储每个电平的持续时间,用于以后判断是0还是1
    irtime=0;
    i++;
       if(i==33)
    {
    irok=1;
    i=0;
    }
    }
      else
    {
    irtime=0;
    startflag=1;
    }
}
/*------------------------------------------------
                红外码值处理
------------------------------------------------*/
void Ircordpro(void)//红外码值处理函数

  unsigned char i, j, k;
  unsigned char cord,value;

  k=1;
  for(i=0;i<4;i++)          //处理4个字节
     {
     for(j=1;j<=8;j++)      //处理1个字节8位
     {
     cord=irdata[k];
     if(cord>7)             //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
     value|=0x80;
     if(j<8)
     {
     value>>=1;
     }
     k++;
     }
     IRcord=value;
     value=0;     
     } 
     irpro_ok=1;             //处理完毕标志位置1
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void)
{
EX0init(); //初始化外部中断
TIM0init();//初始化定时器

while(1)//主循环
   {
   if(irok)                        //如果接收好了进行红外处理
   {   
   Ircordpro();
   irok=0;
   }
       
      if((IRcord[2])==0x0c)           //1档开
      {
      J1=0;
      J2=1;
      J3=1;
      }
      if((IRcord[2])==0x18)           //2档开
      {
      J1=1;
      J2=0;
      J3=1;
      }
      if((IRcord[2])==0x5e)           //3档开
      {
      J1=1;
      J2=1;
      J3=0;
      }
      if((IRcord[2])==0x5a)           //停止
      {
      J1=1;
      J2=1;
      J3=1;
      J0=1;
      }
      if((IRcord[2])==0x52)           //摇头(8号)
      {
      if(J1==0||J2==0||J3==0)      //风扇不转的时候不摇头
      J0=0;
      }
      if((IRcord[2])==0x4a)          //停止摇头(9号)
      {
      J0=1;
      }
   }
}
  


高工
2014-06-23 11:33:47     打赏
2楼
阻容降压,好想法。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]