找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DHT11温湿度传感器设计报告(含单片机源码+实物)

[复制链接]
跳转到指定楼层
楼主
ID:282742 发表于 2018-3-8 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

DHT11温湿度

传感器设计报告

院系:信息工程与科学学院

电气工程学院

专业:电子信息工程,自动化

:2014,2015

学生姓名:文*成,严*

  • 设计电路图


二、实物图





五、硬件设计分析以及使用

   1、程序通过usb数据线烧写到单片机,单片机凹口靠usb下载口插入单片机底座,数据下载分别与单片机3.0和3.1(TXD和RXD)连接;

   2、自锁开关未电源开关,按下通电,按起断电;

   3、lcd1604引脚1接口靠usb下载口,对应引脚插入lcd1604液晶,液晶v0引脚接高精度电位器,液晶亮度可旋转电位器调节,液晶DB0到DB7接口连接单片机的P0引脚,RS,RW和E分别连接单片机的P2^5,P2^6和P2^7引脚;

   4、8550三极管基极通过100欧电阻后与单片机P2^4引脚连接,发射极接vcc,集电极与蜂鸣器正极连接,蜂鸣器负极接地,当有信号触发三极管懂啊同后,蜂鸣器发出响声,集电极与蜂鸣器之间有跳线帽,拔开跳线帽则与蜂鸣器断开,有无信号蜂鸣器均不会响;

   5、DHT11的数据引脚与单片机的P3^6引脚连接,负极与单片机的P3^7引脚连接,且又与电源负极连接,连接之间有跳线帽,拔开后可通过单片机控制DHT11的工作和停止工作,正极与电源正极相连

   6、5个电容按键从左到右,从上之下分别是时间设置按键,时间”+”按键,湿度设置按键,湿度”+”按键,系统复位按键。通电后,液晶显示,第一行是时间设置数值,初始值为0,第二行是本产品实际工作时间,第三行是当前湿度以及设定控制湿度值,控制湿度值初始为0,第四行为当前温度值。当时间设置键按下,光标闪烁,工作时间停止,按时间”+”按键设置指定工作时间,按一次进入秒设置,第二次分设置,第三次时设置,第四次设置完成,退出时间设置;同理,湿度设置,按一次进入设置,再按一次设置完毕,退出湿度设置;当时间到了设定值,蜂鸣器则发出响声,当湿度低于设定值,蜂鸣器也会发出响声。


  • 元器件清单

AT89C52单片机

1个

蜂鸣器

1个

10k电阻

1G个

高精度电位器

1个

AT89C52单片机底座

1个

8550三极管

1个

极性电容10u

1个

DHT11温湿度传感器

1个

Usb母口

1个

跳线帽

2个

晶振11.0592

1个



Usb下载串口

1个

排针和母针

两排

Lcd1604

1个



自锁开关

1个

100欧电阻

1个

30pf电容

4个



电容按键

5个

导线

若干

万用版

1个





四、程序

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define unint unsigned int
  5. unsigned char code str4[12] ={' ',' ','0','0',':','0','0',':','0','0',' ',' '};
  6. unsigned char code str1[] ={"alarm:00:00:00"};
  7. //unsigned char num1[]={""};
  8. //unsigned char num2[]={""};
  9. unsigned char code dis1[] = {"RH: "};
  10. unsigned char code dis2[] = {"T: "};

  11. uchar numble,count,hour,minute,sound;
  12. int hours,minutes,sounds,flag,key1num;
  13. uchar TH_data,TL_data,RH_data,RL_data,CK_data;
  14. uchar TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
  15. uchar com_data,untemp,temp;
  16. uchar respond;
  17. uchar RH_shu,rhflag,key2num;
  18.             
  19. sbit TRH = P3^6;//温湿度传感器DHT11数据接入
  20. sbit LCD_RS = P2^5;            
  21. sbit LCD_RW = P2^6;
  22. sbit LCD_EN = P2^7;
  23. sbit key1 = P1^0;                 //时间调整选择按钮
  24. sbit key2 = P1^2;                //时间加按钮
  25. sbit key3 = P3^2;              //湿度调整选择按钮
  26. sbit key4 = P3^5;              //湿度加按钮
  27. sbit beep = P2^4;  //时间报警
  28. sbit alarm = P1^1;              //湿度报警
  29. void write_time(uchar time,uchar x);
  30. void write_time1(uchar time,uchar x);
  31. /*********************************************************************************/
  32. void timer() interrupt 1
  33. {
  34.               TH0=(65536-50000)/256;
  35.               TL0=(65536-50000)%256;
  36.               count++;
  37.               if(count==20)
  38.               {
  39.                             count=0;
  40.                             sound++;
  41.                             if(sound==60)
  42.                             {
  43.                                           sound=0;
  44.                                           minute++;
  45.                                           if(minute==60)
  46.                                           {
  47.                                                         minute=0;
  48.                                                         hour++;
  49.                                                         if(hour==24)
  50.                                                         {
  51.                                                                       hour = 0;
  52.                                                         }
  53.                                                         write_time(hour,4);
  54.                                           }
  55.                                           write_time(minute,7);
  56.                             }
  57.                             write_time(sound,10);
  58.               }
  59.             
  60. }
  61. void delay(unint k)
  62. {
  63.               unint x,y;
  64.               for(x=k;x>0;x--)
  65.                 for(y=110;y>0;y--);
  66. }
  67. void delayNOP()
  68. {
  69.         _nop_();
  70.         _nop_();
  71.         _nop_();
  72.         _nop_();
  73. }
  74. /*********************************************************************************/

  75. /*********************************************************************************/
  76. // 毫秒级延时子程序
  77. /*********************************************************************************/
  78. void delay_ms(unsigned char ms)
  79. {      
  80.         unsigned char i;
  81.         while(ms--)
  82.         {
  83.                 for(i = 0; i< 150; i++)
  84.                 {
  85.                         _nop_();
  86.                         _nop_();
  87.                         _nop_();
  88.                         _nop_();
  89.                 }
  90.         }
  91. }
  92. /*********************************************************************************/

  93. /*********************************************************************************/
  94. //5us级延时程序
  95. /*********************************************************************************/
  96. void delay_us()
  97. {
  98.         uchar i;
  99.         i--;
  100.         i--;
  101.         i--;
  102.         i--;
  103.         i--;
  104.         i--;
  105. }
  106. /********************************************************************************/


  107. /********************************************************************************/
  108. // 测试LCD忙碌状态
  109. //lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。
  110. /********************************************************************************/
  111. bit lcd_busy()
  112. {      
  113.         bit result;
  114.         LCD_RS = 0;
  115.         LCD_RW = 1;
  116.         LCD_EN = 1;
  117.         delayNOP();
  118.         result=(bit)(P0&0x80);
  119.         LCD_EN = 0;
  120.         return(result);
  121. }
  122. /*******************************************************************************/

  123. /*******************************************************************************/
  124. // 写入指令数据到LCD
  125. /*******************************************************************************/
  126. void lcd_wcmd(unsigned char cmd)
  127. {      
  128.        while(lcd_busy());
  129.         LCD_RS = 0;
  130.         LCD_RW = 0;
  131.         LCD_EN = 0;
  132.         _nop_();
  133.         _nop_();
  134.         P0 = cmd;
  135.         delayNOP();
  136.         LCD_EN = 1;
  137.         delayNOP();
  138.         LCD_EN = 0;
  139. }
  140. /*****************************************************************************/

  141. /*****************************************************************************/
  142. //写显示数据到LCD                                               
  143. //RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。                           
  144. /*****************************************************************************/
  145. void lcd_wdata(unsigned char dat)
  146. {                        
  147.        while(lcd_busy());
  148.         LCD_RS = 1;
  149.         LCD_RW = 0;
  150.         LCD_EN = 0;
  151.         P0 = dat;
  152.         delayNOP();
  153.         LCD_EN = 1;
  154.         delayNOP();
  155.         LCD_EN = 0;
  156. }
  157. /****************************************************************************/

  158. /****************************************************************************/
  159. //LCD初始化设定
  160. /****************************************************************************/
  161. void lcd_init()
  162. {
  163.        // delay_ms(15);                  
  164.         lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
  165.       //  delay_ms(5);
  166.         lcd_wcmd(0x38);        
  167.        // delay_ms(5);
  168.         lcd_wcmd(0x38);        
  169.        // delay_ms(5);
  170.         lcd_wcmd(0x0c);      //显示开,关光标
  171.        // delay_ms(5);
  172.         lcd_wcmd(0x06);      //移动光标
  173.        // delay_ms(5);
  174.         //lcd_wcmd(0x01);      //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除
  175.         //delay_ms(5);
  176.         lcd_wcmd(0x80+0x40+2);
  177.         for(numble=0;numble<10;numble++)
  178.         {
  179.                       lcd_wdata(str4[numble]);
  180.                             }
  181.                             lcd_wcmd(0x80+1);
  182.                             for(numble=0;numble<14;numble++)
  183.                             {
  184.                                           lcd_wdata(str1[numble]);
  185.                             }
  186.                             lcd_wcmd(0x90+11);
  187.                             lcd_wdata('0');
  188.                             lcd_wdata('0');
  189.                             lcd_wdata('%');
  190.                             lcd_wdata('R');
  191.                             lcd_wdata('H');
  192.                             TMOD = 0x01;
  193.                             TH0 = (65536-50000)/256;
  194.                             TL0 = (65536-50000)%256;
  195.                             EA = 1;
  196.                             ET0 = 1;
  197.                             TR0 = 1;
  198. }
  199. /****************************************************************************/
  200. void write_time(uchar time,uchar x)
  201. {
  202.               uchar shi , ge;
  203.               shi = time/10;
  204.               ge = time%10;
  205.               lcd_wcmd(0x80+0x40+x);
  206.               lcd_wdata(0x30+shi);
  207.               lcd_wdata(0x30+ge);
  208. }
  209. void write_time1(uchar time,uchar x)
  210. {
  211.               uchar shi , ge;
  212.               shi = time/10;
  213.               ge = time%10;
  214.               lcd_wcmd(0x80+x);
  215.               lcd_wdata(0x30+shi);
  216.               lcd_wdata(0x30+ge);
  217. }
  218. void write_rh(uchar time,uchar x)
  219. {
  220.               uchar shi , ge;
  221.               shi = time/10;
  222.               ge = time%10;
  223.               lcd_wcmd(0x90+x);
  224.               lcd_wdata(0x30+shi);
  225.               lcd_wdata(0x30+ge);
  226. }

  227. /****************************************************************************/
  228. void keyscan()
  229. {
  230.               if(key1==0)
  231.               {
  232.                             delay(5);
  233.                             if(key1==0)
  234.                             {
  235.                                           key1num++;
  236.                                           while(!key1);
  237.                                           switch(key1num)
  238.                                           {
  239.                                                         case 1:
  240.                                                                       TR0 = 0;
  241.                                                                       lcd_wcmd(0x80+13);
  242.                                                                       lcd_wcmd(0x0f);
  243.                                                                       break;
  244.                                                         case 2:
  245.                                                                       lcd_wcmd(0x80+10);
  246.                                                                       lcd_wcmd(0x0f);
  247.                                                                       break;
  248.                                                         case 3:
  249.                                                                       lcd_wcmd(0x80+7);
  250.                                                                       lcd_wcmd(0x0f);
  251.                                                                       break;
  252.                                                         case 4:
  253.                                                                       TR0 = 1;
  254.                                                                       lcd_wcmd(0x0c);
  255.                                                                       key1num = 0;
  256.                                                                       flag=1;
  257.                                                                       break;
  258.                                           }
  259.                             }
  260.               }
  261.               if(key1num!=0)
  262.               {
  263.                             if(key2 == 0)
  264.                             {
  265.                                           delay(5);
  266.                                           if(key2 == 0)
  267.                                           {
  268.                                                         while(!key2);
  269.                                                         switch(key1num)
  270.                                                         {
  271.                                                                       case 1:
  272.                                                                                     sounds++;
  273.                                                                                     if(sounds==60)
  274.                                                                                     sounds=0;
  275.                                                                                     write_time1(sounds,13);
  276.                                                                                     lcd_wcmd(0x80+13);
  277.                                                                                     break;
  278.                                                                       case 2:
  279.                                                                                     minutes++;
  280.                                                                                     if(minutes==60)
  281.                                                                                     minutes=0;
  282.                                                                                     write_time1(minutes,10);
  283.                                                                                     lcd_wcmd(0x80+10);
  284.                                                                                     break;
  285.                                                                       case 3:
  286.                                                                                     hours++;
  287.                                                                                     if(hours==24)
  288.                                                                                     hours=0;
  289.                                                                                     write_time1(hours,7);
  290.                                                                                     lcd_wcmd(0x80+7);
  291.                                                                                     break;
  292.                                                         }
  293.                                           }
  294.                             }
  295.               }
  296.               if(hour==hours&&minute==minutes&&sound==sounds&&flag==1)
  297.               {
  298.                             beep = 0;
  299.               }
  300.               if(key3==0)
  301.               {
  302.                             delay(5);
  303.                             if(key3==0)
  304.                             {
  305.                                           key2num++;
  306.                                           while(!key3);
  307.                                           switch(key2num)
  308.                                           {
  309.                                                         case 1:
  310.                                                                       lcd_wcmd(0x90+12);
  311.                                                                       lcd_wcmd(0x0f);
  312.                                                                       break;
  313.                                                         case 2:
  314.                                                             rhflag=1;
  315.                                                         case 3:
  316.                                                             key2num=0;
  317.                                                                       lcd_wcmd(0x0c);
  318.                                                                       break;
  319.                                           }
  320.                             }
  321.               }
  322.               if(key2num!=0)
  323.               {
  324.                             if(key4==0)
  325.                             {
  326.                                           delay(5);
  327.                                           if(key4==0)
  328.                                           {
  329.                                                         while(!key4);
  330.                                                         switch(key2num)
  331.                                                         {
  332.                                                                       case 1:
  333.                                                                                     RH_shu++;
  334.                                                                                     if(RH_shu==100)
  335.                                                                                     RH_shu=0;
  336.                                                                                     write_rh(RH_shu,11);
  337.                                                         //                            rhflag = 1;
  338.                                                                                     break;
  339.                                                         }
  340.                                           }
  341.                             }
  342.               }
  343. }
  344. //设定LCD显示位置
  345. /****************************************************************************/
  346. void lcd_dis_pos(unsigned char pos)
  347. {      
  348.         lcd_wcmd(pos | 0x90); //数据指针=80+地址变量
  349. }
  350. /****************************************************************************/

  351. /****************************************************************************/
  352. //收发信号检测,数据读取
  353. /****************************************************************************/
  354. char receive()
  355. {   
  356. uchar i;
  357. com_data=0;
  358. for(i=0;i<=7;i++)   
  359. {
  360.         respond=2;
  361.         while((!TRH)&&respond++);
  362.         delay_us();
  363.         delay_us();
  364.         delay_us();
  365.         if(TRH)
  366.         {
  367.                 temp=1;
  368.                 respond=2;
  369.                 while((TRH)&&respond++);
  370.         }
  371.         else
  372.                 temp=0;
  373.         com_data<<=1;
  374.         com_data|=temp;   
  375. }
  376. return(com_data);
  377. }
  378. /****************************************************************************/

  379. /****************************************************************************/
  380. //湿度读取子程序
  381. //温度高8位== TL_data
  382. //温度低8位== TH_data
  383. //湿度高8位== RH_data
  384. //湿度低8位== RH_data
  385. //校验 8位 == CK_data
  386. //调用的程序有 delay();, Delay_5us();,RECEIVE();
  387. /***************************************************************************/
  388. void read_TRH()
  389. {
  390. //主机拉低18ms
  391. TRH=0;
  392. delay_ms(18);
  393. TRH=1;
  394. //DATA总线由上拉电阻拉高 主机延时20us
  395. delay_us();
  396. delay_us();
  397. delay_us();
  398. delay_us();
  399. //delay_us();
  400. //delay_us();delay_us();delay_us();delay_us();
  401. //主机设为输入 判断从机响应信号
  402. TRH=1;
  403. //判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行  
  404. if(!TRH)  
  405. {
  406.         respond=2;                         //判断DHT11发出 80us 的低电平响应信号是否结束
  407.         while((!TRH)&& respond++);
  408.         respond=2;                         //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  409.         while(TRH && respond++);           //数据接收状态  
  410.         RH_temp = receive();
  411.         RL_temp = receive();
  412.         TH_temp = receive();
  413.         TL_temp = receive();
  414.         CK_temp = receive();
  415.         TRH=1;                             //数据校验
  416.         untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
  417.         if(untemp==CK_temp)
  418.         {
  419.                 RH_data = RH_temp;
  420.                 RL_data = RL_temp;
  421.                 TH_data = TH_temp;
  422.                 TL_data = TL_temp;
  423.                 CK_data = CK_temp;
  424.         }
  425.     }
  426. }
  427. void lcd_display()
  428. {
  429.               lcd_dis_pos(0x03);
  430.               lcd_wdata(0x30+RH_data/10);
  431.               lcd_dis_pos(0x04);
  432.               lcd_wdata(0x30+RH_data%10);
  433.               lcd_dis_pos(0x05);
  434.               lcd_wdata(0x2e);
  435.               lcd_dis_pos(0x06);
  436.               lcd_wdata(0x30+RL_data%10);
  437. ……………………

  438. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整的Word格式文档51黑下载地址:
DHT11设计报告.docx (1.15 MB, 下载次数: 153)




评分

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

查看全部评分

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

使用道具 举报

沙发
ID:501681 发表于 2019-4-28 13:39 | 只看该作者
无数据显示是怎么回事呢
回复

使用道具 举报

板凳
ID:551598 发表于 2019-5-31 08:19 | 只看该作者
想看看   
回复

使用道具 举报

地板
ID:564512 发表于 2019-6-20 14:30 | 只看该作者
请问能给出电路原理图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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