在msp430上使用SHT70
在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相关推荐
- MSP430常见问题之FLASH存储类
Q1:用IAR Embedded Workbench for MSP430 通过JTAG往MSP430上写程序.为了知道片内程序的版本,必须读出Flash 中内容.什么工具软件可以通过JTAG口实现这 ...
- 【单片机】msp430几种不同开发平台的对比
目录 TinyOS (moteiv & mica) 编辑器 工程管理 开发环境 编译.运行和下载 make过程分析 TinyOS操作系统设计思想 MSPGCC 编辑器 工程管理 开发环境 编译 ...
- 【单片机开发平台】msp430几种不同开发平台的对比
原文: http://zh200581134.blog.163.com/blog/static/96010202010310536447/ Altium Designer http://www.mir ...
- MSP430 LIN总线编程
MSP430 LIN总线编程 Lis, 2021-2-3 时隔接近20年,CSDN我回来了...以下为本人原创. 如转载,请注明出处! LIN总线在汽车领域应用十分的广泛.汽车上的油泵,自动折叠反光镜 ...
- 如何有效申请TI的免费样片
转自如何有效申请TI的免费样片 TI公司愿意为支持中国大学的师生们的教学.实验.创新实践.竞赛和科研项目,提供有限数量的免费样片.首先需要指出的是:所有的样片申请应该是诚实正当的,所有不恰当的申请(包 ...
- 边缘计算安全技术综述
边缘计算安全技术综述 凌捷,陈家辉,罗玉,张思亮 广东工业大学计算机学院,广东 广州 510006 摘要:随着物联网应用的不断展开,大量移动终端设备参与服务计算,传统的云计算模型已经不能满足网络 ...
- 2020年全国大学生电子设计大赛赛后总结
今天是2020.10.15,电赛测评已经结束2天. 对于这次电赛,在这边做个小总结.四天三夜,一个字--累!四个字--心力憔悴!从10.10一直到10.13,基本上一天只睡4个小时,基本上一天就是早上 ...
- 电子屏幕的51c语言程序,单片机控制LCD液晶显示器(含程序)
<单片机控制LCD液晶显示器(含程序)>由会员分享,可在线阅读,更多相关<单片机控制LCD液晶显示器(含程序)(16页珍藏版)>请在人人文库网上搜索. 1.液晶显示器一 实验目 ...
- MCU在可穿戴计算机生物特征识别中的关键作用
丢失丢失的手机或平板电脑是很难的;丢失的移动设备的后果是巨大的:我们的移动设备中存储了如此多的信息,以至于我们立即面临丢失金钱.被窃取或甚至被窃取身份的风险.想一想.除了必须重新创建电子邮件.更改密码 ...
最新文章
- 如何控制在一个软件中特殊的字符比如#都显示为红色呢?该字符是作为标签中的内容出现的,可能出现在JLABEL,JCheckBox,JCombox的标签中的,
- 智能车竞赛中视觉AI组别的打把问题
- java策略管理_详解Java编程中的策略模式
- linux网卡驱动更换,Ubuntu更换网卡驱动
- c语言中如何自定义sort,c – 如何重载自定义std :: sort比较函数?
- java读取json数据并解析输出对象
- 神经网络优化——学习率
- Python中fastapi构建的web项目使用.gitlab-ci.yml文件在KubeSphere中进行自动部署
- 18.案例实战:体验lombok的核心@Data和@Slf4j注解
- Scut游戏server引擎Unity3d访问
- 用牛顿法求算术平方根python
- 在线学习PS设计精讲精练记录(5)
- STM32H7的终极调试组件Event Recorder
- 应用中删除iCloud照片或视频 删除相册照片或视频
- C语言班级财务管理系统
- Chrome插件开发(一)
- 第四回:matplotlib文字图例尽眉目
- p5.js实现细胞免疫动画
- 深海打捞计划——VapourSynth学习笔记(一)
- 典型相关分析(Canonical Correlation Analysis,CCA)
热门文章
- 论C语言与PYTHON的优劣
- @Register指令
- 如何在iPhone或iPad上使用Safari下载文件
- windows下OpenCV安装教程以及vs2019配置opencv教程
- cuda、cudnn和pytorch下载与安装的经验
- 【格式化文档】ISO 27001控制措施+ISO27002实施指南 【下】
- VScode远程连接出错 Could not establish connection. Cannot read properties of undefined (reading ‘replace‘)
- CUMT-CTF第一次双月赛Writeup
- 解决word插入图片移动以及遮挡问题
- [Git可视化工具] SourceTree