[温湿度传感器] 发一个si7020温湿度传感器的lpc812程序

littleshrimp   2014-8-27 12:22 楼主
Si701x/2x 设备是 Silicon Labs 第二代相对湿度和温度传感器系列。此设备系列的所有产品均配备经过工厂完全校准的湿度和温度传感器元件、模拟-数字转换器、信号处理功能和一个 I2C 主机接口。使用获得专利认可的低导电聚合物介电质能获得高精度、长期稳定度,以及低漂移和低滞后。创新性 CMOS 设计还为相对湿度和温度传感器提供业内最低功耗。 设计师将感受 Si701x/2x 系列提供的一组独特性能。凭借完全的工厂校准,Si701x/2x 设备在 PCB 装配期间不需要额外的相对湿度/温度校准。为了在 PCB 回流焊设备运行期间免受灰尘、污垢和化学污染物,Si701x/2x 系列的所有产品均配备一个可选的工厂安装的防护罩。另外,需要 2 区温度感应的设计将得益于 Si7013 中使用可编程线性化植入的辅助传感器。 产品页面:http://cn.silabs.com/products/se ... s/si7013-20-21.aspx
  1. /*******************************************************************************
  2. * Copyright (C), 2014, ?? Tech. Co., Ltd.
  3. * FileName: main.c
  4. * Author: littleshrimp
  5. * Version : 1.0
  6. * Date: 2014-7-30 9:23
  7. * Description:
  8. * Function List: //
  9. * 1. -------
  10. * History:
  11. * <author> <time> <version > <desc>
  12. * zhangfeng 2014-7-30 9:23 1.0 build this moudle
  13. ******************************************************************************/
  14. /*******************************************************************************
  15. * * INCLUDES
  16. * */
  17. #include "LPC8xx.h"
  18. #include "si7020.h"
  19. /*******************************************************************************
  20. * * MACROS
  21. * */
  22. /*******************************************************************************
  23. * * CONSTANTS
  24. * */
  25. /*******************************************************************************
  26. * * TYPEDEFS
  27. * */
  28. /*******************************************************************************
  29. * * GLOBAL VARIABLES
  30. * */
  31. /*******************************************************************************
  32. * * EXTERNAL VARIABLES
  33. * */
  34. /*******************************************************************************
  35. * * EXTERNAL FUNCTIONS
  36. * */
  37. /*******************************************************************************
  38. * * LOCAL VARIABLES
  39. * */
  40. static float rh,tmp;
  41. /*******************************************************************************
  42. * * PROFILE CALLBACKS
  43. * */
  44. /*******************************************************************************
  45. * * LOCAL FUNCTIONS
  46. * */
  47. /*******************************************************************************
  48. * * PUBLIC FUNCTIONS
  49. * */
  50. /*******************************************************************************
  51. * Function: myDelay
  52. * Description: 延时一毫秒
  53. * Calls:
  54. * Input: uint32_t ulTime//毫秒数
  55. * Return: void
  56. ******************************************************************************/
  57. void myDelay (uint32_t ulTime)
  58. {
  59. uint32_t i;
  60. while (ulTime--) {
  61. for (i = 0; i < 2401; i++);
  62. }
  63. }
  64. /*******************************************************************************
  65. * Function: main
  66. * Description: 主函数
  67. * Calls:
  68. * Input: void
  69. * Return: int
  70. ******************************************************************************/
  71. int main (void)
  72. {
  73. SystemInit();//系统初始化
  74. Si7020_Init();//初始化si7020
  75. while(1)
  76. {
  77. tmp = ReadTemperature();//读温度
  78. rh = ReadHumidity();//读湿度
  79. myDelay(500);//延时500ms
  80. }
  81. }
  1. /*******************************************************************************
  2. * Copyright (C), 2014, ?? Tech. Co., Ltd.
  3. * FileName: si7020.c
  4. * Author: littleshrimp
  5. * Version : 1.0
  6. * Date: 2014-7-30 9:19
  7. * Description:
  8. * Function List: //
  9. * 1. -------
  10. * History:
  11. * <author> <time> <version > <desc>
  12. * zhangfeng 2014-7-30 9:19 1.0 build this moudle
  13. ******************************************************************************/
  14. /*******************************************************************************
  15. * * INCLUDES
  16. * */
  17. #include "si7020.h"
  18. #include "i2c.h"
  19. /*******************************************************************************
  20. * * MACROS
  21. * */
  22. /*******************************************************************************
  23. * * CONSTANTS
  24. * */
  25. #define SI7021_W 0x80
  26. #define SI7021_R 0x81
  27. /*******************************************************************************
  28. * * TYPEDEFS
  29. * */
  30. /*******************************************************************************
  31. * * GLOBAL VARIABLES
  32. * */
  33. /*******************************************************************************
  34. * * EXTERNAL VARIABLES
  35. * */
  36. /*******************************************************************************
  37. * * EXTERNAL FUNCTIONS
  38. * */
  39. /*******************************************************************************
  40. * * LOCAL VARIABLES
  41. * */
  42. /*******************************************************************************
  43. * * PROFILE CALLBACKS
  44. * */
  45. /*******************************************************************************
  46. * * LOCAL FUNCTIONS
  47. * */
  48. /*******************************************************************************
  49. * * PUBLIC FUNCTIONS
  50. * */
  51. /*******************************************************************************
  52. * Function: Si7020_Init
  53. * Description: 初始化si7020
  54. * Calls: I2CMSTInit()
  55. * Input: void
  56. * Return: void
  57. ******************************************************************************/
  58. void Si7020_Init(void)
  59. {
  60. I2CMSTInit(SI7021_W);//初始化I2C
  61. }
  62. /*******************************************************************************
  63. * Function: ReadTemperature
  64. * Description: 读温度
  65. * Calls: I2CRead2Byte()
  66. * Input: void
  67. * Return: float//温度值
  68. ******************************************************************************/
  69. float ReadTemperature(void)
  70. {
  71. uint8_t buf[2];
  72. float temp;
  73. I2CRead2Byte(CMD_MEASURE_TEMPERATURE_HOLD,buf);
  74. temp = 175.72f * (buf[0]<<8 | buf[1]) / 65536 - 46.85;
  75. return temp;
  76. }
  77. /*******************************************************************************
  78. * Function: ReadHumidity
  79. * Description: 读湿度
  80. * Calls:
  81. * Input: void
  82. * Return: float//温度值
  83. ******************************************************************************/
  84. float ReadHumidity(void)
  85. {
  86. uint8_t buf[2];
  87. float humi;
  88. I2CRead2Byte(CMD_MEASURE_HUMIDITY_HOLD,buf);
  89. humi = 125.00f * (buf[0]<<8 | buf[1]) / 65536 - 6;
  90. return humi;
  91. }
  92. /*******************************************************************************
  93. * Function: test
  94. * Description: 测试函数
  95. * Calls:
  96. * Input: void
  97. * Return: void
  98. ******************************************************************************/
  99. void test(void)
  100. {
  101. float rh,tmp;
  102. Si7020_Init();//初始化si7020
  103. while(1)
  104. {
  105. tmp = ReadTemperature();//读温度
  106. rh = ReadHumidity();//读湿度
  107. myDelay(500);//延时500ms
  108. }
  109. }
  1. /*******************************************************************************
  2. * Copyright (C), 2014, ?? Tech. Co., Ltd.
  3. * FileName: i2c.c
  4. * Author: littleshrimp
  5. * Version : 1.0
  6. * Date: 2014-7-30 9:22
  7. * Description:
  8. * Function List: //
  9. * 1. -------
  10. * History:
  11. * <author> <time> <version > <desc>
  12. * zhangfeng 2014-7-30 9:22 1.0 build this moudle
  13. ******************************************************************************/
  14. /*******************************************************************************
  15. * * INCLUDES
  16. * */
  17. #include "LPC8xx.h"
  18. /*******************************************************************************
  19. * * MACROS
  20. * */
  21. /*******************************************************************************
  22. * * CONSTANTS
  23. * */
  24. #define I2C_SLV_WRITE (slvAddr & 0xfe)
  25. #define I2C_SLV_READ (slvAddr | 0x01)
  26. /*******************************************************************************
  27. * * TYPEDEFS
  28. * */
  29. /*******************************************************************************
  30. * * GLOBAL VARIABLES
  31. * */
  32. /*******************************************************************************
  33. * * EXTERNAL VARIABLES
  34. * */
  35. /*******************************************************************************
  36. * * EXTERNAL FUNCTIONS
  37. * */
  38. /*******************************************************************************
  39. * * LOCAL VARIABLES
  40. * */
  41. static uint8_t slvAddr;
  42. /*******************************************************************************
  43. * * PROFILE CALLBACKS
  44. * */
  45. /*******************************************************************************
  46. * * LOCAL FUNCTIONS
  47. * */
  48. /*******************************************************************************
  49. * * PUBLIC FUNCTIONS
  50. * */
  51. /*********************************************************************************************************
  52. ** Function name: I2CInit
  53. ** Descriptions: I2C主机初始化
  54. ** input parameters: 无
  55. ** output parameters: 无
  56. ** Returned value: 无
  57. *********************************************************************************************************/
  58. void I2CMSTInit (uint8_t _slvAddr)
  59. {
  60. slvAddr = _slvAddr;
  61. LPC_IOCON->PIO0_10 &= ~(0x3 << 8); /* 引脚属性 */
  62. LPC_IOCON->PIO0_10 |= (0x2 << 8); /* 使能I2C_SDA 增强快速模式 */
  63. LPC_IOCON->PIO0_11 &= ~(0x3 << 8);
  64. LPC_IOCON->PIO0_11 |= (0x2 << 8); /* 使能I2C_SCL 增强快速模式 */
  65. LPC_SWM->PINASSIGN7 &= ~(0xFFUL << 24); /* 管脚分配 */
  66. LPC_SWM->PINASSIGN7 |= (10 << 24); /* I2C_SDA ~ P0.10 */
  67. LPC_SWM->PINASSIGN8 &= ~(0xFF << 0);
  68. LPC_SWM->PINASSIGN8 |= (11 << 0); /* I2C_SCL ~ P0.11 */
  69. /*
  70. * 时钟换算关系: I2C_Pclk = MAIN_CLK / SYSAHBCLKDIV;
  71. * I2C_Fclk = I2C_Pclk / DIVVAL;
  72. * I2C_SCLclk = I2C_Fclk / (MSTSCLLOW + MSTSCLHIGH + 4);
  73. *
  74. * 系统时钟: MAIN_CLK = 24 MHz, SYSAHBCLKDIV = 1;
  75. * I2C增强快速模式: I2C_SCLclk = 400 kHz;
  76. * CAT24C02要求: I2C_Fclk = 8 * I2C_SCLclk = 3.2 MHz, MSTSCLLOW = 2, MSTSCLHIGH = 0;
  77. * DIVVAL = I2C_Pclk / I2C_Fclk - 1= 24 / 3.2 - 1 = 7;
  78. */
  79. LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 5); /* 初始化I2C AHB时钟 */
  80. LPC_I2C->DIV = 7;
  81. LPC_I2C->MSTTIME |= (2 << 0) | (0 << 4); /* SCL_LOW = SCL_HIGH = 2 * CLK */
  82. LPC_I2C->CFG |= (1 << 0) | (0 << 3); /* 使能主机模式,禁止超时 */
  83. }
  84. /*********************************************************************************************************
  85. ** Function name: I2CWriteByte
  86. ** Descriptions: I2C写单字节
  87. ** input parameters: uiSubAddr: 器件子地址
  88. ** ucData: 写入数据
  89. ** output parameters: 无
  90. ** Returned value: 无
  91. *********************************************************************************************************/
  92. void I2CWriteByte (uint32_t uiSubAddr, uint8_t ucData)
  93. {
  94. while (!(LPC_I2C->STAT & 1)); /* 等待空闲 */
  95. LPC_I2C->MSTDAT = I2C_SLV_WRITE;
  96. LPC_I2C->MSTCTL = (1 << 1) | (1 << 0); /* 发送起始位 */
  97. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  98. LPC_I2C->MSTDAT = uiSubAddr;
  99. LPC_I2C->MSTCTL = (1 << 0); /* 发送子地址 */
  100. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  101. LPC_I2C->MSTDAT = ucData;
  102. LPC_I2C->MSTCTL = (1 << 0); /* 发送数据 */
  103. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  104. LPC_I2C->MSTCTL = (1 << 2) | (1 << 0); /* 发送停止位 */
  105. }
  106. /*********************************************************************************************************
  107. ** Function name: I2CReadByte
  108. ** Descriptions: I2C读单字节
  109. ** input parameters: uiSubAddr: 器件子地址
  110. ** pucData: 保存读出数据的指针
  111. ** output parameters: 无
  112. ** Returned value: 无
  113. *********************************************************************************************************/
  114. void I2CReadByte (uint32_t uiSubAddr, uint8_t *pucData)
  115. {
  116. while (!(LPC_I2C->STAT & 1)); /* 等待空闲 */
  117. LPC_I2C->MSTDAT = I2C_SLV_WRITE;
  118. LPC_I2C->MSTCTL = (1 << 1) | (1 << 0); /* 发送起始位 */
  119. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  120. LPC_I2C->MSTDAT = uiSubAddr;
  121. LPC_I2C->MSTCTL = (1 << 0); /* 发送子地址 */
  122. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  123. LPC_I2C->MSTDAT = I2C_SLV_READ;
  124. LPC_I2C->MSTCTL = (1 << 1) | (1 << 0); /* 重新发送起始位 */
  125. while ((LPC_I2C->STAT & (7 << 1)) != (1 << 1)); /* 等待数据可以读取状态 */
  126. *pucData = LPC_I2C->MSTDAT;
  127. LPC_I2C->MSTCTL = (1 << 0); /* 接收数据 */
  128. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  129. LPC_I2C->MSTCTL = (1 << 2) | (1 << 0); /* 发送停止位 */
  130. }
  131. void I2CRead2Byte (uint32_t uiSubAddr, uint8_t *pucData)
  132. {
  133. while (!(LPC_I2C->STAT & 1)); /* 等待空闲 */
  134. LPC_I2C->MSTDAT = I2C_SLV_WRITE;
  135. LPC_I2C->MSTCTL = (1 << 1) | (1 << 0); /* 发送起始位 */
  136. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  137. LPC_I2C->MSTDAT = uiSubAddr;
  138. LPC_I2C->MSTCTL = (1 << 0); /* 发送子地址 */
  139. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  140. LPC_I2C->MSTDAT = I2C_SLV_READ;
  141. LPC_I2C->MSTCTL = (1 << 1) | (1 << 0); /* 重新发送起始位 */
  142. while ((LPC_I2C->STAT & (7 << 1)) != (1 << 1)); /* 等待数据可以读取状态 */
  143. *pucData++ = LPC_I2C->MSTDAT;
  144. LPC_I2C->MSTCTL = (1 << 0); /* 接收数据 */
  145. while ((LPC_I2C->STAT & (7 << 1)) != (1 << 1)); /* 等待数据可以读取状态 */
  146. *pucData++ = LPC_I2C->MSTDAT;
  147. LPC_I2C->MSTCTL = (1 << 0); /* 接收数据 */
  148. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  149. LPC_I2C->MSTCTL = (1 << 2) | (1 << 0); /* 发送停止位 */
  150. }
  151. void I2CReadByte16bitAddr (uint32_t uiSubAddr, uint8_t *pucData)
  152. {
  153. while (!(LPC_I2C->STAT & 1)); /* 等待空闲 */
  154. LPC_I2C->MSTDAT = I2C_SLV_WRITE;
  155. LPC_I2C->MSTCTL = (1 << 1) | (1 << 0); /* 发送起始位 */
  156. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  157. LPC_I2C->MSTDAT = uiSubAddr>>8;
  158. LPC_I2C->MSTCTL = (1 << 0); /* 发送子地址 */
  159. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  160. LPC_I2C->MSTDAT = uiSubAddr;
  161. LPC_I2C->MSTCTL = (1 << 0); /* 发送子地址 */
  162. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  163. LPC_I2C->MSTDAT = I2C_SLV_READ;
  164. LPC_I2C->MSTCTL = (1 << 1) | (1 << 0); /* 重新发送起始位 */
  165. while ((LPC_I2C->STAT & (7 << 1)) != (1 << 1)); /* 等待数据可以读取状态 */
  166. *pucData = LPC_I2C->MSTDAT;
  167. LPC_I2C->MSTCTL = (1 << 0); /* 接收数据 */
  168. while (!(LPC_I2C->STAT & 1)); /* 等待操作 */
  169. LPC_I2C->MSTCTL = (1 << 2) | (1 << 0); /* 发送停止位 */
  170. }
  171. /*********************************************************************************************************
  172. ** Function name: I2CWriteString
  173. ** Descriptions: I2C写字符串
  174. ** input parameters: uiSubAddr: 器件子地址
  175. ** pucData: 指向发送字符串的指针
  176. ** uiLen: 发送数据的长度(字节)
  177. ** output parameters: 无
  178. ** Returned value: 1:成功 0:失败
  179. *********************************************************************************************************/
  180. uint8_t I2CWriteString (uint32_t uiSubAddr, uint8_t *pucData, uint32_t uiLen)
  181. {
  182. while (uiLen--) {
  183. I2CWriteByte(uiSubAddr++,*pucData++);
  184. }
  185. return 1;
  186. }
  187. /*********************************************************************************************************
  188. ** Function name: I2CReadString
  189. ** Descriptions: I2C读字符串
  190. ** input parameters: uiSubAddr: 器件子地址
  191. ** pucData: 指向接收字符串的指针
  192. ** uiLen: 读出数据的长度(字节)
  193. ** output parameters: 无
  194. ** Returned value: 1:成功 0:失败
  195. *********************************************************************************************************/
  196. uint8_t I2CReadString (uint32_t uiSubAddr, uint8_t *pucData, uint32_t uiLen)
  197. {
  198. while (uiLen--) {
  199. I2CReadByte(uiSubAddr++,pucData++);
  200. }
  201. return 1;
  202. }
8.lpc812 si7020 温湿度传感器.rar (4.79 KB)
(下载次数: 20, 2014-8-27 12:22 上传)
本帖最后由 littleshrimp 于 2014-8-27 12:28 编辑
虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复评论 (3)

过来看看~~~~~~~~~~~~~
点赞  2014-8-27 16:05
引用: kemasz 发表于 2014-8-27 16:05
过来看看~~~~~~~~~~~~~

看吧,不收费~~

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2014-8-27 16:29
MARK,上面催的进,借鉴一下~
点赞  2014-9-15 09:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复