找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8164|回复: 5
收起左侧

温湿度传感器DHT11 STM32F103驱动程序

  [复制链接]
ID:264767 发表于 2017-12-21 13:34 | 显示全部楼层 |阅读模式
DHT11驱动程序,主控基于STM32F103

单片机源程序如下:
  1. #include "dht11_driver.h"

  2. /*
  3. * 函数名:DHT11_GPIO_Config
  4. * 描述  :配置DHT11用到的I/O口
  5. * 输入  :无
  6. * 输出  :无
  7. */
  8. void DHT11_GPIO_Config(void)
  9. {
  10.         GPIO_InitTypeDef GPIO_InitStructure;

  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                                                                                                                   
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.         GPIO_Init(GPIOB, &GPIO_InitStructure);       

  16.         GPIO_SetBits(GPIOB, GPIO_Pin_1);         
  17. }

  18. /*
  19. * 函数名:DHT11_Mode_IPU
  20. * 描述  :使DHT11-DATA引脚变为上拉输入模式
  21. * 输入  :无
  22. * 输出  :无
  23. */
  24. static void DHT11_Mode_IPU(void)
  25. {
  26.           GPIO_InitTypeDef GPIO_InitStructure;

  27.                   /*选择要控制的DHT11_PORT引脚*/       
  28.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

  29.            /*设置引脚模式为浮空输入模式*/
  30.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;

  31.           /*调用库函数,初始化DHT11_PORT*/
  32.           GPIO_Init(GPIOB, &GPIO_InitStructure);         
  33. }

  34. /*
  35. * 函数名:DHT11_Mode_Out_PP
  36. * 描述  :使DHT11-DATA引脚变为推挽输出模式
  37. * 输入  :无
  38. * 输出  :无
  39. */
  40. static void DHT11_Mode_Out_PP(void)
  41. {
  42.         GPIO_InitTypeDef GPIO_InitStructure;
  43.        
  44.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;       
  45.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  46.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47.           GPIO_Init(GPIOB, &GPIO_InitStructure);                  
  48. }

  49. /*
  50. * 从DHT11读取一个字节,MSB先行
  51. */
  52. static uint8_t Read_Byte(void)
  53. {
  54.         uint8_t i, temp=0;

  55.         for(i=0;i<8;i++)   
  56.         {         
  57.                 /*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/  
  58.                 while(DHT11_DATA_IN()==Bit_RESET);

  59.                 /*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
  60.                  *通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
  61.                  */
  62.                 delay_us(40); //延时x us 这个延时需要大于数据0持续的时间即可                     

  63.                 if(DHT11_DATA_IN()==Bit_SET)/* x us后仍为高电平表示数据“1” */
  64.                 {
  65.                         /* 等待数据1的高电平结束 */
  66.                         while(DHT11_DATA_IN()==Bit_SET);

  67.                         temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1,MSB先行
  68.                 }
  69.                 else         // x us后为低电平表示数据“0”
  70.                 {                          
  71.                         temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
  72.                 }
  73.         }
  74.         return temp;
  75. }
  76. /*
  77. * 一次完整的数据传输为40bit,高位先出
  78. * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
  79. */
  80. uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
  81. {  
  82.         /*输出模式*/
  83.         DHT11_Mode_Out_PP();
  84.         /*主机拉低*/
  85.         DHT11_DATA_OUT(LOW);
  86.         /*延时18ms*/
  87.         delay_ms(18);

  88.         /*总线拉高 主机延时30us*/
  89.         DHT11_DATA_OUT(HIGH);

  90.         delay_us(30);   //延时30us

  91.         /*主机设为输入 判断从机响应信号*/
  92.         DHT11_Mode_IPU();

  93.         /*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
  94.         if(DHT11_DATA_IN()==Bit_RESET)     
  95.         {
  96.                 /*轮询直到从机发出 的80us 低电平 响应信号结束*/  
  97.                 while(DHT11_DATA_IN()==Bit_RESET);

  98.                 /*轮询直到从机发出的 80us 高电平 标置信号结束*/
  99.                 while(DHT11_DATA_IN()==Bit_SET);

  100.                 /*开始接收数据*/   
  101.                 DHT11_Data->humi_int= Read_Byte();

  102.                 DHT11_Data->humi_deci= Read_Byte();

  103.                 DHT11_Data->temp_int= Read_Byte();

  104.                 DHT11_Data->temp_deci= Read_Byte();

  105.                 DHT11_Data->check_sum= Read_Byte();


  106.                 /*读取结束,引脚改为输出模式*/
  107.                 DHT11_Mode_Out_PP();
  108.                 /*主机拉高*/
  109.                 DHT11_DATA_OUT(HIGH);
  110. ……………………

  111. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
dht11.zip (2.32 KB, 下载次数: 293)
回复

使用道具 举报

ID:325299 发表于 2018-5-24 17:44 | 显示全部楼层
在主函数里调用吗
回复

使用道具 举报

ID:510485 发表于 2019-4-19 21:19 | 显示全部楼层
这不是野火的历程吗
回复

使用道具 举报

ID:403312 发表于 2019-7-25 15:49 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:316613 发表于 2019-10-11 12:00 | 显示全部楼层
主函数呢??
回复

使用道具 举报

ID:727275 发表于 2020-10-31 10:57 | 显示全部楼层
可惜没有完整的工程文件,感谢楼主分享温湿度传感器DHT11 STM32F103驱动程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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