找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7350|回复: 7
收起左侧

dht11温湿度检测系统的源程序和原理图pretel99,拿来和大家分享

[复制链接]
ID:116330 发表于 2016-4-24 13:59 | 显示全部楼层 |阅读模式
温湿度检测系统的源程序和原理图,拿来和大家分享
0.png
0.png

原理图

0.png
全部资料(压缩包)下载: 温湿度检测系统资料.zip (587.95 KB, 下载次数: 82)

下面是部分程序预览(完整版本请下载本帖附件):
dht11程序
  1. #include "dht.h"

  2. U8  U8FLAG,k;
  3. U8  U8count,U8temp;
  4. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  5. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  6. U8  U8comdata;
  7. U8  count, count_r=0;

  8. void Delay1(U16 j)
  9. {
  10.     U8 i;
  11.     for(;j>0;j--)
  12.     {        
  13.                 for(i=0;i<27;i++);
  14.     }
  15. }

  16. void  Delay_10us(void)
  17. {
  18.     U8 i;
  19.     i--;
  20.     i--;
  21.     i--;
  22.     i--;
  23.     i--;
  24.     i--;
  25. }

  26. void  COM(void)
  27. {
  28.     U8 i;
  29.     for(i=0;i<8;i++)          
  30.     {
  31.               U8FLAG=2;
  32.                    while((!DATA)&&U8FLAG++);
  33.                 Delay_10us();
  34.                 Delay_10us();
  35.                 Delay_10us();
  36.                   U8temp=0;
  37.         if(DATA)U8temp=1;
  38.                     U8FLAG=2;
  39.                 while((DATA)&&U8FLAG++);
  40.                    //超时则跳出for循环                  
  41.                    if(U8FLAG==1)break;
  42.                    //判断数据位是0还是1         
  43.                      
  44.                 // 如果高电平高过预定0高电平值则数据位为 1
  45.                     
  46.                 U8comdata<<=1;
  47.                    U8comdata|=U8temp;        //0
  48.     }//rof
  49. }

  50. //--------------------------------
  51. //-----温湿度读取子程序 ------------
  52. //--------------------------------
  53. //----以下变量均为全局变量--------
  54. //----温度高8位== U8T_data_H------
  55. //----温度低8位== U8T_data_L------
  56. //----湿度高8位== U8RH_data_H-----
  57. //----湿度低8位== U8RH_data_L-----
  58. //----校验 8位 == U8checkdata-----
  59. //----调用相关子程序如下----------
  60. //---- Delay();, Delay_10us();,COM();
  61. //--------------------------------
  62. U8 RH(void)
  63. {
  64.     //主机拉低18ms
  65.     DATA=0;
  66.         Delay1(180);  //原来为5
  67.         DATA=1;
  68.         //总线由上拉电阻拉高 主机延时20us
  69.         Delay_10us();
  70.         Delay_10us();
  71.         Delay_10us();
  72.         Delay_10us();
  73.         //主机设为输入 判断从机响应信号
  74.         DATA=1;
  75.         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
  76.         if(!DATA)                 //T !          
  77.         {
  78.             U8FLAG=2;
  79.             //判断从机是否发出 80us 的低电平响应信号是否结束         
  80.             while((!DATA)&&U8FLAG++);
  81.             U8FLAG=2;
  82.             //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  83.             while((DATA)&&U8FLAG++);
  84.             //数据接收状态                 
  85.             COM();
  86.             U8RH_data_H_temp=U8comdata;
  87.             COM();
  88.             U8RH_data_L_temp=U8comdata;
  89.             COM();
  90.             U8T_data_H_temp=U8comdata;
  91.             COM();
  92.             U8T_data_L_temp=U8comdata;
  93.             COM();
  94.             U8checkdata_temp=U8comdata;
  95.             DATA=1;
  96.             //数据校验
  97.             U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  98.             if(U8temp==U8checkdata_temp)
  99.             {
  100.                       U8RH_data_H=U8RH_data_H_temp;
  101.                       U8RH_data_L=U8RH_data_L_temp;
  102.                       U8T_data_H=U8T_data_H_temp;
  103.                       U8T_data_L=U8T_data_L_temp;
  104.                       U8checkdata=U8checkdata_temp;
  105.             }//fi
  106.                 return 1;
  107.         }//fi
  108.         else   //传感器不响应
  109.         {
  110.            return 0;
  111.         }
  112. }
复制代码

温湿度检测系统dht11主程序:
  1. #include <reg52.h>
  2. #include <math.h>
  3. #include "1602.h"
  4. #include "dht.h"
  5. #include "DS1302.h"

  6. //定义管脚
  7. sbit Key_Up = P3^2;
  8. sbit Key_Down = P3^5;
  9. sbit Key_Set = P3^3;

  10. //定义标识
  11. volatile bit FlagStartRH = 0;  //开始温湿度转换标志
  12. volatile bit FlagKeyPress = 0; //有键按下标志
  13. volatile bit FlagAlert = 0;    //报警状态标志
  14. volatile bit FlagReview = 0;   //查询标志


  15. //定义温湿度传感器用外部变量
  16. extern U8  U8FLAG,k;
  17. extern U8  U8count,U8temp;
  18. extern U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  19. extern U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  20. extern U8  U8comdata;
  21. extern U8  count, count_r;
  22. //温湿度传感器用变量
  23. U16 temp;
  24. S16 temperature, humidity;
  25. U16 RHCounter;
  26. //按键响应用变量
  27. U8 keyvalue, keyUp, keyDown, keySet;
  28. U8 FlagSet;                  
  29. //DS1302时钟用变量
  30. SYSTEMTIME CurrentTime;
  31. uchar year, month, day, hour, minute, second;
  32. //报警及存储用变量
  33. //char * pSave;
  34. //字符串显示用变量
  35. uchar str1[6] = "000000";
  36. uchar AlertDate[9]="00-00-00", AlertTime[9]="00:00:00";
  37. uchar hide;
  38. //
  39. //函数声明
  40. void int2str(int x, char* str);
  41. void Delay1ms(unsigned int count);
  42. void Data_Init();
  43. void Timer0_Init();
  44. void Timer0_ISR () ;

  45. void KeyProcess(uint num);



  46. //整型转字符串的函数,转换范围0--65536
  47. void int2str(int x, char* str)
  48. {
  49.     int i=1;
  50.     int tmp=10;
  51.     while(x/tmp!=0)
  52.     {
  53.         i++;
  54.         tmp*=10;
  55.     }
  56.     tmp=x;
  57.     str[i]='\0';
  58.     while(i>1)
  59.     {
  60.         str[--i]='0'+(tmp%10);
  61.         tmp/=10;
  62.     }
  63.     str[0]=tmp+'0';
  64. }




  65. void Delay1ms(unsigned int count)
  66. {
  67.         unsigned int i,j;
  68.         for(i=0;i<count;i++)
  69.         for(j=0;j<120;j++);
  70. }


  71. //数据初始化
  72. void Data_Init()
  73. {
  74.    RHCounter = 0;
  75.    keyvalue = 0;
  76.    keyUp = 1;
  77.    keyDown = 1;
  78.    keySet = 1;
  79.    FlagSet = 0;
  80.    hide = 0;
  81.    AlertDate[8]='\0';
  82.    AlertTime[8]='\0';

  83. }

  84. //定时器0初始化
  85. void Timer0_Init()
  86. {
  87.         ET0 = 1;        //允许定时器0中断
  88.         TMOD = 1;       //定时器工作方式选择
  89.         TL0 = 0x06;     
  90.         TH0 = 0xf8;     //定时器赋予初值
  91.         TR0 = 1;        //启动定时器
  92. }

  93. //定时器0中断
  94. void Timer0_ISR (void) interrupt 1 using 0
  95. {
  96.         TL0 = 0x06;
  97.         TH0 = 0xf8;     //定时器赋予初值

  98.         //每2秒钟启动一次温湿度转换
  99.     RHCounter ++;
  100.     if (RHCounter >= 450)
  101.     {
  102.        FlagStartRH = 1;
  103.            RHCounter = 0;
  104.            //设定闪烁标志
  105.            if (hide == 1) hide = 0;
  106.            else hide = 1;
  107.     }
  108. }

  109. void KeyProcess(uint num)
  110. {
  111.    switch (num)
  112.    {
  113.       case 1:         //Up键被按下
  114.                  switch (FlagSet)
  115.                  {
  116.             case 0:
  117.                         case 1:
  118.                            break;
  119.                         case 2: //年
  120.                            if (year<99)        year++;
  121.                            Write1302(0x8e,0x00); //写入允许
  122.                        DS1302_SetTime(DS1302_YEAR,year);
  123.                Write1302(0x8e,0x80); //禁止写入
  124.                            break;
  125.                         case 3: //月
  126.                            if (month<12) month++;
  127.                            Write1302(0x8e,0x00); //写入允许
  128.                        DS1302_SetTime(DS1302_MONTH,month);
  129.                Write1302(0x8e,0x80); //禁止写入
  130.                            break;
  131.                         case 4: //日
  132.                            if (day<31) day++;
  133.                            Write1302(0x8e,0x00); //写入允许
  134.                        DS1302_SetTime(DS1302_DAY,day);
  135.                Write1302(0x8e,0x80); //禁止写入
  136.                            break;
  137.                         case 5: //时
  138.                            if (hour<23) hour++;
  139.                            Write1302(0x8e,0x00); //写入允许
  140.                        DS1302_SetTime(DS1302_HOUR,hour);
  141.                Write1302(0x8e,0x80); //禁止写入
  142.                            break;
  143.                         case 6: //分
  144.                            if (minute<60) minute++;
  145.                            Write1302(0x8e,0x00); //写入允许
  146.                        DS1302_SetTime(DS1302_MINUTE,minute);
  147.                Write1302(0x8e,0x80); //禁止写入
  148.                            break;
  149.                         case 7: //秒
  150.                            if (second<60) second++;
  151.                            Write1302(0x8e,0x00); //写入允许
  152.                        DS1302_SetTime(DS1302_SECOND,second);
  153.                Write1302(0x8e,0x80); //禁止写入
  154.                            break;
  155.              }
  156.                  break;
  157.           case 2:        //Down键被按下
  158.              switch (FlagSet)
  159.                  {
  160.             case 0:
  161.                         case 1:
  162.                            break;
  163.                         case 2: //年
  164.                            if (year>0)        year--;
  165.                            Write1302(0x8e,0x00); //写入允许
  166.                        DS1302_SetTime(DS1302_YEAR,year);
  167.                Write1302(0x8e,0x80); //禁止写入
  168.                            break;
  169.                         case 3: //月
  170.                            if (month>0) month--;
  171.                            Write1302(0x8e,0x00); //写入允许
  172.                        DS1302_SetTime(DS1302_MONTH,month);
  173.                Write1302(0x8e,0x80); //禁止写入
  174.                            break;
  175.                         case 4: //日
  176.                            if (day>0) day--;
  177.                            Write1302(0x8e,0x00); //写入允许
  178.                        DS1302_SetTime(DS1302_DAY,day);
  179.                Write1302(0x8e,0x80); //禁止写入
  180.                            break;
  181.                         case 5: //时
  182.                            if (hour>0) hour--;
  183.                            Write1302(0x8e,0x00); //写入允许
  184.                        DS1302_SetTime(DS1302_HOUR,hour);
  185.                Write1302(0x8e,0x80); //禁止写入
  186.                            break;
  187.                         case 6: //分
  188.                            if (minute>0) minute--;
  189.                            Write1302(0x8e,0x00); //写入允许
  190.                        DS1302_SetTime(DS1302_MINUTE,minute);
  191.                Write1302(0x8e,0x80); //禁止写入
  192.                            break;
  193.                         case 7: //秒
  194.                            if (second>0) second--;
  195.                            Write1302(0x8e,0x00); //写入允许
  196.                        DS1302_SetTime(DS1302_SECOND,second);
  197.                Write1302(0x8e,0x80); //禁止写入
  198.                            break;
  199.              }
  200.              break;
  201.           case 3:    //Set键被按下。FlagSet 0-报警;1-关报警;2-设置年;3-月;4-日;5-时;6-分;7-秒
  202.          if (FlagReview==0)  //只有不查询时才能设定
  203.                  {
  204.                     FlagSet ++;
  205.                         if (FlagSet==1)
  206.                         {
  207.                            L1602_string(2,10," ");
  208.                         }
  209.                         else
  210.                         {
  211.                            L1602_string(2,10," ");
  212.                         }
  213.                     if (FlagSet>=8)
  214.                     {
  215.                        FlagSet = 0;
  216.                         }             
  217.                  }
  218.              break;                  
  219.           default:
  220.              break;
  221.    }
  222. }

  223. /********************************************************************
  224. * 名称 : Main()
  225. * 功能 : 主函数
  226. ***********************************************************************/
  227. void main()
  228. {
  229.     U16 i, j, testnum;

  230.     EA = 0;

  231.         Timer0_Init();  //定时器0初始化
  232.     Data_Init();
  233.         Initial_DS1302();
  234.         EA = 1;

  235.         L1602_init();
  236.         L1602_string(1,1,"  Welcome to my ");
  237.         L1602_string(2,1," Infra Monitor! ");
  238.         //延时
  239.         for (i=0;i<1000;i++)
  240.            for (j=0;j<1000;j++)
  241.            {;}
  242.     //清屏
  243.         L1602_string(1,1,"           T   C");
  244.         L1602_string(2,1,"           H   %");

  245.   
  246.         while(1)
  247.         {
  248.              //查询报警信号
  249.                  //FlagSet=0为报警状态,
  250.                  //FlagSet=1为关报警状态,
  251.                  //FlagSet=2,3,4,5,6,7依次为设置年,月,日,时,分,秒状态
  252.                  if (FlagStartRH == 1)
  253.                  {
  254.              //温湿度转换标志检查
  255.                      TR0 = 0;
  256.              testnum = RH();
  257.                          FlagStartRH = 0;
  258.                          TR0 = 1;
  259.              //读出温湿度,只取整数部分
  260.                          humidity = U8RH_data_H;
  261.                          temperature = U8T_data_H;
  262.                  //读出日期时间值
  263.                  DS1302_GetTime(&CurrentTime);
  264.                          year = CurrentTime.Year;
  265.              month = CurrentTime.Month;
  266.                          day = CurrentTime.Day;
  267.                          hour = CurrentTime.Hour;
  268.                          minute = CurrentTime.Minute;
  269.                          second = CurrentTime.Second;
  270.                  DateToStr(&CurrentTime);
  271.                  TimeToStr(&CurrentTime);
  272.              //如果不处于查询状态则显示当前日期时间温度湿度
  273.                          if (FlagReview==0)
  274.                          {
  275.                             //清屏
  276.                        L1602_string(1,1,"           T   C");
  277.                                 L1602_string(2,1,"                  ");
  278.                                 L1602_string(2,12,"H   %");

  279.                                 //显示温湿度
  280.                             if (temperature<0)
  281.                             {
  282.                                L1602_string(2,7,"-");
  283.                             }
  284.                             temperature = abs(temperature);
  285.                             int2str(temperature,str1);
  286.                             L1602_string(1,14,str1);
  287.                             int2str(humidity,str1);
  288.                         L1602_string(2,14,str1);
  289.                     L1602_string(1,1,CurrentTime.DateString);
  290.                     L1602_string(2,1,CurrentTime.TimeString);
  291.                     //产生时间设定时的闪烁效果,只在未查询且闪烁标志置位时运行
  292.                     if (hide==1)
  293.                     {
  294.                               switch (FlagSet)
  295.                        {
  296.                           case 0:
  297.                                           case 1:
  298.                           break;
  299.                           case 2:                         //年
  300.                                  L1602_string(1,1,"  ");
  301.                                  break;
  302.                           case 3:                         //月
  303.                                  L1602_string(1,4,"  ");
  304.                                  break;
  305.                           case 4:                         //日
  306.                                  L1602_string(1,7,"  ");
  307.                                  break;
  308.                           case 5:                         //时
  309.                                  L1602_string(2,1,"  ");
  310.                                  break;
  311.                           case 6:                         //分
  312.                                  L1602_string(2,4,"  ");
  313.                                  break;
  314.                           case 7:                         //秒
  315.                                  L1602_string(2,7,"  ");
  316.                                  break;
  317.                           default:
  318.                              break;
  319.                            }
  320.                 }
  321.                          }
  322.                 }
  323.                 //以下为键盘查询,当有按键从按下到弹起时,该按键被响应。
  324.                 if ((Key_Up)&&(keyUp==0)) {FlagKeyPress = 1; keyvalue = 1;}
  325.         else if ((Key_Down)&&(keyDown==0)) {FlagKeyPress = 1; keyvalue = 2;}
  326.         else if ((Key_Set)&&(keySet==0)) {FlagKeyPress = 1; keyvalue = 3;}
  327.                 if (FlagKeyPress == 1)
  328.                 {
  329.            KeyProcess(keyvalue);
  330.            FlagKeyPress = 0;           
  331.                 }
  332.         if (!Key_Up) keyUp = 0;
  333.                 else keyUp = 1;
  334.         if (!Key_Down) keyDown = 0;
  335.                 else keyDown = 1;
  336.         if (!Key_Set) keySet = 0;
  337.                 else keySet = 1;
  338.                 Delay1ms(100);
  339.         }       
  340. }


复制代码


评分

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

查看全部评分

回复

使用道具 举报

ID:149790 发表于 2016-11-24 14:19 | 显示全部楼层
感谢分享,有用
回复

使用道具 举报

ID:142383 发表于 2016-11-29 14:57 | 显示全部楼层
下载了,测试成功,谢谢分享!
回复

使用道具 举报

ID:170296 发表于 2017-3-13 13:04 | 显示全部楼层
感谢分享,试试
回复

使用道具 举报

ID:193406 发表于 2017-4-25 14:23 | 显示全部楼层
很需要啊
回复

使用道具 举报

ID:145935 发表于 2017-4-26 12:38 | 显示全部楼层
学习中,谢谢分享!
回复

使用道具 举报

ID:213117 发表于 2017-6-22 22:46 | 显示全部楼层
正需要呢,感谢分享!!
回复

使用道具 举报

ID:68356 发表于 2017-6-23 16:29 | 显示全部楼层
好东西啊,下载看看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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