当前位置:   article > 正文

第九篇,温湿度传感器(DHT11)编程_dht11温度传感器代码

dht11温度传感器代码

1.原理图

DHT11使用单总线通信,使用一根数据线进行传输,再加上VCC,GND,闲置接口(NC),一共四根线。

数据线连接到了CPU的PG9,外接上拉电阻。

2.查看DHT11的说明手册了解其如何工作

 数据格式:

通信时序:

CPU发送起始信号 ===> DTH11响应起始信号 ===> DHT11发回温湿度数据

(1)CPU发送起始信号和模块响应

(2)如何传输1位数据

 

3.代码实现

(1)起始信号和模块响应

说明一下这段代码的写法:

  1. //等待拉低
  2.     while(DQ_IN&&retry<100){
  3.         retry++;
  4.         delay_us(1);
  5.     }
  6.     if(retry>=100)//如果没有拉低,无响应
  7.         return 1;

逻辑或&&:表达式1 || 表达式2 || 表达式3...如果表达式1的运算结果为true,则整个表达式的结果为true,同时不会再执行后面的表达式,如果表达式1的运算结果为false,则根据表达式2的运算结果继续判断。

逻辑与||:表达式1 && 表达式2 && 表达式3...如果表达式1的运算结果为false,则整个表达式的结果为false,同时不会再执行后面的表达式,如果表达式1的运算结果为true,则根据表达式2的运算结果继续判断。
 

(2)读一位数据

(3)读取温湿度

  1. //1字节数据,高位先出
  2. u8 dht11_read_byte(void)
  3. {
  4. u8 i,dat = 0;
  5. //连续读取8
  6. for(i=0;i<8;i++){
  7. dat |= dht11_read_bit()<<(7-i);
  8. }
  9. return dat;
  10. }
  11. //读取温湿度数据
  12. //返回0表示成功,非0表示失败
  13. //temp和humi是输出参数,输出温湿度
  14. u8 dht11_read_data(u8 *temp,u8 *humi)
  15. {
  16. u8 i,buf[5];
  17. //起始信号
  18. if(dht11_check()==0){
  19. //读取40bit数据
  20. for(i=0;i<5;i++){
  21. buf[i] = dht11_read_byte();
  22. }
  23. //验证校验和
  24. if(((buf[0]+buf[1]+buf[2]+buf[3])&0xff)==buf[4]){
  25. *humi = buf[0];
  26. *temp = buf[2];
  27. return 0;
  28. }
  29. }
  30. return 1;
  31. }

//代码实现

  1. #include <stm32f4xx.h>
  2. #include <dht11.h>
  3. #include <delay.h>
  4. //配置DQ 输入模式/输出模式
  5. void dht11_set_io(GPIOMode_TypeDef IO)
  6. {
  7. GPIO_InitTypeDef GPIO_InitStruct;
  8. //1.开启GPIOG的时钟
  9. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
  10. //2.GPIO初始化 PG9
  11. GPIO_InitStruct.GPIO_Mode = IO;
  12. GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
  13. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//高速
  14. GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉
  15. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  16. GPIO_Init(GPIOG,&GPIO_InitStruct);
  17. }
  18. //测试dht11是否有响应,返回0表示正常,非0表示无响应
  19. u8 dht11_check(void)
  20. {
  21. u32 retry = 0;
  22. //输出模式
  23. dht11_set_io(GPIO_Mode_OUT);
  24. //发送>18ms低电平起始信号
  25. DQ_OUT = 0;
  26. //保持20ms
  27. delay_ms(20);
  28. DQ_OUT = 1;
  29. //等待20~40us
  30. delay_us(30);
  31. //输入模式
  32. dht11_set_io(GPIO_Mode_IN);
  33. //等待拉低
  34. while(DQ_IN&&retry<100){
  35. retry++;
  36. delay_us(1);
  37. }
  38. if(retry>=100)//如果没有拉低,无响应
  39. return 1;
  40. retry = 0;
  41. //80us后拉高
  42. while(!DQ_IN&&retry<100){
  43. retry++;
  44. delay_us(1);
  45. }
  46. if(retry>=100)//如果没有拉高,无响应
  47. return 1;
  48. return 0;
  49. }
  50. //1位数据
  51. u8 dht11_read_bit(void)
  52. {
  53. u32 retry = 0;
  54. //等待变为低电平,80us
  55. while(DQ_IN&&retry<100){
  56. retry++;
  57. delay_us(1);
  58. }
  59. if(retry>=100)//如果没有拉低,无响应
  60. return 100;
  61. retry = 0;
  62. //等待拉高,50us
  63. while(!DQ_IN&&retry<100){
  64. retry++;
  65. delay_us(1);
  66. }
  67. if(retry>=100)//如果没有拉高,无响应
  68. return 100;
  69. //延时40us,读取电平 低电平 ----- 0 高电平 ----- 1
  70. delay_us(40);
  71. return DQ_IN;
  72. }
  73. //1字节数据,高位先出
  74. u8 dht11_read_byte(void)
  75. {
  76. u8 i,dat = 0;
  77. //连续读取8
  78. for(i=0;i<8;i++){
  79. dat |= dht11_read_bit()<<(7-i);
  80. }
  81. return dat;
  82. }
  83. //读取温湿度数据
  84. //返回0表示成功,非0表示失败
  85. //temp和humi是输出参数,输出温湿度
  86. u8 dht11_read_data(u8 *temp,u8 *humi)
  87. {
  88. u8 i,buf[5];
  89. //起始信号
  90. if(dht11_check()==0){
  91. //读取40bit数据
  92. for(i=0;i<5;i++){
  93. buf[i] = dht11_read_byte();
  94. }
  95. //验证校验和
  96. if(((buf[0]+buf[1]+buf[2]+buf[3])&0xff)==buf[4]){
  97. *humi = buf[0];
  98. *temp = buf[2];
  99. return 0;
  100. }
  101. }
  102. return 1;
  103. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/606503
推荐阅读
相关标签
  

闽ICP备14008679号