当前位置:   article > 正文

stm32中DHT11温湿度传感器源码.c/.h_dht11库的sys.h文件

dht11库的sys.h文件

DHT11.c

  1. #include "sys.h"
  2. /*-----------------------------------------------
  3. 函数名:温湿度模块输出函数
  4. 参 数:无
  5. 返回值: 无;
  6. ------------------------------------------------*/
  7. void DHT11_IO_OUT (void){
  8. GPIO_InitTypeDef GPIO_InitStructure;
  9. GPIO_InitStructure.GPIO_Pin = DHT11_IO; //选择端口号(0~15或all)
  10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
  12. GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
  13. }
  14. /*-----------------------------------------------
  15. 函数名:温湿度模块输入函数
  16. 参 数:无
  17. 返回值: 无;
  18. ------------------------------------------------*/
  19. void DHT11_IO_IN (void){
  20. GPIO_InitTypeDef GPIO_InitStructure;
  21. GPIO_InitStructure.GPIO_Pin = DHT11_IO; //选择端口号(0~15或all)
  22. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  23. GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
  24. }
  25. /*-----------------------------------------------
  26. 函数名:DHT11端口复位,发出起始信号(IO发送)
  27. 参 数:无
  28. 返回值: 无;
  29. ------------------------------------------------*/
  30. void DHT11_RST (void){
  31. DHT11_IO_OUT(); //端口为输出
  32. GPIO_ResetBits(DHT11_PORT,DHT11_IO); //使总线为低电平
  33. delay_ms(20); //拉低至少18ms
  34. GPIO_SetBits(DHT11_PORT,DHT11_IO); //使总线为高电平
  35. delay_us(30); //主机拉高20~40us
  36. }
  37. /*-----------------------------------------------
  38. 函数名:检查DHT11是否正常
  39. 参 数:无
  40. 返回值: 返回1:未检测到DHT11,返回0:成功(IO接收)
  41. ------------------------------------------------*/
  42. u8 DHT11_Check(void){
  43. u8 retry=0; //定义临时变量
  44. DHT11_IO_IN(); //IO到输入状态
  45. //GPIO端口输入时,配置为上拉输入或者浮空输入,因为外接上拉电阻,所以默认为高电平
  46. //有负信号输入,GPIO端口为1,当GPIO端口为1且retry小于100,retry自加,否则跳出循环执行下一步
  47. while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) && retry<100) //DHT11会拉低40~80us
  48. {
  49. retry++;
  50. delay_us(1);
  51. }
  52. if(retry>=100)return 1;
  53. else retry=0;
  54. //DHT11发来高电平信号,GPIO端口为0,当GPIO端口为0且retry小于100,retry自加,否则跳出循环执行下一步
  55. while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry<100) //DHT11拉低后会再次拉高40~80us
  56. {
  57. retry++;
  58. delay_us(1);
  59. }
  60. if(retry>=100)return 1;
  61. return 0;
  62. }
  63. /*-----------------------------------------------
  64. 函数名:DHT11读取一个位
  65. 参 数:无
  66. 返回值: 0,表示读取低电平;1,表示读取高电平;
  67. ------------------------------------------------*/
  68. u8 DHT11_Read_Bit(void)
  69. {
  70. u8 retry = 0;
  71. while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) && retry < 100) //等待变为低电平
  72. {
  73. retry++;
  74. delay_us(1);
  75. }
  76. retry = 0;
  77. while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry < 100) //等待变高电平
  78. {
  79. retry++;
  80. delay_us(1);
  81. }
  82. delay_us(40);//等待40us
  83. if(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) //用于判断高低电平,即数据1或0
  84. return 1;
  85. else
  86. return 0;
  87. }
  88. /*-----------------------------------------------
  89. 函数名:DHT11读取一字节
  90. 参 数:无
  91. 返回值: 返回一字节值,读到的数据
  92. ------------------------------------------------*/
  93. u8 DHT11_Read_Byte(void)
  94. {
  95. u8 i, dat;
  96. dat = 0;
  97. for (i = 0; i < 8; i++)
  98. {
  99. dat <<= 1; //左移运算符,dat左移1位
  100. dat |= DHT11_Read_Bit(); //"|"表示按位或等于
  101. }
  102. return dat;
  103. }
  104. /*-----------------------------------------------
  105. 函数名:DHT11读取一次温湿度整数部分 读取5个字节
  106. 参 数:无
  107. 返回值: 0,表示成功读取;非0,表示读取不成功;
  108. temp:温度值(范围:0~50°)
  109. humi:湿度值(范围:20%~90%)
  110. 一次完整的数据传输为40bit,高位先出
  111. 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
  112. ------------------------------------------------*/
  113. u8 DHT11_Read_Data(u8 *temp, u8 *humi)
  114. {
  115. u8 buf[5];
  116. u8 i;
  117. DHT11_RST(); //DHT11端口复位,发出起始信号
  118. if(DHT11_Check() == 0) //等待DHT11回应,0为成功回应
  119. {
  120. for(i = 0; i < 5; i++) //读取5个字节,40位数据
  121. {
  122. buf[i] = DHT11_Read_Byte(); //读出数据
  123. }
  124. if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) //校验数据
  125. {
  126. *humi = buf[0]; //湿度的16位,将湿度值放入指针humi
  127. *temp = buf[2]; // 温度的16位,将温度值放入指针temp
  128. printf("读取数据成功!\r\n");
  129. return 0;
  130. }
  131. else
  132. printf("数据校验失败!\r\n");
  133. return 1;
  134. }
  135. else
  136. printf("DHT11初始化未成功!\r\n");
  137. return 1;
  138. }
  139. /*-----------------------------------------------
  140. 函数名:DHT11初始化
  141. 参 数:无
  142. 返回值: 返回一字节值;
  143. ------------------------------------------------*/
  144. u8 DHT11_Init (void){
  145. RCC_APB2PeriphClockCmd(DHT11_RCC,ENABLE); //开始DHT11的时钟
  146. DHT11_RST(); //DHT11端口复位,发出起始信号
  147. return DHT11_Check(); //等待DHT11回应
  148. }

DHT11.h

  1. #ifndef __DHT11_H_
  2. #define __DHT11_H_
  3. #include "sys.h"
  4. #define DHT11_RCC RCC_APB2Periph_GPIOA //开启引脚RCC,根据具体情况修改
  5. #define DHT11_PORT GPIOA //定义端口,根据具体情况修改
  6. #define DHT11_IO GPIO_Pin_5 //定义IO口,根据具体情况修改
  7. void DHT11_IO_OUT (void); //设置IO口为输出模式
  8. void DHT11_IO_IN(void); //设置IO口为输入模式
  9. void DHT11_RST (void); //复位DHT11
  10. u8 DHT11_Init (void); //DHT11初始化
  11. u8 DHT11_Check(void); //检查DHT11是否正常
  12. u8 DHT11_Read_Bit(void); //读取一位数据
  13. u8 DHT11_Read_Byte(void); //读取一个字节
  14. u8 DHT11_Read_Data(u8 *temp, u8 *humi); //DHT11读取数据
  15. #endif
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/606505
推荐阅读
相关标签
  

闽ICP备14008679号