SHT11读写(含露点计算)

2020-02-05 08:55发布

以前做12864电子万年历时在网上下载的一个SHT11读写参考程序,现奉献出来给有需要的做参考,希望大家喜欢,帮我线度过老大的审核关.
sht11 含露点计算读写程序ourdev_680397OZRTB9.rar(文件大小:17K) (原文件名:SHT11 RW.rar)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
hbzxx
1楼-- · 2020-02-06 03:23
LZ用了浮点运算。
会占用很大的空间的。建议用整数来做。
WinLiu
2楼-- · 2020-02-06 09:03
回复【7楼】hbzxx
-----------------------------------------------------------------------

  用浮点运算主要是考虑测量精度,空间现在已经不是问题,大不了用一个的大一点的芯片(我现在用的是SST89E564RD),当然这里是自己搞作玩不用考虑,如果批量生产就必须考虑了,否则成本就会增加.
flyunlimit
3楼-- · 2020-02-06 09:06
给楼主添个砖,这时就体会到32位的好处了。不是全部程序,需要的自己捡有用的吧。

#include "stm32f10x.h"
#include "STM32_Init.h"
#include "key.h"

#define SCK_0 GPIOB->BRR = SCK;delay();
#define SCK_1 GPIOB->BSRR = SCK;delay();
#define DATA_0 GPIOB->BRR = DATA;delay();
#define DATA_1 GPIOB->BSRR = DATA;delay();

u32 sys_time_10ms=0;
u32 sys_time_1s=0;
u32 sys_time_1min=0;
u32 sys_time_1hour=0;
u32 sys_time_1day=0;

u8  USART1_TX_Buf[20];
u8  USART1_RX_Buf[20];
u32 USART1_RX_index=0;
u32 USART1_RX_count=0;
u32 USART1_TX_index=0;
u32 USART1_TX_count=0;
u32 nokey_time=0;

u32 TM;//温度
u32 RH;//湿度

u8 number_g=0;
u8 number_s=0;
u8 number_b=0;
typedef union
{
  unsigned int Bdata;
  struct
  {
    unsigned char TBIT0       :1;                                      
    unsigned char TBIT1       :1;                                       
    unsigned char TBIT2       :1;                                       
    unsigned char TBIT3       :1;                                       
    unsigned char TBIT4       :1;                                       
    unsigned char TBIT5       :1;
    unsigned char TBIT6       :1;                                       
    unsigned char TBIT7       :1;
    unsigned char TBIT8       :1;
    unsigned char TBIT9       :1;                                       
    unsigned char TBIT10      :1;
    unsigned char TBIT11      :1;
    unsigned char TBIT12      :1;
    unsigned char TBIT13      :1;
    unsigned char TBIT14      :1;
    unsigned char TBIT15      :1;
  } Bits;
} TEMP_BIT;
volatile TEMP_BIT _TEMP_FLAG;

#define TEMP_flag               _TEMP_FLAG.Bdata
#define USART1_RXS_FLAG         _TEMP_FLAG.Bits.TBIT0  // 用于串口接收到头标志
#define USART1_RXE_FLAG         _TEMP_FLAG.Bits.TBIT1  // 接受完毕
#define USART1_TXS_FLAG         _TEMP_FLAG.Bits.TBIT2  // 开始dma发送
#define USART1_TXE_FLAG         _TEMP_FLAG.Bits.TBIT3  // 发送完毕

#define key_flag                _TEMP_FLAG.Bits.TBIT4  //
#define SHT_read_flag           _TEMP_FLAG.Bits.TBIT5  //  
#define auto_send_flag          _TEMP_FLAG.Bits.TBIT6  //
//------------------------------------------------------------------------------------
//函数名:  void delay(void)
//功能描述:延时函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明:固定延时几个周期
//------------------------------------------------------------------------------------
__asm void delay(void)
{
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  BX LR
}
//------------------------------------------------------------------------------------
//函数名:  void KeyDo (void)
//功能描述:按键键值的处理函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明: 每10ms执行一次,根据按键程序输出的有效键值进行对应的处理
//          有按键处理,无按键够10秒灭背光
//------------------------------------------------------------------------------------
void KeyDo (void)
{
  u32 key_vale;
  if(key_flag==1)
  {  
    key_flag=0;
    GetKey(&key_vale);
    if(key_vale==0)
    {
      nokey_time++;
      LED1_0; //背光灭
      if(nokey_time>1000)  //10秒无操作
      {
        nokey_time=500;
        LED1_0; //背光灭
      }
    }
    else
    {
      nokey_time=0;
      LED1_1; //背光亮
      switch(key_vale)
      {
        case  KEY_VALUE_1|KEY_UP:          //按下抬起后才有效
          SHT_read_flag=1;  // 手动测量
          LED2_1;
        break;
        case  KEY_VALUE_2|KEY_UP:
          auto_send_flag=1;   // 自动测量发送
        break;
        default :
        break ;
      }
    }
  }
}
//------------------------------------------------------------------------------------
//函数名:  u32 SHT_read (void)
//功能描述:传感器读取函数
//输入参数:u32 cmd 要读取的数据,3-温度 5-湿度         
//输出参数:u32 *pr 返回读到的数据
//返回参数: u32 err 错误类型
//函数说明:按照标准顺序读取传感器的值,不做CRC
//------------------------------------------------------------------------------------
u32 SHT_read (u32 cmd,u32 *pr)
{
  u32 i,err,TR;
  GPIOB->CRL=0x51444444;  //开漏输出
  //启动传输
  SCK_1;
  DATA_0;
  SCK_0;
  SCK_1;
  DATA_1;
  SCK_0;
  for(i=0;i<8;i++)
  {
    SCK_0;
    if(cmd&0x80)
    { DATA_1;} //宏定义是2句,所以大括号要加
    else
    { DATA_0;}
    SCK_1;
    cmd<<=1;
  }
  SCK_0;
  GPIOB->CRL=0x41444444;  //浮空输入
  SCK_1;
  if(GPIO_ReadInputDataBit(GPIOB , DATA)==0) //传感器ACK
    err=0;
  else
  {
    SCK_0;  
    return 0x01;  
  }
  SCK_0;     //SCK下降沿,从机DATA释放
  while(GPIO_ReadInputDataBit(GPIOB , DATA)==1) //等待完成测量
  delay();
  TR=0;
  for(i=0;i<8;i++)
  {
    SCK_1;
    if(GPIO_ReadInputDataBit(GPIOB , DATA)==1)
      TR|=1;
    else
      TR|=0;
    TR<<=1;
    SCK_0;
  }
  SCK_0;
  GPIOB->CRL=0x51444444;    //开漏输出
  DATA_0;    //主机ACK
  SCK_1;
  SCK_0;
  DATA_1;
  GPIOB->CRL=0x41444444;   //浮空输入
  for(i=0;i<8;i++)
  {
    SCK_1;
    if(GPIO_ReadInputDataBit(GPIOB , DATA)==1)
      TR|=1;
    else
      TR|=0;
    TR<<=1;
    SCK_0;
  }
  TR>>=1; //最后一次不用左移
  GPIOB->CRL=0x51444444;    //开漏输出
  DATA_1;     //主机ACK
  SCK_1;
  SCK_0;
  GPIOB->CRL=0x41444444;   //浮空输入
  *pr=TR;
  return err;        
}
//------------------------------------------------------------------------------------
//函数名:  void hextobcd(u32 temp)
//功能描述:hex转bcd
//输入参数:u32 temp 要转换的数,小于99
//输出参数:无
//返回参数: 无
//函数说明:将普通的HEX值转为4个BCD值
//------------------------------------------------------------------------------------
void hextobcd(u32 temp)
{
  u32 i=0;
  if (temp>=800) {i=8; temp-=800;}
  if (temp>=400) {i+=4;temp-=400;}
  if (temp>=200) {i+=2;temp-=200;}
  if (temp>=100) {i++; temp-=100;}
  number_b=i;
  i=0;
  if (temp>=80) {i=8; temp-=80;}
  if (temp>=40) {i+=4;temp-=40;}
  if (temp>=20) {i+=2;temp-=20;}
  if (temp>=10) {i++; temp-=10;}
  number_s=i;
  number_g=temp;
}
//------------------------------------------------------------------------------------
//函数名:  int main (void)
//功能描述:主函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明:程序的主函数。  11010010101000
//------------------------------------------------------------------------------------
int main(void)
{
  u32 temp;
  STM32_Init();
  while (1)
  {
    KeyDo();
    if(SHT_read_flag)            //测量温湿度
          {
            SHT_read_flag=0;
      SHT_read(3,&TM);         //3-温度 5-湿度
            TM-=3964;
      TM/=10;   //小数点以后只留1位
      SHT_read(5,&RH);         //3-温度 5-湿度
      temp=RH;
      RH=(405-temp*28/1000)*temp-40000;   
      RH/=1000;   //小数点以后只留1位
      USART1_TXS_FLAG=1;
          }
    if(USART1_TXS_FLAG)          
          {
            USART1_TXS_FLAG=0;
      hextobcd(TM);
      USART1_TX_Buf[0]='T';
      USART1_TX_Buf[1]='=';
      USART1_TX_Buf[2]=number_b+'0';
      USART1_TX_Buf[3]=number_s+'0';
      USART1_TX_Buf[4]='.';
      USART1_TX_Buf[5]=number_g+'0';
      USART1_TX_Buf[6]=' ';  
      hextobcd(RH);
      USART1_TX_Buf[7]='R';
      USART1_TX_Buf[8]='=';
      USART1_TX_Buf[9]=number_b+'0';
      USART1_TX_Buf[10]=number_s+'0';
      USART1_TX_Buf[11]='.';
      USART1_TX_Buf[12]=number_g+'0';
      USART1_TX_Buf[13]='%';
      USART1_TX_Buf[14]=' ';
      USART1_TX_index=14;
      USART1_TX_count=0;  
            USART_ITConfig(USART1,USART_IT_TC,ENABLE);        //启动  
    }
    if(USART1_RXE_FLAG)          //如果接收结束
          {
            USART1_RXE_FLAG=0;     
          }               
  }
}
WinLiu
4楼-- · 2020-02-06 14:40
 精彩回答 2  元偷偷看……
725725y
5楼-- · 2020-02-06 18:46
3Q楼主
zhangyunbo
6楼-- · 2020-02-06 20:09
mark!!!

一周热门 更多>