历史上的今天
返回首页

历史上的今天

今天是:2025年03月12日(星期三)

正在发生

2020年03月12日 | 在msp430上使用SHT70

2020-03-12 来源:eefocus

属于msp430的串行接口传输数据的应用。SHTxx的串行接口与IIC不兼容,但其软件实现与IIC类似。


使用器件型号:msp430F169/msp430F149,SHT70@SENSIRION AG

典型应用电路:


代码:


#include

#include "intrinsics.h"

#include      


typedef unsigned int  uint;

typedef unsigned char uchar;



char write_byte(uchar value);

char read_byte(uchar ack);

void transstart(void);

void connectionreset(void);

char softreset(void);

char read_statusreg(uchar *p_value, uchar *p_checksum);

char write_statusreg(uchar *p_value);

char measure(unsigned short int*p_value, uchar *p_checksum, uchar mode);

void calc_sth(unsigned short int t, unsigned short int rh, float *p_temperature, float *p_humidity);

float calc_dewpoint(float h,float t);

void sht10_init(void);

void CLK_Init();



   float humi_val_real=0.0;   

   float temp_val_real=0.0;

   float dew_point=0.0;



#define noACK 0

#define ACK   1


#define DATA_OUT  P5DIR |= BIT3

#define DATA_IN   P5DIR &=~BIT3

#define DATA_RIN  (P5IN & BIT3)



#define DATA_H P5OUT |= BIT3 //DATA <---> P5.1

#define DATA_L P5OUT &=~ BIT3 

#define SCK_H  P5OUT |= BIT4  //SCK  <---> P5.2

#define SCK_L  P5OUT &=~ BIT4


#define REG_W 0x06  // 0000 0110

#define REG_R 0x07  // 0000 0111

#define TEMP  0x03  // 0000 0011

#define HUMI  0x05  // 0000 0101

#define RESET 0x1e  // 0001 1111



#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 delay();


char write_byte(uchar value)

//write a byte on the sensibus and checks the ackonwledge


{

  uchar i,error = 0;

  DATA_OUT;

  for(i=0x80;i>0;i/=2)

  {

    if(i&value)

    {DATA_OUT;DATA_H;}

    else

    {DATA_OUT; DATA_L;}

    

delay();

    SCK_H;

delay();//5ms

    SCK_L;

delay();

  }

   DATA_IN; 

  SCK_H;

     //delay_ms(800);


  error = DATA_RIN;

  SCK_L;

  return error;

}


char read_byte(uchar ack)

// read a byte from sensibus and gives an ackowledge in case of 'ack =1'

{

  uchar i,val=0;

                       

  DATA_IN;

  for (i=0x80;i>0;i/=2)             //shift bit for masking

  { 

delay();

    SCK_H;                          //clk for SENSI-BUS

delay();

    if (DATA_RIN) 

      val=(val | i);        //read bit  

    SCK_L;   

  }

  DATA_OUT;

  if(ack) 

    DATA_L;

  else

    DATA_H;

    

  delay();

  SCK_H;                            //clk #9 for ack

  delay();          //pulswith approx. 5 us 

  SCK_L;     

  delay();                        

  return val;


}


void transstart(void)

{

  DATA_OUT;

  DATA_H;SCK_L;

delay();

  SCK_H;

delay();

  DATA_L;

delay();

  SCK_L;

delay();

  SCK_H;

delay();

  DATA_H;

delay();

  SCK_L;

}


void connectionreset(void)

{

  uchar i;

  DATA_OUT;

  DATA_H;

  SCK_L;

  for(i=0;i<9;i++)

  {

    SCK_H;

    

  delay();

    SCK_L;

  delay();

  }

  transstart();

}


char softreset(void)

{

  uchar error = 0;

  connectionreset();

  error += write_byte(RESET);

  return error;

}


char read_statusreg(uchar *p_value, uchar *p_checksum)

//----------------------------------------------------------------------------------

// reads the status register with checksum (8-bit)

  uchar error=0;

  transstart();                   //transmission start

  error=write_byte(REG_R); //send command to sensor

  *p_value=read_byte(ACK);        //read status register (8-bit)

  *p_checksum=read_byte(noACK);   //read checksum (8-bit)  

  return error;                     //error=1 in case of no response form the sensor

}


//----------------------------------------------------------------------------------

char write_statusreg(uchar *p_value)

//----------------------------------------------------------------------------------

// writes the status register with checksum (8-bit)

  uchar error=0;

  transstart();                   //transmission start

  error+=write_byte(REG_W);//send command to sensor

  error+=write_byte(*p_value);    //send value of status register

  return error;                     //error>=1 in case of no response form the sensor

}


//----------------------------------------------------------------------------------

char measure(unsigned short int*p_value, uchar *p_checksum, uchar mode)

//----------------------------------------------------------------------------------

// makes a measurement (humidity/temperature) with checksum

  uchar error=0;

  unsigned short int i;

  uchar value_H = 0,value_L = 0;

  transstart();                   //transmission start

  switch(mode){                     //send command to sensor

  case TEMP:

      error+=write_byte(TEMP); 

      break;

  case HUMI:

      error+=write_byte(HUMI);

      break;

  default:

      break;  

  }

  DATA_IN;

  for (i=0;i<250;i++)

  {  

delay();

delay();

delay();

delay();



    if(DATA_RIN == 0) 

      break;

  } //wait until sensor has finished the measurement

  if(DATA_RIN == 1) error+=1;                // or timeout (~2 sec.) is reached

  value_H=read_byte(ACK);    //read the first byte (MSB)

  value_L =read_byte(ACK);    //read the second byte (LSB)

  

  *p_checksum =read_byte(noACK);  //read checksum

  *p_value = (value_H << 8) | value_L;

  return error;

}

void calc_sth(unsigned short int t, unsigned short int rh, float *p_temperature, float *p_humidity)

{

const float d1 = -39.61;         //@3.3V

const float d2 = +0.01;          //for 14 bit

//for 12 bit

const float C1 = -2.0468;        

const float C2 = +0.0367;

const float C3 = -0.0000015955;

//for 12 bit

const float T1 = +0.01;

const float T2 = +0.00008;


float RH_Lin; 

float RH_Ture;

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.1f)

RH_Ture = 0.1;  


*p_humidity = RH_Ture;

*p_temperature = temp_C;

}


float calc_dewpoint(float t,float h)

float dew_point;

float m=17.62,Tn=243.12; //default

if(-40<=t && t<0)

{

m  = 22.46;

Tn = 272.62;

}

dew_point = Tn*(log10(h)+m*t/(Tn+t))/(m-log10(h)-+m*t/(Tn+t));

return dew_point;

}

void sht10_init(void)

{

  P5SEL = 0x00;

 // P5SEL |=BIT2;

 // P5SEL &=~ BIT1;

 // P5DIR &=~BIT1;

  //P5DIR |= BIT2;

  //DATA_OUT;

  P5DIR |= BIT3+BIT4;


}


void CLK_Init()

{

unsigned int iq0;

   //BCSCTL1&=~0X00;                      //打开XT2振荡器

   BCSCTL1 &= ~XT2OFF;         //打开XT振荡器

   do

   {

      IFG1 &= ~OFIFG;                   // 清除振荡器失效标志

      for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振

    }

    while ((IFG1 & OFIFG) != 0);        // 判断XT2是否起振

    //BCSCTL2 =SELM_2+SELS;               //选择MCLK、SMCLK为XT2

    BCSCTL2 |= SELM1+SELS;      //MCLK为8MHZ,SMCLK为8MHZ

}


int main(void)

  unsigned short int humi_val=0,temp_val=0;

  

  uchar error=0,checksum=0;


  WDTCTL=WDTPW+WDTHOLD;

  //int i;

   CLK_Init();

  sht10_init();


  connectionreset();

  while(1)

  { 

    error=0;

    error+=measure(&temp_val,&checksum,TEMP);  //measure temperature

    error+=measure(&humi_val,&checksum,HUMI);  //measure humidity

    

    if(error!=0) 

      connectionreset();                 

    else

    {                   

       calc_sth(temp_val,humi_val,&temp_val_real, &humi_val_real);            //calculate humidity, temperature

       dew_point = calc_dewpoint(temp_val_real, humi_val_real); 

      //printf("%2.1f℃  %2.1f%% %2.1f℃rn", temp_val_real, humi_val_real, dew_point);

    }

    //----------wait approx. 0.8s to avoid heating up SHTxx------------------------------      

    delay();

    delay();

    delay();

推荐阅读

史海拾趣

Electromagnetic Industries Llp公司的发展小趣事

EMI公司成立于20世纪80年代初,当时正值电子行业的快速发展期。创始人李先生凭借对电磁技术的深厚理解和市场洞察,决定投身电磁产品的研发与生产。初创时期,公司面临着资金短缺、技术难题和市场认可度低等多重挑战。然而,李先生和他的团队并没有放弃,他们通过夜以继日的研发,不断攻克技术难关,同时积极寻找合作伙伴,拓展销售渠道。经过几年的努力,EMI公司逐渐在市场上站稳了脚跟。

CUI公司的发展小趣事

近年来,智能化和物联网技术的快速发展为电子行业带来了前所未有的机遇。CUI技术作为实现电子设备智能化和互联互通的关键环节之一,得到了广泛的应用。一些企业针对智能化和物联网的需求,开发出具有特殊功能的CUI材料,如柔性CUI、透明CUI等,为电子产品的创新提供了有力支持。

请注意,以上故事仅为概述性质,并非针对特定公司的实际发展历程。每个公司的具体情况可能因市场环境、技术实力、管理策略等因素而有所不同。如果需要了解特定公司的具体发展故事,建议查阅相关公司的官方网站、新闻报道或行业分析报告。

GAIA Converter Inc公司的发展小趣事

位于广东东莞的锋鸣电子有限公司,自2010年成立以来,便明确了自己的市场定位——专注于汽车电子配件的研发与生产。随着汽车行业的快速发展,公司敏锐地捕捉到智能驾驶和车载娱乐系统对高质量电声器件的需求,迅速调整产品结构,推出了一系列符合市场需求的蜂鸣器、扬声器等产品。凭借精准的市场定位和优质的产品质量,锋鸣电子在汽车电子配件领域站稳了脚跟。

AUK Contractors Co Ltd公司的发展小趣事

随着公司业务的不断扩展,AUK Contractors Co Ltd意识到单一市场已无法满足其增长需求。于是,公司积极寻求国际合作,与多个国家的电子企业建立了战略伙伴关系。通过技术交流和资源共享,公司成功打开了新的市场,实现了业务的快速增长。

Alpha Industries公司的发展小趣事

随着电子技术的飞速发展,军事装备也在不断升级。Alpha Industries敏锐地捕捉到了这一趋势,开始将电子技术应用于其军事服装设计中。例如,公司研发了一款带有GPS定位功能的飞行夹克,帮助飞行员在复杂环境中快速定位。此外,Alpha Industries还利用电子传感器技术,开发出能够监测士兵体温和心率的战地风衣,为军队提供更为全面的保障。

Bytes公司的发展小趣事

Bytes公司在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和工艺,降低产品对环境的影响。同时,公司还积极参与公益事业,捐赠资金和物资支持教育、扶贫等事业。这些举措使得Bytes公司赢得了社会的广泛认可和尊重。

请注意,这些故事框架仅供参考,您可以根据具体公司的实际情况和发展历程进行调整和补充。同时,由于我无法获取实时数据和信息,因此建议您在编写具体故事时参考相关公司的官方资料和市场分析报告。

问答坊 | AI 解惑

MCGS组态软件设计及其应用

一、引言     过去工业控制计算机系统的软件功能都靠软件人员编程实现。工作量大,软件通用性差,且易产生错误。随着工业控制要求的不断提高,专门用于工业控制的组态软件应运而生,它是一套功能齐全的组态生成工具软件,通用性强,而 ...…

查看全部问答>

ARM c程序的问题

_irqHandler PROC    1. STMFD   sp!,{r0-r4,r12,lr}    2. mov     r4,#0x80000000  //中断控制寄存器首地址(假设的)    3. ldr     r0,[r4,#0] ...…

查看全部问答>

给论坛的建议

我希望论坛能够在下载扣金币方面可以放松点,比如每次只扣一个或者在某个贴上下载只扣若干个就好了,因为有些文件确实比较大,要下好几个压缩文件才能行的,而每下一个就扣好几,很多人都有些不舍得,毕竟金币有比较难得,特别是新手就更麻烦了,我 ...…

查看全部问答>

wince 桌面快捷方式

请问: wince中的文件夹有没有后缀名? 我想把一个名为NandFlash的文件夹,放到桌面快捷方式, 我在WINCE500\\PLATFORM\\SMDK2440\\FILES创建了一个NandFlash.LNK文件,里面写上22#\\windows\\NandFlash 我又在Project.bib 里面加上 NandFlash ...…

查看全部问答>

PCI设备识别不正常

首先我的程序在某些主板上是可以正常工作的(具体型号我也搞不懂),设置的是从设备,内部只有从设备状态机。没有接入奇偶检验,仲裁和热插拔。 问题是在一些主板上发现设置为从设备时无法找到设备,设置为主设备可以找到,但是通过软件读取配置信 ...…

查看全部问答>

0

居然要全部下完才能都打开?这个有点不厚道…

查看全部问答>

LM3S程序求教

//————————————————头文件————————————————————#include \"inc/hw_ints.h\"//硬件中断#include \"inc/hw_memmap.h\"#include \"inc/hw_types.h\"//硬件类型#include \"driverlib/gpio.h\"//GPIO#include \"dri ...…

查看全部问答>

中断究竟是个怎么回事?

今天听单片机老师讲课讲中断,说分了好几种,被他弄得一头雾水,还是没明白他说的中断都有什么,怎么配置,查了查2553手册,愣是没找到讲解终端的地方,球大神指点123!不胜感激。…

查看全部问答>

DCDC电源中的电流检测

文章介绍了7中电流检测的办法,可以作为电流检测的入门读物 …

查看全部问答>