在msp430上使用SHT70

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

使用器件型号:msp430F169/msp430F149,SHT70@SENSIRION AG
典型应用电路:

代码:

#include <msp430x16x.h>
#include "intrinsics.h"
#include <math.h>     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();//5msSCK_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;elseDATA_H;delay();SCK_H;                            //clk #9 for ackdelay();          //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 starterror=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 starterror+=write_byte(REG_W);//send command to sensorerror+=write_byte(*p_value);    //send value of status registerreturn 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 startswitch(mode){                     //send command to sensorcase 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 measurementif(DATA_RIN == 1) error+=1;                // or timeout (~2 sec.) is reachedvalue_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.3Vconst float d2 = +0.01;          //for 14 bit//for 12 bitconst float C1 = -2.0468;        const float C2 = +0.0367;const float C3 = -0.0000015955;//for 12 bitconst 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; //defaultif(-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为XT2BCSCTL2 |= 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 temperatureerror+=measure(&humi_val,&checksum,HUMI);  //measure humidityif(error!=0) connectionreset();                 else{                   calc_sth(temp_val,humi_val,&temp_val_real, &humi_val_real);            //calculate humidity, temperaturedew_point = calc_dewpoint(temp_val_real, humi_val_real); //printf("%2.1f℃  %2.1f%% %2.1f℃\r\n", temp_val_real, humi_val_real, dew_point);}//----------wait approx. 0.8s to avoid heating up SHTxx------------------------------      delay();delay();delay();}
}void delay(){for(int i=0;i<300;i++)for(int j=0;j<2;j++);}

在msp430上使用SHT70相关推荐

  1. MSP430常见问题之FLASH存储类

    Q1:用IAR Embedded Workbench for MSP430 通过JTAG往MSP430上写程序.为了知道片内程序的版本,必须读出Flash 中内容.什么工具软件可以通过JTAG口实现这 ...

  2. 【单片机】msp430几种不同开发平台的对比

    目录 TinyOS (moteiv & mica) 编辑器 工程管理 开发环境 编译.运行和下载 make过程分析 TinyOS操作系统设计思想 MSPGCC 编辑器 工程管理 开发环境 编译 ...

  3. 【单片机开发平台】msp430几种不同开发平台的对比

    原文: http://zh200581134.blog.163.com/blog/static/96010202010310536447/ Altium Designer http://www.mir ...

  4. MSP430 LIN总线编程

    MSP430 LIN总线编程 Lis, 2021-2-3 时隔接近20年,CSDN我回来了...以下为本人原创. 如转载,请注明出处! LIN总线在汽车领域应用十分的广泛.汽车上的油泵,自动折叠反光镜 ...

  5. 如何有效申请TI的免费样片

    转自如何有效申请TI的免费样片 TI公司愿意为支持中国大学的师生们的教学.实验.创新实践.竞赛和科研项目,提供有限数量的免费样片.首先需要指出的是:所有的样片申请应该是诚实正当的,所有不恰当的申请(包 ...

  6. 边缘计算安全技术综述

    边缘计算安全技术综述 凌捷,陈家辉,罗玉,张思亮  广东工业大学计算机学院,广东 广州 510006   摘要:随着物联网应用的不断展开,大量移动终端设备参与服务计算,传统的云计算模型已经不能满足网络 ...

  7. 2020年全国大学生电子设计大赛赛后总结

    今天是2020.10.15,电赛测评已经结束2天. 对于这次电赛,在这边做个小总结.四天三夜,一个字--累!四个字--心力憔悴!从10.10一直到10.13,基本上一天只睡4个小时,基本上一天就是早上 ...

  8. 电子屏幕的51c语言程序,单片机控制LCD液晶显示器(含程序)

    <单片机控制LCD液晶显示器(含程序)>由会员分享,可在线阅读,更多相关<单片机控制LCD液晶显示器(含程序)(16页珍藏版)>请在人人文库网上搜索. 1.液晶显示器一 实验目 ...

  9. MCU在可穿戴计算机生物特征识别中的关键作用

    丢失丢失的手机或平板电脑是很难的;丢失的移动设备的后果是巨大的:我们的移动设备中存储了如此多的信息,以至于我们立即面临丢失金钱.被窃取或甚至被窃取身份的风险.想一想.除了必须重新创建电子邮件.更改密码 ...

最新文章

  1. 如何控制在一个软件中特殊的字符比如#都显示为红色呢?该字符是作为标签中的内容出现的,可能出现在JLABEL,JCheckBox,JCombox的标签中的,
  2. 智能车竞赛中视觉AI组别的打把问题
  3. java策略管理_详解Java编程中的策略模式
  4. linux网卡驱动更换,Ubuntu更换网卡驱动
  5. c语言中如何自定义sort,c – 如何重载自定义std :: sort比较函数?
  6. java读取json数据并解析输出对象
  7. 神经网络优化——学习率
  8. Python中fastapi构建的web项目使用.gitlab-ci.yml文件在KubeSphere中进行自动部署
  9. 18.案例实战:体验lombok的核心@Data和@Slf4j注解
  10. Scut游戏server引擎Unity3d访问
  11. 用牛顿法求算术平方根python
  12. 在线学习PS设计精讲精练记录(5)
  13. STM32H7的终极调试组件Event Recorder
  14. 应用中删除iCloud照片或视频 删除相册照片或视频
  15. C语言班级财务管理系统
  16. Chrome插件开发(一)
  17. 第四回:matplotlib文字图例尽眉目
  18. p5.js实现细胞免疫动画
  19. 深海打捞计划——VapourSynth学习笔记(一)
  20. 典型相关分析(Canonical Correlation Analysis,CCA)

热门文章

  1. 论C语言与PYTHON的优劣
  2. @Register指令
  3. 如何在iPhone或iPad上使用Safari下载文件
  4. windows下OpenCV安装教程以及vs2019配置opencv教程
  5. cuda、cudnn和pytorch下载与安装的经验
  6. 【格式化文档】ISO 27001控制措施+ISO27002实施指南 【下】
  7. VScode远程连接出错 Could not establish connection. Cannot read properties of undefined (reading ‘replace‘)
  8. CUMT-CTF第一次双月赛Writeup
  9. 解决word插入图片移动以及遮挡问题
  10. [Git可视化工具] SourceTree