历史上的今天
返回首页

历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2019年10月21日 | 两路学习型风扇遥控开关带自然风 单片机源程序+电路

2019-10-21 来源:51hei

路原理图如下:
 
制作说明:

这个电路采用15W104单片机通过红外遥控器控制电风扇。

在初次使用时,首先进行按键学码。

学码方法:找一个闲置的红外遥控器,选择两个好用的按键,按住其中一个遥控
按键不放约6秒,蜂鸣器响一声,表明学习完成。同样方法学习另外一个遥控按键。

正常使用时,短按一下已学习的按键即可控制对应的开关反转,蜂鸣器会响一声。

第一个学习的按键为风扇开关,开后吹风3小时会自动关闭,防止长开。第二个学习的按键为自然风开关,自然风启动后电扇吹7秒停3秒,再按关闭自然风。由于使用延时控制,开自然风后遥控反应会延迟。

如果需要换别的遥控按键或另外一个遥控器,重新上述操作,即可删除旧的按键,使用新的按键。


红外接收端为1脚。输出端为5脚,低电平为工作态。蜂鸣器接8脚,低电平为工作态。

落地扇或台扇一般有3个档位,实际制作时可将其中一个档位改成遥控,另外两个仍用手动。我是将最慢的1档改成了遥控。

电路图是借用别人的,程序也是应邀修改的,只要把8脚的led指示灯换成蜂鸣器即可。当然不换也行,看各人爱好。程序不会冲突,指示灯和蜂鸣器都是低电平工作。

单片机源程序如下:

#define CPU_Fosc 11059200uL //定义时钟,自适应解码和延时用

#include

#include

#include

#define uchar unsigned char

#define uint  unsigned  int

#define USER_H     0x80  //用户码高8位

#define USER_L     0x7F  //用户码低8位

#define Check_EN   0   //是否要校验16位用户码:不校验填0,校验则填1 

#define CA_S       40   //长按时间设置,单位:108mS(即 108mS整数倍,10倍以上为宜)

/*┈┈┈┈┈┈┈┈┈┈ 基准 ┈┈┈┈┈┈┈┈┈┈┈*/

#define  Boot_Limit     (((9000+4500) +2000)/Step)   //引导码周期上限    

#define  Boot_Lower     (((9000+4500) -2000)/Step)   //引导码周期下限    

#define  Bit1_Limit     ((2250 +800)/Step)           //“1”周期上限

#define  Bit0_Limit     ((1125 +400)/Step)     //“0”周期上限

#define  Step       400//红外采样步长:400us

#define  TH_H  ((65536-Step*(CPU_Fosc/300)/40000)/256)  //定时器高8位基准赋值

#define  TH_L  ((65536-Step*(CPU_Fosc/300)/40000)%256)  //定时器低8位基准赋值

sfr P3M0        =   0xB2;   //0000,0000 端口3模式寄存器0

sfr P3M1        =   0xB1;   //0000,0000 端口3模式寄存器1

uint     IR_BT;           //解码效果返回:0无效,1有效,2短按,3长按

uchar    NEC[4];       //解码存放:16位用户码、操作码正反码

uint     cntCA;           //长按计数

uint     cntStep;    //步数计

bit      IRa,IRb;    //电位状态保存

bit      IRsync;    //同步标志

bit      bz1,bz2,bz3,bz4;

bit      m1,m2;     //红外输入键值变量

uint     BitN;               //位码装载数

uchar    num1,num2,num3,num4;

uchar  aa;

float   tm;

/********************************************/

sbit  out_1  = P3^0;   //输出1

sbit  BE  = P3^3;   //蜂鸣器

sbit  IR     = P3^4;    //定义红外线接口(任意引脚)

/************************************************/

//========================================================================

// 函数: void  delayms(unsigned int ms)

// 描述: 延时函数。

// 参数: ms,要延时的ms数, 这里只支持1~65535ms. 自动适应主时钟.

// 返回: none.

// 版本: VER1.0

// 日期: 2013-4-1

// 备注: 

//========================================================================

void  DelayMs(unsigned int ms)

{

     unsigned int i;

         do{

              i = CPU_Fosc / 13000;

                  while(--i)        ;   //14T per loop

     }while(--ms);

}


/****************蜂鸣器*************************/

void beep()

{

BE=0;

DelayMs(500);

BE=1;

}


/***************写数据 ***************************/


void W_W_1(void)//写数据 

num1 = NEC[2];

EA = 0;     //关中断

EROM_C(0);    //读擦除EPPROM

EROM_W(0,5,num1); //写EPPROM

num2 = EROM_R(0,5); //读EPPROM

EA = 1;  //开中断

}


/**************写数据 ****************************/


void W_W_2(void)//写数据 

num3 = NEC[2];

EA = 0;     //关中断

EROM_C(1);    //读擦除EPPROM

EROM_W(1,10,num3); //写EPPROM

num4 = EROM_R(1,10); //读EPPROM

EA = 1;  //开中断

}


/****************遥控短按处理*************************/


void KZ0()//函数:遥控短按处理

{

   beep();

num2 = EROM_R(0,5); //读EPPROM

num4 = EROM_R(1,10);

if(num2 == num1)

{

//   bz3 = m1;

//  out_1 = ~out_1;

   m1=~m1;

}

if(num4 == num3)

{

   m2=~m2;

}

}


/*****************遥控长按处理********************/


void KZ1()//函数:遥控长按处理

{

  beep();

//m2 = 1;

//m1 = 1;

aa ++;

if(aa == 1)

{

  W_W_1();//读写程序

}

if(aa == 2)

{

  W_W_2();//读写程序

  aa = 0;

}

  

}

/****************红外解码初始化************************/


void IR_Init() //红外线解码初始化

{

TMOD &= 0xF0;    //清定时器0

TMOD |= 0x01;    //定时器0:16位定时器

TL0 = TH_L;        //每步时间

TH0 = TH_H;

ET0 = 1;

EA  = 1;

TR0 = 1;

}


/****************主函数*************************/

void main(void)

{

P3M0 = 0x03;   //

P3M1 = 0x00;   //

m1 = 0;

m2 = 0;

BE=1;

IR_Init();      //红外线解码初始化

num2 = EROM_R(0,5); //读EPPROM

num4 = EROM_R(1,10); //读EPPROM

while(1)

  if((IR_BT == 2) || (IR_BT == 3))//遥控检测     

  {

   tm=0;                //有操作,开机时间清0

   if(IR_BT == 2)

    KZ0();      //短按处理    

   else        

    KZ1();      //长按处理 

    IR_BT = 0;  //清有效标志

  }

   if(tm>27000000)        //风扇开启3小时后关闭(3*3600*1000000us/400us=27000000次)

    {

     m1=1;                        //风扇停电

     tm=27000001;   //停止计时防止溢出

    }

     out_1=~m1;

         if(m1==1)

          {

           if(m2==1)

            {

             DelayMs(7000);          //风扇通电7s

             out_1=1;

             DelayMs(3000); //风扇停电3s

                }

          }

}

}             

/********************** 定时器0中断函数************************/

void time0(void) interrupt 1

TL0 = TH_L;        //重赋值

TH0 = TH_H; 

IRb = IRa;     //上次电位状态

IRa = IR;     //当前电位状态

tm ++;

cntStep ++;     

if(IR_BT == 1)

if(cntStep > 300)

IR_BT = 2;//解码有效后,如果无长按,120ms(400us×300)后默认短按

if(IRb && !IRa)         //是否下降沿(上次高,当前低)

{

  if(cntStep > Boot_Limit)      //超过同步时间?

  { 

      if(IR_BT == 1) //解码有效后,继续按住遥控>CA_S即长按

   if(++ cntCA > CA_S)

   IR_BT = 3; 

   IRsync = 0;      //同步位清0

  }

  else 

  if(cntStep > Boot_Lower)

  { 

   IRsync = 1; //同步位置1,装载位码数

   BitN = 32; 

  }     

  else 

  if(IRsync) //如果已同步

  {

   if(cntStep > Bit1_Limit)

   IRsync = 0;            

   else

   { 

    NEC[3] >>= 1;    

    if(cntStep > Bit0_Limit)NEC[3] |= 0x80;    //“0”与“1”

             if(-- BitN == 0)    

    {

     IRsync = 0;         //同步位清0

              #if (Check_EN == 1)     

     if((NEC[0] == USER_H) && (NEC[1] == USER_L) && (NEC[2] == ~NEC[3])) //校验16位用户码、操作码正反码

      {  

      IR_BT = 1; //解码有效,接下来判断:短按?长按?

      cntCA = 0;  

     }      

     #else

     if(NEC[2] == ~NEC[3])//校验操作码正反码

     { 

      IR_BT = 1; 

      cntCA = 0; 

     } 

     #endif     

    }

    else 

    if((BitN & 0x07) == 0)//NEC[3]每装满8位,移动保存一次(即 BitN%8 == 0)

    { 

     NEC[0] = NEC[1];

     NEC[1] = NEC[2]; 

     NEC[2] = NEC[3];   

    }

   }

  }

  cntStep = 0;   //步数计清0

}   


/******************************************/

if(IR_BT == 1)//写键值指示

{

  num1 = NEC[2];

}

/*****************************************/

if(IR_BT == 1)//写键值指示

{

  num3 = NEC[2];

}

}



推荐阅读

史海拾趣

静芯微电子(ElecSuper)公司的发展小趣事

随着技术的不断进步和市场需求的不断变化,静芯微电子开始拓展产品线。公司不仅继续深耕ESD/TVS领域,还逐渐涉足了RS485、HALL、电源、接口等芯片的研发和生产。这些新产品的推出不仅丰富了公司的产品线,还进一步扩大了静芯微电子在电子行业的应用范围。目前,静芯微电子的产品已经广泛应用于汽车电子、工业控制、消费电子等领域,并与多家知名品牌建立了深度合作。

CQR SECURITY公司的发展小趣事

CQR SECURITY公司在追求商业成功的同时,也积极履行社会责任。公司定期举办网络安全宣传活动,提高公众的网络安全意识。同时,CQR还积极参与社会公益事业,为弱势群体提供网络安全支持和帮助。这种积极履行社会责任的举措不仅提升了CQR的品牌形象,还为公司赢得了社会的广泛赞誉。

这些故事虽然虚构,但反映了电子安全公司可能经历的一些普遍发展路径和挑战。希望这些故事能够为您提供一些启发和参考。如果需要更多关于特定公司的信息,建议您查阅相关新闻报道、行业分析报告或公司官网等渠道。

Diconex公司的发展小趣事

品质是电子行业的生命线。Diconex公司深知品质的重要性,因此从原材料采购到生产制造的每一个环节都严格把控品质。公司建立了完善的质量管理体系,对每一道生产工序都进行严格的检测和评估。这种对品质的执着追求使得Diconex的产品在市场上具有很高的口碑和竞争力。

广东华裕(GDHY)公司的发展小趣事

随着环保意识的不断提高,电子行业的环保要求也越来越高。Diconex公司积极响应环保号召,将环保理念融入生产全过程。公司采用环保材料和工艺进行生产,降低生产过程中的污染排放。同时,公司还建立了完善的废弃物处理机制,确保废弃物得到合理处理和资源化利用。这种环保理念的实施不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

AD Semiconductor公司的发展小趣事

人才是企业发展的核心动力。Diconex公司高度重视人才培养和引进工作。公司建立了完善的人才培养机制,为员工提供广阔的发展空间和良好的职业晋升通道。同时,公司还积极引进行业优秀人才,为公司的快速发展提供了有力的人才保障。这种人才战略的成功实施使得Diconex在电子行业中拥有了强大的技术团队和人才队伍。

Corsair Memory Inc公司的发展小趣事

Corsair Memory Inc公司的成功不仅在于其产品的创新,更在于其与全球知名电脑厂商的合作。多家世界级的OEM合作伙伴选择Corsair作为其内存供应商,这不仅提升了Corsair的品牌影响力,也为其带来了稳定的订单和市场份额。这种合作关系的建立,是Corsair在电子行业中持续发展的重要支撑。

问答坊 | AI 解惑

旋转的时钟( 源码+电路+图片)(附件含原理图)

//************************************** //************************************** // Clock 16Mhz // Version 1.0 Janvier 2002 // Sylvain Bissonnette //************************************** //*********************** ...…

查看全部问答>

关于CPCI总线的应用

大家谁知道CPCI总线与PCI总线相比较有啥优缺点,CPCI总线的应用范围是啥,一般是哪些人用?谢谢了!…

查看全部问答>

niosii8.0问题

用NIOSII8.0进行编译时出现问题:There is a problem with the Quartus II installation on your computer. Please use `jtagconfig` for further diagnosis.该怎么解决啊???? …

查看全部问答>

WINCE串口的问题:

大家好,请教一个问题呀,请问:一个串口的TX和RX联在一起,然后用WRITEFILE向串口写数据,这样容不容易造成WINCE死机呀?谢谢了!我现在用WRITEFILE这个函数往串口写数据时,容易死机是什么原因呀?谢谢了!…

查看全部问答>

CE编译出错

我用的2440开发板. 用开发板商提供的工程文件编译没问题. 我想自己做一个新的工程. 按照生成向导选择选项后. 首先只加进2440bsp包中一些基本的驱动后编译结果如下: BUILD: [01:0000003302:ERRORE] NMAKE :  U1073: don\'t know how to ...…

查看全部问答>

求物联网方面的论文题目

如题,我想在物联网方面写篇小论文,可是不知道在哪方面立题,请大家赐教! O(∩_∩)O谢谢!…

查看全部问答>

视频监控系统的基本防雷措施

(1)、前端设备的防雷:前端设备有室外和室内两种分布方式,室内分布的一般不会受到直击雷击,但需考虑防止雷电过电压对设备的侵害,而室外的设备则同时需考虑防止直击雷击。     前端设备如摄像头等应置于避雷针有效保护范围之内。对于 ...…

查看全部问答>

lm3s9B96的lwip的web服务器问题

在enet_io 和enet_lwip实例中,网页文件被存放在io_fsdata.h中,网页代码被译成16进制数组,请问这个怎么生成的!…

查看全部问答>