|
车库门经常忘关,好在我的邻居都是善心人,认识的不认识的,都专门告知。最让我感动的是一个隔壁楼上的邻居,没有我的电话号码,专门爬上5楼告知,感激之余,很过意不去。想法做了一个忘关提醒系统。
想法是用光电开关感知门的状态,如果门打开了,发送状态信号,室内灯光或声音提醒,直到关闭(担心声音烦人,我只做了灯光闪烁提醒) 。 车库与5楼直线距离大约20-30米,不能布明线,优先考虑无线。
主要元件;单片机stc15F104W 编码解码,315M 再生高频接收模块一套
电路很简单,都是用洞洞板简单连接。
发射端:
光电开关检测到门开启,给无线发射模块接通电源,发送门开启状态信号,然后关闭无线发射模块电源,待命
光电开关检测到门关闭,给无线发射模块接通电源,发送门关闭状态信号,然后关闭无线发射模块电源,待命
发射端程序
/***************发射端*****************************************/
//发送端:模块发射端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;
}
}
接收端:收到门开启状态信号,灯光闪烁提醒,直到接收到门关闭状态信号,灯光熄灭,待命
/***************接收端*************************/
//使用的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)。(邻频阻塞)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|