一、引脚

二、代码

iic.c文件

#include "iic.h"/* 初始化模拟IIC**/
void IIC_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能GPIOA时钟//GPIOB1,B2初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   //普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;     //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;      //上拉GPIO_Init(GPIOB, &GPIO_InitStructure);              //初始化SCL_H;SDA_H;
}//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT(); //sda线输出SDA_H;SCL_H;IIC_Delay_us(4);SDA_L; //START:when CLK is high,DATA change form high to lowIIC_Delay_us(4);SCL_L; //钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT(); //sda线输出SCL_L;SDA_L; //STOP:when CLK is high DATA change form low to highIIC_Delay_us(2);SCL_H;IIC_Delay_us(1);SDA_H; //发送I2C总线结束信号IIC_Delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime = 0;SDA_IN(); //SDA设置为输入SDA_H;IIC_Delay_us(1);SCL_H;IIC_Delay_us(1);while (SDA_READ){ucErrTime++;if (ucErrTime > 250){IIC_Stop();return 1;}}SCL_L;IIC_Delay_us(30);return 0;
}
//产生ACK应答
void IIC_Ack(void)
{SCL_L;SDA_OUT();SDA_L;IIC_Delay_us(2);SCL_H;IIC_Delay_us(2);SCL_L;
}
//不产生ACK应答
void IIC_NAck(void)
{SCL_L;SDA_OUT();SDA_H;IIC_Delay_us(2);SCL_H;IIC_Delay_us(2);SCL_L;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{u8 t;SDA_OUT();SCL_L; //拉低时钟开始数据传输for (t = 0; t < 8; t++){if (txd & 0x80)SDA_HelseSDA_L;txd <<= 1;IIC_Delay_us(2); //对TEA5767这三个延时都是必须的SCL_H;IIC_Delay_us(2);SCL_L;//IIC_Delay_us(2);}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i, receive = 0;SDA_IN(); //SDA设置为输入for (i = 0; i < 8; i++){SCL_L;IIC_Delay_us(2);SCL_H;receive <<= 1;if (SDA_READ)receive++;IIC_Delay_us(1);}if (!ack)IIC_NAck(); //发送nACKelseIIC_Ack(); //发送ACKreturn receive;
}
//IIC延时函数
void IIC_Delay_us(u16 us)
{{u16 i = 0;while (us--){i = 6;while (i--);}}
}

iic.h文件

#ifndef __IIC_H
#define __IIC_H
#include "stm32f4xx_conf.h"
/*
IIC_SCL  --PB2
IIC_SDA  --PB1
*/
//IO方向设置
#define SDA_IN()  {GPIOB->MODER&=~(3<<(1*2));GPIOB->MODER|=0<<1*2;} //PB1输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(1*2));GPIOB->MODER|=1<<1*2;} //PB1输出模式
//IO操作函数
#define SCL_L       {GPIOB->ODR&=0xFFFB;}  //SCL拉低(1011)B
#define SCL_H       {GPIOB->ODR|=0x0004;}  //SCL拉高(0100)4
#define SDA_L           {GPIOB->ODR&=0xFFFD;}  //SDA拉低(1101)D
#define SDA_H           {GPIOB->ODR|=0x0002;}  //SDA拉高(0010)2
#define SDA_READ        (GPIOB->IDR&0x0002)   //SDA读取#define ACK         1
#define NACK        0void IIC_Init(void);                     //初始化IIC的IO口
void IIC_Start(void);                           //发送IIC开始信号
void IIC_Stop(void);                            //发送IIC停止信号
void IIC_Send_Byte(u8 byte);      //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void);                //IIC等待ACK信号
void IIC_Ack(void);                       //IIC发送ACK信号
void IIC_NAck(void);                      //IIC不发送ACK信号
void IIC_Delay_us(u16 us);        //IIC delay
#endif

htu21d.c

/********************************************************************************* @file    htu21d.c * @brief   HTU21D 温湿度模块驱动*******************************************************************************/
#include <stdio.h>
#include "htu21d.h"
#include "iic.h"
#include "delay.h"
#include "usart.h"SENSOR_DATA_t g_sensorData ={0,0,0,0,0};
static u32 timer = 0;
static u8 isTempOrHumi = 1;//Temp firth,humi second;
static u8 htu21_res=0;
/** HTU21D模块初始化函数*/
void HTU21D_Init(void){IIC_Start();IIC_Send_Byte(HTU21D_IIC_ADDR<<1);IIC_Wait_Ack();IIC_Send_Byte(CMD_RESET_CH21D);IIC_Wait_Ack();IIC_Stop();Delay_ms(18);HTU21D_Temp_Trig();Delay_ms(60);
}/***/
u8 HTU21D_ReadSensor(void){if(HasElapsed(&timer, 500)){if(isTempOrHumi){htu21_res = HTU21D_Read_Temp(&g_sensorData.innerTemp);HTU21D_Humi_Trig();isTempOrHumi = 0;}else{htu21_res = HTU21D_Read_Humi(&g_sensorData.humi);HTU21D_Temp_Trig();isTempOrHumi = 1;}}return htu21_res;
}
/** 读取计算温度函数*/
u8 HTU21D_Read_Temp(float* temp){u32 data;IIC_Start();IIC_Send_Byte((HTU21D_IIC_ADDR<<1)+1);if(!IIC_Wait_Ack()){data = IIC_Read_Byte(ACK);data <<= 8;data += IIC_Read_Byte(ACK);data <<= 8;data += IIC_Read_Byte(NACK);IIC_Stop();data >>= 8;data &= 0xFFFC;*temp = (175.72*data)/65536 - 46.85;return 0;}//iic errorreturn 1;
}
/** 读取计算湿度函数*/
u8 HTU21D_Read_Humi(float* humi){u32 data;IIC_Start();IIC_Send_Byte((HTU21D_IIC_ADDR<<1)+1);if(!IIC_Wait_Ack()){data = IIC_Read_Byte(ACK);data <<= 8;data += IIC_Read_Byte(ACK);data <<= 8;data += IIC_Read_Byte(NACK);IIC_Stop();data >>= 8;data &= 0xFFF0;*humi = (125.0*data)/65536 - 6;return 0;}//iic errorreturn 1;
}
/** 开始温度检测函数*/
void HTU21D_Temp_Trig(){IIC_Start();IIC_Send_Byte(HTU21D_IIC_ADDR<<1);IIC_Wait_Ack();IIC_Send_Byte(CMD_T_TRIG);IIC_Wait_Ack();
}
/** 开始湿度检测函数*/
void HTU21D_Humi_Trig(){IIC_Start();IIC_Send_Byte(HTU21D_IIC_ADDR<<1);IIC_Wait_Ack();IIC_Send_Byte(CMD_RH_TRIG);IIC_Wait_Ack();
}

htu21d.h

#ifndef __HTU21D_H
#define __HTU21D_H
#include "stm32f4xx_conf.h"typedef struct
{float pressure;float depth;float innerTemp;float humi;float waterTemp;
}SENSOR_DATA_t;
extern SENSOR_DATA_t g_sensorData;#define HTU21D_IIC_ADDR               0x40            // the HTU21D 7 bits iic device addr
#define CMD_LOADER_DATA                 0x81            //the HTU21D iic device addr to read data       #define CMD_T_TRIG_HOSTMODEL            0xE3            //trigger of measure temperature command
#define CMD_RH_TRIG_HOSTMODEL           0xE5            //trigger of measure relative humidity command
#define CMD_T_TRIG                      0xF3            //trigger of measure temperature command
#define CMD_RH_TRIG                     0xF5            //trigger of measure relative humidity command
#define CMD_USER_WRITE                  0xE6            //write user reg command
#define CMD_USER_READ                   0xE7            //read user reg command
#define CMD_RESET_CH21D                     0xFE            //HTU21D reset commandvoid HTU21D_Init(void);
u8 HTU21D_ReadSensor(void);
u8 HTU21D_Read_Temp(float* temp);
u8 HTU21D_Read_Humi(float* humi);
void HTU21D_Temp_Trig(void);
void HTU21D_Humi_Trig(void);
void HTU21D_Process(void);
#endif

main.c

void HTU21D_Process(void)
{HTU21D_ReadSensor() printf("temp:%.3f,humi:%.3f\r\n",g_sensorData.innerTemp,g_sensorData.humi);}
}
int main()
{while(1){HTU21D_Process();delay_ms(100);}
}

STM32之HTU21D温湿度传感器获取温湿度数据相关推荐

  1. Arduino使用DHT11温湿度传感器获取环境温湿度

    通过本文,可以了解到以下内容: DHT11 温湿度传感器接线与使用 DHT11 Arduino 测试程序编写 DHT11 温湿度转换显示 DHT11 温湿度传感器接线与使用 DHT11 是一款温湿度传 ...

  2. 51单片机上连YL69土壤湿度传感器获取的数据在LCD上显示出来

    要做一个项目,被分配到做DS18B20温度传感与YL69土壤湿度传感器在51单片机上用LCD显示屏显示出来.温度传感模块很简单,网上到处都是资料,但是YL69的资料就很少了,特别还是在51单片机上实现 ...

  3. 温湿度传感器——室内温湿度检测环境系统

    目的: 1.编写温湿度传感器 DHT11 程序,实时读取环境温湿度并显示于 PC 串行端口监控窗口.并由监控窗口输入温度值, 当温度超限时,启动面包板上的风扇转动. 2.理解温湿度传感器的原理,并学会 ...

  4. vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...

    寻求更好的阅读体验,请移步Mculover666的个人博客: [STM32Cube_15]使用硬件I2C读取温湿度传感器数据(SHT30)​www.mculover666.cn 本篇详细的记录了如何使 ...

  5. 【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)

    上一篇:[STM32Cube_14]使用硬件I2C读写环境光强度传感器(BH1750) 寻求更好的阅读体验,请移步:Mculover666的个人博客. 本篇详细的记录了如何使用STM32CubeMX配 ...

  6. 【物联网智能网关-01】通过AD采集获取温湿度

    无论是机房管理系统,还是面向农村温室大棚的管理系统,温湿度采集模块是必不可少的.常见的温湿度模块从通信接口上来说,一般有三种,第一种是单总线方式(我以前写了两篇博文来介绍这方面的内容<DHT11 ...

  7. 温湿度传感器 AHT21B 简明教程

    学习物联网,来HaaSEDU就对了 温湿度传感器 - AHT21B 一.产品简介 AHT21B是基于AH21开发的集成式温湿度传感器模块,产品内部配有一个全新设计的ASIC专用芯片.一个经过改进的ME ...

  8. Python温湿度传感器应用(二)基于pymysql温湿度表查询(C/S端)

    承接上一次 温湿度传感器 获取传值.存入数据库 ,这偏文章主要增加了 客户端查询显示的功能 ! 上一次博客链接:https://blog.csdn.net/cungudafa/article/deta ...

  9. 传感器:SHT30温湿度传感器检测环境温湿度实验(底部附代码)

    一.导言 SHT30温湿度传感器模块是通过IIC驱动,所以大家使用该模块时,需要具备IIC的基本知识,这篇文章带领大家一起使用SHT30模块进行温湿度的测量,当然DHT10/DHT10原理都一样,好了 ...

最新文章

  1. linux下常用关机命令
  2. 神级代码编辑器 Sublime Text 全程指南
  3. 3.14 01串排序
  4. 精通ASP.NET MVC ——控制器可扩展性
  5. 看完微信抢红包算法你就明白,为啥你不是手气最佳
  6. 大前端的自动化工厂(3)—— babel
  7. 《分布式系统模式》中文版
  8. C++ vector 内存分配与回收机制
  9. JavaScript 实现:输出斐波那契数列
  10. 【IDE】JetBrains全家桶教程系列,学生认证 + 汉化
  11. msf 生成php马_PHP的性能优化方法总结
  12. 奥运22日看点:女乒女曲有望夺金 皮划艇全线出击
  13. access vba代码大全_VBA编程在翻译中的应用
  14. oracle周数计算
  15. 使用python提取英语句子中的英文单词(初学)
  16. IMPDP和ORA-31684
  17. (最新)天津各片区,各小区,各学校 对应关系,持续更新
  18. 理解Java虚拟机(七)低延迟垃圾收集器-Shenandoah
  19. DOS命令:systeminfo
  20. ocx 访问 html,HTML 加载ocx VB编写的控件

热门文章

  1. 微信小程序实战须知2:详解数据API所需网络配置域名、Https、备案、SSL
  2. 从Gartner 最新“客户之选”报告,看国内外RPA的差异化竞争
  3. Jstorm 基本概念
  4. unity实现多人协同,画面监控
  5. php7.0源码加密,Zend Guard(php源码加密工具) V7.0 官方版
  6. 医院lis系统需要服务器吗,医院里的HIS系统和LIS系统有什么区别?
  7. 网络安全的第二道防线:区块链
  8. seo写作是一种提高网站百度排名的方法
  9. CLIPCAP:图生文
  10. Python的一些基础特性,也是成为Python开发者必备的知识