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

[复制链接]
1129|0
 楼主| linshifaa 发表于 2017-2-18 21:55 | 显示全部楼层 |阅读模式
  1. #include "mbed.h"

  2. Serial pc(SERIAL_TX, SERIAL_RX,115200); //定义串口

  3. I2C AM2311(I2C_SDA,I2C_SCL);  //定义I2C引脚

  4. //唤醒AM2311
  5. void AM2311_Awaken(void)
  6. {
  7.                 AM2311.start();
  8.                 AM2311.write(0xb8);
  9.                 wait_ms(1);
  10.                 AM2311.stop();
  11.        
  12. }

  13. //发送指令
  14. void AM2311_SendCmd(void)
  15. {
  16.                 AM2311.start();
  17.        
  18.                 AM2311.write(0xb8);   //写指令
  19.        
  20.                 AM2311.write(0x03);   //"0X03"功能码读取多路寄存器
  21.        
  22.                 AM2311.write(0x00);   //从0X00寄存器地址开始读取
  23.                
  24.                 AM2311.write(0x04);   //读取寄存器个数
  25.                
  26.                 AM2311.stop();
  27.        
  28.                 wait_ms(5);
  29. }

  30. //读取数据无校验
  31. void Read_data(uint8_t *buf)
  32. {
  33.         char i = 0;
  34.        
  35.         AM2311.start();
  36.        
  37.         AM2311.write(0xb9);   //读数据指令
  38.        
  39.         wait_us(50);          //延迟30us

  40.         for(i=0;i<7;i++)
  41.         {
  42.                  buf[i]=AM2311.read(1);
  43.         }
  44.         buf[i] = AM2311.read(0);   //根据手册最后一位无应答
  45.        
  46.         AM2311.stop();
  47. }


  48. ///CRC检验
  49. unsigned int CRC16(unsigned char *ptr, unsigned char len)
  50. {
  51.    unsigned int crc=0xffff;
  52.    unsigned char i;
  53.    while(len--)
  54.    {
  55.        crc ^=*ptr++;
  56.        for(i=0;i<8;i++)
  57.            {
  58.                if(crc & 0x1)
  59.                    {
  60.                       crc>>=1;
  61.                           crc^=0xa001;
  62.                    }
  63.                    else
  64.                    {
  65.                       crc>>=1;
  66.                    }
  67.            }
  68.    }
  69.    return crc;
  70. }
  71. ///检查CRC校验是否对
  72. unsigned char CheckCRC(unsigned char *ptr)
  73. {
  74.   unsigned int crc;
  75.         crc=(unsigned int)CRC16(ptr,8-2);
  76.         if(ptr[8-1]==(crc>>8) && ptr[8-2]==(crc & 0x00ff))
  77.         {
  78.             return 0xff;
  79.         }
  80.         else
  81.         {
  82.            return 0x0;
  83.         }
  84. }


  85. //读取温湿度数据并且校验 正确返回 0XFF 错误返回 0x00
  86. char Read_AM2311_Data(uint8_t *read_buf)
  87. {
  88.         //static uint8_t read_buf[10];       
  89.        
  90.         AM2311_Awaken();                                 //唤醒
  91.         AM2311_SendCmd();                                //发送读指令
  92.         Read_data(read_buf);    //读取数据
  93.         if(CheckCRC(read_buf))  //校验数据
  94.         {
  95.                 return 0xff;
  96.         }
  97.         else
  98.         {
  99.                 return 0x00;
  100.         }
  101. }




  102. int main()
  103. {       
  104.         uint8_t buf_data[10];     //读取数据缓存区
  105.         float tmp = 0,hum = 0;          //组合数据后 存放的缓冲区
  106.          AM2311.frequency(50);    //设置
  107.     while(1)
  108.                 {

  109.                         if(Read_AM2311_Data(buf_data))  //判断数据校验是否正确 正确才读取数据
  110.                         {
  111.                                         tmp = (float)(buf_data[4]*256+buf_data[5])/10;  //根据数据手册 读取数据 除以10得到正真的数据
  112.                                         hum = (float)(buf_data[2]*256+buf_data[3])/10;
  113.                                
  114.                                         printf("Temp = %.1f\r\n",tmp);     //保留一位小数串口打印
  115.                                         printf("hum  = %.1f\r\n",hum);
  116.                                   
  117.                                         printf("=================================\r\n\r\n");
  118.                         }
  119.                         else
  120.                         {
  121.                                         printf("校验错误\r\n");
  122.                         }
  123.                
  124.                        
  125.                         wait(2);  //延迟一下

  126.                                        
  127.     }
  128. }
程序
温湿度AM2311.rar (1.82 MB, 下载次数: 0)

温湿度AM2311手册
AM2311PDF中文资料.pdf (1.11 MB, 下载次数: 4)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

72

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部