打印
[STM32F4]

【Nucleo-F413ZH创想】-基于Mbed开发环境-I2C(温湿度AM2311)

[复制链接]
871|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linshifaa|  楼主 | 2017-2-18 21:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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)
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

72

帖子

1

粉丝