文章底部有完整工程下载链接
#include "main.h"
#include "oled.h"
#include "iic.h"
#include "delay.h"
#include "sht20.h"
#include "usart.h"
int main(void)
{
TempHumiValue_t humi_temp_val ; //温湿度
char a[100]={0};
usart_init(115200); //串口初始化 波特率为115200
IIC_Init(); //IIC初始化
delay_init();
OLED_Init(); //初始化OLED
OLED_Clear();
SHT20_Init(); //STH20初始化
delay_ms(500);
while (1)
{
humi_temp_val=*SHT20_readTemAndHum();//获取温湿度
OLED_ShowString(5,0,"IIC Test");
printf("温度为%f,湿度为%f%% \r\n",humi_temp_val.temperature,humi_temp_val.humidity);
sprintf(a,"Tem = %.5f",humi_temp_val.temperature);
OLED_ShowString(5,2,(u8 *)a);
sprintf(a,"Hum = %.5f%%",humi_temp_val.humidity);
OLED_ShowString(5,4,(u8 *)a);
delay_ms(500);
delay_ms(500);
OLED_Clear();
}
}
#include "sht20.h"
float Humidity,Temperature;
TempHumiValue_t temp_humi_Value;
/*******************************************************************************
* 函数名:SHT20_writeOneByte
* 功能描述:写一个字节
* 作者:Jahol Fan
* 参数说明: 写一个字节的数据
* 返回值说明:返回的是应答信号
* 修改记录:
*******************************************************************************/
static u8 SHT20_writeOneByte(u8 dataToWrite)
{
u8 ack;
IIC_Send_Byte(dataToWrite);
ack=IIC_Wait_Ack();
return ack;
}
/*******************************************************************************
* 函数名:SHT20_softReset
* 功能描述:SHT20软件复位,主函数中调用
* 作者:Jahol Fan
* 参数说明:
* 返回值说明:
* 修改记录:
*******************************************************************************/
void SHT20_softReset(void)
{
IIC_Start();
SHT20_writeOneByte(SHT20_adder&0xfe);
SHT20_writeOneByte(0xfe);
IIC_Stop();
}
/*******************************************************************************
* 函数名:SHT20_Init
* 功能描述:初始化iic总线
* 作者:Jahol Fan
* 参数说明:
* 返回值说明:成功返回测量的结果,失败返回 1
* 修改记录:
*******************************************************************************/
void SHT20_Init(void)
{
IIC_Init();
SHT20_softReset();
}
/*******************************************************************************
* 函数名:SHT20_readOneByte
* 功能描述:读一个字节
* 作者:Jahol Fan
* 参数说明:
* 返回值说明:
* 修改记录:
*******************************************************************************/
u8 SHT20_readOneByte(u8 ack)
{
u8 temp;
temp=IIC_Read_OneByte();
iic_put_ack(ack);
return temp;
}
/*******************************************************************************
* 函数名:SHT20_setResolution
* 功能描述:写寄存器,设置帧率
* 作者:Jahol Fan
* 参数说明:
* 返回值说明:
* 修改记录:
*******************************************************************************/
static void SHT20_setResolution(void)
{
IIC_Start();
if(SHT20_writeOneByte(SHT20_adder&0xfe)==ACK)
{
if(SHT20_writeOneByte(0xe6)==ACK)
{
if(SHT20_writeOneByte(0x83)==ACK);
}
}
IIC_Stop();
}
/*******************************************************************************
* 函数名:SHT20_readTemOrHum
* 功能描述:读取SHT20的温度或读取湿度测量值
* 作者:Jahol Fan
* 参数说明:
* 返回值说明:成功返回测量的结果,失败返回 1
* 修改记录:
*******************************************************************************/
float SHT20_readTemOrHum(u8 commod)
{
float temp;
u8 ack=1;
u8 MSB,LSB;
float Humidity,Temperature;
SHT20_setResolution();
IIC_Start();
ack=SHT20_writeOneByte(SHT20_adder&0xfe);
if(ack == ACK) //写地址,并等待ACK
{
if(SHT20_writeOneByte(commod)==ACK)
{
do{
delay_ms(6);
IIC_Start();
}while(SHT20_writeOneByte(SHT20_adder|0x01)==NACK);
MSB = SHT20_readOneByte(ACK);//读Data(MSB),给应答
LSB = SHT20_readOneByte(ACK);//读Data(MSB),给应答
SHT20_readOneByte(NACK);
IIC_Stop();
LSB &= 0xfc;
temp=MSB*256+LSB;
if(commod==((u8)Hum_Comd))
{
Humidity=(temp*125)/65536-6;
return Humidity;
}
else if(commod==((u8)Tem_Comd))
{
Temperature=(temp*175.72f)/65536-46.85f;
return Temperature;
}
}
}
return FAIL;
}
/*******************************************************************************
* 函数名:SHT20_readTemAndHum
* 功能描述:读取SHT20的温度和湿度测量值
* 作者:Jahol Fan
* 参数说明:
* 返回值说明:成功返回测量的结果,失败返回 1
* 修改记录:
*******************************************************************************/
TempHumiValue_t * SHT20_readTemAndHum(void)
{
temp_humi_Value.humidity = SHT20_readTemOrHum(Hum_Comd);//读取湿度
temp_humi_Value.temperature = SHT20_readTemOrHum(Tem_Comd);//读取温度
return &temp_humi_Value;
}
主控芯片是STM32F411CEU6,显示屏是1.3寸OLED屏,传感器是SHT20温湿度传感器。
STM32:sht20温湿度检测程序,并在OLED屏上显示