当前位置:   article > 正文

STM32+DHT11温湿度传感器_stm32温湿度传感器代码

stm32温湿度传感器代码

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次
通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数
部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验

数据传送正确时校验和数据
等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
” 所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到速模式,等待主
机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,
用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,
如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后
转换到低速模式.

 

直接上代码

  1. //main程序
  2. #include "stdio.h"
  3. #include "stm32f10x.h"
  4. #include "USART.h"
  5. #include "dht11.h"
  6. #include "Delay.h"
  7. extern u8 dat[5];
  8. int main(void)
  9. {
  10. uart1_init();
  11. printf( "串口printf函数测试\n" );
  12. while (1)
  13. {
  14. if(DHT_Read())
  15. printf("湿度:%d%%,温度:%d度\r\n",dat[0],dat[2]);
  16. //printf("湿度:%d.%d%%,温度:%d.%d度\r\n",dat[0],dat[1],dat[2],dat[3]); 显示小数
  17. Delay_ms(3000);
  18. }
  19. }
  1. //UART1.C程序
  2. #include "stm32f10x.h" // Device header
  3. #include "stdio.h"
  4. #include "USART.h"
  5. u8 Recse;
  6. void uart1_init(void)
  7. {
  8. GPIO_InitTypeDef GPIO_InitStructure;
  9. USART_InitTypeDef USART_InitStructure;
  10. NVIC_InitTypeDef NVIC_InitStructure;
  11. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
  12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  13. USART_InitStructure.USART_BaudRate = 9600; //波特率
  14. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不进行硬件流控制
  15. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//模式为接收和发送双向
  16. USART_InitStructure.USART_Parity = USART_Parity_No;//不校验
  17. USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止1
  18. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据8
  19. USART_Init(USART1, &USART_InitStructure);
  20. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//输出复用推挽
  21. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  22. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23. GPIO_Init(GPIOA, &GPIO_InitStructure);
  24. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//输入复用浮空
  25. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  26. GPIO_Init(GPIOA, &GPIO_InitStructure);
  27. USART_Cmd(USART1, ENABLE);//使能串口1
  28. }
  29. /* 重定向printf函数 */
  30. int fputc(int ch, FILE *f)
  31. {
  32. while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  33. USART_SendData(USART1,ch);
  34. /* 等待发送完毕 */
  35. return ch;
  36. }
  1. //UART.H程序
  2. #ifndef __USART_H
  3. #define __USART_H
  4. void uart1_init(void);
  5. #endif
  1. //dht11.c程序
  2. #include "dht11.h"
  3. #include "Delay.h"
  4. uint8_t dat[5]={0x00,0x00,0x00,0x00,0x00};
  5. uint8_t sum=0;
  6. //初始化为输出
  7. void DHT11_GPIO_OUT(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14. GPIO_Init(GPIOB, &GPIO_InitStructure);
  15. }
  16. //初始化为输入
  17. void DHT11_GPIO_IN(void)
  18. {
  19. GPIO_InitTypeDef GPIO_InitStructure;
  20. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  21. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  22. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  23. GPIO_Init(GPIOB, &GPIO_InitStructure);
  24. }
  25. //读一个字节
  26. uint8_t DHT_Read_Byte(void)
  27. {
  28. uint8_t temp;
  29. uint8_t ReadDat=0;
  30. uint8_t retry = 0;
  31. uint8_t i;
  32. for(i=0;i<8;i++)
  33. {
  34. //数据信号低电平50us
  35. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)
  36. {
  37. Delay_us(1);
  38. retry++;
  39. }
  40. retry=0;
  41. Delay_us(30);
  42. temp=0;//数字信号0,temp=0
  43. //数字0信号高电平持续28us,数字1信号高电平70us,延时30us以确认数字01
  44. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1) temp=1;
  45. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&&retry<100)//数字1信号高电平剩余40us
  46. {
  47. Delay_us(1);
  48. retry++;
  49. }
  50. retry=0;
  51. ReadDat<<=1;
  52. ReadDat|=temp;
  53. }
  54. return ReadDat;
  55. }
  56. uint8_t DHT_Read(void)
  57. {
  58. uint8_t i;
  59. uint8_t retry = 0;
  60. //主机设置为输出,发送开始信号低电平18ms,高电平40us
  61. DHT11_GPIO_OUT();
  62. GPIO_ResetBits(GPIOB,GPIO_Pin_14);
  63. Delay_ms(18);
  64. GPIO_SetBits(GPIOB,GPIO_Pin_14);
  65. Delay_us(40);
  66. //主机设置为输入,检查并接收响应信号低电平80us,高电平80us
  67. DHT11_GPIO_IN();
  68. Delay_us(20);
  69. //延时20us,低电平80us,还剩60us,检查是否是低电平以确定是否有响应信号
  70. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0)
  71. {
  72. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)//接收响应信号低电平剩余60us
  73. {
  74. Delay_us(1);
  75. retry++;
  76. }
  77. retry=0;//超过100us自动向下运行,以免卡死
  78. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&&retry<100)//接收响应信号高电平80us
  79. {
  80. Delay_us(1);
  81. retry++;
  82. }
  83. retry=0;
  84. //接收8字节数据
  85. for(i=0;i<5;i++)
  86. {
  87. dat[i]=DHT_Read_Byte();
  88. }
  89. Delay_us(50);//DHT11拉低总线50us作为结束信号,或者使用以下语句
  90. // while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)//接收响应信号低电平剩余60us
  91. // {
  92. // SysTick_Delay_us(1);
  93. // retry++;
  94. // }
  95. // retry=0;
  96. }
  97. sum=dat[0]+dat[1]+dat[2]+dat[3];
  98. if(dat[4]==sum)
  99. {
  100. return 1;
  101. }
  102. else
  103. return 0;
  104. }


 

  1. //dth11.h程序
  2. #ifndef __DHT11_H
  3. #define __DHT11_H
  4. #include "stm32f10x.h"
  5. void DHT11_GPIO_OUT(void);
  6. void DHT11_GPIO_IN(void);
  7. uint8_t DHT_Read_Byte(void);
  8. uint8_t DHT_Read(void);
  9. #endif
  1. //Delay.c程序
  2. #include "stm32f10x.h"
  3. /**
  4. * @brief 微秒级延时
  5. * @param xus 延时时长,范围:0~233015
  6. * @retval 无
  7. */
  8. void Delay_us(uint32_t xus)
  9. {
  10. SysTick->LOAD = 72 * xus; //设置定时器重装值
  11. SysTick->VAL = 0x00; //清空当前计数值
  12. SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
  13. while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
  14. SysTick->CTRL = 0x00000004; //关闭定时器
  15. }
  16. /**
  17. * @brief 毫秒级延时
  18. * @param xms 延时时长,范围:0~4294967295
  19. * @retval 无
  20. */
  21. void Delay_ms(uint32_t xms)
  22. {
  23. while(xms--)
  24. {
  25. Delay_us(1000);
  26. }
  27. }
  28. /**
  29. * @brief 秒级延时
  30. * @param xs 延时时长,范围:0~4294967295
  31. * @retval 无
  32. */
  33. void Delay_s(uint32_t xs)
  34. {
  35. while(xs--)
  36. {
  37. Delay_ms(1000);
  38. }
  39. }
  1. //Delay.h程序
  2. #ifndef __DELAY_H
  3. #define __DELAY_H
  4. void Delay_us(uint32_t us);
  5. void Delay_ms(uint32_t ms);
  6. void Delay_s(uint32_t s);
  7. #endif

上结果图

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

闽ICP备14008679号