#include "mbed.h"
Serial pc(SERIAL_TX, SERIAL_RX,115200); //定义串口
I2C AM2311(I2C_SDA,I2C_SCL); //定义I2C引脚
//唤醒AM2311
void AM2311_Awaken(void)
{
AM2311.start();
AM2311.write(0xb8);
wait_ms(1);
AM2311.stop();
}
//发送指令
void AM2311_SendCmd(void)
{
AM2311.start();
AM2311.write(0xb8); //写指令
AM2311.write(0x03); //"0X03"功能码读取多路寄存器
AM2311.write(0x00); //从0X00寄存器地址开始读取
AM2311.write(0x04); //读取寄存器个数
AM2311.stop();
wait_ms(5);
}
//读取数据无校验
void Read_data(uint8_t *buf)
{
char i = 0;
AM2311.start();
AM2311.write(0xb9); //读数据指令
wait_us(50); //延迟30us
for(i=0;i<7;i++)
{
buf[i]=AM2311.read(1);
}
buf[i] = AM2311.read(0); //根据手册最后一位无应答
AM2311.stop();
}
///CRC检验
unsigned int CRC16(unsigned char *ptr, unsigned char len)
{
unsigned int crc=0xffff;
unsigned char i;
while(len--)
{
crc ^=*ptr++;
for(i=0;i<8;i++)
{
if(crc & 0x1)
{
crc>>=1;
crc^=0xa001;
}
else
{
crc>>=1;
}
}
}
return crc;
}
///检查CRC校验是否对
unsigned char CheckCRC(unsigned char *ptr)
{
unsigned int crc;
crc=(unsigned int)CRC16(ptr,8-2);
if(ptr[8-1]==(crc>>8) && ptr[8-2]==(crc & 0x00ff))
{
return 0xff;
}
else
{
return 0x0;
}
}
//读取温湿度数据并且校验 正确返回 0XFF 错误返回 0x00
char Read_AM2311_Data(uint8_t *read_buf)
{
//static uint8_t read_buf[10];
AM2311_Awaken(); //唤醒
AM2311_SendCmd(); //发送读指令
Read_data(read_buf); //读取数据
if(CheckCRC(read_buf)) //校验数据
{
return 0xff;
}
else
{
return 0x00;
}
}
int main()
{
uint8_t buf_data[10]; //读取数据缓存区
float tmp = 0,hum = 0; //组合数据后 存放的缓冲区
AM2311.frequency(50); //设置
while(1)
{
if(Read_AM2311_Data(buf_data)) //判断数据校验是否正确 正确才读取数据
{
tmp = (float)(buf_data[4]*256+buf_data[5])/10; //根据数据手册 读取数据 除以10得到正真的数据
hum = (float)(buf_data[2]*256+buf_data[3])/10;
printf("Temp = %.1f\r\n",tmp); //保留一位小数串口打印
printf("hum = %.1f\r\n",hum);
printf("=================================\r\n\r\n");
}
else
{
printf("校验错误\r\n");
}
wait(2); //延迟一下
}
}
程序
温湿度AM2311.rar
(1.82 MB)
温湿度AM2311手册
AM2311PDF中文资料.pdf
(1.11 MB)
|