门磁报警器
门磁报警器,是由开关和磁铁两部分组成,开关部分由磁簧开关经引线连接。定型封装而成;磁铁部分由对应的磁场强度的磁铁封装于塑胶或合金壳体内。当两者分开或接近至一定距离后,引起开关的开断从而感应物体位置的变化。一般多用于城市安防领域。门磁报警器广泛应用于城市安防、银行、电信、电力、司法、小区、工厂、公司、学校、家庭、别墅、仓库等众多领域门窗安装使用。
设计功能
1开门报警。
2关门报警。
3电池低压报警。
4能通过OOK无线通讯将报警信号传送到WIFI报警主机上。
OOk无线通讯技术原理
OOK即On-Off Keying。
OOK是ASK调制的一个特例,把一个幅度取为0,另一个幅度为非0,就是OOK。二进制启闭键控(OOK:On-Off Keying)又名二进制振幅键控(2ASK),它是以单极性不归零码序列来控制正弦载波的开启与关闭。
参考波形图
代码
本次项目中采用的,是5.5296Mhz的晶振,分频为12T,根据上图,可以用STC烧录工具中自带的定时器计算器,计算出不同信号持续时间
///12.8ms
#define OOK_TONG_H 0xE8 //同步头高位
#define OOK_TONG_L 0xF4 //同步头低位
//0.4ms
#define OOK_SMALL_H 0xFF //小脉冲高位
#define OOK_SMALL_L 0x47 //小脉冲低位
//1.2ms
#define OOK_LONG_H 0xFD //大脉冲高位
#define OOK_LONG_L 0xD6 //大脉冲低位
得知三个不同时长之后,就可以组合成同步信号,高电平信号和低电平信号。
同步信号:
//0.4ms
TH0=OOK_SMALL_H 0xFF //小脉冲高位
TL0=OOK_SMALL_L 0x47 //小脉冲低位
//12.8ms
TH0=OOK_SMALL_H 0xE8 //同步头高位
TL0=OOK_SMALL_L 0xF4 //同步头低位
高电平信号
//1.2ms
TH0=OOK_LONG_H 0xFD //大脉冲高位
TL0=OOK_LONG_L 0xD6 //大脉冲低位
//0.4ms
TH0=OOK_SMALL_H 0xFF //小脉冲高位
TL0=OOK_SMALL_L 0x47 //小脉冲低位
低电平信号
//0.4ms
TH0=OOK_SMALL_H 0xFF //小脉冲高位
TL0=OOK_SMALL_L 0x47 //小脉冲低位
//1.2ms
TH0=OOK_LONG_H 0xFD //大脉冲高位
TL0=OOK_LONG_L 0xD6 //大脉冲低位
最终,得到如下程序:
void OOK_Save(unsigned char SendData)
{
unsigned char data0;
unsigned char data1;
unsigned char data2;
unsigned char i, j, temp;
unsigned char arr[100];
data1 = CBYTE[0xFF7];
data0 = CBYTE[0xff8];
data2 = SendData;
arr[0] = OOK_SMALL_H;
arr[1] = OOK_SMALL_L;
arr[2] = OOK_TONG_H;
arr[3] = OOK_TONG_L;
//将数据存储当数组中
for (i = 4; i < 100; i++)
{
if (i == 4)
{
temp = data0;
}
else if (i == 36)
{
temp = data1;
}
else if (i == 68)
{
temp = data2;
}
for (j = 0; j < 8; j++)
{
//取出最高位
if (temp & 0x80)
{
arr[i] = OOK_LONG_H;
i++;
arr[i] = OOK_LONG_L;
i++;
arr[i] = OOK_SMALL_H;
i++;
arr[i] = OOK_SMALL_L;
i++;
}
//最高位为0
else
{
arr[i] = OOK_SMALL_H;
i++;
arr[i] = OOK_SMALL_L;
i++;
arr[i] = OOK_LONG_H;
i++;
arr[i] = OOK_LONG_L;
i++;
}
temp <<= 1;//左移,让低位成为高位
}
i--;
}
TR0 = 1;//定时器开始计时
P3M0 |= 0x04;//P32设置为开漏输出模式
LED_WORKER = 1;
ASK_SENDDATA = 0;
for (j = 0; j < 23; j++)//发送多次
{
for (i = 0; i < 100; i++)
{
TF0 = 0;
ASK_SENDDATA = !ASK_SENDDATA;
TH0 = arr[i];//定时器高位
i++;
TL0 = arr[i];//定时器低位
//消耗定时器时间
while (!TF0)
{
}
}
}
ASK_SENDDATA = 0;
TR0 = 0;
TF0 = 0;
LED_WORKER = 0;
P3M0 &= ~0X04;
}
这里的data0、data1为地址码,而data2为发送过去的信息。
总结
代码类似ev1527编码芯片的编码,但这个门磁并没有用上ev1527编码芯片,只是模拟它,ev1527是20个基础码,4个功能码,但是我们做的项目是16+8,所以要做好这个理解,另外里面有一个TH0和TL0记数的,16位,加起来65536,有一个TF0来控制while,如果TH0和TL0满了,就是让TF0置1,停止这个while循环,继续执行外层的for循环。
当我们的门开关状态发生改变时,就可以用该函数将数据传到data2中,发送给报警主机,再通过WIFI或者4G信号发送到我们的手机上。
很显然这个程序也暴露了OOK无线通讯方式的缺陷,为了防止干扰,保证信号无误,三个字节的数据,要反复发送23次,时间一秒钟,严重拖慢了效率。