找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2567|回复: 1
打印 上一主题 下一主题
收起左侧

STM32+DHT11带oled7脚的源程序

[复制链接]
跳转到指定楼层
楼主
ID:192318 发表于 2018-7-19 21:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自测可用

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "DHT11.h"
  3. #include "Delay.h"
  4. #include "bsp_usart.h"
  5. #include "oled.h"
  6. DHT11_Data DHT11;

  7. void DHT11_GPIO_IN(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  11.        
  12. GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置浮空输入
  15. GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
  16. }

  17. /********************************************************
  18. 函数:DHT11_GPIO_OUT
  19. 描述:设置GPIO口为输出状态
  20. 参数:无
  21. 返回:无
  22. ********************************************************/
  23. void DHT11_GPIO_OUT(void)
  24. {
  25. GPIO_InitTypeDef GPIO_InitStructure;
  26. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  27.        
  28. GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
  29. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出
  31. GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
  32. }

  33. /********************************************************
  34. 函数:DHT11WriteStart
  35. 描述:发起开始信号
  36. 参数:无
  37. 返回:无
  38. ********************************************************/
  39. void DHT11WriteStart(void)//开始标志
  40. {
  41. DHT11_GPIO_OUT(); //设置io为输出模式
  42. DHT11_DATA_OUT(1); //拉高
  43. DHT11_DATA_OUT(0); //拉低
  44. Delay_Ms(20); //主机拉低总线必须大于18ms
  45. DHT11_DATA_OUT(1); //拉高
  46. Delay_Us(30); //主机发送开始信号结束后延时等待20-40us
  47. DHT11_GPIO_IN(); //启动信号开始后,为如数据将io设置设置为输入模式
  48. }

  49. /********************************************************
  50. 函数:DHT11ReadByte
  51. 描述:从DHT11中读取一位数据
  52. 参数:无
  53. 返回:返回读出来的数据
  54. ********************************************************/
  55. u8 DHT11ReadByte(void)
  56. {
  57. u8 temp=0,i;
  58. for(i=0;i<8;i++)//读取8位数据
  59. {
  60. while(DHT11_DATA_IN()==0);//等待变高电平[DHT在单片机采集DATA引脚输出低电平时,从低功耗模式转至高速模式,等待DATA引脚变为高电平]
  61. /*DHT11 以26us~28us的高电平表示“0”,以70us的高电平表示“1”
  62. 每一bit数据都以50us低电平时隙开始,当检测到60us后的电平区别状态*/
  63. Delay_Us(60);//1.DHT输出 60us低电平 作为应答信号2.DHT输出 80us高电平 通知微处理器准备接受数据
  64. if(DHT11_DATA_IN()==1) //60us后还是高电平则是“1”
  65. {
  66. while(DHT11_DATA_IN()==1);
  67. temp|=(u8)(0x01<<(7-i));
  68. }
  69. else //否则是“0”
  70. {
  71. temp&=(u8)~(0x01<<(7-i));
  72. }
  73. }
  74. return temp;
  75. }

  76. /********************************************************
  77. 函数:DHT11Read
  78. 描述:采样当前温湿度值
  79. 参数:
  80. RH:湿度值的整数部分
  81. RL: 湿度值的小数部分
  82. TH: 温度值的整数部分
  83. TL: 温度值的小数部分
  84. 返回:
  85. ********************************************************/
  86. char a[5];
  87. int temp;
  88. void DHT11Read(void)
  89. {
  90. DHT11WriteStart(); //发起开始信号
  91. if(DHT11_DATA_IN()==0)
  92. {
  93. while(DHT11_DATA_IN()==0);
  94. while(DHT11_DATA_IN()==1);
  95. DHT11.RH= DHT11ReadByte(); //湿度高8位
  96. DHT11.RL= DHT11ReadByte(); //湿度低8位
  97. DHT11.TH= DHT11ReadByte(); //温度高8位
  98. DHT11.TL= DHT11ReadByte(); //温度低8位
  99. DHT11.sum= DHT11ReadByte(); //校验和

  100. DHT11_GPIO_OUT(); //采样结束后设置io口为输出,等待下一次开始信号
  101. DHT11_DATA_OUT(1); //设置总线空闲状态为高电平
  102. }
  103. if(DHT11.sum== DHT11.RH+DHT11.RL+DHT11.TH+DHT11.TL) //校验和与计算出的数据相等
  104.         {
  105. //                OLED_ShowString(6,6,"c");
  106. //                printf("当前环境湿度为%d.%d﹪,当前环境温度为%d.%d℃\r\n",DHT11.RH,DHT11.RL,DHT11.TH,DHT11.TL);
  107. //                DHT11.TL=2;
  108.                
  109.                 OLED_16x16CNStr(0,0,"23");
  110.                 OLED_ShowChar(32,0,':');
  111.                
  112.                 temp=(int)DHT11.RH;
  113.                 sprintf(a,"%d",temp);
  114.                 OLED_ShowString(48,0,a);
  115.                
  116.                 OLED_ShowChar(64,0,'.');
  117.                
  118.                 temp=(int)DHT11.RL;
  119.                 sprintf(a,"%d",temp);
  120.                 OLED_ShowString(72,0,a);
  121.                 OLED_ShowChar(80,0,'%');
  122.                
  123.                 OLED_16x16CNStr(0,2,"45");
  124.                 OLED_ShowChar(32,2,':');
  125.                
  126.                 temp=(int)DHT11.TH;
  127.                 sprintf(a,"%d",temp);
  128.                 OLED_ShowString(48,2,a);
  129.                
  130.                 OLED_ShowChar(64,2,'.');
  131.                
  132.                 temp=(int)DHT11.TL;
  133.                 sprintf(a,"%d",temp);
  134.                 OLED_ShowString(72,2,a);
  135.                 OLED_16x16CNStr(80,2,"6");
  136.                
  137. }

  138. }
复制代码

所有资料51hei提供下载:
DHT11.rar (47.18 KB, 下载次数: 45)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-7-20 05:06 | 只看该作者
此贴需要补全原理图等资料后可获得100+积分
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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