由于在寝室睡觉时想关风扇十分不方便,为了科学创新和锻炼自己的动手能力决定用手头的元器件将 风扇改为遥控关闭和启动(就是因为懒)。
用到的元器件
用到的元器件为:
红外遥控器一个
STC89C52RC一个
CHQ红外接收头一个
4.7K电阻一个
1路5V低电平继电器模块一个
5号电池4个
4节电池电池盒一个
硬纸板若干
控制方式
开启单片机之后按下遥控器上的1后,风扇停止转动,按下2后,风扇继续转动。
制作过程和思路
风扇为USB供电的,将后面的接线盒拆开之后将正极红线剪断准备串联接入继电器的常闭,之后电扇这边先放这里不管,去把单片机程序写出来,然后测试下程序能否正常运行(程序见下方)。
红外接收头通过NEC通讯协议完成对数据的传输。传输时序图如下图:
lead code高电平约9000us 左右,低电平约4500us 左右;
custom code16 位,data code16 位,共32位;
bit0 是用高电平约560us +低电平约560us表示。
bit1 可用高电平约560us+低电平约1680us表示。
红外接头接线原理图:
将继电器模块的IN引脚接到单片机的P1.0引脚,给单片机的5V供电由电池提供(因为没有驱动芯片)。
程序清单
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar time0;
bit IRok;//33数据位处理完成标志位
bit handle_ok;
uchar IRcode[4];//4个字节
uchar IRdata[33];//33位数据
void InitUART() //定时器初始化
{
TMOD=0x02;//定时器重装初值
TH0=0;
TL0=0;
EA=1;
EX0=1;
TCON=0X01;
ET0=1;
TR0=1;//启动定时器
}
void t0() interrupt 1
{
time0++;//一次中断为277.76us
}
void int0() interrupt 0
{
static uchar i;
static bit flag;
if(flag)
{
if((time0<54)&&(time0>32))
i=0;
IRdata[i]=time0;
time0=0;
i++;
if(i==33)
{
i=0;
IRok=1;
}
}
else
{
time0=0;
flag=1;
}
}
void handle_data()
{
uchar i;//处理四个字节
uchar j;//处理八位
uchar k;//处理三十三个数据
k=1;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
if(IRdata[k]>5)
IRcode[i]|=0x80;
k++;
if(j<7)
IRcode[i]>>=1;
}
}
handle_ok=1;
}
void work()
{
uchar j;
j=0x01;
switch (IRcode[2])
{
case 0x0c:P1=0xfe;break;//1 数字一按键停止(修改这里更改控制按键)
case 0x18:P1=0xff;break;//2数字二按键启动
default:break;
}
}
void main()
{
InitUART();
while(1)
{
P1=0;
if(IRok)
{
handle_data();
IRok=0;
}
if(handle_ok)//如果处理完成处理遥控器相关程序
{
work();
handle_ok=0;
}
}
}
遥控器相应按键的16进制代码: