分享一份测试可用的sht31温湿度传感器源码

2019-07-20 00:50发布

#include "delay.h"
#include "usart.h"
#include "myiic.h"
#include "sht31.h"
float mys_water;
/*------本次测试单片机型号:STM32F401。适用于STMF4系列,其它型号自行更改GPIO-----*/
/*STM32F401只有usart1.usart2.usart6,没有usart3*/
int main(void)
{
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置系统中断优先级分组2
        delay_init(168);                                                                                                                                //延时初始化
        uart_init(9600);                                                                                                                                //串口初始化波特率为115200
        IIC_Init();
       
        while(1)
        {
                        Read_sht31();
                        Convert_sht31();
                        delay_ms(1000);       
               
        }
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
478956448
1楼-- · 2019-07-20 05:27
/*-------sht31.c源码------*/
#include "sht31.h"
#include "delay.h"
#include "myiic.h"
#include "usart.h"
u8 BUFt[2]={0};
u8 BUFh[2]={0};
u8 rxbufsht31[6];
u8 crc1=0;
u8 crc2=0;
uint8_t tem ;
uint8_t hum ;


u8 Get_Crc8(u8 *ptr,u16 len)
{
        u8 crc;
        u8 i;
        crc=0;
        while(len--)
        {
                crc^=*ptr++;
                for(i=0;i<8;i++)
                {
                        if(crc&0x01)crc=(crc>>1)^0x8C;
                        else crc >>= 1;
                }
        }
        return crc;
}
void Cmd_Write_sht31(uint8_t msb,uint8_t lsb)
{
  IIC_Start();                          //起始信号
  IIC_Send_Byte(0x88+0);                                   //发送设备地址+写信号
        while(IIC_Wait_Ack());                                        //从机应答

  IIC_Send_Byte(msb);                                            //发送命令
        while(IIC_Wait_Ack());

        IIC_Send_Byte(lsb);                                            //发送命令
        while(IIC_Wait_Ack());

  IIC_Stop();                           //发送停止信号
        delay_ms(5);
}


/*传感器将首先发送温度值,然后发送相对湿度值。在收到湿度值的校验和后,就应该发送一个NACK和停止条件*/
void Read_sht31(void)
{          
                u8 i;
                Cmd_Write_sht31(0x21,0x26);         //数据采集频率1 mps,周期性数据采集模式的测量命令
                IIC_Start();           //起始信号
    IIC_Send_Byte(0x88+1);        //发送设备地址+读信号
                while(IIC_Wait_Ack());
                delay_us(5);
                for(i=0;i<6;i++)
                {
                       
                        if(i==5)*(rxbufsht31+i)=IIC_Read_Byte(0);        //读取湿度校验后发送NACK
                        else *(rxbufsht31+i)=IIC_Read_Byte(1);                //读取并发送ACK
                }
       
    IIC_Stop();                                                          //发送停止信号
                BUFt[0]=rxbufsht31[0];                                                                                  //存入温度数据
                BUFt[1]=rxbufsht31[1];  
       
                BUFh[0]=rxbufsht31[3];                                                                                  //存入湿度数据
                BUFh[1]=rxbufsht31[4];  
    delay_ms(5);
}

//数据转换
void Convert_sht31(void)
{
        tem=175*(BUFt[0]*256+BUFt[1])/65535-45; //摄氏度
        hum=100*(BUFh[0]*256+BUFh[1])/65535;
        BUFt[0]=0;
        BUFt[1]=0;
        BUFh[0]=0;
        BUFh[1]=0;
        printf("温度:%d ",tem);
        printf("湿度:%d ",hum);
}


478956448
2楼-- · 2019-07-20 10:41
其他就不粘贴了,直接打包
478956448
3楼-- · 2019-07-20 11:49
 精彩回答 2  元偷偷看……
478956448
4楼-- · 2019-07-20 12:53
之前本来打算专门用一个号来分享源码的,可是号登不上,密码咋滴就忘记了呢,气死了
peng1554
5楼-- · 2019-07-20 17:50
 精彩回答 2  元偷偷看……
yueng
6楼-- · 2019-07-20 21:46
 精彩回答 2  元偷偷看……

一周热门 更多>