前几天看到coolrikuy的这个帖子,
让废旧手机再放光芒,超远程遥控开门 真是非常好的创意。。。!不过与用手机实现开关想比,我更喜欢用无线的方式,这样还可以和我正在进行中的智能家居系统进行整合
搭建中央控制智能家居系统【进行中】 我家也有这么一个类似的对讲门禁系统,如下:
拆看测一下电压,傻眼了,这个系统只有两根供电线,而且在按下门铃的时候才有电压,电压在3-5V之间波动。。。很不稳定。没有常电,不得已只好用外供电的手段。
控制方面,这个系统有点变态,门铃响了之后,一定要摘掉话筒之后,才能按开关开门。。。不得已用了两个继电器实现。
单片机使用STC11F02E,NEC格式红外接收头,具体电路和代码很简单。。。就不多说了。
红外接收头安装在角落,不注意看看不出来。
随便找了个不用的遥控器获得编码,然后祭出大杀器:红外遥控学习解码发射中心。
使用WIFI转串口模块控制
将学习到的编码添加到控制数据库
系统自动检测到并显示简单的控制面板
外接的电源线使用扁平网线制作,找个时间需要美化一下。
这样,只要在能上网的地方,就可以开楼道门,家里门也是密码锁,终于再也不用担心忘带钥匙了。。。
附上单片机代码
#include<reg52.h> //包含头文件
#include<intrins.h> // intrins.h
sbit IR=P3^2; //红外接口标志
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit switcher1 = P1^7;
sbit switcher2 = P1^6;
/*------------------------------------------------
全局变量声明
------------------------------------------------*/
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
/*------------------------------------------------
函数声明
------------------------------------------------*/
void smgdisplay(void);
void Ircordpro(void);
void Delay300ms() //@5.5296MHz
{
unsigned char i, j, k;
i = 7;
j = 78;
k = 167;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*------------------------------------------------
定时器0
------------------------------------------------*/
void tim0_isr (void) interrupt 1 using 1
{
irtime++; ////用于计数2个下降沿之间的时间,每次中断时间为0.555ms(5.5M内部晶振)
}
/*------------------------------------------------
外部中断0
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
static unsigned char i; //接收红外信号处理
static bit ir_flag; //是否开始处理标志位
if(irtime<26&&irtime>=23) //9ms下降沿和第一个信号下降沿之间的时间,甄别是否为13.5ms的引导信号: 23*0.555 = 12.76, 26*0.555 = 14.43
{
i=0;
ir_flag=0; //如果是,则开始处理红外信号
}
if (ir_flag==0)
{
irdata
=irtime; //存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
ir_flag=1;
}
}
if (ir_flag)
{
irtime=0;
return;
}
}
/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00; //重载值
TL0=0x00; //初始化值,溢出时间约为0.555ms
ET0=1; //开中断
TR0=1;
}
/*------------------------------------------------
外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1; //开总中断
}
/*------------------------------------------------
红外码值处理
------------------------------------------------*/
void Ircordpro(void)//????????
{
unsigned char i, j, k;
unsigned char cord,value;
k=1; //抛弃irdata[0](引导码时间)
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>3)// 2.25ms为1,1.12ms为0 3*0.555 = 1.665 ms
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();
if ((IRcord[0]==0x00)&&(IRcord[1]==0xBF)&&(IRcord[2]==0x0D)&&(IRcord[3]==0xF2))
{
switcher1 = 0;
Delay300ms();
Delay300ms();
Delay300ms();
switcher2 = 0;
Delay300ms();
switcher1 = 1;
switcher2 = 1;
} //door open
irok=0;
}
}
}
[ 此帖被ppxiaop在2015-05-23 16:47重新编辑 ]