发帖 |
[问答] 传感器直接连STM32 为什么单片机测出来的数据都是0
2018-1-2 08:44:26  1297 SHT10 STM32 SHT10传感器
收藏 0 收藏 推荐 0 推荐
分享
这是我的代码
#include "SHT10.h"
/*************************************************************
  Function   :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("\nSHT10温室度测试程序!!!\n");
              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℃\r\n", temp_val_real, humi_val_real, dew_point);
                delay_ms(1000);
        }
}



请问是我的程序有问题呢还是我的接线有问题
微信图片_20180102084050.jpg
已退回5积分
2018-1-2 08:44:26   评论 邀请回答
2个回答
这种同步通讯其实仿真的时候可以一步一步的点击,逐步看IO口的输出和读回对不对。先读一下芯片ID之类的看看对不对。
2018-1-4 11:25:56 评论

举报

你这有没有示波器之类的东东啊  直接看看时序之类的 就一目了然了  就这么猜  谁能知道咋回事啊
2018-1-9 08:18:02 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

提问题
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表