请选择 进入手机版 | 继续访问电脑版

EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 453|回复: 0

[资料共享] 基于51单片机的dht11温湿度数码管显示proteus仿真与程序源码

[复制链接]

201

主题

11

回帖

1167

E币

助理工程师

Rank: 3Rank: 3

积分
413
发表于 2019-1-10 13:44:13 | 显示全部楼层 |阅读模式
仿真原理图如下
225353nhqbsn0bf6bxf535.png

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


实物如下
温度显示
1.PNG
湿度显示  小数
2.PNG

234038bcda0d78a1dd3foz.png
模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。

单片机源程序如下:
  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. }
复制代码
Display_temphum.zip (112.49 KB, 下载次数: 2)
积分规则
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-3-29 06:17 , Processed in 0.044824 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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