数码之家

 找回密码
 立即注册
搜索
查看: 8838|回复: 57

[C51] 做了个车库门忘关无线提醒设备

[复制链接]
发表于 2020-3-3 09:08:42 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
车库门经常忘关,好在我的邻居都是善心人,认识的不认识的,都专门告知。最让我感动的是一个隔壁楼上的邻居,没有我电话号码,专门爬上5楼告知,感激之余,很过意不去。想法做了一个忘关提醒系统。
想法是用光电开关感知门的状态,如果门打开了,发送状态信号,室内灯光或声音提醒,直到关闭(担心声音烦人,我只做了灯光闪烁提醒)   。 车库与5楼直线距离大约20-30米,不能布明线,优先考虑无线。

主要元件;单片机stc15F104W 编码解码,315M 再生高频接收模块一套
电路很简单,都是用洞洞板简单连接。
TIM截图20200303085044.jpg

发射端:
光电开关检测到门开启,给无线发射模块接通电源,发送门开启状态信号,然后关闭无线发射模块电源,待命
光电开关检测到门关闭,给无线发射模块接通电源,发送门关闭状态信号,然后关闭无线发射模块电源,待命

发射.jpg

发射端程序
/***************发射端*****************************************/
//发送端:模块发射端data接STC15F104W的 P3^3,P3.4接光电开关的信号输入,P3.5接发射模块的电源供电开关
//工作原理:单片机监测供电开关的状态,门打开的时候,P3.4变低电平,P3.5输出1,使发射模块得电,P3.3输出DATA
//发送25次后,P3.5输出0,使发射模块断电
// *********************************/
#include <STC15.H> //单片机头文件
unsigned char LED_flag;//状态信号暂存标志.
sbit OUT  = P3^1;   //发送的数据信号
sbit LED  = P3^4; //光电开关状态输入信号
sbit power  = P3^5; //给发射模块供电
#define STC_Y1  97560U  // 89C/LEXX、90C/LEXX
#define STC_Y3  14050U  // 10F/Lxx、11F/Lxx 、12C/LExx、15F104E/L104E(A版)、15F204E/L204EA(A版)
#define STC_Y5  13043U  // 15F/L/Wxx(Y3内核个别型号除外)、15F104W

#define Fosc 12000000UL
#define Core STC_Y5
/**
*  功能:延时t毫秒
*  入参:1~65535
*/
void DELAY_MS (unsigned int a)
{
    unsigned int i;
    do
    {
        i = Fosc / Core;
        while(--i)
        {
            ;
        }
    }
    while(--a);
}
void ST (void) //开始码
{
    OUT = 1; //
    DELAY_MS (6);
    OUT = 0; //
    DELAY_MS (4);
}

void BT (bit s) //数据位码
{
    OUT = 1;
    DELAY_MS (1);
    OUT = 0;
    DELAY_MS (1);
    if(s)
    {
        DELAY_MS (1);
    }
}

void MT (unsigned char a)   //8位的数据发送
{
    unsigned char i,n;
    for(i=0; i<8; i++)
    {
        n = a & 0x80;
        a = a << 1;
        if(n == 0x80)
        {
            BT(1);
        }
        else
        {
            BT(0);
        }
    }
}

void END (void)//结束码
{
    MT(0xFF);
}



void main (void)
{
    unsigned char j;
    P3M1=0xDD;
    P3M0=0x22; //
    while(1)
    {
        if(LED_flag==~LED)
        {
            power=1;
            for (j=0; j<=50; j++)
            {
                DELAY_MS(5);
                if(!LED)
                {
                    ST();
                    MT(0x94);//关闭
                    END();
                }
                if(LED)
                {
                    ST();
                    MT(0x93);//开启
                    END();
                }
            }
        }
        LED_flag=LED;
        power=0;
    }
}




接收端:收到门开启状态信号,灯光闪烁提醒,直到接收到门关闭状态信号,灯光熄灭,待命

2.jpg

TIM截图20200303090046.jpg

/***************接收端*************************/
//使用的315M的发射模块,发送端 纯铜天线长度24cm
//接收端天线长度24cm
//发送端:模块发射端data接STC15F104W的 P1^1,P0.0接LED负极,LED正极接5V
//接收端:数据data接STC12C4052AD的P3^4,P3^7接LED1负极 P1^7接LED2负极 LED正极都接5V
//*********************************************/
#include <STC15.H> //单片机头文件
#define STC_Y1  97560U  // 89C/LEXX、90C/LEXX
#define STC_Y3  14050U  // 10F/Lxx、11F/Lxx 、12C/LExx、15F104E/L104E(A版)、15F204E/L204EA(A版)
#define STC_Y5  13043U  // 15F/L/Wxx(Y3内核个别型号除外)、15F104W
#define Fosc 12000000UL
#define Core STC_Y5
sbit IN =P3^2;
sbit LED1=P3^3;
//sbit LED2=P1^7;
unsigned char Ir_Buf; //用于保存4个8位的解码结果
unsigned char flag;
unsigned char m,k;
unsigned int Ir_Get_Low()
{
    TL0=0;
    TH0=0;
    TR0=1;
    // 如果是0就循环,不能超过32.768ms
    while(!IN && (TH0&0x80)==0)
    {
        ;
    }
    TR0=0;
    return TH0*256+TL0;
}
unsigned int Ir_Get_High()
{
    TL0=0;
    TH0=0;
    TR0=1;
    // 如果是1就循环,不能超过32.768ms
    while(IN && (TH0&0x80)==0)
    {
        ;
    }
    TR0=0;
    return TH0*256+TL0;
}
void main(void)
{
    unsigned int temp;
    unsigned char j;
    k=0;
    AUXR &= 0x7F;       //定时器0时钟12T模式
    TMOD &= 0xF0;       //设置定时器0模式,16位的定时/计数器
    AUXR &= 0xFB;       //定时器2时钟12T模式,20ms,16位重装
    T2L = 0xE0;       //设置定时2初值 用于led闪烁
    T2H = 0xB1;       //设置定时初值
    AUXR |= 0x10;     //定时器2开始计时
    IE2 |= 0x04;  //开定时器2中断
    EA = 1; //开总中断
    LED1=0;
    while(1)
    {
        if(Ir_Buf==0x93) //93,门打开了
        {
            flag=1;
        }
        if(Ir_Buf==0x94)//门关闭了
        {
            flag=0;
        }
restart:
        if(m>=25)
        {
            m=0;
            if( flag==1)
            {
                LED1=~LED1;
            }
            if( flag==0)
            {
                LED1=0;
            }
        }
        while(!IN)
        {
            ;    // 检查发送准备就绪,去除杂波干扰
        }
        temp=Ir_Get_High(); //6毫秒高电平  标记判断
        if(temp<5000 &&temp>7000)
        {
            goto restart;
        }
        temp=Ir_Get_Low();  //4毫秒低电平  标记判断
        if(temp<3000 || temp>5000)
        {
            goto restart;
        }
        for(j=0; j<8; j++) //每个字节8位
        {
            // 检验数据开始的高电平长度
            temp=Ir_Get_High();
            if(temp<500 || temp>1500)
            {
                goto restart;
            }
            // 检验低电平长度
            temp=Ir_Get_Low();
            if(temp<500 || temp>2500)
            {
                goto restart;
            }
            Ir_Buf<<=1;  // 第一位默认写零
            if(temp>1500)
            {
                Ir_Buf|=0x01;    // 比较是0还是1 或运算1
            }
        }
    }
}
void timer2() interrupt 12
{
    m++;
}



说明:
1、采用编码译码的目的是防止误告警,接收模块是超外差的,当没有发送信号的时候,也会时不时的输出一个干扰脉冲,因此必须是设定宽度、序列的脉冲才可使用。曾试验过不用编译码,直接发送固定时间间隔的脉冲,误告警概率太大。
2、发射端有一路控制发射模块的供电。作用是,避免在待命状态的时候,发射模块发送白噪声,这种没有数据的噪声,会干扰车库门遥控接收(413MHz)。(邻频阻塞)

打赏

参与人数 4家元 +160 收起 理由
wenxueroom + 20 優秀文章
玫瑰余香 + 20 都是技术流的,我等只有佩服。.
aec + 20 謝謝分享
家睦 + 100

查看全部打赏

发表于 2020-3-3 09:23:47 | 显示全部楼层
不错  这样很方便
回复 支持 反对

使用道具 举报

发表于 2020-3-3 09:44:21 | 显示全部楼层
信号怎么样?我家2楼 车库负一  我想过用路由器(放在车库可以蹭网)连接433遥控和监控摄像头,这样可以远程查看车库和遥控,但是对电路了解很少 一直没着手做
回复 支持 反对

使用道具 举报

发表于 2020-3-3 09:54:57 | 显示全部楼层
买个无线摄像头,人进去就知道微信通知您
回复 支持 反对

使用道具 举报

发表于 2020-3-3 10:15:33 | 显示全部楼层
这个挺不错的,收藏了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-3 10:39:26 来自手机浏览器 | 显示全部楼层
fred_yan 发表于 2020-3-3 09:44
信号怎么样?我家2楼 车库负一  我想过用路由器(放在车库可以蹭网)连接433遥控和监控摄像头,这样可以远 ...

有网,最好用8266,可以监控也可超远程关闭,413或315,作用距离太近,只适合我这情况
回复 支持 反对

使用道具 举报

发表于 2020-3-3 10:49:01 | 显示全部楼层
jmkl128 发表于 2020-3-3 10:39
有网,最好用8266,可以监控也可超远程关闭,413或315,作用距离太近,只适合我这情况 ...

:mad:谢谢大佬 不过真是无力啊 既不会编程又不会电路 唯一就是动手能力还可以 有教程跟着学学焊接组装的话可以
回复 支持 反对

使用道具 举报

发表于 2020-3-3 11:04:32 | 显示全部楼层
我家车库门有时候关门会反弹回去,每次关门都要多看一会,楼主这个方法不错,回到家能够知道门关没关好
回复 支持 反对

使用道具 举报

发表于 2020-3-3 13:59:58 | 显示全部楼层
jmkl128,电路图可否详细一些吗?元件参数也标上方便自制!~谢谢!
单片机程序编译成可写入文件
谢谢分享!
回复 支持 反对

使用道具 举报

发表于 2020-3-3 14:21:22 | 显示全部楼层
不错啊 声光提醒 省的忘记了 还可以加上 一路有人闯入报警啊
回复 支持 反对

使用道具 举报

发表于 2020-3-3 15:31:00 | 显示全部楼层
为什么不红外检测是否有人员活动,一段时间内人员不活动就关闭呢?手动门吗?
回复 支持 反对

使用道具 举报

发表于 2020-3-3 16:54:15 | 显示全部楼层
revery 发表于 2020-3-3 15:31
为什么不红外检测是否有人员活动,一段时间内人员不活动就关闭呢?手动门吗? ...

如果是电动门的话,这是个很危险的东西,最好还是在人的全程监督下运作。

举个例子,商店的卷帘门在上升的时候,能把一个孩子卷进上面的卷轴里面,你能相信?
至于下落的时候压到人就太常见了。
回复 支持 2 反对 0

使用道具 举报

发表于 2020-3-3 17:36:43 | 显示全部楼层
fryefryefrye 发表于 2020-3-3 16:54
如果是电动门的话,这是个很危险的东西,最好还是在人的全程监督下运作。

举个例子,商店的卷帘门在上升 ...

是的,安全第一。。。。。
回复 支持 反对

使用道具 举报

发表于 2020-3-3 20:44:24 | 显示全部楼层
这是一个非常有用的制作,车库忘关、误开几乎大部分人都遇到过,确实是个难题,我的车库与住宅不在一个楼群里,直线应该超过800米并且有楼群遮挡,我是在门框上安装了一个机械锁开关,使卷帘门变成了半自动遥控的了,每次到家先下车用钥匙开锁通电,而后遥控开门,完事锁好拔了钥匙走人,将家门钥匙和车库钥匙串一起,忘了拔钥匙进不了家门,但仍然有乌龙的时候。
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-3 21:45:37 | 显示全部楼层
厉害,可以量产的话方便了
回复 支持 反对

使用道具 举报

发表于 2020-3-3 22:00:42 | 显示全部楼层
大家都散了吧 要车库的
回复 支持 反对

使用道具 举报

发表于 2020-3-4 13:55:59 | 显示全部楼层
jmkl128 发表于 2020-3-3 10:39
有网,最好用8266,可以监控也可超远程关闭,413或315,作用距离太近,只适合我这情况 ...

315M 433M  才是远距离最佳操作方式   天线做的好发射4-5km  毫无压力 并且不需要发射端多少发射功率
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 14:41:28 | 显示全部楼层
傻xx小魔法师 发表于 2020-3-4 13:55
315M 433M  才是远距离最佳操作方式   天线做的好发射4-5km  毫无压力 并且不需要发射端多少发射功率 ...

总不至于加一个八木天线吧?目前,我只用了一段导线23cm,也就是1/8波长,距离再大,效果明显变差了
回复 支持 反对

使用道具 举报

发表于 2020-3-4 16:59:58 | 显示全部楼层
不错,楼主方便了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-27 00:03 , Processed in 0.171600 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表