找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DHT11温湿度检测器 基于51单片机的proteus仿真+代码

  [复制链接]
跳转到指定楼层
#
给大伙分享一个最近的学习成果:基于51单片机的温湿度仿真 程序加proteus 8.0的版本 1602液晶屏显示
dht11温湿度系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>          /////////////头文件
  2. ////////////////////////////////////////////////////////////////////////////
  3. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  4. void ConfigTimer0(unsigned int ms);
  5. unsigned char IntToString(unsigned char *str, int dat);
  6. extern bit Start18B20();
  7. extern bit Get18B20Temp(int *temp);
  8. extern void InitLcd1602();         
  9. bit DHT_Start();        
  10. void aj (void);
  11. bit DHT_ByteRead(unsigned char *dat);
  12. /////////////////////////////////////////////////////////////////////
  13. sbit K1=P1^4;           ///引脚声明
  14. sbit K2=P1^5;
  15. sbit K3=P1^6;
  16. sbit K4=P1^7;
  17. sbit M1=P1^0;
  18. sbit M2=P1^1;
  19. sbit M3=P1^2;
  20. sbit M4=P1^3;

  21. sbit D1=P2^7;
  22. sbit D2=P2^6;

  23. sbit KD1=P2^3;
  24. sbit KD2=P2^4;

  25. /////////////////

  26. /////////////////////////////  数组命名
  27. int SD,WD,x,xx,SDC,WDC,PWM1,PWM2;
  28. int KK1,KK2;
  29. int wdg=40,wdd=20,sdg=80,sdd=60;
  30. bit SZ,JB;
  31. bit flag1s = 0;          //1s定时标志
  32. unsigned char T0RH = 0;  //T0重载值的高字节
  33. unsigned char T0RL = 0;  //T0重载值的低字节
  34.   /////////////////////////////////        延时子程序
  35. void delay ()
  36. {
  37. x=99999;
  38. while(x--);
  39. }
  40.    /////////////////////////////////
  41. void main()          ////////////////主程序
  42. {                 

  43.     bit tmp;
  44.     unsigned char str[12];
  45.          unsigned char DHT[5];
  46.   ////初始化///////////////////////
  47.     EA = 1;            //开总中断
  48.     ConfigTimer0(10);  //T0定时10ms
  49.     InitLcd1602();     //初始化液晶
  50.         M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
  51. ////////////////////////////////////
  52.   DHT_Start();
  53.   delay();
  54.   delay();
  55.     delay();

  56.   delay();

  57.     while (1)
  58.     {
  59.         LcdShowStr(0, 0, "WD");        //显示到液晶屏上
  60.         LcdShowStr(0, 1, "SD");        //显示到液晶屏上

  61.     LcdShowStr(5, 0, "H");        //显示到液晶屏上
  62.         LcdShowStr(5, 1, "H");        //显示到液晶屏上

  63.         
  64.         LcdShowStr(9, 0, "L");        //显示到液晶屏上
  65.         LcdShowStr(9, 1, "L");        //显示到液晶屏上
  66.         if (flag1s)  //每秒更新一次温度
  67.         {
  68.            
  69.                         
  70.                str[0] = (wdg/10)%10 + '0';  //十位转为ASCII码
  71.            str[1] = (wdg%10) + '0';  //个位转为ASCII
  72.            str[2] = '\0';
  73.                LcdShowStr(6, 0, str);

  74.                    str[0] = (wdd/10)%10 + '0';  //十位转为ASCII码
  75.            str[1] = (wdd%10) + '0';  //个位转为ASCII
  76.            str[2] = '\0';
  77.                LcdShowStr(10,0, str);

  78.                    str[0] = (sdg/10)%10 + '0';  //十位转为ASCII码
  79.            str[1] = (sdg%10) + '0';  //个位转为ASCII
  80.            str[2] = '\0';
  81.                LcdShowStr(6, 1, str);

  82.                    str[0] = (sdd/10)%10 + '0';  //十位转为ASCII码
  83.            str[1] = (sdd%10) + '0';  //个位转为ASCII
  84.            str[2] = '\0';
  85.                LcdShowStr(10, 1, str);

  86.                 DHT_Start();
  87.                         tmp=DHT_ByteRead(&DHT);
  88.                    if(tmp==1)
  89.                    {
  90.                    str[0] = (DHT[0]/10)%10 + '0';  //十位转为ASCII码
  91.            str[1] = (DHT[0]%10) + '0';  //个位转为ASCII
  92.                LcdShowStr(2, 1, str);

  93.                    str[0] = (DHT[2]/10)%10 + '0';  //十位转为ASCII码
  94.            str[1] = (DHT[2]%10) + '0';  //个位转为ASCII
  95.            str[2] = '\0';
  96.                LcdShowStr(2,0, str);

  97.                    WD= DHT[2];
  98.                    SD=DHT[0];
  99.                    }
  100.         }


  101.                 ////////////////////超热警报
  102.                 if(wdg<=WD)
  103.                 {
  104.                 WDC=WD-wdg+2;
  105.                  M1=1;
  106.                 }
  107.                 else M1=0;

  108.                 if(wdd>=WD)
  109.                 {
  110.                 WDC=wdd-WD+2;
  111.                  M2=1;
  112.                 }
  113.                 else M2=0;

  114.                 if(sdg<=SD)
  115.                 {
  116.                 SDC=SD-sdg+2;
  117.                  M3=1;
  118.                 }
  119.                 else M3=0;

  120.                 if(sdd>=SD)
  121.                 {
  122.                 SDC=sdd-SD+2;
  123.                  M4=1;
  124.                 }
  125.                 else M4=0;

  126.                 if(wdg<=WD||wdd>=WD)
  127.                 {
  128.                   PWM1++;
  129.                   if(PWM1<WDC)
  130.                   D1=1;
  131.                   if(PWM1>=WDC)
  132.                    D1=0;
  133.                   if(PWM1==10)
  134.                   PWM1=0;
  135.                 }
  136.       if(wdg>WD&&wdd<WD&&KK1==0)
  137.             D1=0;

  138.                 if(sdg<=SD||sdd>=SD)
  139.                 {
  140.                   PWM2++;
  141.                   if(PWM2<SDC)
  142.                   D2=1;
  143.                   if(PWM2>=SDC)
  144.                    D2=0;
  145.                   if(PWM2==10)
  146.                   PWM2=0;
  147.                 }
  148.                 if(sdg>SD&&sdd<SD&&KK2==0)
  149.          D2=0;
  150.                 /////////////////////////////按键设置
  151.                  aj();
  152.                   //////////////////////////////////////////////
  153.          }
  154. }

  155. void aj (void)
  156. {

  157. if(KD1==0)
  158. {
  159.   delay();
  160.   KK1++;
  161.   if(KK1==1)
  162.    D1=1;
  163.    if(KK1>=2)
  164.    {
  165.     D1=0;
  166.         KK1=0;
  167.    }
  168. }


  169. if(KD2==0)
  170. {
  171.   delay();
  172.   KK2++;
  173.   if(KK2==1)
  174.    D2=1;
  175.    if(KK2>=2)
  176.    {
  177.     D2=0;
  178.         KK2=0;
  179.    }
  180. }
  181.                  if(K1==0)
  182.                 {
  183.                    xx++;
  184.                   delay();
  185.                   if(xx==1)
  186.                     LcdShowStr(12, 0, "WDH");        //显示到液晶屏上
  187.                   if(xx==2)
  188.                     LcdShowStr(12, 0, "WDL");        //显示到液晶屏上  
  189.                   if(xx==3)
  190.                     LcdShowStr(12, 0, "SDH");        //显示到液晶屏上
  191.                   if(xx==4)
  192.                     LcdShowStr(12, 0, "SDL");        //显示到液晶屏上
  193.                 if(xx>=5)
  194.                 xx=0;                                                   
  195.                 }
  196.                 if(K2==0)
  197.                 {

  198.                 if(xx==1)
  199.                 {
  200.                   LcdShowStr(12, 1, "WD+");        //显示到液晶屏上
  201.                   wdg++;
  202.                 }
  203.                                 if(xx==2)
  204.                 {
  205.                   LcdShowStr(12, 1, "WD+");        //显示到液晶屏上
  206.                   wdd++;
  207.                 }
  208.                                 if(xx==3)
  209.                 {
  210.                   LcdShowStr(12, 1, "SD+");        //显示到液晶屏上
  211.                   sdg++;
  212.                 }
  213.                                 if(xx==4)
  214.                 {
  215.                   LcdShowStr(12, 1, "SD+");        //显示到液晶屏上
  216.                   sdd++;
  217.                 }

  218.                   delay();
  219.                 }

  220.                 if(K3==0)
  221.                 {
  222.                                  if(xx==1)
  223.                 {
  224.                   LcdShowStr(12, 1, "WD-");        //显示到液晶屏上
  225.                   wdg--;
  226.                 }
  227.                                 if(xx==2)
  228.                 {
  229.                   LcdShowStr(12, 1, "WD-");        //显示到液晶屏上
  230.                   wdd--;
  231.                 }
  232.                                 if(xx==3)
  233.                 {
  234.                   LcdShowStr(12, 1, "SD-");        //显示到液晶屏上
  235.                   sdg--;
  236.                 }
  237.                                 if(xx==4)
  238.                 {
  239.                   LcdShowStr(12, 1, "SD-");        //显示到液晶屏上
  240.                   sdd--;
  241.                 }
  242.                   delay();
  243.                 }
  244.                  if(K4==0)
  245.                 {

  246.                   delay();
  247.                   xx=0;
  248.                   InitLcd1602();     //初始化液晶
  249.                 }
  250. }
  251. /* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
  252. unsigned char IntToString(unsigned char *str, int dat)
  253. {
  254.     signed char i = 0;
  255.     unsigned char len = 0;
  256.     unsigned char buf[6];
  257.    
  258.     if (dat < 0)  //如果为负数,首先取绝对值,并在指针上添加负号
  259.     {
  260.         dat = -dat;
  261.         *str++ = '-';
  262.         len++;
  263.     }
  264.     do {          //先转换为低位在前的十进制数组
  265.         buf[i++] = dat % 10;
  266.         dat /= 10;
  267.     } while (dat > 0);
  268.     len += i;     //i最后的值就是有效字符的个数
  269.     while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上
  270.     {
  271.         *str++ = buf[i] + '0';
  272.     }
  273.     *str = '\0';  //添加字符串结束符
  274.    
  275. ……………………

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

所有资料51hei提供下载:
温湿度检测.zip (198.88 KB, 下载次数: 2525)


评分

参与人数 17黑币 +119 收起 理由
秦六木· + 6 绝世好帖!
DIY电子 + 10 测试了下很好 谢谢分享 资料留存先
With_commands + 4 PROGRAM! The With Commands - Electronics
肉夹馍111 + 1 赞一个!
wolovestudy + 1 绝世好帖!
jqc + 1 很给力!
dumplings + 5 很给力!
云云 + 5 很给力!
dgxiong + 5 很给力!
zx果子 + 5 赞一个!
LNBOW + 1 绝世好帖!
森眸暖光 + 5 赞一个!
759072231 + 5 赞一个!
刘大阳 + 5 很给力!
jikunpeng + 5
初秋夜微凉 + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

153#
ID:1126601 发表于 2025-5-12 15:55 | 只看该作者
好,非常感谢
回复

使用道具 举报

152#
ID:1123155 发表于 2024-5-31 15:54 | 只看该作者
学到了
回复

使用道具 举报

151#
ID:1025698 发表于 2022-5-11 15:04 来自触屏版 | 只看该作者
你好,如果多点测量怎么改呢
回复

使用道具 举报

150#
ID:981034 发表于 2021-11-17 08:13 | 只看该作者
谢谢,可惜注解少
回复

使用道具 举报

149#
ID:89352 发表于 2021-4-14 00:39 | 只看该作者
感谢分享,好资料,仿真功能正常
回复

使用道具 举报

148#
ID:748788 发表于 2020-9-17 16:05 | 只看该作者
可以仿真,可以编译,只是有几个warning,编译后的.hex可以仿真运行。难得的资料,感谢楼主。
回复

使用道具 举报

147#
ID:783472 发表于 2020-6-28 13:34 | 只看该作者
对,我的也生成不了.hex文件,是不是程序哪里有问题?
回复

使用道具 举报

146#
ID:655165 发表于 2020-6-21 17:47 | 只看该作者
试一试
回复

使用道具 举报

145#
ID:379551 发表于 2020-6-19 13:09 | 只看该作者
大B 发表于 2017-11-7 00:18
为什么proteus8会打开不了文件,一打开就直接关闭

没PO解好,卸载掉重新安装吧,注意PO解方法,安装路径!!
回复

使用道具 举报

144#
ID:606251 发表于 2020-6-19 08:32 | 只看该作者
非常好的资料,谢谢!
回复

使用道具 举报

143#
ID:606251 发表于 2020-6-19 08:31 | 只看该作者
非常好的资料,谢谢!
回复

使用道具 举报

142#
ID:783472 发表于 2020-6-18 20:51 | 只看该作者
为什么无法打开呢
回复

使用道具 举报

141#
ID:751451 发表于 2020-6-18 15:44 来自触屏版 | 只看该作者
谢谢分享
回复

使用道具 举报

140#
ID:766403 发表于 2020-6-1 12:47 | 只看该作者
很赞作品非常好
回复

使用道具 举报

139#
ID:759681 发表于 2020-5-24 10:50 | 只看该作者
很棒很棒
回复

使用道具 举报

138#
ID:759681 发表于 2020-5-24 10:50 | 只看该作者
这个真的太棒了 单片机课程设计就是这个
回复

使用道具 举报

137#
ID:759294 发表于 2020-5-23 17:35 | 只看该作者
哇,测试了很成功
回复

使用道具 举报

136#
ID:287128 发表于 2020-5-9 13:34 | 只看该作者
学习学习
回复

使用道具 举报

135#
ID:65237 发表于 2020-5-7 21:31 | 只看该作者
BL51 BANKED LINKER/LOCATER V6.22 - SN: Eval Version
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2009
"STARTUP.obj",
"1602.obj",
"MAIN.obj",
"dht11.obj"
TO "CX"
RAMSIZE(256)
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?LCDOPENCURSOR?1602
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?LCDCLOSECURSOR?1602
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_INTTOSTRING?MAIN
******************************************************************************
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 083FH BYTE (103%) *
******************************************************************************
Program Size: data=76.4 xdata=0 code=2805
LINK/LOCATE RUN COMPLETE.  3 WARNING(S),  0 ERROR(S)
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?LCDOPENCURSOR?1602
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?LCDCLOSECURSOR?1602
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_INTTOSTRING?MAIN
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
    MODULE:  D:\KEIL\C51\LIB\C51S.LIB (-----)
    LIMIT:   0800H BYTES
Target not created
我 的为什么不能创建成功
回复

使用道具 举报

134#
ID:740183 发表于 2020-4-28 16:10 | 只看该作者
ybfq 发表于 2017-6-19 10:52
你好  请问一下你的proteus里面怎么有DHT11的  为什么我的没有  是版本的问题吗

proteus 8.6可以
回复

使用道具 举报

133#
ID:87780 发表于 2020-4-27 15:52 | 只看该作者
找了一圈,别的人分享的都是假的,就你这个是真的,大赞!
回复

使用道具 举报

132#
ID:738997 发表于 2020-4-27 05:48 | 只看该作者
试一试看可以用不
回复

使用道具 举报

131#
ID:582255 发表于 2020-4-25 23:06 | 只看该作者
DHT11这个大家都在用啊
回复

使用道具 举报

130#
ID:473537 发表于 2020-4-1 15:41 | 只看该作者
最近正在做这个,学习下
回复

使用道具 举报

129#
ID:473537 发表于 2020-4-1 15:40 | 只看该作者
最近正在做这个,学习下
回复

使用道具 举报

128#
ID:473537 发表于 2020-4-1 15:40 | 只看该作者
最近正在做这个,学习一下
回复

使用道具 举报

127#
ID:642374 发表于 2020-3-28 21:16 | 只看该作者
真的是良心帖子
回复

使用道具 举报

126#
ID:552550 发表于 2020-3-26 16:15 | 只看该作者
如何仿真的?下载仿真不了,怎么弄?
回复

使用道具 举报

125#
ID:552550 发表于 2020-3-26 15:47 | 只看该作者
DHT11的温湿度检测如何仿真的?下载仿真不了,怎么弄?
回复

使用道具 举报

124#
ID:261045 发表于 2020-3-22 23:19 | 只看该作者
谢谢,正需要这个资料,非常感谢!!!
回复

使用道具 举报

123#
ID:707289 发表于 2020-3-14 20:28 | 只看该作者
不知道为什么不能在keil4里面调试,但是里面有的hex文件可以用。
回复

使用道具 举报

122#
ID:410071 发表于 2020-3-9 17:05 | 只看该作者
哇,很厉害,小白来研究哦i
回复

使用道具 举报

121#
ID:38792 发表于 2020-2-15 12:35 | 只看该作者
我的Proteus竟然没有找到DHT11,只有SHT系列。
回复

使用道具 举报

120#
ID:674898 发表于 2019-12-28 16:45 来自触屏版 | 只看该作者
哥,在吗,为什么我编译后不能创建hex文件啊
回复

使用道具 举报

119#
ID:434850 发表于 2019-12-20 23:51 | 只看该作者
不对呀
回复

使用道具 举报

118#
ID:638754 发表于 2019-12-20 12:24 | 只看该作者
很棒
。我是小白感觉很有用,希望楼主再接再厉。
回复

使用道具 举报

117#
ID:656783 发表于 2019-12-6 10:12 | 只看该作者
绝世好贴
回复

使用道具 举报

116#
ID:369443 发表于 2019-9-28 17:04 | 只看该作者
谢谢
回复

使用道具 举报

115#
ID:577468 发表于 2019-7-7 16:13 | 只看该作者
打不开呀  找不到路径  是因为时间太长了么?
能私发我一下么    2649053528@qq.com
回复

使用道具 举报

114#
ID:577492 发表于 2019-7-3 23:12 | 只看该作者
有没有只检测湿度的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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