SHT71.C
- /***********************************
- 功能模块:SHT71温湿度传感器
- 功能注释:重难点在无时序图
- ***********************************/
- #include<msp430x14x.h>
- #include "SHT71.h"
- #include <math.h> //数据函数
- typedef unsigned char uchar;
- typedef unsigned int uint;
- #define CLC_SCK P5OUT&=~BIT1 //SCK=P5.1
- #define SET_SCK P5OUT|= BIT1
- #define CLC_DATA P5OUT&=~BIT2 //DATA=P5.2
- #define SET_DATA P5OUT|= BIT2
- #define IN_DATA P5DIR&=~BIT2
- #define OUT_DATA P5DIR|= BIT2
- #define RIN_DATA (P5IN & BIT2) //用于单片机读取总线
- #define NACK 0
- #define ACK 1
- //测量温度0x03 测量湿度0x05 软复位0x1e
- //写状态寄存器0x06 读状态寄存器0x07
- /***************延时函数********************/
- void delay_80ms(void)
- {
- uint i;
- for(i=64000;i>0;i--);
- }
- /********************************************
- 函数名称:SHT71_write_byte()
- 实现功能:向SHT71写一个字节
- 函数注释:dat为要写入的数据
- *********************************************/
- void SHT71_write_byte(uchar dat)
- {
- uchar i;
- OUT_DATA; //DATA为输出状态
- for(i=0x80;i>0;i/=2)
- {
- if(i&dat) SET_DATA; //最高位在前
- else CLC_DATA;
- _NOP();
- SET_SCK; //下降沿有效
- _NOP(); _NOP(); _NOP();
- CLC_SCK;
- _NOP();
- }
- SET_SCK; //检测响应信号
- _NOP();
- IN_DATA;
- if(RIN_DATA) //检查ack(DATA被拉低)
- CLC_SCK;
- OUT_DATA;
- SET_DATA; //释放DATA
- }
- /********************************************
- 函数名称:SHT71_read_byte()
- 实现功能:从SHT71读一个字节
- 函数注释:dat为要读取的数据
- *********************************************/
- uchar SHT71_read_byte(uchar dat)
- {
- uchar i,value;
- for(i=0x80;i>0;i/=2)
- {
- OUT_DATA; //DATA为输出状态
- SET_SCK; //下降沿有效
- _NOP();
- IN_DATA;
- if(RIN_DATA)
- value|=i;
- CLC_SCK;
- }
- IN_DATA;
- _NOP();
- if(RIN_DATA!=dat) //防止dat==1,拉低DATA数据线
- _NOP();
- OUT_DATA;
- SET_SCK;
- _NOP(); _NOP(); _NOP();
- CLC_SCK;
- _NOP();
- SET_DATA;
- return value;
- }
- /********************************************
- 函数名称:SHT71_start()
- 实现功能:启动传输,完成数据传输初始化
- 函数注释:无
- *********************************************/
- void SHT71_start(void)
- {
- OUT_DATA; //DATA为输出状态
- SET_DATA;
- CLC_SCK;
- _NOP();
- SET_SCK; //SCK为高电平时DATA反转
- _NOP();
- CLC_DATA;
- _NOP();
- CLC_SCK;
- _NOP();_NOP();_NOP();
- SET_SCK; //SCK为高电平时DATA反转
- _NOP();
- CLC_DATA;
- _NOP();
- CLC_SCK;
- }
- /***************通讯复位*******************/
- void SHT71_reset(void)
- {
- uchar i;
- SET_DATA;
- CLC_SCK;
- for(i=0;i<9;i++)
- {
- SET_SCK;
- _NOP();
- CLC_SCK;
- }
- SHT71_start(); //串口复位
- }
- /***************软复位*******************/
- void SHT71_softreset(void)
- {
- SHT71_reset();
- SHT71_write_byte(0x1e); //软复位命令为0x1e
- }
- /********************************************
- 函数名称:SHT71_read_status()
- 实现功能:读状态寄存器
- 函数注释:p_value为状态寄存器,p_check为校验位
- *********************************************/
- void SHT71_read_status(uchar *p_value,uchar *p_check)
- {
- SHT71_start();
- SHT71_write_byte(0x07); // 读状态寄存器指令
- *p_value=SHT71_read_byte(ACK); //read status register (8-bit)
- *p_check=SHT71_read_byte(NACK); //read checksum (8-bit)
- }
- /********************************************
- 函数名称:SHT71_write_status()
- 实现功能:写状态寄存器
- 函数注释:p_value为状态寄存器值
- *********************************************/
- void SHT71_write_status(uchar *p_value)
- {
- SHT71_start();
- SHT71_write_byte(0x06); // 写状态寄存器指令
- SHT71_write_byte(*p_value); //send value of status register
- }
- /********************************************
- 函数名称:SHT71_measure()
- 实现功能:温湿度的测量
- 函数注释:mode为状态指令(测量温湿度指令)
- p_value为温湿度值,p_checksum为检测
- *********************************************/
- void SHT71_measure(uchar *p_value,uchar *p_checksum,uchar mode)
- {
- SHT71_start();
- SHT71_write_byte(mode); //选择温湿度值
- delay_80ms(); //等待80ms后等待12位湿度值测量
- IN_DATA;
- _NOP();
- // while(RIN_DATA==0)
- // if(RIN_DATA==0) break;
- if(RIN_DATA)
- *(p_value) =SHT71_read_byte(ACK); //read the first byte (MSB)
- *(p_value+1)=SHT71_read_byte(ACK); //read the second byte (LSB)
- *p_checksum =SHT71_read_byte(NACK); //read checksum
- }
- /********************************************
- 函数名称:SHT71_calc()
- 实现功能:温湿度的测量数据转化为响应数据
- 函数注释:p_humidity湿度数据[%RH],
- p_temperature温度数据[°C]
- rh_lin=C3*rh*rh+C2*rh+C1
- rh_true=(t_C-25)*(T1+T2*rh)+rh_lin
- t_c=d1+d2*t
- *********************************************/
- void SHT71_calc(float *p_humidity ,float *p_temperature)
- {
- float rh=*p_humidity;
- float t=*p_temperature;
- float rh_lin; //相对湿度
- float rh_true; //湿度补偿
- float t_C; //温度值
- t_C=t*0.01-39.6;
- rh_lin=-2.0468+0.0367*rh+(-0.0000015955)*rh*rh;
- rh_true=(t_C-25)*(0.01+0.00008*rh)+rh_lin;
-
- if(rh_true>100.0)rh_true=100.0;
- if(rh_true<0.1)rh_true=0.1;
- *p_temperature=t_C;
- *p_humidity=rh_true;
- }
- /********************************************
- 函数名称:calc_dewpoint()
- 实现功能:露点的测量
- 函数注释:h为湿度值,t为温度值
- *********************************************/
- float calc_dewpoint(float h,float t)
- {
- float k,dew_point ;
- k=(log10(h)-2)/0.4343 + (17.62*t)/(243.12+t);
- dew_point =243.12*k/(17.62-k);
- return dew_point;
- }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>