a18926453764 发表于 2019-4-16 16:47:57

STM32通过硬件I2C读写控制AM2311温湿度传感器模块打印输出...

程序功能说明:
1、通过I2C硬件查询方式驱动AM2311。
2、获取AM2311测得的温度和湿度并串口打印输出。
3、使用I2C1。
程序注意事项:
1、AM2311在测试完数据后会进入一个休眠模式,程序需要向AM2311发送一个任意的数据将其唤醒,发送这个数据可能会返回一些错误的信息,这个可以不用理会。
2、每次准备读取温度或者湿度时需要发送读取数据命令,发送命令后需要稍微等待一段时间使传感器将数据准备好,若不加延时直接调用读数据函数可能会出现总线错误。
3、测得的温度或者湿度值要通过移位除10处理,具体处理方法可以产考程序源码和AM2311传感器模块资料。
程序主函数:
[*]/**
[*]* @brief串口打印输出温度和湿度
[*]* @paramNone
[*]* @retval None
[*]*/
[*]int main(void)
[*]{
[*]      uint8_t AM2311Data,ret;
[*]      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); //重新映射中断向量表
[*]      SystemInit();//系统时钟初始化
[*]      USART_Configuration(115200);//串口1初始化
[*]      printf("\x0c\0");printf("\x0c\0");//超级终端清屏
[*]      printf("\033[1;40;32m");//设置超级终端背景为黑色,字符为绿色
[*]      printf("\r\n*******************************************************************************");
[*]      printf("\r\n************************ Copyright 2009-2012, ViewTool ************************");
[*]      printf("\r\n************************* http://www.viewtool.com/bbs *************************");
[*]      printf("\r\n***************************** All Rights Reserved *****************************");
[*]      printf("\r\n*******************************************************************************");
[*]      printf("\r\n");
[*]      //根据AM2311传感器设置I2C初始化数据
[*]      I2C_Info.controlMode = 1;//硬件控制
[*]      I2C_Info.speed=100000;//100K
[*]      I2C_Info.subAddrMode=2;//无子地址模式
[*]      I2C_Info.subAddrWidth=0;//子地址为0字节宽度
[*]      I2C_Info.slaveAddr=0xB8;//AM2311传感器I2C地址
[*]      I2C_Info.channel=0;//使用I2C1
[*]      VT_I2C_HardInit(&I2C_Info);
[*]      while(1)
[*]      {
[*]                VT_I2C_HardWriteNByte(I2C1,0,AM2311Data,1);//随便发送一个数据出去,将传感器从睡眠中唤醒
[*]                AM2311Data=0x03;
[*]                AM2311Data=0x00;
[*]                AM2311Data=0x04;
[*]                ret = VT_I2C_HardWriteNByte(I2C1,0,AM2311Data,3);//发送读取温度和湿度的指令
[*]                if(ret){
[*]                        printf("I2C写数据错误 %d\n\r",ret);
[*]                }
[*]                Delay(100000);//必须加这个延时,否则传感器没准备好数据会出现读数据错误
[*]                ret = VT_I2C_HardReadNByte(I2C1,0,AM2311Data,8);//读取温度和湿度
[*]                if(ret){
[*]                        printf("I2C读数据错误 %d\n\r",ret);
[*]                }else{
[*]                        printf("温度:%f℃\n\r",((AM2311Data<<8)+AM2311Data)/10.0);
[*]                        printf("湿度:%f%%\n\r",((AM2311Data<<8)+AM2311Data)/10.0);
[*]                }
[*]                Delay(10000000);
[*]      }
[*]}

复制代码
程序运行效果:
http://www.viewtool.com/bbs/data/attachment/forum/201211/20/123340j9xokoko4xx51x4d.jpg
页: [1]
查看完整版本: STM32通过硬件I2C读写控制AM2311温湿度传感器模块打印输出...