STM32通过IIC驱动SHT31室内温湿度传感器

STM32F103单片机通过IIC控制SHT31室内温湿度传感器

SHT31室内温湿度传感器引脚接正点原子STM32F103mini板:
SHT31 STM32
VCC -> VCC(3.3V)
GND -> GND
SDA -> PC11
SCL -> PC12
本文最后有源工程文件的下载链接。

工程文件中使用的delay.h,sys.h,usart.h,myiic.h均为正点原子官方提供的STM32F103mini单片机对应的源码,未做改动。

因此本文只粘贴新加的sht31.h(驱动代码头文件),sht31.c(驱动代码),以及main.c的测试样例

main.c文件

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "sht31.h"

int main(void)
{	
	delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(115200);	 //串口初始化为115200
  SHT31_Init();
	while(1)
	{
		//体温测试
		SHT31_read_result(0x44);
		printf("温湿度:%s\r\n",humiture_buff);
		delay_ms(500);
	}	 
}

sht31.h

#ifndef _SHT31_H
#define _SHT31_H
//?????????
#include "sys.h"
#include "delay.h"
#include "stdio.h"
extern u8 humiture_buff[20];
extern u8 str[];

extern u8 Temperature_L;
extern u8 Humidity_L;
extern u8 Temperature_H;
extern u8 Humidity_H;

//IO方向设置
#define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}

#define write 0
#define read  1
//IO操作函数	 
#define IIC_SCL    PCout(12) //SCL
#define IIC_SDA    PCout(11) //SDA	 
#define READ_SDA   PCin(11)  //输入SDA 

//MLX90614所有操作函数
void SHT31_Init(void); //器件初始化
void SHT31_Send_Byte(u8 txd);			//SHT31发送一个字节
u8 SHT31_Read_Byte(void);//SHT31读取一个字节

void SHT31_read_result(u8 addr);//SHT31读取结果

#endif


sht31.c


#include "sht31.h"
#include "myiic.h"
float humiture[4];
u8 humiture_buff[20];
u8 str[]={"000.00℃"};
u8 Temperature_L=15;
u8 Humidity_L=50;
u8 Temperature_H=30;
u8 Humidity_H=80;

void SHT31_Init()//???MLX90614初始化
{
  IIC_Init();
}
//IIC发送一个字节  
void SHT31_Send_Byte(u8 txd)
{                        
    u8 t;   
	SDA_OUT(); 	    
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
			IIC_SDA=(txd&0x80)>>7;
			txd<<=1;
			delay_us(2);
			IIC_SCL=1;
			delay_us(2); 
			IIC_SCL=0;	
			delay_us(2);
    }	 
} 	
//SHT31读1个字节
u8 SHT31_Read_Byte()
{
	unsigned char i,receive=0;
	SDA_IN();//SDA设置为输入
   	for(i=0;i<8;i++ )
	{
      IIC_SCL=0; 
      delay_us(2);
	  IIC_SCL=1;
	  delay_us(2);
      receive<<=1;
      if(READ_SDA)receive|=1;;   
	  delay_us(2); 
    }					 
	IIC_SCL=0;	
    return receive;
}

void SHT31_read_result(u8 addr)
{
	u16 tem,hum;
	u16 buff[6];
	float Temperature=0;
	float Humidity=0;

  	IIC_Start();
	SHT31_Send_Byte(addr<<1 | write);
	IIC_Wait_Ack();
  	SHT31_Send_Byte(0x2C);
	IIC_Wait_Ack();
	SHT31_Send_Byte(0x06);
	IIC_Wait_Ack();
	IIC_Stop(); 
	delay_us(50);
	
  IIC_Start();
	SHT31_Send_Byte(addr<<1 | read);
	if(IIC_Wait_Ack()==0)
	{
		buff[0]=SHT31_Read_Byte();
		IIC_Ack();
		buff[1]=SHT31_Read_Byte();
		IIC_Ack();
		buff[2]=SHT31_Read_Byte();
		IIC_Ack();
		buff[3]=SHT31_Read_Byte();
		IIC_Ack();
		buff[4]=SHT31_Read_Byte();
		IIC_Ack();
		buff[5]=SHT31_Read_Byte();
		IIC_Ack();
		IIC_Stop();
	}
	tem = ((buff[0]<<8) | buff[1]);
	hum = ((buff[3]<<8) | buff[4]);
	Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)
	Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)
	if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//??????
	{
		humiture[0]=Temperature;
		humiture[2]=Humidity;
		sprintf(humiture_buff,"%4.2fC,%4.2f%%",Temperature,Humidity);

	}
	SHT31_Read_Byte();
    IIC_Stop(); 
	delay_us(10);
	hum=0;
	tem=0;

} 


STM32F103mini-SHT31工程文件下载链接

  • 1
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值