找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2681|回复: 4
打印 上一主题 下一主题
收起左侧

需要基于MSP430F149单片机驱动温湿度传感器STH10的程序

[复制链接]
跳转到指定楼层
楼主
ID:227437 发表于 2017-8-24 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
跪求大神,如题,急需基于430F149的温湿度传感器STH10的驱动程序,最好IAR项目。
急需!!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82765 发表于 2017-8-24 15:10 来自手机 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:170270 发表于 2017-8-24 17:12 | 只看该作者
我有 加QQ2944428743
回复

使用道具 举报

地板
ID:170270 发表于 2017-8-26 10:26 | 只看该作者
#ifndef _SHT10_H_
#define _SHT10_H_

typedef  unsigned char  uint8;

#define HUM_DATA BIT6
#define HUM_SCK  BIT7
#define SHT_SCK_HIGH P6OUT |= HUM_SCK
#define SHT_SCK_LOW  P6OUT &= ~HUM_SCK
#define SHT_DATA_HIGH P6OUT |= HUM_DATA
#define SHT_DATA_LOW  P6OUT &= ~HUM_DATA
#define READ_SHT_DATA (P6IN & HUM_DATA)
#define SHT_DATA_INPUT  P6DIR &=~ HUM_DATA
#define SHT_DATA_OUTPUT P6DIR |= HUM_DATA
#define MEASURE_TEMP 0x03//测量温度
#define MEASURE_HUMI  0x05//测量湿度
#define READ_SR  0x07//读状态寄存器
#define WRITE_SR 0x06//写状态寄存器
#define Soft_Reset 0x1e//软件复位 清空状态寄存器
#define SHT_8BIT_CMD 0x01//设置湿度值为8位命令
#define ACK   1
#define NOACK 0

#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

void SHT_Init(void);
void SHT_Start(void);
void SHTConnectionRst(void);
uint8 S_Write_Byte(uint8 value);
uint8 S_Read_Byte(uint8 ack);
uint8 SHTSoftwareRst(void);
uint8 SHTWriteReg(uint8 value);
uint8 SHTReadReg(uint8 *Dst,uint8 *CRC);
void SHT_Calculate(float *Humidity,float *Temperature);
uint8 SHTSample(uint8 *Dst,uint8 *CRC,uint8 Mode);
void Read_Wsd(uint8 *Txdata);

#endif


#include <msp430x14x.h>
#include "sht10.h"

typedef union
{
    unsigned int i;
    float f;
}value;
value humi_val,temp_val;
unsigned short temp16_T,temp16_H;
uint8 checksum;

/*******************************************
函数名称:SHT_Init()
功    能:温湿度传感器IO初始化
参    数:无
返回值  :无
********************************************/
void SHT_Init(void)
{
    P6SEL &=~(HUM_DATA + HUM_SCK);
    P6OUT |= (HUM_DATA + HUM_SCK);//SDA SCK输出
    SHT_DATA_HIGH;
    SHT_SCK_HIGH;
    SHTConnectionRst();//connection reset sequence
    //SHTWriteReg(SHT_8BIT_CMD);
}
/*******************************************
函数名称:SHT_Start()
功    能:SHT启动传输
参    数:无
返回值  :无
********************************************/
void SHT_Start(void)
{
    SHT_DATA_HIGH;SHT_SCK_LOW;
    _NOP();
    _NOP();
    SHT_SCK_HIGH;
    _NOP();
    _NOP();
    SHT_DATA_LOW;
    _NOP();
    _NOP();
    SHT_SCK_LOW;
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    SHT_SCK_HIGH;
    _NOP();
    _NOP();
    SHT_DATA_HIGH;
    _NOP();
    _NOP();
    SHT_SCK_LOW;
}
/*******************************************
函数名称:SHTConnectionRst()
功    能:SHT通讯复位时序
参    数:无
返回值  :无
********************************************/
void SHTConnectionRst(void)
{
    uint8 i;
    SHT_DATA_OUTPUT;
    SHT_SCK_LOW;
    SHT_DATA_HIGH;
    for(i=0;i<9;i++)
    {
        SHT_SCK_HIGH;
        _NOP();_NOP();
        SHT_SCK_LOW;
        _NOP();_NOP();
    }
    SHT_Start();
}
/*******************************************
函数名称:S_Write_Byte()
功    能:向SHT写一个字节
参    数:value--要写的字节
返回值  :err_code:0-正常  1-出错
********************************************/
uint8 S_Write_Byte(uint8 value)
{
    uint8 i;
    uint8 err_code = 0;
    for(i=0x80;i>0;i/=2)
    {
        if(i & value)
        {
            SHT_DATA_HIGH;
        }
        else
        {
            SHT_DATA_LOW;
        }
        SHT_SCK_HIGH;
        _NOP();
        _NOP();
        SHT_SCK_LOW;
    }
    SHT_DATA_HIGH;//Release Data_line
    _NOP();_NOP();
    SHT_DATA_INPUT;
    _NOP();_NOP();
    SHT_SCK_HIGH;
    _NOP();_NOP();
    err_code = READ_SHT_DATA;
    _NOP();_NOP();
    SHT_SCK_LOW;
    _NOP();_NOP();
   
    SHT_DATA_OUTPUT;
   
    return err_code;
}
/*******************************************
函数名称:S_Read_Byte()
功    能:从SHT读取一个字节
参    数:ack--ACK
返回值  :val--读到的的数据
********************************************/
uint8 S_Read_Byte(uint8 ack)
{
    uint8 i;
    uint8 val = 0;
    SHT_DATA_OUTPUT;
    SHT_DATA_HIGH;//Release Data_line
    _NOP();_NOP();
    SHT_DATA_INPUT;
    _NOP();_NOP();
    for(i=0x80;i>0;i/=2)//shift bit for masking
    {
        SHT_SCK_HIGH;
        _NOP();_NOP();
        if(READ_SHT_DATA)val = (val | i);//read bit
        SHT_SCK_LOW;
        _NOP();_NOP();
    }
    SHT_DATA_OUTPUT;
    if(ack == 0)
    {
        SHT_DATA_HIGH;
    }
    else
    {
        SHT_DATA_LOW;
    }
    SHT_SCK_HIGH;
    _NOP();_NOP();
    _NOP();_NOP();
    SHT_SCK_LOW;
    SHT_DATA_HIGH;//释放数据线
    _NOP();_NOP();
    return val;
}
/*******************************************
函数名称:SHTSoftwareRst()
功    能:SHT软件复位
参    数:无
返回值  :err_code 0--正常 1--出错
********************************************/
uint8 SHTSoftwareRst(void)
{
    uint8 err_code = 0;
    SHTConnectionRst();
    err_code = S_Write_Byte(Soft_Reset);
    return err_code;
}
/*******************************************
函数名称:SHTWriteReg()
功    能:SHT写状态寄存器
参    数:value--要写的值
返回值  :err_code 0--正常 1--出错
********************************************/
uint8 SHTWriteReg(uint8 value)
{
    uint8 err_code = 0;
    SHT_Start();
    err_code += S_Write_Byte(WRITE_SR);
    err_code += S_Write_Byte(value);
    return err_code;
}
/*******************************************
函数名称:SHTReadReg()
功    能:SHT读状态寄存器
参    数:Dst--数据源指针 CRC--CRC校验值
返回值  :err_code 0--正常 1--出错
********************************************/
uint8 SHTReadReg(uint8 *Dst,uint8 *CRC)
{
    uint8 err_code = 0;
    SHT_Start();
    err_code += S_Write_Byte(READ_SR);
    *Dst = S_Read_Byte(ACK);
    *CRC = S_Read_Byte(NOACK);
    return err_code;
}
/*******************************************
函数名称:SHT_Calculate()
功    能:计算温度[°C]和湿度[%RH]
参    数:Humi --湿度数据源指针[12 bit]
          Temp --温度数据源指针[14 bit]
返回值  :humi[%RH]
********************************************/
void SHT_Calculate(float *p_humidity,float *p_temperature)
{      
    const float C1 = -4;// 12 Bit RH
    const float C2 = +0.0405;//12 Bit RH
    const float C3 = -0.0000028;//12 Bit RH
    const float T1 = +0.01;//12 Bit RH
    const float T2 = +0.00008;//12 Bit RH
    const float D1 = -39.60;//for 14 bit @3v
    const float D2 = +0.01;//for 14 bit @3v
    float rh = *p_humidity;
    float t  = *p_temperature;
    float rh_lin = 0;//Humidity linear
    float rh_true = 0;//Temperature compensated humidity
    float t_C = 0;//Temperature
    t_C = D1 + D2*t;//14 bit temperature
    rh_lin = C1 + C2*rh + C3*rh*rh;//12 bit humidity
    rh_true = (t_C - 25)*(T1 + T2*rh) + rh_lin;//calc Temperature compensated Humidity
    if(rh_true > 100)
    {
        rh_true = 100;
    }
    if(rh_true < 0.1)
    {
        rh_true = 0.1;
    }
    *p_humidity = rh_true;
    *p_temperature = t_C;
}
/*******************************************
函数名称:S_Measure()
功    能:SHT采样
参    数:Dst -- 数据源指针
          CRC --  CRC校验值
          Mode--采集模式
返回值  :err_code 0--正常 1--出错
********************************************/
uint8 S_Measure(uint8 *p_value,uint8 *p_checksum,uint8 mode)
{
    uint8 err_code = 0;
    unsigned short TimeCnt = 2000;
    SHT_Start();
    switch(mode)
    {
        case MEASURE_TEMP:err_code += S_Write_Byte(MEASURE_TEMP);break;
        case MEASURE_HUMI:err_code += S_Write_Byte(MEASURE_HUMI);break;
    default:break;
    }
    SHT_DATA_INPUT;
    do
    {
        delay_ms(1);
    }while((READ_SHT_DATA)&&(--TimeCnt));
    if(!TimeCnt)
    {
        err_code++;
    }
    else
    {
        *(p_value+1) = S_Read_Byte(ACK);//read the first byte(MSB)
        *(p_value) = S_Read_Byte(ACK);//read the second byte(LSB)
        *p_checksum = S_Read_Byte(NOACK);//read CheckSum
    }
   
    return err_code;
}
/*******************************************
函数名称:Read_wsd()
功    能:读取温湿度
参    数:无
返 回 值:无
********************************************/
void Read_Wsd(uint8 *Txdata)
{
    SHT_Init();
   
    uint8 err_code = 0;
    err_code += S_Measure((uint8*)&humi_val.i,&checksum,MEASURE_HUMI);
    err_code += S_Measure((uint8*)&temp_val.i,&checksum,MEASURE_TEMP);
    if(err_code)//in case of an err,connection reset
    {
        SHTConnectionRst();
    }
    else
    {
        humi_val.f = (float)humi_val.i;
        temp_val.f = (float)temp_val.i;
        SHT_Calculate(&humi_val.f,&temp_val.f);
        temp16_T = (unsigned int)(temp_val.f * 10);
        temp16_H = (unsigned int)(humi_val.f * 10);
        Txdata[0] = temp16_T;//温度的低字节
        Txdata[1] = temp16_T >> 8;//温度的高字节
        Txdata[2] = temp16_H;//湿度的低字节
        Txdata[3] = temp16_H >> 8;//湿度的高字节
   
    }
}
回复

使用道具 举报

5#
ID:750600 发表于 2020-5-20 18:30 | 只看该作者
依然是你 发表于 2017-8-26 10:26
#ifndef _SHT10_H_
#define _SHT10_H_

编程时候显示这个#include "sht10.h"打不开是怎么回事
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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