PM2.5 Modbus IIC

发布时间:2017-10-17 16:26:44

JP1为串口调试接口;JP2IIC接口(需外部上拉);JP3PD4NS传感器接口,可用间距为2.544PIN座子接到2345位置。

一、标准modbus RTU协议说明

1、串口设置

波特率9600,无校验,数据位8,停止位1

万能通讯命令16进制:00 03 00 00 00 01 85 DB (不清楚设备地址可用此找回)

2、接口说明

可直接使用串口线的5V供电进行调试,若不使用串口线电源,请接入GND(地\电源负极),TX(模组串口发对应串口线收),RX(模组串口收对应串口线发)对应接口。调试不通请交换串口线再试。

3、寄存器描述

4CRC16校验计算函数(请确认单片机大端编程还是小端)

/******************函数CRC_16()*********大端

返回short int

参数 data【】数组、len数组长度

例子:datax8={01, 03, 00, 00, 00, 01, 00, 00}16进制

unsigned short int x=CRC_16(datax,6);

得到x=0x840a;

***************************************************/

unsigned short int CRC_16(unsigned char *data,int len)

{

unsigned char *buf;

unsigned short int * CRC;

unsigned short int crch,crcl;

short int i;

short int j;

char err;

buf= & data[len];

CRC=(unsigned short int *)buf;

buf[0]=0xff;

buf[1]=0xff;

for(i=0;i

{

buf[0]=buf[0]^data[i];

for(j=0;j<8;j++)

{

err=buf[0]&1;

*CRC=*CRC/2;

if(err) *CRC=*CRC^0xa001;

}

}

crch=*CRC>>8;

crcl=*CRC<<8;

*CRC=crch+crcl;

return(*CRC);

}

/******************函数CRC_16()*********小端

返回short int

参数 data【】数组、len数组长度

例子:datax8={01, 03, 00, 00, 00, 01, 00, 00}16进制

unsigned short int x=CRC_16(datax,6);

得到x=0x840a;

***************************************************/

unsigned short int CRC_16(unsigned char *data,int len)

{

unsigned char *buf;

unsigned short int * CRC;

unsigned short int crch,crcl;

uchar p;

uchar j;

char err;

buf= & data[len];

CRC=(unsigned short int *)buf;

buf[0]=0xff;//lsb

buf[1]=0xff;//msb

for(p=0;p

{

buf[1]=buf[1]^data[p];

for(j=0;j<8;j++)

{

err=buf[1]&1;

*CRC=*CRC/2;

if(err) *CRC=*CRC^0xa001;

}

}

crch=*CRC>>8;

crcl=*CRC<<8;

*CRC=crch+crcl;

return(*CRC);

}

二、IIC接口说明

1、注意事项

IIC接口需要接10k上拉电阻;

默认设备地址为0x50;若需修改请参考Modbus协议说明;

数据格式0x0B PM高位 PM低位 0x0B 0x00 0x00 ……

请用IICdata0】和IICdata3】来保证数据准确;

2、读取例程:

Uchar IICdata7】;

void pm2_Read(void)

{

Unsigned char i;

Start(); //发送开始条件

IIC_ Write (0x51); //发送地址+

if(I2C_Get_Ack()) //等待ACK

{

Stop(); //ACK则停止

return;

}

//进入数据收取

for(i=0;i<8;i++) //收取8位数据

{

Delay_us(2);

IIC_read(&IICdata [i]);

if(i<7) //倒数一位停止发送ACK(注意这里很重要)

I2C_Send_Ack(); //收到数据发送ACK

}

Stop(); //停止条件

}

PM2.5 Modbus IIC

相关推荐