`这是我的代码
#include "SHT10.h"
/*************************************************************
Func
tion :SHT10_Dly
Description:SHT10时序需要的延时
Input : none
return : none
*************************************************************/
void SHT_Dly(void)
{
u16 i;
for(i = 500; i > 0; i--);
}
/****************************************************************************
* Function Name : SHT_Config
* Description : 初始化GPIO.
* Input : None
* Output : None
* Return : None
****************************************************************************/
void SHT_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=SHT_SCK | SHT_DATA ;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
SHT_RESET();
}
/*******************************************************************************
* 函 数 名 : SHT_FASONG
* 函数功能 : SDA输出配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void SHT_FASONG(void)
{
SHT_DATA_OUT(); //设置DATA数据线为输出
SHT_DATA_H();
SHT_SCK_L();
SHT_Dly();
SHT_SCK_H();
SHT_Dly();
SHT_DATA_L();
SHT_Dly();
SHT_SCK_L();
SHT_Dly();
SHT_SCK_H();
SHT_Dly();
SHT_DATA_H();
SHT_Dly();
SHT_SCK_L();
}
/*******************************************************************************
* 函 数 名 : SHT_DATA_OUT
* 函数功能 : SDA输出配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void SHT_DATA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=SHT_DATA;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 数 名 : SHT_RESET
* 函数功能 : SHT复位
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void SHT_RESET(void)
{
u8 i=0;
SHT_DATA_OUT();
SHT_SCK_L();
SHT_DATA_H();
for(i=0;i<9;i++)
{
SHT_SCK_H();
SHT_Dly();
SHT_SCK_L();
SHT_Dly();
}
SHT_FASONG();
}
/*******************************************************************************
* 函 数 名 : SHT_DATA_IN
* 函数功能 : SDA输入配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void SHT_DATA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=SHT_DATA;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 数 名 : SHT_WRITE
* 函数功能 :
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void SHT_WriteByte(u8 value)
{
u8 i= 0;
SHT_DATA_OUT(); //设置DATA数据线为输出
for(i = 0x80; i > 0; i /= 2) //写1个字节
{
if(i & value)
SHT_DATA_H();
else
SHT_DATA_L();
SHT_Dly();
SHT_SCK_H();
SHT_Dly();
SHT_SCK_L();
SHT_Dly();
}
SHT_DATA_IN(); //设置DATA数据线为输入,释放DATA线
SHT_SCK_H();
SHT_Dly();
SHT_SCK_L();
}
/*******************************************************************************
* 函 数 名 : SHT_READ_L
* 函数功能 :
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
u8 SHT_ReadByte(u8 Ack)
{
u8 i, val = 0;
SHT_DATA_IN(); //设置DATA数据线为输入
for(i = 0x80; i > 0; i /= 2) //读取1字节的数据
{
SHT_Dly();
SHT_SCK_H();
SHT_Dly();
if(SHT_DATA_R())
val = (val | i);
SHT_SCK_L();
}
SHT_DATA_OUT(); //设置DATA数据线为输出
if(Ack)
SHT_DATA_L(); //应答,则会接下去读接下去的数据(校验数据)
else
SHT_DATA_H(); //不应答,数据至此结束
SHT_Dly();
SHT_SCK_H();
SHT_Dly();
SHT_SCK_L();
SHT_Dly();
return val; //返回读到的值
}
void SHT_Measure(u16 *p_value, u8 mode)
{
u32 i;
u8 value_H = 0;
u8 value_L = 0;
SHT_FASONG(); //开始传输
switch(mode)
{
case TEMP: //测量温度
SHT_WriteByte(MEASURE_TEMP);//写MEASURE_TEMP测量温度命令
break;
case HUMI:
SHT_WriteByte(MEASURE_HUMI);//写MEASURE_HUMI测量湿度命令
break;
default:
break;
}
SHT_DATA_IN();
for(i = 0; i < 72000000; i++) //等待DATA信号被拉低
{
if(SHT_DATA_R() == 0) break; //检测到DATA被拉低了,跳出循环
}
value_H = SHT_ReadByte(ACK);
value_L = SHT_ReadByte(noACK);
*p_value = (value_H << 8) | value_L;
}
void SHT_Calculate(u16 t, u16 rh, float *p_temperature, float *p_humidity)
{
const float d1 = -39.7;
const float d2 = +0.01;
const float C1 = -2.0468;
const float C2 = +0.0367;
const float C3 = -0.0000015955;
const float T1 = +0.01;
const float T2 = +0.00008;
float RH_Lin; //RH线性值
float RH_Ture; //RH真实值
float temp_C;
temp_C = d1 + d2 * t; //计算温度值
RH_Lin = C1 + C2 * rh + C3 * rh * rh; //计算湿度值
RH_Ture = (temp_C -25) * (T1 + T2 * rh) + RH_Lin; //湿度的温度补偿,计算实际的湿度值
if(RH_Ture > 100) //设置湿度值上限
RH_Ture = 100;
if(RH_Ture < 0.1)
RH_Ture = 0.1; //设置湿度值下限
*p_humidity = RH_Ture;
*p_temperature = temp_C;
}
float SHT_CalcuDewPoint(float t, float h)
{
float logEx, dew_point;
logEx = 0.66077 + 7.5 * t / (237.3 + t) + (log10(h) - 2);
dew_point = ((0.66077 - logEx) * 237.3) / (logEx - 8.16077);
return dew_point;
}
#include"SHT10.h"
#include"printf.h"
int main()
{
u16 humi_val, temp_val;
float humi_val_real = 0.0;
float temp_val_real = 0.0;
float dew_point = 0.0;
printf_init();
printf("
SHT10温室度测试程序!!!
");
SHT_INIT();
delay_ms(20);
while(1)
{
SHT_Measure(&temp_val,TEMP); //获取温度测量值
SHT_Measure(&humi_val,HUMI); //获取湿度测量值
SHT_Calculate(temp_val, humi_val, &temp_val_real, &humi_val_real); //计算实际的温湿度值
dew_point = SHT_CalcuDewPoint(temp_val_real, humi_val_real); //计算露点温度
printf("当前环境温度为:%2.1f℃,湿度为:%2.1f%%,露点温度为%2.1f℃
", temp_val_real, humi_val_real, dew_point);
delay_ms(1000);
}
}
请问是我的程序有问题呢还是我的接线有问题
`