找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: 凌净清河
打印 上一主题 下一主题
收起左侧

基于DHT11的温湿计设计 OLED12864显示

  [复制链接]
跳转到指定楼层
楼主
本作品采用STC15F104W单片机和OLED12864(IIC)设计,配合B站上传的视频更佳。
B站搜索基于DHT11的温湿计(UP凌净清河)即可查到相关视频(预计2018年7月13日前会审核完毕)。

主要亮点:
1.自定义的显示函数以满足显示需求
2.简化的字库以满足单片机4K Flash的容量需求
次要亮点:
1.使用小巧的STC15F104W单片机

请注意!为防止低成本盗用(虽然写的不怎么样),仅展示主程序文件源码,在附件中有完整版。

  1. #include<STC15.H>
  2. #include "intrins.h"
  3. #include "OLED_Contrul_Hygrothermograph.c"
  4. sbit YLED=P3^1;
  5. sbit RLED=P3^0;
  6. sbit DHT=P3^5;
  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. 借用了<a href="http://www.51hei.com/bbs/dpj-38067-1.html" target="_blank">http://www.51hei.com/bbs/dpj-38067-1.html</a>上的部分程序,在此表示感谢
  27. #################################################################################*/
  28. void Delay30us()
  29. {unsigned char i;i=87;while(--i);}

  30. void Delay20ms()
  31. {unsigned char i,j,k;i=1;j=234;k=113;do{do{while(--k);}while(--j);}while(--i);}

  32. void Delay1s()
  33. {unsigned char i,j,k;i=46;j=153;k=245;do{do{while(--k);}while(--j);}while(--i);}

  34. void OLED_Display()
  35. {OLED_DataDisplay_T(56,4,Temperature);OLED_DataDisplay_H(56,6,Humidity);}

  36. void DHT_Collect()
  37. {unsigned char i,j;unsigned char t;unsigned char dat8=0;unsigned int CheckValue=0;
  38. DHT=0;Delay20ms();DHT=1;Delay30us();
  39. t=80;while(DHT&&t--);if(t==0){DHT=1;}t=250;while(!DHT&&t--);
  40. if(t==0){DHT=1;}t=250;while(DHT&&t--);if(t==0){DHT=1;}
  41. for(j=0;j<5;j++)
  42. {for(i=0;i<8;i++){t=150;while(!DHT&&t--);if(t==0){DHT=1;}t=0;
  43. while(DHT&&++t);dat8<<=1;if(t>30)dat8+=1;}Data_Receive[j]=dat8;}
  44. Delay30us();Delay30us();DHT=1;
  45. for(i=0;i<4;i++){CheckValue+=Data_Receive[i];}
  46. if((unsigned char)CheckValue==Data_Receive[4])
  47. {Temperature[0]=Data_Receive[2]/10;Temperature[1]=Data_Receive[2]%10;Temperature[2]=Data_Receive[3]%10;
  48. Humidity[0]=Data_Receive[0]/10;Humidity[1]=Data_Receive[0]%10;}}

  49. void sys_init()
  50. {YLED=1;RLED=1;OLED_Init();OLED_CLS();
  51. OLED_FormTitle(0,0);OLED_FormName(0,2);OLED_FormLine(0,3);OLED_FormTemp(8,4);OLED_FormHumi(16,6);
  52. OLED_AnyChar_16X16(96,4,TempChar);OLED_AnyChar_8X16(88,6,HumiChar);OLED_AnyChar_8X16(72,4,PointChar);}

  53. void main()
  54. {sys_init();while(1){DHT_Collect();YLED=1;RLED=0;OLED_Display();RLED=1;YLED=0;Delay1s();Delay1s();}}
复制代码
带注释版以及OLED控制文件、字库文件、底层通信文件在附件中,上面的为主程序文件无注释紧缩版。
所有代码排版严谨,分级之间使用TAB件,无多余空格,使用Notpad++以c文件形式打开即可正常观看。

新矿城学习基地 凌净清河

Keil代码下载: 基于DHT11的温湿计 凌净清河.zip (45.51 KB, 下载次数: 565)

评分

参与人数 3黑币 +87 收起 理由
aiober + 30 很给力!
hbnpmw + 7
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:362076 发表于 2018-7-24 20:50 | 显示全部楼层
hjklk 发表于 2018-7-24 13:44
你好  您的基于DHT1112864显示   我能下载吗”

这算是试探性的回复么?>v<
只要回帖就可以下载的。
回复

使用道具 举报

板凳
ID:362076 发表于 2018-8-27 09:25 | 显示全部楼层
kodak0818 发表于 2018-8-26 17:51
楼主,感谢分享,顺便问一下,怎么鉴定oled12864是不是坏的,我烧你的hex,oled不显示啊

确定连线都是按照程序中位定义连接的么?OLED的初始化操作正确执行了么?这两步完成程序应该会有显示了。OLED对延时要求不是很高呀。和DHT相关的部分倒是要改一下精准延时函数。
回复

使用道具 举报

地板
ID:362076 发表于 2018-8-27 09:27 | 显示全部楼层
kodak0818 发表于 2018-8-26 17:51
楼主,感谢分享,顺便问一下,怎么鉴定oled12864是不是坏的,我烧你的hex,oled不显示啊

如果不是按照程序中的引脚定义连线的,要改一下OLED_Hygrothermograph.h中的串行数据/时钟的定义,应该是没有改吧?
回复

使用道具 举报

5#
ID:362076 发表于 2018-9-5 12:27 | 显示全部楼层
twelveboy 发表于 2018-8-15 21:58
楼主,我仿制了一个,我想把数字的字体加大到16*32,程序怎么改,我试了多次,提示void OLED_Set_Pos(unsig ...

不好意思,之前浏览回复的时候竟然没有注意到你的问题。但是我并没能想清楚你的问题出现在哪里,OLED_Set_Pos的作用类似于打印机将打印头移动到要写入数据的位置处。本不应该出现错误的,推测是你的上级调用函数出了问题?
增大字号的话,先是扩充取模数组,对应着取模的方式重写显示函数,要考虑到每一个字符占的位置大小,每一个字节的显示顺序等等,当需要开始新一行(8个纵点)的时候就要重新设置Pos,如此分行多次写完一个字模。
回复

使用道具 举报

6#
ID:362076 发表于 2018-9-5 12:31 | 显示全部楼层
kodak0818 发表于 2018-8-27 22:25
线序是对的,烧了好多hex 都没有反应,自己也写了一些全屏显示的代码,没有反应,估计屏幕是坏的。放弃了 ...

OLED12864在淘宝上最便宜有12块钱包邮的,小猫芯城价格15元,15元也是大多数“便宜”卖家给出的价格,至于20块左右或者更高价格的,直接pass吧,我买过几个便宜的,用着也没什么问题。
回复

使用道具 举报

7#
ID:362076 发表于 2018-9-5 12:33 | 显示全部楼层
pk可乐 发表于 2018-8-28 15:56
谢谢,想学习一下12864与单片机的链接

连接...IIC的话除了P0要加上拉之外,SDA和SCL随便连接哪一个IO都可以啊~
回复

使用道具 举报

8#
ID:362076 发表于 2018-9-12 10:04 | 显示全部楼层

不大,如果是用我的程序直接烧录的话,难度就是5个IO和器件的连接,因为屏幕是IIC的,所以连接起来较SPI的更方便。
制作成本的话,按主要的算,屏幕13+洞洞板0.8元+DTH11 5.7+microUSB小板0.8+STC15F104W 1.8+杂项,大约不到25元。
回复

使用道具 举报

9#
ID:362076 发表于 2018-10-1 22:15 | 显示全部楼层
jijkf 发表于 2018-10-1 11:40
这是什么型号oled

OLED12864(IIC接口)
回复

使用道具 举报

10#
ID:362076 发表于 2018-10-6 22:31 | 显示全部楼层
jijkf 发表于 2018-10-6 20:31
怎样换成中文的?

中文显示就要换一下显示驱动函数了,具体的要根据取字模的方式而定,而且这个单片机的话,存不下太多中文字模,一共只有4k的空间。
回复

使用道具 举报

11#
ID:362076 发表于 2018-10-16 10:22 | 显示全部楼层
jijkf 发表于 2018-10-15 19:31
有没有用sm32做的

不好意思,没有使用32,51的资源足够了。
回复

使用道具 举报

12#
ID:362076 发表于 2018-12-2 17:16 | 显示全部楼层
13118302007 发表于 2018-11-28 14:26
楼主,您好, 想请教一下STC15F104W这个单片机用什么工具下载啊?我在网上找了就是下载不来,能帮忙解决一 ...

就是使用STC-ISP官方下载工具就可以。
回复

使用道具 举报

13#
ID:362076 发表于 2018-12-20 19:54 | 显示全部楼层
书石 发表于 2018-12-20 14:58
能改为STC89c52单片机的吗

可以,主要改一下延时,头文件也换一下,应该就可以移植了。
回复

使用道具 举报

14#
ID:362076 发表于 2019-1-9 07:59 | 显示全部楼层
h8924 发表于 2019-1-8 21:46
感谢分享,顺便问一下,怎么鉴定oled12864是不是坏的

这个...找一个正常工作的代码测试下,最简单的办法了
回复

使用道具 举报

15#
ID:362076 发表于 2019-1-17 16:39 | 显示全部楼层

这个制作就是用51做的,核心是51,要是移植到传统51内核的话改一下延时就可以了
回复

使用道具 举报

16#
ID:362076 发表于 2019-4-2 20:31 | 显示全部楼层
wuyanting 发表于 2019-4-2 13:24
为什么没有显示dht
11的测量结果呢?

首先注意一下单片机型号,我制作使用的是15系列,Y5内核的,看你的核心板有可能是15或者12系列的,如果速度不一样,延时就需要改一下,因为1-wire通信的时序比较严格,这个有别于带有CLK信号线的其它传输协议。一般也要顺带着排除一下硬件的问题,比如上拉电阻,引脚定义和连接,连接线的信号衰减等。
回复

使用道具 举报

17#
ID:362076 发表于 2019-4-2 20:34 | 显示全部楼层
vvvvt 发表于 2019-4-2 19:37
想看看iic的oled怎么用

关于IIC的OLED,就是通过IIC协议写内部寄存器而已。重点在于了解SSD1306的显示相关寄存器组织形式以及驱动函数的编写。
回复

使用道具 举报

18#
ID:362076 发表于 2019-4-14 10:30 | 显示全部楼层
wuyanting 发表于 2019-4-13 18:11
楼主,为什么rebuild后target not created,菜鸟学习中

没包含STC15的头文件,需要先添加MCU型号到Keil
回复

使用道具 举报

19#
ID:362076 发表于 2019-4-15 23:48 | 显示全部楼层
1065210594 发表于 2019-4-15 23:30
显示的温度和湿度都是0,一直不变,大佬这是什么情况

DHT11通讯不成功或者没有得到有效数据,可以注意一下以下方面:DHT11的延时、单片机工作频率、上拉电阻等。
回复

使用道具 举报

20#
ID:362076 发表于 2019-4-27 12:27 | 显示全部楼层
蝶舞狂雷 发表于 2019-4-26 23:24
谢谢楼主,我想问问,这个能做到把数据显示在手机上么?并且记录。

可以,发个数据的问题,根据方式的不同选用不同的通信模块就好了
回复

使用道具 举报

21#
ID:362076 发表于 2019-8-22 17:34 | 显示全部楼层
天风情 发表于 2019-8-9 09:29
有用过8位并口的OLED吗?

没有,改天我可以试试,按说并口速度会更快,一般用在刷新率较高的地方,我还没有试过。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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