标题: DHT11温湿度检测器 基于51单片机的proteus仿真+代码 [打印本页]

作者: 也不诺    时间: 2017-6-8 16:29
标题: 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)



作者: ybfq    时间: 2017-6-19 10:52
你好  请问一下你的proteus里面怎么有DHT11的  为什么我的没有  是版本的问题吗
作者: 759072231    时间: 2017-6-21 12:29
我最近在做基于单片机温室大棚温湿度报警程序设计。。小白一个完全不懂
作者: OREO    时间: 2017-7-4 13:29
请问这个实现的功能是怎样的呢
作者: faridzled    时间: 2017-7-5 04:32
thanks for sharing
作者: 5083    时间: 2017-7-5 23:01
学习学习
作者: wuminhong    时间: 2017-7-6 13:21
已下载测试。
作者: franki1996    时间: 2017-9-5 22:22
已下载测试。
作者: franki1996    时间: 2017-9-5 22:50
学习学习已下载测试。
作者: wojinjia1    时间: 2017-9-11 19:17
学习一下!!!!
作者: 腾飞的龙    时间: 2017-9-12 09:24
感谢分享学习啦!!!!!!!!!!
作者: 森眸暖光    时间: 2017-9-19 20:26
proteus7.7版本里是没有DHT11的。
作者: woaiduman1979    时间: 2017-9-22 23:41
工程文件不能用 proteus打开啊!
作者: songtiao    时间: 2017-9-23 08:29
为什么我没能找到dsn文件
作者: 孤独求败    时间: 2017-10-7 12:16
下载了
作者: xiaoma123    时间: 2017-10-9 18:00
很实用 不错

作者: yanan_7310    时间: 2017-11-1 18:57
学习下不知道是哪个版本的proteus,现在版本的差别很大
作者: jacketcai    时间: 2017-11-6 08:28
学习一下,谢呀
作者: 大B    时间: 2017-11-7 00:18
为什么proteus8会打开不了文件,一打开就直接关闭
作者: masayumec    时间: 2017-11-26 22:48
学习下不知道是哪个版本的proteus,现在版本的差别很大DE1
作者: DWABTK2017    时间: 2017-12-1 16:28
谢谢分享,很好的资料,正在研究DHT11,一定好好学习下。
作者: yjjysw    时间: 2017-12-7 16:13
程序下载进单片机为什么全部是高电平?
作者: WUhei12    时间: 2017-12-17 18:22
一直仿真不了DHT11,想学习一下
作者: 顾风雨    时间: 2017-12-28 18:48
很棒,谢谢~
作者: angelrm    时间: 2018-1-10 18:48
能发我邮箱吗?1628015612@qq.com
作者: 150605200    时间: 2018-1-16 23:30
你好,想求一下pcb图可以吗,实在是画不出来
作者: zhangsq2018    时间: 2018-3-3 22:51
请问如何制作DHT11的仿真模型?
作者: 小小凤    时间: 2018-3-11 16:47
学习学习!
作者: xiaosong1234    时间: 2018-3-16 22:35
每次都是  PDS.exe已停止运行 是什么鬼 各位大佬
作者: 泪奔小飞侠    时间: 2018-3-21 22:39
大B 发表于 2017-11-7 00:18
为什么proteus8会打开不了文件,一打开就直接关闭

我也是,下载了一个,proteus 8.0 打不开文件,一打开就关闭

作者: 泪奔小飞侠    时间: 2018-3-21 22:40
xiaosong1234 发表于 2018-3-16 22:35
每次都是  PDS.exe已停止运行 是什么鬼 各位大佬

我也是,不知道怎么回事
作者: ljj1120    时间: 2018-4-1 00:11
学习学习
作者: asdaqwe    时间: 2018-4-11 11:20
很给力!学习学习
作者: BOOKS    时间: 2018-4-12 02:30
为什么温度高低和湿度高低控制的都是同一个设备,不应该是温度高时是通风设备,温度低是是加热设备吗?
作者: ZZG转角    时间: 2018-4-13 17:29
最近在做一个设计需要用到温湿度检测,感觉挺好
作者: zx果子    时间: 2018-4-15 11:11
赞一个!
作者: 笔墨河河    时间: 2018-4-16 20:37
最近在做温湿度报警仪,感谢分享
作者: 975225133    时间: 2018-4-17 08:50
小白一只,下载下来研究很久还是不会。
作者: 小丑,    时间: 2018-4-21 11:06
给楼主点赞
作者: 1979759100Ls    时间: 2018-4-21 11:54
ybfq 发表于 2017-6-19 10:52
**** 作者被禁止或删除 内容自动屏蔽 ****

这个是自己命名的
作者: 1979759100Ls    时间: 2018-4-21 13:26
OREO 发表于 2017-7-4 13:29
**** 作者被禁止或删除 内容自动屏蔽 ****

应该是根据温湿度值调节风扇转速!!!或者说温湿度值超过设置报警阈值风扇启动
作者: A120439525616    时间: 2018-4-27 02:10
您好 能方便加下WX吗 我想要原理图和PCB 我给您红包
作者: gaosong12    时间: 2018-4-27 21:08
学习一下,谢谢楼主
作者: 云云    时间: 2018-4-28 00:37
大B 发表于 2017-11-7 00:18
为什么proteus8会打开不了文件,一打开就直接关闭

对,我也是这样,一打开就关闭,,你后来成功了吗

作者: ntsmcf    时间: 2018-5-3 21:24
为什么proteus8会打开不了文件,一打开就直接关闭
作者: JIANG2    时间: 2018-5-5 16:17
很棒 看不懂耶 那个DHT11 为啥可以画出啦u?

作者: JIANG2    时间: 2018-5-5 16:21
可不可以发给我 邮箱里 2695202062@qq.com
作者: 抬头看烟花灿烂    时间: 2018-5-5 19:11
刚好遇到这个题目了
作者: 妍妍妍    时间: 2018-5-6 15:30
很好,很有用
作者: yqjd123    时间: 2018-5-10 11:22
泪奔小飞侠 发表于 2018-3-21 22:40
我也是,不知道怎么回事

版本不对,下个最新的8.7版本就可以打开
作者: yqjd123    时间: 2018-5-10 11:25
请问楼主这个地方是做什么用的?

图片1.png (14.75 KB, 下载次数: 1158)

图片1.png

作者: magenyin    时间: 2018-5-10 20:00
zip有毒
作者: JIANG2    时间: 2018-5-11 22:46
妍妍妍 发表于 2018-5-6 15:30
很好,很有用

?你能打开
作者: vignas    时间: 2018-5-17 10:37
谁下载了,发给我一份吧。hushuliang@qq.com
作者: xianfajushi    时间: 2018-5-17 19:37
看看,还不知道仿真软件是怎么用的,又不能下载,能送我邮箱?
作者: 火树银花    时间: 2018-5-29 09:50
学习一下,感谢分享
作者: 带刀的鹌鹑    时间: 2018-5-30 02:14
看看咋样
作者: wt1690016588    时间: 2018-6-12 18:25
给力啊 我一会就去下载测试 感谢
作者: wanghao123456    时间: 2018-6-14 15:13
想下载下来试试
作者: wfsdfgnhfsdgffg    时间: 2018-6-14 15:42
学习学习
作者: LLLHHHH    时间: 2018-6-30 12:35
刚好需要这个,很给力
作者: wolovestudy    时间: 2018-7-1 13:39
很棒~很棒!!!!
作者: 孟祥江abc    时间: 2018-7-5 01:32
下载下来 学习学习
作者: 生无灭无    时间: 2018-7-7 17:19
完整版在哪里啊
作者: 大概微笑会好吧    时间: 2018-7-18 09:54
各位大佬,为什么仿真之后LED没有任何反应呢?
作者: 杰子jzj    时间: 2018-9-17 15:00
好的很哦谢谢老哥
作者: 冯波涛    时间: 2018-12-12 17:40
余下代码在哪下载
作者: 别吃我奥利奥    时间: 2018-12-28 19:38
老哥,连接电路时有没有需要注意的,连出来lcd不显示


作者: 只四百多块    时间: 2018-12-29 11:24
想问下,用DHT21的话,这程序该怎么改啊?
作者: 只四百多块    时间: 2018-12-29 11:28
用DHT21,程序该怎么改啊?
作者: 牛不耕    时间: 2019-1-3 12:43
下载试试^_^
作者: sunhzhichao    时间: 2019-1-7 22:24
谢谢,很给力,不多为什么每次仿真开始,低温报警都要亮一次
作者: yuli    时间: 2019-3-9 23:43
来学习学习
作者: 793376762    时间: 2019-3-10 18:07
好想下载下来,微信已经关注了
作者: 闲散子    时间: 2019-3-11 13:26
学习学习已下载测试。
作者: +634504744    时间: 2019-3-14 20:43
非常感谢
作者: quanuanc    时间: 2019-3-15 15:54
感谢楼主,很需要这个
作者: wang1002811677    时间: 2019-3-17 15:02
很给力
作者: 周周喵    时间: 2019-3-18 08:17
很棒!!!!!!
作者: seafly    时间: 2019-3-18 14:55
谢谢 分享

作者: cooldale    时间: 2019-3-18 23:01
很厉害!
作者: dymiracle    时间: 2019-3-18 23:16
超棒的
作者: ADAMmy970424    时间: 2019-3-19 14:27
很厉害~~~~
作者: zxr51161    时间: 2019-3-22 00:31
为什么仿真他提示出错啊
作者: wxweixin    时间: 2019-3-22 12:26
厉害厉害
作者: 小罗999    时间: 2019-3-29 11:02
nice is very good
作者: asdfrebrh    时间: 2019-4-10 11:10
测试了下很好 谢谢分享 资料留存先
作者: a510184855    时间: 2019-4-10 13:48
学习学习

作者: sevendjc    时间: 2019-4-12 10:07
好帖子,感谢分享,下载下来学习一下。
作者: LY_123    时间: 2019-4-19 20:30
感谢分享
作者: LY_123    时间: 2019-4-22 16:08
感谢分享,很有用
作者: xuanzehuiqu    时间: 2019-4-22 22:48
学习下,非常不错
作者: X1234561    时间: 2019-4-23 08:01

学习一下!学做温湿度报警仪,感谢分享!

作者: firefly299    时间: 2019-4-27 20:56
太棒了,最近在做小设计。
作者: yyhlsf    时间: 2019-4-28 10:23
'谢谢分享
作者: yyhlsf    时间: 2019-4-28 10:24
谢谢分享
作者: yyhlsf    时间: 2019-4-28 10:26
谢谢分享
作者: 大海呀    时间: 2019-4-29 09:26
很厉害
作者: HUJINHUI    时间: 2019-5-11 21:08
很给力!
作者: 阿杜太聪明    时间: 2019-5-12 10:01
谢谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1