【51单片机】OOK无线通讯在无线门磁报警中的应用

门磁报警器

门磁报警器,是由开关和磁铁两部分组成,开关部分由磁簧开关经引线连接。定型封装而成;磁铁部分由对应的磁场强度的磁铁封装于塑胶或合金壳体内。当两者分开或接近至一定距离后,引起开关的开断从而感应物体位置的变化。一般多用于城市安防领域。门磁报警器广泛应用于城市安防、银行、电信、电力、司法、小区、工厂、公司、学校、家庭、别墅、仓库等众多领域门窗安装使用。

设计功能

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次,时间一秒钟,严重拖慢了效率。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值