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;
}