单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码

  [复制链接]
跳转到指定楼层
楼主
灵魂9527 发表于 2019-1-9 23:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
仿真原理图如下




按button1可以切换模式
模式0 只显示温度
模式1 只显示湿度
模式2 动态显示温度和湿度,每5s切换一次


实物如下
温度显示




湿度显示  小数

微信图片_20190109232507.jpg (1.64 MB, 下载次数: 12)

湿度显示

湿度显示

资料.png (13.6 KB, 下载次数: 111)

资料.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
 楼主| 灵魂9527 发表于 2019-1-9 23:49 | 只看该作者
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。

单片机源程序如下:
  1. #include<reg51.h>

  2. bit DHT_Start();
  3. bit DHT_ByteRead(unsigned char *dat);
  4. void ConfigTimer0(unsigned int ms);
  5. void Display_hum(unsigned char *num);
  6. void Display_temp(unsigned char *num);


  7. unsigned char T0RH = 0;  //T0重载值的高字节
  8. unsigned char T0RL = 0;  //T0重载值的低字节
  9. unsigned char str=88;
  10. unsigned char DHT[5];

  11. unsigned int tmr1s = 0;
  12. unsigned int tmr10ms = 0;
  13. unsigned char st=0;
  14. unsigned int sdd=0;
  15. unsigned char td=0;
  16. unsigned char mode=0;

  17. bit flag1s = 0;
  18. bit flag10ms = 0;
  19. int x;
  20.             
  21. sbit button1=P0^0;
  22. sbit dot=P1^3;   //数码管小数点


  23. void delay(unsigned char x)   //延时ms
  24. {
  25.     unsigned char a,b,c;
  26.         for(c=x;c>0;c--)
  27.     {
  28.                 for(b=102;b>0;b--)
  29.         for(a=3;a>0;a--);
  30.         }
  31. }
  32. void main()          
  33. {                 

  34.     bit tmp;
  35.         dot=0;
  36.     EA = 1;            //开总中断
  37.     ConfigTimer0(10);  //T0定时10ms
  38. //        M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;
  39.     DHT_Start();
  40.     delay(5);

  41.     while (1)
  42.     {


  43.         if(flag10ms)  //数码管刷新频率
  44.                 {
  45.                    if(st==0){
  46.                                 Display_temp(&str);
  47.                                 flag10ms=0;
  48.                         }
  49.                    else if(st==1)
  50.                    {
  51.                       Display_hum(&str);
  52.                           flag10ms=0;
  53.                         }

  54.                   
  55.                   
  56.                 }
  57.                 else if (flag1s)  //每秒更新一次温度、湿度
  58.         {
  59.                 DHT_Start();
  60.                    tmp=DHT_ByteRead(&DHT);
  61.                    if(tmp==1)
  62.                    {

  63.                           if(st==0)
  64.                           {
  65.                             str = DHT[2] ;             //温度
  66.                                 Display_temp(&str);                     
  67.                             flag1s =0;         //标志位清零
  68.                           }
  69.                           else if(st==1){

  70.                           str = DHT[0] ;  //湿度
  71.                   Display_hum(&str);
  72.                                   flag1s =0;         //标志位清零
  73.                           }

  74.                           

  75.                    }
  76.         }
  77.                 if(button1==0)
  78.                 {
  79.                    delay(2);
  80.                   
  81.                    if(button1==0)
  82.                    {
  83.                      
  84.                                 mode++;
  85.                                 switch(mode)
  86.                                 {
  87.                                   case 0:  st=0;      break;
  88.                                   case 1:  st=1;      break;
  89.                                   case 2:  td=1;      break;
  90.                                   default:     break;
  91.                                 }
  92.                                 if(mode>=3)
  93.                                 {
  94.                                   td=0;
  95.                                   mode=0;
  96.                                 }
  97.                                 while(button1==0)
  98.                                 {
  99.                                 }


  100.                    }

  101.                 }



  102.          }
  103. }


  104. /* 配置并启动T0,ms-T0定时时间 */
  105. void ConfigTimer0(unsigned int ms)
  106. {
  107.     unsigned long tmp;  //临时变量
  108.    
  109.     tmp = 11059200 / 12;      //定时器计数频率
  110.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  111.     tmp = 65536 - tmp;        //计算定时器重载值
  112.     tmp = tmp + 12;           //补偿中断响应延时造成的误差
  113.     T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
  114.     T0RL = (unsigned char)tmp;
  115.     TMOD &= 0xF0;   //清零T0的控制位
  116.     TMOD |= 0x01;   //配置T0为模式1
  117.     TH0 = T0RH;     //加载T0重载值
  118.     TL0 = T0RL;
  119.     ET0 = 1;        //使能T0中断
  120.     TR0 = 1;        //启动T0
  121. }
  122. /* T0中断服务函数,完成1秒定时 */
  123. void InterruptTimer0() interrupt 1
  124. {

  125.     TH0 = T0RH;  //重新加载重载值
  126.     TL0 = T0RL;
  127.     tmr1s++;
  128.         sdd++;
  129.         tmr10ms++;

  130.         if(tmr10ms>=1)           //  数码管刷新频率
  131.         {
  132.                   tmr10ms=0;
  133.                 flag10ms = 1;
  134.         }
  135.         if(td==1)
  136.         {
  137.           if(sdd>=500)           //温度显示5s        、湿度显示5s
  138.           {
  139.              sdd=0;
  140.              if(st==0)
  141.              {
  142.                st=1;
  143.                  }
  144.                  else st=0;
  145.           }
  146.         }
  147.     if (tmr1s >= 200)  //1s 数据更新频率
  148.     {
  149.         tmr1s = 0;
  150.         flag1s = 1;
  151.         }

  152.    
  153. }
复制代码

所有资料51hei提供下载:
Display_temphum.zip (112.49 KB, 下载次数: 287)


回复

使用道具 举报

板凳
abssea 发表于 2019-1-10 20:40 | 只看该作者
谢谢!!
回复

使用道具 举报

地板
ontheroad 发表于 2019-2-23 15:43 | 只看该作者
DHT11的data口,好像没有接4.7K的上拉电阻?
回复

使用道具 举报

5#
782907272 发表于 2019-6-20 12:47 | 只看该作者
灵魂9527 发表于 2019-1-9 23:49
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。

单片机源程序如下:

谢谢大佬!!
回复

使用道具 举报

6#
宫伟迪 发表于 2019-6-25 06:15 | 只看该作者
感谢你的分享
回复

使用道具 举报

7#
weixiao4 发表于 2019-8-5 10:35 | 只看该作者
非常感谢,
回复

使用道具 举报

8#
User999 发表于 2019-9-21 15:04 | 只看该作者
非常感谢
回复

使用道具 举报

9#
周栩乐 发表于 2019-10-26 12:20 | 只看该作者
是共阴数码管还是共阳的
回复

使用道具 举报

10#
 楼主| 灵魂9527 发表于 2019-12-1 10:05 | 只看该作者
周栩乐 发表于 2019-10-26 12:20
是共阴数码管还是共阳的

共阴   
回复

使用道具 举报

11#
myemcu 发表于 2019-12-10 14:39 | 只看该作者
东东不错
回复

使用道具 举报

12#
kampoer 发表于 2019-12-22 16:36 | 只看该作者
为什么我用你的程序数码管只显示88
回复

使用道具 举报

13#
张力力 发表于 2019-12-26 15:03 来自手机 | 只看该作者
如果在此基础上,加上一个温度报警好做吗
回复

使用道具 举报

14#
221524 发表于 2019-12-27 22:42 | 只看该作者
在这上面加个控制器设计好做吗
回复

使用道具 举报

15#
anjianguo 发表于 2019-12-28 12:40 | 只看该作者
灵魂9527 发表于 2019-1-9 23:49
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。

单片机源程序如下:

刚刚学习,先复制源代码试试,
回复

使用道具 举报

16#
anjianguo 发表于 2019-12-28 13:01 | 只看该作者
灵魂9527 发表于 2019-1-9 23:49
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。

单片机源程序如下:

谢谢!调试通过!
回复

使用道具 举报

17#
fanaijun 发表于 2020-1-7 17:24 | 只看该作者
为什么把你的程序没有更改,只是重新编译一下,就只会很闪的显示88,但不重新编译,直接用你之前的.hex文件,又显示正常呢?
回复

使用道具 举报

18#
fanaijun 发表于 2020-1-7 17:25 | 只看该作者
为什么用你的程序没有任何改动只是重新编译一下,会显示不了,只会显示闪的88
回复

使用道具 举报

19#
莳离季节 发表于 2020-3-19 15:55 | 只看该作者
挺好的,希望大佬继续分享dht12.
回复

使用道具 举报

20#
BrianWaring 发表于 2020-3-24 15:40 | 只看该作者
感谢分享!正需要学习!
回复

使用道具 举报

21#
干掉蒂 发表于 2020-5-15 22:23 来自手机 | 只看该作者
仿真原理图为什么我的p2.1、p2.4、p1.1,为红色
回复

使用道具 举报

22#
meiying... 发表于 2020-5-17 16:35 来自手机 | 只看该作者
为什么我编译,出现delay:missing function-prototype和 delay:requires-style prototype
回复

使用道具 举报

23#
干掉蒂 发表于 2020-5-23 14:17 来自手机 | 只看该作者
unsigned int tmr1s = 0; unsigned int tmr10ms = 0;是什么意思
回复

使用道具 举报

24#
1185404984 发表于 2020-5-23 21:25 | 只看该作者
仿真的时候除了把proteus和keil 保存在同一文件夹下 还有什么要求吗
回复

使用道具 举报

25#
玩卟欺 发表于 2020-5-26 18:02 | 只看该作者
灵魂9527 发表于 2019-1-9 23:49
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。

单片机源程序如下:

楼主程序非常有用哦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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