MSP430控制SHT71温湿度传感器的采集程序

2019-07-19 13:34发布

SHT71.C
  1. /***********************************
  2. 功能模块:SHT71温湿度传感器
  3. 功能注释:重难点在无时序图
  4. ***********************************/
  5. #include<msp430x14x.h>
  6. #include "SHT71.h"
  7. #include <math.h>              //数据函数
  8. typedef unsigned char uchar;
  9. typedef unsigned int  uint;

  10. #define CLC_SCK  P5OUT&=~BIT1  //SCK=P5.1
  11. #define SET_SCK  P5OUT|= BIT1  
  12. #define CLC_DATA P5OUT&=~BIT2  //DATA=P5.2
  13. #define SET_DATA P5OUT|= BIT2

  14. #define IN_DATA  P5DIR&=~BIT2  
  15. #define OUT_DATA P5DIR|= BIT2
  16. #define RIN_DATA (P5IN & BIT2)  //用于单片机读取总线

  17. #define NACK 0
  18. #define ACK  1
  19. //测量温度0x03     测量湿度0x05  软复位0x1e
  20. //写状态寄存器0x06 读状态寄存器0x07
  21. /***************延时函数********************/
  22. void delay_80ms(void)
  23. {
  24.     uint i;
  25.     for(i=64000;i>0;i--);
  26. }
  27. /********************************************
  28. 函数名称:SHT71_write_byte()
  29. 实现功能:向SHT71写一个字节
  30. 函数注释:dat为要写入的数据
  31. *********************************************/
  32. void SHT71_write_byte(uchar dat)
  33. {
  34.     uchar i;
  35.     OUT_DATA;                 //DATA为输出状态
  36.     for(i=0x80;i>0;i/=2)
  37.     {
  38.         if(i&dat)     SET_DATA;  //最高位在前
  39.         else          CLC_DATA;
  40.         _NOP();
  41.         SET_SCK;                 //下降沿有效
  42.         _NOP(); _NOP(); _NOP();
  43.         CLC_SCK;
  44.         _NOP();
  45.     }
  46.     SET_SCK;                    //检测响应信号
  47.     _NOP();
  48.     IN_DATA;
  49.     if(RIN_DATA)                //检查ack(DATA被拉低)
  50.     CLC_SCK;
  51.     OUT_DATA;
  52.     SET_DATA;                  //释放DATA
  53. }
  54. /********************************************
  55. 函数名称:SHT71_read_byte()
  56. 实现功能:从SHT71读一个字节
  57. 函数注释:dat为要读取的数据
  58. *********************************************/
  59. uchar SHT71_read_byte(uchar dat)
  60. {
  61.     uchar i,value;      
  62.     for(i=0x80;i>0;i/=2)
  63.     {
  64.         OUT_DATA;                 //DATA为输出状态
  65.         SET_SCK;                 //下降沿有效
  66.         _NOP();
  67.         IN_DATA;
  68.         if(RIN_DATA)
  69.         value|=i;
  70.         CLC_SCK;
  71.     }
  72.     IN_DATA;
  73.     _NOP();
  74.     if(RIN_DATA!=dat)         //防止dat==1,拉低DATA数据线
  75.     _NOP();
  76.     OUT_DATA;
  77.     SET_SCK;
  78.     _NOP(); _NOP(); _NOP();
  79.     CLC_SCK;
  80.     _NOP();
  81.     SET_DATA;
  82.     return value;
  83. }
  84. /********************************************
  85. 函数名称:SHT71_start()
  86. 实现功能:启动传输,完成数据传输初始化
  87. 函数注释:无
  88. *********************************************/
  89. void SHT71_start(void)
  90. {   
  91.      OUT_DATA;            //DATA为输出状态
  92.      SET_DATA;
  93.      CLC_SCK;
  94.      _NOP();
  95.      SET_SCK;           //SCK为高电平时DATA反转
  96.      _NOP();
  97.      CLC_DATA;
  98.      _NOP();
  99.      CLC_SCK;
  100.      _NOP();_NOP();_NOP();
  101.      SET_SCK;           //SCK为高电平时DATA反转
  102.      _NOP();
  103.      CLC_DATA;
  104.      _NOP();
  105.      CLC_SCK;
  106. }
  107. /***************通讯复位*******************/
  108. void SHT71_reset(void)
  109. {
  110.     uchar i;
  111.     SET_DATA;
  112.     CLC_SCK;
  113.     for(i=0;i<9;i++)
  114.     {
  115.         SET_SCK;
  116.         _NOP();
  117.         CLC_SCK;
  118.     }
  119.     SHT71_start(); //串口复位
  120. }
  121. /***************软复位*******************/
  122. void SHT71_softreset(void)
  123. {
  124.     SHT71_reset();
  125.     SHT71_write_byte(0x1e); //软复位命令为0x1e
  126. }
  127. /********************************************
  128. 函数名称:SHT71_read_status()
  129. 实现功能:读状态寄存器
  130. 函数注释:p_value为状态寄存器,p_check为校验位
  131. *********************************************/
  132. void SHT71_read_status(uchar *p_value,uchar *p_check)
  133. {
  134.     SHT71_start();
  135.     SHT71_write_byte(0x07);            // 读状态寄存器指令
  136.     *p_value=SHT71_read_byte(ACK);     //read status register (8-bit)
  137.     *p_check=SHT71_read_byte(NACK);    //read checksum (8-bit)
  138. }
  139. /********************************************
  140. 函数名称:SHT71_write_status()
  141. 实现功能:写状态寄存器
  142. 函数注释:p_value为状态寄存器值
  143. *********************************************/
  144. void SHT71_write_status(uchar *p_value)
  145. {   
  146.     SHT71_start();
  147.     SHT71_write_byte(0x06);      // 写状态寄存器指令
  148.     SHT71_write_byte(*p_value); //send value of status register
  149. }
  150. /********************************************
  151. 函数名称:SHT71_measure()
  152. 实现功能:温湿度的测量
  153. 函数注释:mode为状态指令(测量温湿度指令)
  154.           p_value为温湿度值,p_checksum为检测
  155. *********************************************/
  156. void SHT71_measure(uchar *p_value,uchar *p_checksum,uchar mode)
  157. {
  158.     SHT71_start();
  159.     SHT71_write_byte(mode);  //选择温湿度值   
  160.     delay_80ms();           //等待80ms后等待12位湿度值测量
  161.     IN_DATA;
  162.     _NOP();
  163. //    while(RIN_DATA==0)
  164. //    if(RIN_DATA==0)  break;
  165.     if(RIN_DATA)     
  166.     *(p_value)  =SHT71_read_byte(ACK);  //read the first byte (MSB)
  167.     *(p_value+1)=SHT71_read_byte(ACK); //read the second byte (LSB)
  168.     *p_checksum =SHT71_read_byte(NACK); //read checksum
  169. }
  170. /********************************************
  171. 函数名称:SHT71_calc()
  172. 实现功能:温湿度的测量数据转化为响应数据
  173. 函数注释:p_humidity湿度数据[%RH],
  174.           p_temperature温度数据[°C]
  175.           rh_lin=C3*rh*rh+C2*rh+C1
  176.           rh_true=(t_C-25)*(T1+T2*rh)+rh_lin
  177.           t_c=d1+d2*t
  178. *********************************************/
  179. void SHT71_calc(float *p_humidity ,float *p_temperature)
  180. {
  181.     float rh=*p_humidity;
  182.     float t=*p_temperature;
  183.     float rh_lin;           //相对湿度
  184.     float rh_true;          //湿度补偿
  185.     float t_C;              //温度值
  186.     t_C=t*0.01-39.6;
  187.     rh_lin=-2.0468+0.0367*rh+(-0.0000015955)*rh*rh;
  188.     rh_true=(t_C-25)*(0.01+0.00008*rh)+rh_lin;  
  189.    
  190.     if(rh_true>100.0)rh_true=100.0;
  191.     if(rh_true<0.1)rh_true=0.1;
  192.     *p_temperature=t_C;
  193.     *p_humidity=rh_true;
  194. }
  195. /********************************************
  196. 函数名称:calc_dewpoint()
  197. 实现功能:露点的测量
  198. 函数注释:h为湿度值,t为温度值
  199. *********************************************/
  200. float calc_dewpoint(float h,float t)
  201. {
  202.     float k,dew_point ;
  203.     k=(log10(h)-2)/0.4343 + (17.62*t)/(243.12+t);
  204.     dew_point =243.12*k/(17.62-k);
  205.     return dew_point;
  206. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。