找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15单片机DHT11温湿度检测(注释详细)oled显示程序

  [复制链接]
跳转到指定楼层
楼主
我这里加了oled用来显示温湿度,采用STC15,dht11模块,有兴趣可以玩下

  1. #include<STC15.H>
  2. #include "intrins.h"//用于提供_nop_();函数
  3. #include "OLED_Contrul_Hygrothermograph.c"//OLED控制函数

  4. sbit YLED=P3^1;
  5. sbit RLED=P3^0;
  6. sbit DHT=P3^5;//DHT11模块

  7. unsigned int Temperature[3]={1,1,1};//前两位为整数部分,后一位为小数部分
  8. unsigned int Humidity[2]={1,1};//传回的湿度数据只有整数部分

  9. unsigned char Data_Receive[5];
  10. /*##############################################################################################
  11. 设计名称:基于DHT11的温湿度计(Hygrothermograph)
  12. 设计者:清河

  13. 平台:STC15F104W
  14. 硬件部分
  15. 显示:采用OLED12864显示温度和湿度
  16. 测量,采用DHT11模块,模块信息如下:
  17. ASATR
  18. -----
  19. NA:DHT11
  20. OC:3.3-5.5V
  21. U1:5-95%RH
  22. U2:-20-60℃
  23. U3:±5%RH±2℃
  24. SN:A1712882A

  25. 为保证延时准确,晶振设置为12MHz

  26. 借用了http://www.51hei.com/bbs/dpj-38067-1.html上的部分程序,在此表示感谢
  27. ##############################################################################################*/

  28. void Delay30us()//@12.000MHz
  29. {
  30.         unsigned char i;
  31.         i=87;
  32.         while(--i);
  33. }

  34. void Delay20ms()//@12.000MHz
  35. {
  36.         unsigned char i,j,k;
  37.         i=1;
  38.         j=234;
  39.         k=113;
  40.         do
  41.         {
  42.                 do
  43.                 {
  44.                         while(--k);
  45.                 }while(--j);
  46.         }while(--i);
  47. }

  48. void Delay1s()//@12.000MHz
  49. {
  50.         unsigned char i,j,k;
  51.         i=46;
  52.         j=153;
  53.         k=245;
  54.         do
  55.         {
  56.                 do
  57.                 {
  58.                         while(--k);
  59.                 }while(--j);
  60.         }while(--i);
  61. }

  62. void OLED_Display()//OLED显示驱动函数
  63. {
  64.         OLED_DataDisplay_T(56,4,Temperature);//在指定位置显示温度
  65.         OLED_DataDisplay_H(56,6,Humidity);//在指定位置显示湿度
  66. }

  67. void DHT_Collect()//温度采集函数
  68. {
  69.         unsigned char i,j;//for循环变量
  70.         unsigned char t;//超时判断
  71.         unsigned char dat8=0;//一次读取的8位数据,需要读5次
  72.         unsigned int CheckValue=0;//校验和
  73.         
  74.         DHT=0;//主机发起始信号
  75.         Delay20ms();//主机拉低总线至少18ms
  76.         DHT=1;//主机拉高总线20~40us
  77.         Delay30us();
  78.         
  79.         t=80;//设置超时等待时间
  80.         while(DHT&&t--);//等待DHT11拉低总线
  81.         if(t==0)//超时
  82.         {
  83.                 DHT=1;
  84.         }
  85.         t=250;//设置超时等待时间
  86.         while(!DHT&&t--);//等待DHT11拉高总线
  87.         if(t==0)//超时
  88.         {
  89.                 DHT=1;
  90.         }
  91.         t=250;//设置超时等待时间
  92.         while(DHT&&t--);//等待DHT11拉低总线
  93.         if(t==0)//超时
  94.         {
  95.                 DHT=1;
  96.         }

  97.         for(j=0;j<5;j++)//5次读取
  98.         {
  99.                 for(i=0;i<8;i++)//1次8个位
  100.                 {
  101.         //等待50us开始时隙
  102.                         t=150;//设置超时等待时间
  103.                         while(!DHT&&t--);//等待DHT11拉高总线
  104.                         if(t==0)//超时
  105.                         {
  106.                                 DHT=1;
  107.                         }
  108.                         t=0;//记录时间清零
  109.                         while(DHT&&++t);//等待并记录高电平持续时间
  110.                         dat8<<=1;
  111.                         if(t>30)//高电平持续时间较长(70us)
  112.                         dat8+=1;//传输值为1
  113.                 }
  114.                 Data_Receive[j]=dat8;
  115.         }
  116.         
  117.         Delay30us();//等待DHT11拉低50us
  118.         Delay30us();
  119.         DHT=1;

  120.         for(i=0;i<4;i++)
  121.         {
  122.                 CheckValue+=Data_Receive[i];//计算校验值
  123.         }
  124.         if((unsigned char)CheckValue==Data_Receive[4])//比对
  125.         {
  126.                 Temperature[0]=Data_Receive[2]/10;
  127.                 Temperature[1]=Data_Receive[2]%10;
  128.                 Temperature[2]=Data_Receive[3]%10;
  129.                 Humidity[0]=Data_Receive[0]/10;
  130.                 Humidity[1]=Data_Receive[0]%10;
  131.         }
  132. }

  133. void sys_init()//系统初始化函数
  134. {
  135.         YLED=1;
  136.         RLED=1;
  137.         OLED_Init(); //OLED初始化
  138.         OLED_CLS();//清屏
  139.         
  140.         OLED_FormTitle(0,0);//显示标题文字Linyar Lab.
  141.         OLED_FormName(0,2);//显示Hygrothermograph名称
  142.         OLED_FormLine(0,3);//显示一条横线
  143.         OLED_FormTemp(8,4);//显示温度文字
  144.         OLED_FormHumi(16,6);//显示湿度文字
  145.         OLED_AnyChar_16X16(96,4,TempChar);//在行4(每行高16像素),列96像素位置显示摄氏度℃字符
  146.         OLED_AnyChar_8X16(88,6,HumiChar);//在行6(每行高16像素),列88像素位置显示百分号%字符
  147.         OLED_AnyChar_8X16(72,4,PointChar);//在行4(每行高16像素),列72像素位置显示冒号:字符
  148. }

  149. void main()
  150. {
  151.         P3M0=0X00;
  152.         P3M1=0X00;
  153.         sys_init();
  154.         
  155.         while(1)
  156.         {
  157.                 DHT_Collect();//DHT11数据采集
  158.                 YLED=1;RLED=0;//灯状态转换
  159.                 OLED_Display();//OLED显示函数
  160.                 RLED=1;YLED=0;//灯状态转换
  161.                 Delay1s();
  162.                 Delay1s();//注意:长时间的延时必须要有,不然会读出0
  163.         }
  164. }
复制代码

全部资料51hei下载地址:
温湿度检测 oled.zip (52.82 KB, 下载次数: 458)

评分

参与人数 2黑币 +54 收起 理由
凌净清河 + 4 转载不注明出处,羊毛薅的不错哟
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:412814 发表于 2019-2-1 20:39 | 只看该作者
学习了,谢谢楼主
回复

使用道具 举报

板凳
ID:412814 发表于 2019-2-9 15:56 | 只看该作者
谢谢楼主,正需要呢。
回复

使用道具 举报

地板
ID:445069 发表于 2019-2-20 15:49 | 只看该作者
给楼主点赞!正在分析DHT11的代码。
回复

使用道具 举报

5#
ID:245031 发表于 2019-3-1 16:00 来自手机 | 只看该作者
ontheroad 发表于 2019-2-20 15:49
给楼主点赞!正在分析DHT11的代码。

实验成功。

15514271931110.035022819921855075.jpg (661.79 KB, 下载次数: 147)

15514271931110.035022819921855075.jpg
回复

使用道具 举报

6#
ID:471657 发表于 2019-4-3 08:21 | 只看该作者
為什麼,我新建一個stc工程把你的代碼加進去沒有現象尼?
回复

使用道具 举报

7#
ID:471657 发表于 2019-4-3 14:04 | 只看该作者
大佬我問一下,為什麼你那個溫度的小數部分,他的j沒有賦值,卻能顯示出小數部分,為什麼?
回复

使用道具 举报

8#
ID:321223 发表于 2019-5-22 22:06 | 只看该作者
谢谢楼主
回复

使用道具 举报

9#
ID:425297 发表于 2019-5-23 19:36 | 只看该作者
学习学习
回复

使用道具 举报

10#
ID:553704 发表于 2019-6-12 08:20 | 只看该作者

想问一下楼主,我刚接触15单片机,编写完完整的程序之后,运行也没有错误,然后接线的时候就是按照程序写的把OLED(7脚的OLED)的SLK和SDA分别接了单片机的P31和P30口,VCC和GND接单片机的VCC和GND,dht11的第二个引脚接了单片机的P35口,VCC和GND接单片机的VCC和GND,接线应该没有错误吧,为什么OLED不能显示数据,但是感受到它在发烫,dht11也在发烫,这是什么原因啊
回复

使用道具 举报

11#
ID:59423 发表于 2019-9-21 20:17 | 只看该作者
很棒的程序,尝试下。
回复

使用道具 举报

12#
ID:399931 发表于 2019-11-27 22:12 来自手机 | 只看该作者
可不可以加个电机控制我不会啊
回复

使用道具 举报

13#
ID:476465 发表于 2020-1-9 15:17 | 只看该作者
用的是STC15W4K56S4芯片,烧录你的程序为什么会没有现象呢?
回复

使用道具 举报

14#
ID:547758 发表于 2020-2-13 17:10 | 只看该作者
您好 请问一下 为什么我按照程序上面连接后  oled上面能显示 但是温湿度一直是0 没有变化 谢谢
回复

使用道具 举报

15#
ID:692891 发表于 2020-2-13 17:32 | 只看该作者
请问 我按照你的程序上面连接之后 温湿度一直显示为0 没有变化 怎么解决 谢谢
回复

使用道具 举报

16#
ID:692971 发表于 2020-2-13 21:07 | 只看该作者
Mr.572 发表于 2020-2-13 17:32
请问 我按照你的程序上面连接之后 温湿度一直显示为0 没有变化 怎么解决 谢谢

延时不够会不会 是用在51单片机还是15
回复

使用道具 举报

17#
ID:692891 发表于 2020-2-23 16:58 | 只看该作者
explode 发表于 2020-2-13 21:07
延时不够会不会 是用在51单片机还是15

用在51单片机上,延时1-2s呀
回复

使用道具 举报

18#
ID:692891 发表于 2020-2-29 15:58 | 只看该作者

大佬 为什么我的oled上面的温湿度一直显示为0呢 而且无变化
回复

使用道具 举报

19#
ID:372579 发表于 2020-2-29 17:52 | 只看该作者
这个有空了试着做下
回复

使用道具 举报

20#
ID:700310 发表于 2020-2-29 20:18 来自手机 | 只看该作者
我也要做这个远程温湿度检测
回复

使用道具 举报

21#
ID:680485 发表于 2020-3-25 23:17 | 只看该作者
MANHAMCHAN 发表于 2020-1-9 15:17
用的是STC15W4K56S4芯片,烧录你的程序为什么会没有现象呢?

师兄你好,我遇到和你一样的问题,请问你解决了吗??
回复

使用道具 举报

22#
ID:664117 发表于 2020-5-15 14:07 | 只看该作者
chen_mq 发表于 2020-3-25 23:17
师兄你好,我遇到和你一样的问题,请问你解决了吗??

还是用示波器去看波形吧
回复

使用道具 举报

23#
ID:1015572 发表于 2022-4-19 08:48 | 只看该作者
谢谢楼主,正需要呢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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