51单片机和NBIOT模块
一、NBIOT模块
1.基本功能及原理图
NB75-BA用于实现MCU与NB-IoT网络间的数据双向透传功能。
11和12引脚接地,13和14引脚接5V电压,6和7引脚反接被拉低为3V或3.3V电平的单片机串口通信引脚,
NBIOT模块原理图
2.工作模式
NB75-BA支持CoAP、UDP、TCP透传,由于受到运营商限制,我使用的电信物联网卡仅支持CoAP透传模式,不过移动联通用户支持CoAP、UDP、TCP透传。
3.模块调试
我使用的模块为针插式并配有一根天线和一个物联网卡。特别注意一下就是,调试模块的时候不需要连接单片机,否则会产生错误信息,调试完成后的模块,再连接单片机进行数据的发送和接收。
1)打开设置软件,打开串口(出厂串口参数9600/8/N/1)进入配置状态(若是出厂状态下cmd模式,无需进入配置状态),一键联网检测一下模块是否OK。
2)读取当前参数,然后设置工作模式为coap透传模式,coap服务器地址和端口保持默认的117.60.157.137:5683.然后点击设置所有参数,模块会自动保存参数并重启,等待重启完成之后,设备联网Ok之后会打印connected,此时可以测试数据通信。
启用心跳包功能的作用是它间隔一定的时间不停的向云端发送数据以保持唤醒模块。
4.注意
51单片机VCC=5V,可以为模块提供给电源,但是使用模块的串口引脚需要3V,所以一定要转换电平,否则会造成模块功耗过大,甚至烧毁芯片。电平转换还需要一块降压模块配合使用。
电平转换的功能图
输出的低电压连接到OE使能引脚和VA引脚,降压模块图
二、透传云使用
1.透传云的功能
通过透传云可以实现温湿度报警和在云端发送数据无线控制单片机。
2.在透传云平台实现报警配置
1)添加设备
2)添加数据模板
3)添加报警联系人
4)添加触发器
3.在透传云实现远程控制单片机配置
1)添加设备
2)数据调试
通过你发送的数据来实现无线控制单片机做出应答。
三、Modbus RTU通信协议
在实现报警的过程中,需要采用Modbus RTU通信协议,这样云端才可以采集到有效信息。
1.MODBUS 数据模型
1)MODBUS 以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:
对于基本表格中任何一项,协议都允许单个地选择 65536 个数据项,而且设计那些项的读写操 作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。
2)协议描述
启动 MODBUS 事务处理的客户机创建 MODBUS 应用数据单元。功能码向服务器指示将执行哪 种操作。MODBUS 协议建立了客户机启动的请求格式。用一个字节编码 MODBUS 数据单元的功能码域。有效的码字范围是十进制 1-255(128-255 为 异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。
我在实现报警机制中只使用了保持寄存器 利用modbus通信协议向云端发送的数据。如下图:
当单片机发送一个数据至云端,云端会自行计算数据通过crc校验查看发送的数据是否出现错误。
四、实现报警功能
单片机发送数据给模块,模块再上传云端,数据通过与透传云触发器设置的报警阈值进行比对,查看是否满足报警。透传云可通过微信,手机号,邮箱向用户发出报警信息,如下图的微信报警图:
完成数据发送,与云端可主动采集数据,需要编写串口通信函数,和crc校验函数,注意的是利用modbus通信协议只能实现上传数据,所以把串口中断开关设置为0防止出现乱码,采用适合通信的11.0592晶振,波特率设置为9600 不用波特率加倍,当只发送一次数据时可能在数据调试窗口看不到发送的数据,那是因为数据发送的太开,在你打开数据调试窗口之前它已经将数据发送完毕,所以可以在main函数当中加一个延时,延时它发送数据,给我们留出打开数据调试窗口的时间。函数如下:
#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
u16 dat[7];
void crc()
{
u16 cc=0xffff;
u16 i=0,j=0;
dat[0]=0x01 ;dat[1]=0x03;dat[2]=0x02 ; dat[3]=0x00; dat[4]=0x11;
for(i=0; i<5;i++)
{
cc = (cc^dat[i]);
for(j=0;j<8; j++)
{
if((cc & 0x01) == 1)
{
cc = ((cc >> 1) ^0xa001);
}
else
{
cc = (cc >> 1);
}
}
}
dat[5]=cc%256;
dat[6]=cc/256;
}
void Delay500ms()
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UsartInit() //串口初始化
{
SCON=0X50;
TMOD=0x20;
TH1=0XFD; //9600比特率
TL1=0xFD;
TR1=1;
ES=0;
EA=1;
}
void main()
{
u8 a;
Delay500ms();
crc();
UsartInit();
for(a=0;a<7;a++)
{
SBUF=dat[a];
while(!TI);
TI=0;
}
while(1);
五、实现远程控制单片机功能
实现此功能采用的是数据透传协议,此功能只用到了串口通信,没有报警那么繁琐。我利用数据透传控制单片机上的数码管显示,如下图:自行焊接数码管和单片机的原理图
相关代码如下:
#include <reg52.h>
sbit s0=P2^0; //定义数码管
sbit s1=P2^1; //定义数码管
sbit s2=P2^2; //定义数码管
sbit s3=P2^3; //定义数码管
typedef unsigned int u16;
typedef unsigned char u8;
u8 a[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
u8 dat;
u16 xianshi[3];
void UsartInit()
{
SCON=0X50;
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
ES=1;
EA=1;
TR1=1;
}
void delay(u16 v)
{
while(v--);
}
void display()
{ u16 i;
for(i=0;i<3;i++)
{
switch(i)
{
case(0):
s3=0;delay(500);s3=1; break;
case(1):
s1=0;delay(500);s1=1; break;
case(2):
s2=0;delay(500); s2=1;break;
}
P0=xianshi[i];
}
}
void main()
{
delay();
UsartInit();
while(1)
{
s0=1;
if(0xff||dat)
{
xianshi[0]=a[dat/16];
xianshi[1]=a[dat%16];
xianshi[2]=a[16];
}
display();
}
}
void Usart() interrupt 4
{
dat=SBUF;
RI = 0;
SBUF=dat;
while(!TI);
TI=0;
}