找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2144|回复: 2
收起左侧

湿度和温度传感器SHT40驱动程序

[复制链接]
ID:374824 发表于 2023-9-2 22:26 | 显示全部楼层 |阅读模式
湿度和温度传感器SHT40驱动,C51
SHT40_READ_ID();
SHT40_Read_T_H();

sht40.c
  1. #define SHT40_C
  2. #include "includes.h"
  3. #include <stdarg.h>

  4. xdata u8 SHTC3_Buf[6]={0,0,0,0,0,0};
  5. xdata float Temp_Value=0;
  6. xdata float Humi_Value=0;
  7. xdata u16 Temp_x10=0;
  8. xdata u16 Humi_x10=0;

  9. // ******
  10. void SHTC3_I2C_Ack(void)
  11. {
  12. SDA_L();
  13. SCL_L();
  14. SCL_PIN_out();
  15. SDA_PIN_out();
  16. IIC_delay();
  17. SCL_H();
  18. IIC_delay();
  19. SCL_L();
  20. }
  21. /*
  22. // ******
  23. void SHTC3_Read(void)
  24. {
  25. Delay_nms(50);                // 等待SHTC3测量完成,SCL恢复高       
  26. IIC_start();
  27. IIC_W_B(SHTC3_READ_CMD);
  28. IIC_respons();

  29. Delay_nms(50);                // 等待SHTC3测量完成,SCL恢复高

  30. SHTC3_Buf[0]=IIC_R_B();
  31. SHTC3_I2C_Ack();
  32. SHTC3_Buf[1]=IIC_R_B();
  33. SHTC3_I2C_Ack();
  34. SHTC3_Buf[2]=IIC_R_B();
  35. SHTC3_I2C_Ack();
  36. SHTC3_Buf[3]=IIC_R_B();
  37. SHTC3_I2C_Ack();
  38. SHTC3_Buf[4]=IIC_R_B();
  39. SHTC3_I2C_Ack();
  40. SHTC3_Buf[5]=IIC_R_B();
  41. SHTC3_I2C_Ack();
  42. IIC_stop();
  43. IIC_release();
  44. }

  45. // ******
  46. void SHTC3_W_CMD(u16 CMD)
  47. {
  48. u8 CMD_H,CMD_L;

  49. CMD_H=(u8)(CMD>>8);
  50. CMD_L=(u8)(CMD&0x00FF);

  51. IIC_start();
  52. IIC_W_B(SHTC3_WIRTE_CMD);
  53. IIC_respons();
  54. IIC_W_B(CMD_H);
  55. IIC_respons();
  56. IIC_W_B(CMD_L);
  57. IIC_respons();
  58. IIC_stop();
  59. IIC_release();
  60. }


  61. // ******
  62. void SHTC3_WAKE_UP(void)
  63. {
  64. SHTC3_W_CMD(SHTC3_WAKE_UP_CMD);
  65. Delay_nms(5);
  66. }

  67. // ******
  68. void SHTC3_Sleep(void)
  69. {
  70. SHTC3_W_CMD(SHTC3_SLEEP_CMD);
  71. Delay_nms(5);
  72. }

  73. // ******
  74. u16 SHTC3_READ_ID(void)
  75. {
  76. SHTC3_W_CMD(SHTC3_READ_ID_CMD);
  77. SHTC3_Read();
  78. Delay_nms(5);
  79. }

  80. // ******
  81. void SHTC3_Init(void)
  82. {
  83. SHTC3_WAKE_UP();
  84. SHTC3_W_CMD(SHTC3_SOFT_RESET_CMD);
  85. Delay_nms(50);
  86. // SHTC3_WAKE_UP();
  87. // SHTC3_READ_ID();
  88. SHTC3_Read_T_H();

  89. }
  90. */
  91. // *******************************************************************************
  92. // * 名称: crc8_compute
  93. // * 功能: 计算8位CRC校验和
  94. // * 形参: check_data -> 需要校验的数据,num_of_data -> 需要校验的字节数
  95. // * 返回: 检验和
  96. // * 说明: 无
  97. // ******************************************************************************
  98. int crc8_compute(u8 *check_data,u8 num_of_data)
  99. {
  100.   u8 i;        //位掩码
  101.   u8 crc=0xFF;   //0xFF是根据手册设置的初始值
  102.   u8 byteCtr;    //字节计数

  103.   //用给定的多项式计算8位检验和
  104.   for(byteCtr=0;byteCtr<num_of_data;byteCtr++)
  105.   {
  106.     crc ^= (check_data[byteCtr]);
  107.           //crc校验,如果最高位是1,则^0x31
  108.     for(i=8;i>0;--i)
  109.                 {
  110.       if(crc&0x80)
  111.                         {
  112.         crc=(crc<<1)^0x31;
  113.       }  
  114.                         else
  115.                         {
  116.         crc=(crc<<1);
  117.       }
  118.     }
  119.   }
  120.   return crc;
  121. }

  122. // *******************************************************************************
  123. // * 名称: shtc3_crc8_check
  124. // * 功能: 检查校验和
  125. // * 形参: check_data -> 校验的数据,num_of_data -> 校验字节数,CrcData -> 对比的校验和
  126. // * 返回: 0:校验和正确,1:校验和错误
  127. // * 说明: 无
  128. // ******************************************************************************
  129. int shtc3_crc8_check(u8 *p,u8 num_of_data,u8 CrcData)
  130. {
  131.   u8 crc;
  132.   crc=crc8_compute(p,num_of_data);  //计算8位校验和
  133.   if(crc!=CrcData)
  134.   {   
  135.     return 1;           
  136.   }
  137.         else
  138.         {
  139.                 return 0;
  140.         }
  141. }

  142. /*
  143. // ******
  144. void SHTC3_Read_T_H(void)
  145. {
  146. u8 crc_result;
  147. u16 Humi_RdData;
  148. u16 Temp_RdData;
  149.        
  150. SHTC3_WAKE_UP();
  151. // SHTC3_W_CMD(SHTC3_NOR_READ_TEMP_FIR_EN_CMD);
  152. SHTC3_W_CMD(SHTC3_NOR_READ_HUM_FIR_EN_CMD);  
  153. // SHTC3_W_CMD(SHTC3_NOR_READ_HUM_FIR_DIS_CMD);  
  154. // SHTC3_W_CMD(SHTC3_NOR_READ_TEMP_FIR_DIS_CMD);
  155. Delay_nms(5);
  156. SHTC3_Read();
  157. Delay_nms(5);
  158. SHTC3_Sleep();
  159. // ***
  160. b_Sensor_Error=0;
  161. crc_result=shtc3_crc8_check(SHTC3_Buf,2,SHTC3_Buf[2]);
  162. if(crc_result==0)
  163.         {
  164.                 Humi_RdData=(SHTC3_Buf[0]<<8)+SHTC3_Buf[1];
  165.                 Humi_Value=(float)((100.0*Humi_RdData)/65535.0);
  166. //                printf("Humi_RdData: %d        ",Humi_RdData);
  167. //                printf("Humi:%.1f  ",Humi_Value);
  168.         }
  169.         else
  170.         {
  171.         b_Sensor_Error=1;
  172.         //         printf("Humi CRC Error\r\n");
  173.         }
  174.        

  175. crc_result=shtc3_crc8_check(&SHTC3_Buf[3],2,SHTC3_Buf[5]);
  176. if(crc_result==0)
  177.         {
  178.           Temp_RdData=(SHTC3_Buf[3]<<8)+SHTC3_Buf[4];   
  179.           Temp_Value=(float)(((175.0*Temp_RdData)/65535.0)-45.0);
  180.                 // Temp_Value=(float)(((175.0*Temp_RdData)/65535.0)-50.0);                // Test
  181. //                printf("Temp_RdData: %d        ",Temp_RdData);
  182. //                printf("Temp:%.1f\r\n",Temp_Value);
  183.         }
  184.         else
  185.         {
  186.         b_Sensor_Error=1;
  187.         //         printf("Temp CRC Error\r\n");
  188.         }
  189. }
  190. */
  191. // ******
  192. void SHT40_Soft_Reset(void)
  193. {
  194. IIC_start();
  195. IIC_W_B(SHT40_WIRTE_CMD);
  196. IIC_respons();
  197. IIC_W_B(0x94);
  198. IIC_respons();
  199. IIC_stop();
  200. IIC_release();
  201. Delay_nms(2);
  202. }

  203. // ******
  204. void SHT40_CMD(u8 CMD)
  205. {
  206. IIC_start();
  207. IIC_W_B(SHT40_WIRTE_CMD);
  208. IIC_respons();
  209. IIC_W_B(CMD);
  210. IIC_respons();
  211. IIC_stop();
  212. IIC_release();
  213. Delay_nms(2);       
  214. }

  215. // ******
  216. void SHT40_Read(void)
  217. {
  218. Delay_nms(100);                // 等待SHTC3测量完成,SCL恢复高       
  219. IIC_start();
  220. IIC_W_B(SHT40_READ_CMD);
  221. IIC_respons();
  222. Delay_nms(100);                // 等待SHTC3测量完成,SCL恢复高

  223. SHTC3_Buf[0]=IIC_R_B();
  224. SHTC3_I2C_Ack();
  225. SHTC3_Buf[1]=IIC_R_B();
  226. SHTC3_I2C_Ack();
  227. SHTC3_Buf[2]=IIC_R_B();
  228. SHTC3_I2C_Ack();
  229. SHTC3_Buf[3]=IIC_R_B();
  230. SHTC3_I2C_Ack();
  231. SHTC3_Buf[4]=IIC_R_B();
  232. SHTC3_I2C_Ack();
  233. SHTC3_Buf[5]=IIC_R_B();
  234. SHTC3_I2C_Ack();
  235. IIC_stop();
  236. IIC_release();
  237. }

  238. void SHT40_READ_ID(void)
  239. {
  240. SHT40_Soft_Reset();
  241. SHT40_CMD(0x89);
  242. SHT40_Read();
  243. }

  244. // ******
  245. void SHT40_Read_T_H(void)
  246. {
  247. u8 crc_result;
  248. idata u16 Humi_RdData;
  249. idata u16 Temp_RdData;
  250.        
  251. SHT40_Soft_Reset();
  252. SHT40_CMD(0xFD);
  253. SHT40_Read();

  254. // ***
  255. b_Sensor_T_Error=0;
  256. crc_result=shtc3_crc8_check(&SHTC3_Buf[0],2,SHTC3_Buf[2]);
  257. if(crc_result==0)
  258.         {
  259.           Temp_RdData=(SHTC3_Buf[0]<<8)+SHTC3_Buf[1];   
  260.           Temp_Value=(float)(((175.0*Temp_RdData)/65535)-45);
  261. //                printf("Temp_RdData: %d        ",Temp_RdData);
  262. //                printf("Temp:%.1f\r\n",Temp_Value);
  263.                
  264.                 Humi_RdData=(SHTC3_Buf[3]<<8)+SHTC3_Buf[4];
  265.                 Humi_Value=(float)(((125.0*Humi_RdData)/65535)-6);       
  266.                 if(Humi_Value>100)
  267.                         {Humi_Value=100;}
  268.                 if(Humi_Value<0)
  269.                         {Humi_Value=0;}
  270.         }
  271.         else
  272.         {
  273.         b_Sensor_T_Error=1;
  274.         //         printf("Temp CRC Error\r\n");
  275.         }       
  276. /*       
  277. b_Sensor_H_Error=0;       
  278. crc_result=shtc3_crc8_check(SHTC3_Buf[3],2,SHTC3_Buf[5]);
  279. if(crc_result==0)
  280.         {
  281.                 Humi_RdData=(SHTC3_Buf[3]<<8)+SHTC3_Buf[4];
  282.                 Humi_Value=(float)(((125.0*Humi_RdData)/65535)-6);
  283. //                printf("Humi_RdData: %d        ",Humi_RdData);
  284. //                printf("Humi:%.1f  ",Humi_Value);
  285.         }
  286.         else
  287.         {
  288.         b_Sensor_H_Error=1;
  289.         //         printf("Humi CRC Error\r\n");
  290.         }
  291. */
  292. }

  293. /*
  294. IIC_IO_Init();

  295. // ******
  296. SHTC3_Init();
  297. SHTC3_Read_T_H();
  298. */
复制代码

sht40.h
  1. #ifndef SHT40_H
  2. #define SHT40_H

  3. #include "includes.h"

  4. /*
  5. // SHTC3 地址
  6. #define SHTC3_ADDRESS                   0x70

  7. //SHTC3 命令
  8. #define SHTC3_WIRTE_CMD                 ((SHTC3_ADDRESS<<1)&0xFE)
  9. #define SHTC3_READ_CMD                  ((SHTC3_ADDRESS<<1)|0x01)

  10. #define SHTC3_SOFT_RESET_CMD            0x805D                //软件复位命令
  11. #define SHTC3_READ_ID_CMD               0xEFC8                //读取SHTC3 ID命令
  12. #define SHTC3_WAKE_UP_CMD               0x3517                //将芯片从睡眠模式唤醒命令
  13. #define SHTC3_SLEEP_CMD                 0xB098                //使芯片进入休眠命令

  14. //Normal Mode Clock Stretching Enable Measurement Command
  15. #define SHTC3_NOR_READ_TEMP_FIR_EN_CMD  0x7CA2//
  16. #define SHTC3_NOR_READ_HUM_FIR_EN_CMD   0x5C24//

  17. //Normal Mode Clock Stretching Disable Measurement Command
  18. #define SHTC3_NOR_READ_TEMP_FIR_DIS_CMD 0x7866//
  19. #define SHTC3_NOR_READ_HUM_FIR_DIS_CMD  0x58E0//

  20. //Low Power Mode Clock Stretching Enable Measurement Command
  21. #define SHTC3_LOW_READ_TEMP_FIR_EN_CMD  0x6458//
  22. #define SHTC3_LOW_READ_HUM_FIR_EN_CMD   0x44DE//

  23. //Low Power Mode Clock Stretching Disable Measurement Command
  24. #define SHTC3_LOW_READ_TEMP_FIR_DIS_CMD 0x609C//
  25. #define SHTC3_LOW_READ_HUM_FIR_DIS_CMD  0x401A//
  26. */

  27. // SHT40_A 地址
  28. #define SHT40_A_ADDRESS             0x44
  29. #define SHT40_B_ADDRESS             0x45
  30. // SHT40 命令
  31. #define SHT40_WIRTE_CMD                 ((SHT40_A_ADDRESS<<1)&0xFE)
  32. #define SHT40_READ_CMD                  ((SHT40_A_ADDRESS<<1)|0x01)

  33. // ******
  34. extern xdata u8 SHTC3_Buf[];
  35. extern xdata float Temp_Value;
  36. extern xdata float Humi_Value;
  37. extern xdata u16 Temp_x10;
  38. extern xdata u16 Humi_x10;

  39. #ifdef SHT40_C
  40. /*
  41. void SHTC3_I2C_Ack(void);
  42. void SHTC3_Read(void);
  43. void SHTC3_ReadW_CMD(u16 CMD);
  44. void SHTC3_WAKE_UP(void);
  45. void SHTC3_Sleep(void);
  46. u16 SHTC3_READ_ID(void);
  47. void SHTC3_Init(void);
  48. void SHTC3_Read_T_H(void);
  49. */
  50. void SHT40_Read(void);
  51. void SHT40_READ_ID(void);
  52. void SHT40_Read_T_H(void);

  53. #else
  54. /*
  55. extern void SHTC3_I2C_Ack(void);
  56. extern void SHTC3_Read(void);
  57. extern void SHTC3_W_CMD(u16 CMD);
  58. extern void SHTC3_Sleep(void);
  59. extern void SHTC3_WAKE_UP(void);
  60. extern u16 SHTC3_READ_ID(void);
  61. extern void SHTC3_Init(void);
  62. extern void SHTC3_Read_T_H(void);
  63. */
  64. extern void SHT40_Read(void);
  65. extern void SHT40_READ_ID(void);
  66. extern void SHT40_Read_T_H(void);


  67. #endif
  68. #endif

复制代码


回复

使用道具 举报

ID:398219 发表于 2023-10-26 17:10 | 显示全部楼层
求一下完善的,谢谢楼主分享
回复

使用道具 举报

ID:1126381 发表于 2024-6-21 13:29 | 显示全部楼层
一个温湿度读取 就这么多代码,太难了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表